X-Git-Url: https://pd.if.org/git/?p=nbds;a=blobdiff_plain;f=test%2Fmap_test2.c;h=1ba4e42b91e75faa510a255b6df255684025bdb7;hp=51b17b3f10cbf7f75eabdb8cbc7ea1260198f216;hb=329b5ab58cde015f4faec1879d3106f635294dd6;hpb=f3a053a46bbb4ba460bcff0920b93dfc8263e02e diff --git a/test/map_test2.c b/test/map_test2.c index 51b17b3..1ba4e42 100644 --- a/test/map_test2.c +++ b/test/map_test2.c @@ -19,7 +19,7 @@ #define ASSERT_EQUAL(x, y) CuAssertIntEquals(tc, x, y) -#define TEST_STRING_KEYS +//#define TEST_STRING_KEYS typedef struct worker_data { int id; @@ -30,8 +30,18 @@ typedef struct worker_data { static const map_impl_t *map_type_; +static uint64_t iterator_size (map_t *map) { + map_iter_t *iter = map_iter_begin(map, NULL); + uint64_t count = 0; + while (map_iter_next(iter, NULL) != DOES_NOT_EXIST) { + count++; + } + map_iter_free(iter); + return count; +} + // Test some basic stuff; add a few keys, remove a few keys -void simple (CuTest* tc) { +void basic_test (CuTest* tc) { #ifdef TEST_STRING_KEYS map_t *map = map_alloc(map_type_, &DATATYPE_NSTRING); @@ -50,29 +60,37 @@ void simple (CuTest* tc) { ASSERT_EQUAL( 0, map_count (map) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_add (map, k1,10) ); ASSERT_EQUAL( 1, map_count (map) ); + ASSERT_EQUAL( 1, iterator_size(map) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_add (map, k2,20) ); ASSERT_EQUAL( 2, map_count (map) ); + ASSERT_EQUAL( 2, iterator_size(map) ); ASSERT_EQUAL( 20, map_get (map, k2) ); ASSERT_EQUAL( 10, map_set (map, k1,11) ); ASSERT_EQUAL( 20, map_set (map, k2,21) ); ASSERT_EQUAL( 2, map_count (map) ); + ASSERT_EQUAL( 2, iterator_size(map) ); ASSERT_EQUAL( 21, map_add (map, k2,22) ); ASSERT_EQUAL( 11, map_remove (map, k1) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_get (map, k1) ); ASSERT_EQUAL( 1, map_count (map) ); + ASSERT_EQUAL( 1, iterator_size(map) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_remove (map, k1) ); ASSERT_EQUAL( 21, map_remove (map, k2) ); ASSERT_EQUAL( 0, map_count (map) ); + ASSERT_EQUAL( 0, iterator_size(map) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_remove (map, k2) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_remove (map, k3) ); ASSERT_EQUAL( 0, map_count (map) ); + ASSERT_EQUAL( 0, iterator_size(map) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_add (map, k4,40) ); ASSERT_EQUAL( 40, map_get (map, k4) ); ASSERT_EQUAL( 1, map_count (map) ); + ASSERT_EQUAL( 1, iterator_size(map) ); ASSERT_EQUAL( 40, map_remove (map, k4) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_get (map, k4) ); ASSERT_EQUAL( 0, map_count (map) ); + ASSERT_EQUAL( 0, iterator_size(map) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_replace(map, k4,10) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_get (map, k4) ); @@ -82,6 +100,7 @@ void simple (CuTest* tc) { ASSERT_EQUAL( 41, map_remove (map, k4) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_get (map, k4) ); ASSERT_EQUAL( 0, map_count (map) ); + ASSERT_EQUAL( 0, iterator_size(map) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_replace(map, k2,20) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_get (map, k2) ); @@ -93,11 +112,14 @@ void simple (CuTest* tc) { ASSERT_EQUAL( 21, map_remove (map, k2) ); ASSERT_EQUAL( DOES_NOT_EXIST, map_get (map, k2) ); ASSERT_EQUAL( 0, map_count (map) ); + ASSERT_EQUAL( 0, iterator_size(map) ); map_free(map); - // In a quiecent state; it is safe to free. - rcu_update(); + rcu_update(); // In a quiecent state. +#ifdef TEST_STRING_KEYS + nbd_free(k1); nbd_free(k2); nbd_free(k3); nbd_free(k4); +#endif } void *add_remove_worker (void *arg) { @@ -125,8 +147,8 @@ void *add_remove_worker (void *arg) { key = (void *)i; #endif TRACE("t0", "test map_add() iteration (%llu, %llu)", j, i); - CuAssertIntEquals_Msg(tc, (void *)i, DOES_NOT_EXIST, map_add(map, key, d+1) ); - rcu_update(); + ASSERT_EQUAL(DOES_NOT_EXIST, map_add(map, key, d+1) ); + rcu_update(); // In a quiecent state. } for (uint64_t i = d+1; i < iters; i+=2) { #ifdef TEST_STRING_KEYS @@ -136,15 +158,15 @@ void *add_remove_worker (void *arg) { key = (void *)i; #endif TRACE("t0", "test map_remove() iteration (%llu, %llu)", j, i); - CuAssertIntEquals_Msg(tc, (void *)i, d+1, map_remove(map, key) ); - rcu_update(); + ASSERT_EQUAL(d+1, map_remove(map, key) ); + rcu_update(); // In a quiecent state. } } return NULL; } // Do some simple concurrent testing -void add_remove (CuTest* tc) { +void concurrent_add_remove_test (CuTest* tc) { pthread_t thread[2]; worker_data_t wd[2]; @@ -181,20 +203,101 @@ void add_remove (CuTest* tc) { // In the end, all members should be removed ASSERT_EQUAL( 0, map_count(map) ); + ASSERT_EQUAL( 0, iterator_size(map) ); // In a quiecent state; it is safe to free. map_free(map); } -void *inserter_worker (void *arg) { - //pthread_t thread[NUM_THREADS]; +void basic_iteration_test (CuTest* tc) { +#ifdef TEST_STRING_KEYS + map_t *map = map_alloc(map_type_, &DATATYPE_NSTRING); + nstring_t *k1 = ns_alloc(3); strcpy(k1->data, "k1"); + nstring_t *k2 = ns_alloc(3); strcpy(k1->data, "k2"); + nstring_t *x_k; + nstring_t *y_k; +#else + map_t *map = map_alloc(map_type_, NULL); + void *k1 = (void *)1; + void *k2 = (void *)2; + void *x_k; + void *y_k; +#endif - //map_t *map = map_alloc(map_type_); - return NULL; + ASSERT_EQUAL( DOES_NOT_EXIST, map_add (map, k1,1) ); + ASSERT_EQUAL( DOES_NOT_EXIST, map_add (map, k2,2) ); + + uint64_t x_v, y_v; + map_iter_t *iter = map_iter_begin(map, NULL); + x_v = map_iter_next(iter, &x_k); + y_v = map_iter_next(iter, &y_k); + ASSERT_EQUAL( DOES_NOT_EXIST, map_iter_next(iter, NULL) ); + map_iter_free(iter); +#ifdef TEST_STRING_KEYS + ASSERT_EQUAL( TRUE, (ns_cmp(x_k, k1) == 0 && x_v == 1) || (ns_cmp(y_k, k1) == 0 && y_v == 1) ); + ASSERT_EQUAL( TRUE, (ns_cmp(x_k, k2) == 0 && x_v == 2) || (ns_cmp(y_k, k2) == 0 && y_v == 2) ); + nbd_free(k1); + nbd_free(k2); +#else + ASSERT_EQUAL( TRUE, (x_k == k1 && x_v == 1) || (y_k == k1 && y_v == 1) ); + ASSERT_EQUAL( TRUE, (x_k == k2 && x_v == 2) || (y_k == k2 && y_v == 2) ); +#endif + + map_free(map); } -// Concurrent insertion -void concurrent_insert (CuTest* tc) { +void big_iteration_test (CuTest* tc) { + static const int n = 10000; + +#ifdef TEST_STRING_KEYS + map_t *map = map_alloc(map_type_, &DATATYPE_NSTRING); + nstring_t *key = ns_alloc(9); + nstring_t *k3 = ns_alloc(3); strcpy(k1->data, "k3"); + nstring_t *k4 = ns_alloc(3); strcpy(k1->data, "k4"); +#else + map_t *map = map_alloc(map_type_, NULL); + void *k3 = (void *)3; + void *k4 = (void *)4; + void *key; +#endif + + for (size_t i = 1; i <= n; ++i) { +#ifdef TEST_STRING_KEYS + memset(key->data, 0, key->len); + snprintf(key->data, key->len, "k%llu", i); +#else + key = (void *)i; +#endif + ASSERT_EQUAL( DOES_NOT_EXIST, map_get(map, key) ); + ASSERT_EQUAL( DOES_NOT_EXIST, map_set(map, key, i) ); + ASSERT_EQUAL( i, map_get(map, key) ); + rcu_update(); // In a quiecent state. + } + + ASSERT_EQUAL( n, map_count(map) ); + ASSERT_EQUAL( n, iterator_size(map) ); + + uint64_t sum = 0; + uint64_t val; + map_iter_t *iter = map_iter_begin(map, NULL); + while ((val = map_iter_next(iter, NULL)) != DOES_NOT_EXIST) { + sum += val; + } + map_iter_free(iter); + ASSERT_EQUAL(n*(n+1)/2, sum); + ASSERT_EQUAL(3, map_remove(map, k3)); + ASSERT_EQUAL(4, map_remove(map, k4)); + sum = 0; + iter = map_iter_begin(map, NULL); + while ((val = map_iter_next(iter, NULL)) != DOES_NOT_EXIST) { + sum += val; + } + map_iter_free(iter); + ASSERT_EQUAL(n*(n+1)/2 - (3+4), sum); + +#ifdef TEST_STRING_KEYS + nbd_free(key); +#endif } int main (void) { @@ -210,8 +313,10 @@ int main (void) { CuString *output = CuStringNew(); CuSuite* suite = CuSuiteNew(); - SUITE_ADD_TEST(suite, simple); - SUITE_ADD_TEST(suite, add_remove); + SUITE_ADD_TEST(suite, basic_test); + SUITE_ADD_TEST(suite, concurrent_add_remove_test); + SUITE_ADD_TEST(suite, basic_iteration_test); + SUITE_ADD_TEST(suite, big_iteration_test); CuSuiteRun(suite); CuSuiteDetails(suite, output);