From bc2e58a436002e1627a225663bc7b11dddc1172f Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Wed, 18 Feb 2015 14:47:01 +0100 Subject: testing: Switch to cmocka the successor of cmockery2 This uses https://cmocka.org/ as the unit testing framework. With this change, unit testing is made optional as well. We assume there is no cmocka available while building. cmocka will be enabled by default later on. For now, to build with cmocka run: $ ./configure --enable-cmocka This change is based on the work of Andreas (replacing cmockery2 with cmocka) and Kaleb (make cmockery2 an optional build dependency). The only modifications I made, are additional #defines in unittest.h for making sure the unit tests function as expected. Change-Id: Iea4cbcdaf09996b49ffcf3680c76731459cb197e BUG: 1067059 Merged-change: http://review.gluster.org/9762/ Signed-off-by: Andreas Schneider Signed-off-by: Kaleb S. KEITHLEY Signed-off-by: Niels de Vos Change-Id: Ia2e955481c102d5dce17695a9205395a6030e985 Reviewed-on: http://review.gluster.org/9738 Tested-by: Gluster Build System --- libglusterfs/src/Makefile.am | 6 ++-- libglusterfs/src/mem-pool.c | 3 +- libglusterfs/src/mem-pool.h | 4 ++- libglusterfs/src/unittest/global_mock.c | 2 +- libglusterfs/src/unittest/log_mock.c | 2 +- libglusterfs/src/unittest/mem_pool_unittest.c | 45 ++++++++++++++++----------- libglusterfs/src/unittest/unittest.h | 45 +++++++++++++++++++++++++++ 7 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 libglusterfs/src/unittest/unittest.h (limited to 'libglusterfs/src') diff --git a/libglusterfs/src/Makefile.am b/libglusterfs/src/Makefile.am index 181babe85b0..3d1de02e894 100644 --- a/libglusterfs/src/Makefile.am +++ b/libglusterfs/src/Makefile.am @@ -47,7 +47,8 @@ noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h timespec. gidcache.h client_t.h glusterfs-acl.h glfs-message-id.h \ template-component-messages.h strfd.h syncop-utils.h parse-utils.h \ $(CONTRIBDIR)/mount/mntent_compat.h lvm-defaults.h \ - $(CONTRIBDIR)/libexecinfo/execinfo_compat.h + $(CONTRIBDIR)/libexecinfo/execinfo_compat.h \ + unittest/unittest.h EXTRA_DIST = graph.l graph.y @@ -61,7 +62,7 @@ y.tab.h: graph.y CLEANFILES = graph.lex.c y.tab.c y.tab.h CONFIG_CLEAN_FILES = $(CONTRIB_BUILDDIR)/uuid/uuid_types.h -#### UNIT TESTS ##### +if UNITTEST CLEANFILES += *.gcda *.gcno *_xunit.xml noinst_PROGRAMS = TESTS = @@ -76,3 +77,4 @@ mem_pool_unittest_CFLAGS = $(UNITTEST_CFLAGS) mem_pool_unittest_LDFLAGS = $(UNITTEST_LDFLAGS) noinst_PROGRAMS += mem_pool_unittest TESTS += mem_pool_unittest +endif diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c index 019be95e37e..3bba30fc72e 100644 --- a/libglusterfs/src/mem-pool.c +++ b/libglusterfs/src/mem-pool.c @@ -24,8 +24,7 @@ #define GLUSTERFS_ENV_MEM_ACCT_STR "GLUSTERFS_DISABLE_MEM_ACCT" -#include -#include +#include "unittest/unittest.h" void gf_mem_acct_enable_set (void *data) diff --git a/libglusterfs/src/mem-pool.h b/libglusterfs/src/mem-pool.h index a6adb6cc8c2..88ec9705604 100644 --- a/libglusterfs/src/mem-pool.h +++ b/libglusterfs/src/mem-pool.h @@ -26,7 +26,9 @@ * unit test versions */ #ifdef UNIT_TESTING -#include +#include +#include +#include #endif #define GF_MEM_HEADER_SIZE (4 + sizeof (size_t) + sizeof (xlator_t *) + 4 + 8) diff --git a/libglusterfs/src/unittest/global_mock.c b/libglusterfs/src/unittest/global_mock.c index b50638d1023..afdadc4e868 100644 --- a/libglusterfs/src/unittest/global_mock.c +++ b/libglusterfs/src/unittest/global_mock.c @@ -16,7 +16,7 @@ #include #include -#include +#include xlator_t **__glusterfs_this_location () { diff --git a/libglusterfs/src/unittest/log_mock.c b/libglusterfs/src/unittest/log_mock.c index fec48bafc19..b35e03b3618 100644 --- a/libglusterfs/src/unittest/log_mock.c +++ b/libglusterfs/src/unittest/log_mock.c @@ -16,7 +16,7 @@ #include #include -#include +#include int _gf_log (const char *domain, const char *file, const char *function, int32_t line, gf_loglevel_t level, diff --git a/libglusterfs/src/unittest/mem_pool_unittest.c b/libglusterfs/src/unittest/mem_pool_unittest.c index 0d7aa199df0..906ebb0a7f3 100644 --- a/libglusterfs/src/unittest/mem_pool_unittest.c +++ b/libglusterfs/src/unittest/mem_pool_unittest.c @@ -17,8 +17,15 @@ #include #include #include -#include -#include +#include +#include + +#ifndef assert_ptr_equal +#define assert_ptr_equal(a, b) \ + _assert_int_equal(cast_ptr_to_largest_integral_type(a), \ + cast_ptr_to_largest_integral_type(b), \ + __FILE__, __LINE__) +#endif /* * memory header for gf_mem_set_acct_info @@ -252,7 +259,7 @@ test_gf_calloc_mem_acct_enabled(void **state) xl->ctx->mem_acct_enable = 1; // For line mem-pool.c:115 and mem-pool:118 - will_always_return(__glusterfs_this_location, &xl); + will_return_always(__glusterfs_this_location, &xl); // Call __gf_calloc size = 1024; @@ -319,7 +326,7 @@ test_gf_malloc_mem_acct_enabled(void **state) xl->ctx->mem_acct_enable = 1; // For line mem-pool.c:115 and mem-pool:118 - will_always_return(__glusterfs_this_location, &xl); + will_return_always(__glusterfs_this_location, &xl); // Call __gf_malloc size = 1024; @@ -352,7 +359,7 @@ test_gf_realloc_default_realloc(void **state) // Initialize xl xl = helper_xlator_init(10); assert_int_equal(xl->ctx->mem_acct_enable, 0); - will_always_return(__glusterfs_this_location, &xl); + will_return_always(__glusterfs_this_location, &xl); // Call __gf_malloc then realloc size = 10; @@ -391,7 +398,7 @@ test_gf_realloc_mem_acct_enabled(void **state) xl->ctx->mem_acct_enable = 1; // For line mem-pool.c:115 and mem-pool:118 - will_always_return(__glusterfs_this_location, &xl); + will_return_always(__glusterfs_this_location, &xl); // Call __gf_malloc then realloc size = 1024; @@ -436,7 +443,7 @@ test_gf_realloc_ptr(void **state) assert_int_equal(xl->ctx->mem_acct_enable, 0); // For line mem-pool.c:115 and mem-pool:118 - will_always_return(__glusterfs_this_location, &xl); + will_return_always(__glusterfs_this_location, &xl); // Tests according to the manpage for realloc @@ -458,18 +465,18 @@ test_gf_realloc_ptr(void **state) } int main(void) { - const UnitTest tests[] = { - unit_test(test_gf_mem_acct_enable_set), - unit_test(test_gf_mem_set_acct_info_asserts), - unit_test(test_gf_mem_set_acct_info_memory), - unit_test(test_gf_calloc_default_calloc), - unit_test(test_gf_calloc_mem_acct_enabled), - unit_test(test_gf_malloc_default_malloc), - unit_test(test_gf_malloc_mem_acct_enabled), - unit_test(test_gf_realloc_default_realloc), - unit_test(test_gf_realloc_mem_acct_enabled), - unit_test(test_gf_realloc_ptr), + const struct CMUnitTest libglusterfs_mem_pool_tests[] = { + cmocka_unit_test(test_gf_mem_acct_enable_set), + cmocka_unit_test(test_gf_mem_set_acct_info_asserts), + cmocka_unit_test(test_gf_mem_set_acct_info_memory), + cmocka_unit_test(test_gf_calloc_default_calloc), + cmocka_unit_test(test_gf_calloc_mem_acct_enabled), + cmocka_unit_test(test_gf_malloc_default_malloc), + cmocka_unit_test(test_gf_malloc_mem_acct_enabled), + cmocka_unit_test(test_gf_realloc_default_realloc), + cmocka_unit_test(test_gf_realloc_mem_acct_enabled), + cmocka_unit_test(test_gf_realloc_ptr), }; - return run_tests(tests, "libglusterfs_mem_pool"); + return cmocka_run_group_tests(libglusterfs_mem_pool_tests, NULL, NULL); } diff --git a/libglusterfs/src/unittest/unittest.h b/libglusterfs/src/unittest/unittest.h new file mode 100644 index 00000000000..6320217db0d --- /dev/null +++ b/libglusterfs/src/unittest/unittest.h @@ -0,0 +1,45 @@ +/* + Copyright (c) 2015 Red Hat, Inc. + This file is part of GlusterFS. + + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. +*/ + +#ifndef _GF_UNITTEST_H_ +#define _GF_UNITTEST_H_ + +#ifdef UNIT_TESTING +#include +#include +#include +#include +#include + +extern void mock_assert(const int result, const char* const expression, + const char * const file, const int line); + +// Change GF_CALLOC and GF_FREE to use +// cmocka memory allocation versions +#ifdef UNIT_TESTING +#undef GF_CALLOC +#define GF_CALLOC(n, s, t) test_calloc(n, s) +#undef GF_FREE +#define GF_FREE test_free + +/* Catch intended assert()'s while unit-testing */ +extern void mock_assert(const int result, const char* const expression, + const char * const file, const int line); + +#undef assert +#define assert(expression) \ + mock_assert((int)(expression), #expression, __FILE__, __LINE__); +#endif +#else +#define REQUIRE(p) /**/ +#define ENSURE(p) /**/ +#endif + +#endif /* _GF_UNITTEST */ -- cgit