From bf8b3ce2a389339e3c499a8a511418296109d9e9 Mon Sep 17 00:00:00 2001 From: Vincent Torri Date: Mon, 1 Mar 2010 21:05:17 +0000 Subject: [PATCH] add unit test and coverage framework, and trivial tests SVN revision: 46742 --- legacy/efreet/Makefile.am | 48 +++++++- legacy/efreet/configure.ac | 14 +++ legacy/efreet/m4/efl_coverage.m4 | 62 +++++++++++ legacy/efreet/m4/efl_tests.m4 | 43 ++++++++ legacy/efreet/src/tests/Makefile.am | 13 +++ legacy/efreet/src/tests/efreet_suite.c | 103 ++++++++++++++++++ legacy/efreet/src/tests/efreet_suite.h | 10 ++ legacy/efreet/src/tests/efreet_test_efreet.c | 25 +++++ .../src/tests/efreet_test_efreet_cache.c | 31 ++++++ 9 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 legacy/efreet/m4/efl_coverage.m4 create mode 100644 legacy/efreet/m4/efl_tests.m4 create mode 100644 legacy/efreet/src/tests/efreet_suite.c create mode 100644 legacy/efreet/src/tests/efreet_suite.h create mode 100644 legacy/efreet/src/tests/efreet_test_efreet.c create mode 100644 legacy/efreet/src/tests/efreet_test_efreet_cache.c diff --git a/legacy/efreet/Makefile.am b/legacy/efreet/Makefile.am index ad7a4287a2..bf71008653 100644 --- a/legacy/efreet/Makefile.am +++ b/legacy/efreet/Makefile.am @@ -28,8 +28,54 @@ efreet.spec.in \ efreet.spec \ README -.PHONY: doc +.PHONY: doc coverage doc: @echo "entering doc/" make -C doc doc + +# Unit tests + +if EFL_ENABLE_TESTS + +check-local: + @./src/tests/efreet_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 -v "`cd $(top_srcdir) && pwd`" | cut -d: -f1 > 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 diff --git a/legacy/efreet/configure.ac b/legacy/efreet/configure.ac index 361fd7f92c..9eb5dbce83 100644 --- a/legacy/efreet/configure.ac +++ b/legacy/efreet/configure.ac @@ -174,6 +174,17 @@ AC_SUBST(lt_enable_auto_import) AC_FUNC_ALLOCA AC_CHECK_FUNCS(strlcpy) +### Unit tests, coverage + +EFL_CHECK_TESTS([enable_tests="yes"], [enable_tests="no"]) + +EFL_CHECK_COVERAGE([${enable_tests}], [enable_coverage="yes"], [enable_coverage="no"]) +EFREET_CFLAGS="${EFREET_CFLAGS} ${EFL_COVERAGE_CFLAGS}" +EFREET_LIBS="${EFREET_LIBS} ${EFL_COVERAGE_LIBS}" +if test "x$enable_coverage" = "xyes" ; then + EFREET_CFLAGS="${EFREET_CFLAGS} ${EFL_DEBUG_CFLAGS}" +fi + AC_SUBST(requirement_efreet) AC_OUTPUT([ @@ -210,6 +221,9 @@ echo " Specification compliance:" echo " Strict.............: ${enable_strict_spec}" echo " Sloppy.............: ${enable_sloppy_spec}" echo +echo " Tests................: ${enable_tests}" +echo " Coverage.............: ${enable_coverage}" +echo echo " Documentation........: ${build_doc}" echo echo "Compilation............: make (or gmake)" diff --git a/legacy/efreet/m4/efl_coverage.m4 b/legacy/efreet/m4/efl_coverage.m4 new file mode 100644 index 0000000000..85d03215b3 --- /dev/null +++ b/legacy/efreet/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/efreet/m4/efl_tests.m4 b/legacy/efreet/m4/efl_tests.m4 new file mode 100644 index 0000000000..3a4dfe246f --- /dev/null +++ b/legacy/efreet/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/efreet/src/tests/Makefile.am b/legacy/efreet/src/tests/Makefile.am index 375cd15d56..3170b569a9 100644 --- a/legacy/efreet/src/tests/Makefile.am +++ b/legacy/efreet/src/tests/Makefile.am @@ -39,3 +39,16 @@ efreet_spec_test.c efreet_cache_test_LDADD = $(top_builddir)/src/lib/libefreet.la @EFREET_LIBS@ efreet_cache_test_SOURCES = \ ef_cache.c + +if EFL_ENABLE_TESTS + +check_PROGRAMS = efreet_suite + +efreet_suite_SOURCES = \ +efreet_suite.c \ +efreet_test_efreet.c \ +efreet_test_efreet_cache.c + +efreet_suite_LDADD = @CHECK_LIBS@ $(top_builddir)/src/lib/libefreet.la + +endif diff --git a/legacy/efreet/src/tests/efreet_suite.c b/legacy/efreet/src/tests/efreet_suite.c new file mode 100644 index 0000000000..801a41376a --- /dev/null +++ b/legacy/efreet/src/tests/efreet_suite.c @@ -0,0 +1,103 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include + +#include "efreet_suite.h" + +typedef struct _Efreet_Test_Case Efreet_Test_Case; + +struct _Efreet_Test_Case +{ + const char *test_case; + void (*build)(TCase *tc); +}; + +static const Efreet_Test_Case etc[] = { + { "Efreet", efreet_test_efreet }, + { "Efreet Cache", efreet_test_efreet_cache }, + { NULL, NULL } +}; + +static void +_list_tests(void) +{ + const Efreet_Test_Case *itr; + + itr = etc; + fputs("Available Test Cases:\n", stderr); + for (; itr->test_case != NULL; 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 * +efreet_suite_build(int argc, const char **argv) +{ + TCase *tc; + Suite *s; + int i; + + s = suite_create("Efreet"); + + for (i = 0; etc[i].test_case != NULL; ++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 = efreet_suite_build(argc - 1, (const char **)argv + 1); + sr = srunner_create(s); + + srunner_run_all(sr, CK_NORMAL); + failed_count = srunner_ntests_failed(sr); + srunner_free(sr); + + return (failed_count == 0) ? 0 : 255; +} diff --git a/legacy/efreet/src/tests/efreet_suite.h b/legacy/efreet/src/tests/efreet_suite.h new file mode 100644 index 0000000000..bfb47f9dab --- /dev/null +++ b/legacy/efreet/src/tests/efreet_suite.h @@ -0,0 +1,10 @@ +#ifndef _EFREET_SUITE_H +#define _EFREET_SUITE_H + +#include + +void efreet_test_efreet(TCase *tc); +void efreet_test_efreet_cache(TCase *tc); + + +#endif /* _EFREET_SUITE_H */ diff --git a/legacy/efreet/src/tests/efreet_test_efreet.c b/legacy/efreet/src/tests/efreet_test_efreet.c new file mode 100644 index 0000000000..d35ec9effd --- /dev/null +++ b/legacy/efreet/src/tests/efreet_test_efreet.c @@ -0,0 +1,25 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "efreet_suite.h" + + +START_TEST(efreet_test_efreet_init) +{ + int ret; + + ret = efreet_init(); + fail_if(ret != 1); + + ret = efreet_shutdown(); + fail_if(ret != 0); +} +END_TEST + +void efreet_test_efreet(TCase *tc) +{ + tcase_add_test(tc, efreet_test_efreet_init); +} diff --git a/legacy/efreet/src/tests/efreet_test_efreet_cache.c b/legacy/efreet/src/tests/efreet_test_efreet_cache.c new file mode 100644 index 0000000000..83b320ae09 --- /dev/null +++ b/legacy/efreet/src/tests/efreet_test_efreet_cache.c @@ -0,0 +1,31 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "efreet_suite.h" + + +START_TEST(efreet_test_efreet_cache_init) +{ + int ret; + + ret = efreet_init(); + fail_if(ret != 1); + + ret = efreet_util_init(); + fail_if(ret != 1); + + ret = efreet_util_shutdown(); + fail_if(ret != 0); + + ret = efreet_shutdown(); + fail_if(ret != 0); +} +END_TEST + +void efreet_test_efreet_cache(TCase *tc) +{ + tcase_add_test(tc, efreet_test_efreet_cache_init); +}