From e9518f1521c6746da827677d03a54a09203db5d6 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Sat, 9 Jul 2011 02:59:24 +0000 Subject: [PATCH] Add unit tests + coverage support to evas, for Tasn. unit tests : make check coverage : make coverage SVN revision: 61167 --- legacy/evas/Makefile.am | 65 +++++++++++++++- legacy/evas/configure.ac | 24 ++++++ legacy/evas/m4/efl_coverage.m4 | 62 +++++++++++++++ legacy/evas/m4/efl_tests.m4 | 43 +++++++++++ legacy/evas/src/Makefile.am | 2 +- legacy/evas/src/lib/canvas/Makefile.am | 8 +- legacy/evas/src/tests/Makefile.am | 25 ++++++ legacy/evas/src/tests/evas_suite.c | 101 +++++++++++++++++++++++++ legacy/evas/src/tests/evas_suite.h | 9 +++ legacy/evas/src/tests/evas_test_init.c | 21 +++++ 10 files changed, 356 insertions(+), 4 deletions(-) create mode 100644 legacy/evas/m4/efl_coverage.m4 create mode 100644 legacy/evas/m4/efl_tests.m4 create mode 100644 legacy/evas/src/tests/Makefile.am create mode 100644 legacy/evas/src/tests/evas_suite.c create mode 100644 legacy/evas/src/tests/evas_suite.h create mode 100644 legacy/evas/src/tests/evas_test_init.c diff --git a/legacy/evas/Makefile.am b/legacy/evas/Makefile.am index 1f44c81fed..71a0c76b1e 100644 --- a/legacy/evas/Makefile.am +++ b/legacy/evas/Makefile.am @@ -47,7 +47,19 @@ evas-direct3d.pc.in \ evas-software-16-wince.pc.in \ evas-software-sdl.pc.in \ evas.spec.in \ -evas.spec +evas.spec \ +m4/ac_attribute.m4 \ +m4/efl_coverage.m4 \ +m4/efl_doxygen.m4 \ +m4/efl_fnmatch.m4 \ +m4/efl_path_max.m4 \ +m4/efl_pthread.m4 \ +m4/efl_tests.m4 \ +m4/evas_check_engine.m4 \ +m4/evas_check_loader.m4 \ +m4/evas_converter.m4 \ +m4/evas_dither.m4 \ +m4/evas_scaler.m4 pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = evas.pc @@ -108,8 +120,57 @@ if BUILD_ENGINE_SOFTWARE_SDL pkgconfig_DATA += evas-software-sdl.pc endif -.PHONY: doc +.PHONY: doc coverage doc: @echo "entering doc/" $(MAKE) -C doc doc + +# Unit tests + +if EFL_ENABLE_TESTS + +check-local: + @./src/tests/evas_suite + +else + +check-local: + @echo "reconfigure with --enable-tests" + +endif + +# Coverage report + +if EFL_ENABLE_COVERAGE +lcov-reset: + @rm -rf coverage + @find . -name "*.gcda" -exec rm {} \; + @lcov --directory . --zerocounters + +lcov-report: + @mkdir coverage + @lcov --compat-libtool --directory $(top_srcdir)/src --capture --output-file coverage/coverage.info + @lcov -l coverage/coverage.info |grep "\\.h" |cut -d " " -f 2 > coverage/remove + @lcov -r coverage/coverage.info `cat coverage/remove` > coverage/coverage.cleaned.info + @rm coverage/remove + @mv coverage/coverage.cleaned.info coverage/coverage.info + @genhtml -t "$(PACKAGE_STRING)" -o coverage coverage/coverage.info + +coverage: + @make lcov-reset + @make check + @make lcov-report +else +lcov-reset: + @echo "reconfigure with --enable-coverage" + +lcov-report: + @echo "reconfigure with --enable-coverage" + +coverage: + @echo "reconfigure with --enable-tests --enable-coverage" +endif + +maintainer-clean-local: + rm -rf coverage diff --git a/legacy/evas/configure.ac b/legacy/evas/configure.ac index 747d6c0083..32c9b2b48c 100644 --- a/legacy/evas/configure.ac +++ b/legacy/evas/configure.ac @@ -1668,6 +1668,19 @@ AC_ARG_ENABLE([build-examples], [build_examples="no"]) AM_CONDITIONAL([BUILD_EXAMPLES], [test "x${build_examples}" = "xyes"]) +## Unit tests, coverage + +EFL_CHECK_TESTS([enable_tests="yes"], [enable_tests="no"]) + +EFL_CHECK_COVERAGE([${enable_tests}], [enable_coverage="yes"], [enable_coverage="no"]) +EVAS_CFLAGS="${EVAS_CFLAGS} ${EFL_COVERAGE_CFLAGS}" +EVAS_LIBS="${EVAS_LIBS} ${EFL_COVERAGE_LIBS}" +if test "x$enable_coverage" = "xyes" ; then + EVAS_CFLAGS="${EVAS_CFLAGS} ${EFL_DEBUG_CFLAGS}" +fi + +AC_SUBST(EVAS_CFLAGS) +AC_SUBST(EVAS_LIBS) ##################################################################### ## Fill in flags @@ -1765,6 +1778,7 @@ src/static_deps/Makefile src/static_deps/liblinebreak/Makefile src/lib/include/Makefile src/examples/Makefile +src/tests/Makefile README evas.spec ]) @@ -1940,6 +1954,16 @@ echo " 32bpp Rotation 270......: $conv_32_rgb_rot_270" echo echo "Documentation.............: ${build_doc}" echo "Examples..................: install:${install_examples} build:${build_examples}" +if test "x${enable_tests}" = "xyes" ; then + echo "Tests.....................: ${enable_tests} (make check)" +else + echo "Tests.....................: ${enable_tests}" +fi +if test "x${enable_coverage}" = "xyes" ; then + echo "Coverage..................: ${enable_coverage} (make coverage)" +else + echo "Coverage..................: ${enable_coverage}" +fi echo echo "Compilation............: make (or gmake)" echo " CPPFLAGS.............: $CPPFLAGS" diff --git a/legacy/evas/m4/efl_coverage.m4 b/legacy/evas/m4/efl_coverage.m4 new file mode 100644 index 0000000000..85d03215b3 --- /dev/null +++ b/legacy/evas/m4/efl_coverage.m4 @@ -0,0 +1,62 @@ +dnl Copyright (C) 2008 Vincent Torri +dnl That code is public domain and can be freely used or copied. + +dnl Macro that check if coverage support is wanted and, if yes, if +dnl lcov is available. + +dnl Usage: EFL_CHECK_COVERAGE(tests [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl The parameter 'tests' is used if a dependency is needed. If set to "yes", +dnl the dependency is available. +dnl Defines EFL_COVERAGE_CFLAGS and EFL_COVERAGE_LIBS variables +dnl Defines the automake conditionnal EFL_ENABLE_COVERAGE + +AC_DEFUN([EFL_CHECK_COVERAGE], +[ + +dnl configure option + +AC_ARG_ENABLE([coverage], + [AC_HELP_STRING([--enable-coverage], [enable coverage profiling instrumentation @<:@default=disabled@:>@])], + [ + if test "x${enableval}" = "xyes" ; then + _efl_enable_coverage="yes" + else + _efl_enable_coverage="no" + fi + ], + [_efl_enable_coverage="no"]) + +AC_MSG_CHECKING([whether to use profiling instrumentation]) +AC_MSG_RESULT([$_efl_enable_coverage]) + +dnl lcov check + +if test "x$_efl_enable_coverage" = "xyes" && test ! "x$1" = "xyes" ; then + AC_MSG_WARN([Coverage report requested but tests not being built, disable profiling instrumentation.]) + AC_MSG_WARN([Run configure with --enable-tests]) + _efl_enable_coverage="no" +fi + +if test "x$_efl_enable_coverage" = "xyes" ; then + AC_CHECK_PROG(have_lcov, [lcov], [yes], [no]) + if test "x$have_lcov" = "xyes" ; then + EFL_COVERAGE_CFLAGS="-fprofile-arcs -ftest-coverage" + EFL_COVERAGE_LIBS="-lgcov" +# remove any optimisation flag and force debug symbols + EFL_DEBUG_CFLAGS="-g -O0 -DDEBUG" + else + AC_MSG_WARN([lcov is not found, disable profiling instrumentation]) + _efl_enable_coverage="no" + fi +fi + +dnl Substitution +AC_SUBST(EFL_COVERAGE_CFLAGS) +AC_SUBST(EFL_COVERAGE_LIBS) + +AM_CONDITIONAL(EFL_ENABLE_COVERAGE, test "x${_efl_enable_coverage}" = "xyes") + +AS_IF([test "x$_efl_enable_coverage" = "xyes"], [$2], [$3]) +]) + +dnl End of efl_coverage.m4 diff --git a/legacy/evas/m4/efl_tests.m4 b/legacy/evas/m4/efl_tests.m4 new file mode 100644 index 0000000000..3a4dfe246f --- /dev/null +++ b/legacy/evas/m4/efl_tests.m4 @@ -0,0 +1,43 @@ +dnl Copyright (C) 2008 Vincent Torri +dnl That code is public domain and can be freely used or copied. + +dnl Macro that check if tests programs are wanted and if yes, if +dnl the Check library is available. + +dnl Usage: EFL_CHECK_TESTS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Define the automake conditionnal EFL_ENABLE_TESTS + +AC_DEFUN([EFL_CHECK_TESTS], +[ + +dnl configure option + +AC_ARG_ENABLE([tests], + [AC_HELP_STRING([--enable-tests], [enable tests @<:@default=disabled@:>@])], + [ + if test "x${enableval}" = "xyes" ; then + _efl_enable_tests="yes" + else + _efl_enable_tests="no" + fi + ], + [_efl_enable_tests="no"]) + +AC_MSG_CHECKING([whether tests are built]) +AC_MSG_RESULT([${_efl_enable_tests}]) + +AC_REQUIRE([PKG_PROG_PKG_CONFIG]) + +if test "x${_efl_enable_tests}" = "xyes" ; then + PKG_CHECK_MODULES([CHECK], + [check >= 0.9.5], + [dummy="yes"], + [_efl_enable_tests="no"]) +fi + +AM_CONDITIONAL(EFL_ENABLE_TESTS, test "x${_efl_enable_tests}" = "xyes") + +AS_IF([test "x$_efl_enable_tests" = "xyes"], [$1], [$2]) +]) + +dnl End of efl_tests.m4 diff --git a/legacy/evas/src/Makefile.am b/legacy/evas/src/Makefile.am index 323da76896..c44a82efe1 100644 --- a/legacy/evas/src/Makefile.am +++ b/legacy/evas/src/Makefile.am @@ -1,3 +1,3 @@ MAINTAINERCLEANFILES = Makefile.in -SUBDIRS = static_deps lib bin modules examples +SUBDIRS = static_deps lib bin modules tests examples diff --git a/legacy/evas/src/lib/canvas/Makefile.am b/legacy/evas/src/lib/canvas/Makefile.am index cf2d61b766..32dadc3219 100644 --- a/legacy/evas/src/lib/canvas/Makefile.am +++ b/legacy/evas/src/lib/canvas/Makefile.am @@ -12,6 +12,7 @@ AM_CPPFLAGS = \ @FREETYPE_CFLAGS@ \ @EET_CFLAGS@ \ @FONTCONFIG_CFLAGS@ \ +@EVAS_CFLAGS@ \ @EINA_CFLAGS@ \ @EVIL_CFLAGS@ \ @PIXMAN_CFLAGS@ @@ -53,9 +54,14 @@ evas_stats.c \ evas_map.c \ evas_gl.c -libevas_canvas_la_LIBADD = @EVIL_LIBS@ +#evas_object_textgrid.c + +libevas_canvas_la_LIBADD = @EVAS_LIBS@ @EVIL_LIBS@ if EVAS_USE_LINEBREAK AM_CPPFLAGS += @LINEBREAK_CFLAGS@ libevas_canvas_la_LIBADD += @LINEBREAK_LIBS@ endif + +clean-local: + rm -rf *.gcno diff --git a/legacy/evas/src/tests/Makefile.am b/legacy/evas/src/tests/Makefile.am new file mode 100644 index 0000000000..5f369fcd05 --- /dev/null +++ b/legacy/evas/src/tests/Makefile.am @@ -0,0 +1,25 @@ +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = \ +-I$(top_srcdir)/src/lib \ +-I$(top_srcdir)/src/include \ +-I$(top_builddir)/src/include \ +-I$(top_builddir)/src/lib \ +-DPACKAGE_BIN_DIR=\"$(bindir)\" \ +-DPACKAGE_LIB_DIR=\"$(libdir)\" \ +-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ +@EINA_CFLAGS@ \ +@CHECK_CFLAGS@ + +if EFL_ENABLE_TESTS + +check_PROGRAMS = evas_suite + +evas_suite_SOURCES = \ +evas_suite.c \ +evas_test_init.c \ +evas_suite.h + +evas_suite_LDADD = @CHECK_LIBS@ $(top_builddir)/src/lib/libevas.la @EINA_LIBS@ + +endif diff --git a/legacy/evas/src/tests/evas_suite.c b/legacy/evas/src/tests/evas_suite.c new file mode 100644 index 0000000000..1527f16587 --- /dev/null +++ b/legacy/evas/src/tests/evas_suite.c @@ -0,0 +1,101 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include + +#include "evas_suite.h" + +typedef struct _Evas_Test_Case Evas_Test_Case; + +struct _Evas_Test_Case +{ + const char *test_case; + void (*build)(TCase *tc); +}; + +static const Evas_Test_Case etc[] = { + { "Evas", evas_test_init }, + { NULL, NULL } +}; + +static void +_list_tests(void) +{ + const Evas_Test_Case *itr; + + itr = etc; + fputs("Available Test Cases:\n", stderr); + for (; itr->test_case; itr++) + fprintf(stderr, "\t%s\n", itr->test_case); +} +static Eina_Bool +_use_test(int argc, const char **argv, const char *test_case) +{ + if (argc < 1) + return 1; + + for (; argc > 0; argc--, argv++) + if (strcmp(test_case, *argv) == 0) + return 1; + return 0; +} + +static Suite * +evas_suite_build(int argc, const char **argv) +{ + TCase *tc; + Suite *s; + int i; + + s = suite_create("Evas"); + + for (i = 0; etc[i].test_case; ++i) + { + if (!_use_test(argc, argv, etc[i].test_case)) continue; + tc = tcase_create(etc[i].test_case); + + etc[i].build(tc); + + suite_add_tcase(s, tc); + tcase_set_timeout(tc, 0); + } + + return s; +} + +int +main(int argc, char **argv) +{ + Suite *s; + SRunner *sr; + int i, failed_count; + + for (i = 1; i < argc; i++) + if ((strcmp(argv[i], "-h") == 0) || + (strcmp(argv[i], "--help") == 0)) + { + fprintf(stderr, "Usage:\n\t%s [test_case1 .. [test_caseN]]\n", + argv[0]); + _list_tests(); + return 0; + } + else if ((strcmp(argv[i], "-l") == 0) || + (strcmp(argv[i], "--list") == 0)) + { + _list_tests(); + return 0; + } + + s = evas_suite_build(argc - 1, (const char **)argv + 1); + sr = srunner_create(s); + + srunner_run_all(sr, CK_ENV); + failed_count = srunner_ntests_failed(sr); + srunner_free(sr); + + return (failed_count == 0) ? 0 : 255; +} diff --git a/legacy/evas/src/tests/evas_suite.h b/legacy/evas/src/tests/evas_suite.h new file mode 100644 index 0000000000..5acb946edb --- /dev/null +++ b/legacy/evas/src/tests/evas_suite.h @@ -0,0 +1,9 @@ +#ifndef _EVAS_SUITE_H +#define _EVAS_SUITE_H + +#include + +void evas_test_init(TCase *tc); + + +#endif /* _EVAS_SUITE_H */ diff --git a/legacy/evas/src/tests/evas_test_init.c b/legacy/evas/src/tests/evas_test_init.c new file mode 100644 index 0000000000..f4271ecbc3 --- /dev/null +++ b/legacy/evas/src/tests/evas_test_init.c @@ -0,0 +1,21 @@ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include "evas_suite.h" +#include "Evas.h" + +START_TEST(evas_simple) +{ + fail_if(evas_init() != 1); /* one init by test suite */ + fail_if(evas_shutdown() != 0); +} +END_TEST + +void evas_test_init(TCase *tc) +{ + tcase_add_test(tc, evas_simple); +}