diff options
| author | Luis Pabon <lpabon@redhat.com> | 2014-02-20 13:50:19 -0500 | 
|---|---|---|
| committer | Vijay Bellur <vbellur@redhat.com> | 2014-03-06 04:10:46 -0800 | 
| commit | c817c214033481fe59f9f44c325a9092dc337d07 (patch) | |
| tree | 2259dd37b25b12fdd6a6db1738f0f2a73e71180d /xlators/cluster/dht/src | |
| parent | a193f2262b93a06bf1a299f423d4ebaaa171a539 (diff) | |
build: GlusterFS Unit Test Framework
This patch will allow for developers to create unit tests for
their code.  Documentation has been added to the patch and
is available here:
doc/hacker-guide/en-US/markdown/unittest.md
Also, unit tests are run when RPM is created.
BUG: 1067059
Change-Id: I95cf8bb0354d4ca4ed4476a0f2385436a17d2369
Signed-off-by: Vijay Bellur <vbellur@redhat.com>
Signed-off-by: Luis Pabon <lpabon@redhat.com>
Reviewed-on: http://review.gluster.org/7145
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Rajesh Joseph <rjoseph@redhat.com>
Reviewed-by: Justin Clift <justin@gluster.org>
Tested-by: Justin Clift <justin@gluster.org>
Diffstat (limited to 'xlators/cluster/dht/src')
| -rw-r--r-- | xlators/cluster/dht/src/Makefile.am | 15 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-layout.c | 20 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/unittest/dht_layout_mock.c | 63 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/unittest/dht_layout_unittest.c | 124 | 
4 files changed, 222 insertions, 0 deletions
diff --git a/xlators/cluster/dht/src/Makefile.am b/xlators/cluster/dht/src/Makefile.am index 174bea84110..3032705b5d5 100644 --- a/xlators/cluster/dht/src/Makefile.am +++ b/xlators/cluster/dht/src/Makefile.am @@ -36,3 +36,18 @@ uninstall-local:  install-data-hook:  	ln -sf dht.so $(DESTDIR)$(xlatordir)/distribute.so + +#### UNIT TESTS ##### +CLEANFILES += *.gcda *.gcno *_xunit.xml +noinst_PROGRAMS = +TESTS = + +dht_layout_unittest_CPPFLAGS = $(UNITTEST_CPPFLAGS) $(AM_CPPFLAGS) +dht_layout_unittest_SOURCES = unittest/dht_layout_unittest.c \ +                              unittest/dht_layout_mock.c \ +                              dht-layout.c +dht_layout_unittest_CFLAGS = $(UNITTEST_CFLAGS) +dht_layout_unittest_LDADD = $(UNITTEST_LDADD) +dht_layout_unittest_LDFLAGS = $(UNITTEST_LDFLAGS) +noinst_PROGRAMS += dht_layout_unittest +TESTS += dht_layout_unittest diff --git a/xlators/cluster/dht/src/dht-layout.c b/xlators/cluster/dht/src/dht-layout.c index 31d85a5060b..deaa493f908 100644 --- a/xlators/cluster/dht/src/dht-layout.c +++ b/xlators/cluster/dht/src/dht-layout.c @@ -25,6 +25,19 @@  #define layout_size(cnt) (layout_base_size + (cnt * layout_entry_size)) +#include <cmockery/pbc.h> +#include <cmockery/cmockery_override.h> + +// Change GF_CALLOC and GF_FREE to use +// cmockery2 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 +#endif + +  dht_layout_t *  dht_layout_new (xlator_t *this, int cnt) @@ -32,6 +45,8 @@ dht_layout_new (xlator_t *this, int cnt)          dht_layout_t *layout = NULL;          dht_conf_t   *conf = NULL; +        REQUIRE(NULL != this); +        REQUIRE(cnt >= 0);          conf = this->private; @@ -50,6 +65,11 @@ dht_layout_new (xlator_t *this, int cnt)          }          layout->ref = 1; + +        ENSURE(NULL != layout); +        ENSURE(layout->type == DHT_HASH_TYPE_DM); +        ENSURE(layout->cnt == cnt); +        ENSURE(layout->ref == 1);  out:          return layout;  } diff --git a/xlators/cluster/dht/src/unittest/dht_layout_mock.c b/xlators/cluster/dht/src/unittest/dht_layout_mock.c new file mode 100644 index 00000000000..aa19ddc575d --- /dev/null +++ b/xlators/cluster/dht/src/unittest/dht_layout_mock.c @@ -0,0 +1,63 @@ +/* +  Copyright (c) 2014 Red Hat, Inc. <http://www.redhat.com> +  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 _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#include "glusterfs.h" +#include "xlator.h" +#include "dht-common.h" +#include "byte-order.h" + +int +dht_hash_compute (xlator_t *this, int type, const char *name, uint32_t *hash_p) +{ +    return 0; +} + +int +dht_inode_ctx_layout_get (inode_t *inode, xlator_t *this, dht_layout_t **layout) +{ +    return 0; +} + +int +dht_inode_ctx_layout_set (inode_t *inode, xlator_t *this, +                          dht_layout_t *layout_int) +{ +    return 0; +} + +int +dict_get_ptr (dict_t *this, char *key, void **ptr) +{ +    return 0; +} + +int +dict_get_ptr_and_len (dict_t *this, char *key, void **ptr, int *len) +{ +    return 0; +} + +int _gf_log (const char *domain, const char *file, +             const char *function, int32_t line, gf_loglevel_t level, +             const char *fmt, ...) +{ +    return 0; +} + +int _gf_log_callingfn (const char *domain, const char *file, +                       const char *function, int32_t line, gf_loglevel_t level, +                       const char *fmt, ...) +{ +    return 0; +} diff --git a/xlators/cluster/dht/src/unittest/dht_layout_unittest.c b/xlators/cluster/dht/src/unittest/dht_layout_unittest.c new file mode 100644 index 00000000000..b5233d235d0 --- /dev/null +++ b/xlators/cluster/dht/src/unittest/dht_layout_unittest.c @@ -0,0 +1,124 @@ +/* +  Copyright (c) 2008-2014 Red Hat, Inc. <http://www.redhat.com> +  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. +*/ + +#include "dht-common.h" +#include "logging.h" +#include "xlator.h" + +#include <stdarg.h> +#include <stddef.h> +#include <setjmp.h> +#include <inttypes.h> +#include <cmockery/pbc.h> +#include <cmockery/cmockery.h> + +/* + * Helper functions + */ + +static xlator_t * +helper_xlator_init(uint32_t num_types) +{ +    xlator_t *xl; +    int i, ret; + +    REQUIRE(num_types > 0); + +    xl = test_calloc(1, sizeof(xlator_t)); +    assert_non_null(xl); +    xl->mem_acct.num_types = num_types; +    xl->mem_acct.rec = test_calloc(num_types, sizeof(struct mem_acct_rec)); +    assert_non_null(xl->mem_acct.rec); + +    xl->ctx = test_calloc(1, sizeof(glusterfs_ctx_t)); +    assert_non_null(xl->ctx); + +    for (i = 0; i < num_types; i++) { +            ret = LOCK_INIT(&(xl->mem_acct.rec[i].lock)); +            assert_false(ret); +    } + +    ENSURE(num_types == xl->mem_acct.num_types); +    ENSURE(NULL != xl); + +    return xl; +} + +static int +helper_xlator_destroy(xlator_t *xl) +{ +    int i, ret; + +    for (i = 0; i < xl->mem_acct.num_types; i++) { +            ret = LOCK_DESTROY(&(xl->mem_acct.rec[i].lock)); +            assert_int_equal(ret, 0); +    } + +    free(xl->mem_acct.rec); +    free(xl->ctx); +    free(xl); +    return 0; +} + +/* + * Unit tests + */ +static void +test_dht_layout_new(void **state) +{ +    xlator_t *xl; +    dht_layout_t *layout; +    dht_conf_t   *conf; +    int cnt; + +    expect_assert_failure(dht_layout_new(NULL, 0)); +    expect_assert_failure(dht_layout_new((xlator_t *)0x12345, -1)); +    xl = helper_xlator_init(10); + +    // xl->private is NULL +    assert_null(xl->private); +    cnt = 100; +    layout = dht_layout_new(xl, cnt); +    assert_non_null(layout); +    assert_int_equal(layout->type, DHT_HASH_TYPE_DM); +    assert_int_equal(layout->cnt, cnt); +    assert_int_equal(layout->ref, 1); +    assert_int_equal(layout->gen, 0); +    assert_int_equal(layout->spread_cnt, 0); +    free(layout); + +    // xl->private is not NULL +    cnt = 110; +    conf = (dht_conf_t *)test_calloc(1, sizeof(dht_conf_t)); +    assert_non_null(conf); +    conf->dir_spread_cnt = 12345; +    conf->gen = -123; +    xl->private = conf; + +    layout = dht_layout_new(xl, cnt); +    assert_non_null(layout); +    assert_int_equal(layout->type, DHT_HASH_TYPE_DM); +    assert_int_equal(layout->cnt, cnt); +    assert_int_equal(layout->ref, 1); +    assert_int_equal(layout->gen, conf->gen); +    assert_int_equal(layout->spread_cnt, conf->dir_spread_cnt); +    free(layout); + +    free(conf); +    helper_xlator_destroy(xl); +} + +int main(void) { +    const UnitTest tests[] = { +        unit_test(test_dht_layout_new), +    }; + +    return run_tests(tests, "xlator_dht_layout"); +}  | 
