From 579e32013e474f0b9a1f112fe636266041807cfa Mon Sep 17 00:00:00 2001 From: colm Date: Sat, 10 Dec 2016 13:20:18 -0500 Subject: [PATCH] FS-9775: add tests for dht buckets --- libs/libks/test/Makefile.am | 5 + libs/libks/test/testbuckets.c | 278 ++++++++++++++++++++++++++++++++++ 2 files changed, 283 insertions(+) create mode 100644 libs/libks/test/testbuckets.c diff --git a/libs/libks/test/Makefile.am b/libs/libks/test/Makefile.am index d32802aa9e..89e1fd45fe 100644 --- a/libs/libks/test/Makefile.am +++ b/libs/libks/test/Makefile.am @@ -4,6 +4,11 @@ check_PROGRAMS = EXTRA_DIST = tap.h +check_PROGRAMS += testbuckets +testbuckets_SOURCES = testbuckets.c tap.c +testbuckets_CFLAGS = $(AM_CFLAGS) +testbuckets_LDADD = $(TEST_LDADD) + check_PROGRAMS += testpools testpools_SOURCES = testpools.c tap.c testpools_CFLAGS = $(AM_CFLAGS) diff --git a/libs/libks/test/testbuckets.c b/libs/libks/test/testbuckets.c new file mode 100644 index 0000000000..4c7c4d087c --- /dev/null +++ b/libs/libks/test/testbuckets.c @@ -0,0 +1,278 @@ +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#pragma GCC diagnostic ignored "-Wunused-variable" + +//#include "ks.h" +#include "../src/dht/ks_dht.h" + +ks_dhtrt_routetable_t* rt; +ks_pool_t* pool; + + +int doquery(ks_dhtrt_routetable_t* rt, uint8_t* id, enum ks_dht_nodetype_t type, enum ipfamily family) +{ + ks_dhtrt_querynodes_t query; + memset(&query, 0, sizeof(query)); + query.max = 30; + memcpy(&query.nodeid.id, id, KS_DHT_NODEID_SIZE); + query.family = family; + query.type = type; + + return ks_dhtrt_findclosest_nodes(rt, &query); +} + +void test01() +{ + printf("testbuckets - test01 start\n"); fflush(stdout); + ks_dhtrt_routetable_t* rt; + ks_dhtrt_initroute(&rt, pool); + ks_dhtrt_deinitroute(&rt); + + ks_dhtrt_initroute(&rt, pool); + ks_dht_nodeid_t nodeid, homeid; + memset(homeid.id, 0xdd, KS_DHT_NODEID_SIZE); + homeid.id[19] = 0; + + char ip[] = "192.168.100.100"; + unsigned short port = 7000; + ks_dht_node_t* peer; + + ks_status_t status; + status = ks_dhtrt_create_node(rt, homeid, ks_dht_local_t, ip, port, &peer); + if (status == KS_STATUS_FAIL) { + printf("*** ks_dhtrt_create_node test01 failed\n"); + exit(101); + } + + peer = ks_dhtrt_find_node(rt, homeid); + if (peer == 0) { + printf("*** ks_dhtrt_find_node test01 failed \n"); fflush(stdout); + exit(102); + } + + status = ks_dhtrt_create_node(rt, homeid, ks_dht_local_t, ip, port, &peer); + if (status != KS_STATUS_FAIL) { + printf("*** ks_dhtrt_create_node test01 allowed duplicate!!\n"); + exit(103); + } + + status = ks_dhtrt_delete_node(rt, peer); + if (status == KS_STATUS_FAIL) { + printf("*** ks_dhtrt_delete_node test01 failed\n"); + exit(104); + } + + printf("*** testbuckets - test01 complete\n"); fflush(stdout); +} + +void test02() +{ + ks_dht_node_t* peer; + ks_dht_nodeid_t nodeid; + memset(nodeid.id, 0xef, KS_DHT_NODEID_SIZE); + + char ipv6[] = "1234:1234:1234:1234"; + char ipv4[] = "123.123.123.123"; + unsigned short port = 7000; + enum ipfamily both = ifboth; + + ks_status_t status; + + nodeid.id[0] = 1; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_local_t, ipv6, port, &peer); + nodeid.id[0] = 2; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv6, port, &peer); + nodeid.id[0] = 3; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv6, port, &peer); + nodeid.id[0] = 4; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_local_t, ipv6, port, &peer); + nodeid.id[1] = 1; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv6, port, &peer); + + + nodeid.id[19] = 1; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv4, port, &peer); + nodeid.id[19] = 2; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv4, port, &peer); + nodeid.id[19] = 3; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv4, port, &peer); + nodeid.id[19] = 4; + status = ks_dhtrt_create_node(rt, nodeid, ks_dht_local_t, ipv4, port, &peer); + + int qcount = doquery(rt, nodeid.id, ks_dht_local_t, both); + printf("\n*** local query count expected 3, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_remote_t, both); + printf("\n*** remote query count expected 6, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_both_t, both); + printf("\n*** both query count expected 9, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_local_t, ifv4); + printf("\n*** local AF_INET query count expected 1, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_local_t, ifv6); + printf("\n*** local AF_INET6 query count expected 2, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_both_t, ifv6); + printf("\n*** AF_INET6 count expected 5, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_remote_t, ifv4); + printf("\n*** remote AF_INET query count expected 3, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_remote_t, ifv6); + printf("\n*** remote AF_INET6 query count expected 3, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_both_t, ifv4); + printf("\n*** AF_INET count expected 4, actual %d\n", qcount); fflush(stdout); + + return; +} + +/* this is similar to test2 but after mutiple table splits. */ + +void test03() +{ + ks_dht_node_t* peer; + ks_dht_nodeid_t nodeid; + memset(nodeid.id, 0xef, KS_DHT_NODEID_SIZE); + + char ipv6[] = "1234:1234:1234:1234"; + char ipv4[] = "123.123.123.123"; + unsigned short port = 7000; + enum ipfamily both = ifboth; + + ks_status_t status; + + for (int i=0; i<200; ++i) { + if (i%10 == 0) { + ++nodeid.id[0]; + } + else { + ++nodeid.id[1]; + } + ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv4, port, &peer); + } + + for (int i=0; i<2; ++i) { + if (i%10 == 0) { + ++nodeid.id[0]; + } + else { + ++nodeid.id[1]; + } + + ks_dhtrt_create_node(rt, nodeid, ks_dht_local_t, ipv4, port, &peer); + } + + for (int i=0; i<201; ++i) { + if (i%10 == 0) { + ++nodeid.id[0]; + } + else { + ++nodeid.id[1]; + } + ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv6, port, &peer); + } + + + int qcount = doquery(rt, nodeid.id, ks_dht_local_t, both); + printf("\n** local query count expected 3, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_remote_t, both); + printf("\n*** remote query count expected 6, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_both_t, both); + printf("\n*** both query count expected 9, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_local_t, ifv4); + printf("\n*** local AF_INET query count expected 1, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_local_t, ifv6); + printf("\n*** local AF_INET6 query count expected 2, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_both_t, ifv6); + printf("\n*** AF_INET6 count expected 5, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_remote_t, ifv4); + printf("\n** remote AF_INET query count expected 3, actual %d\n", qcount); fflush(stdout); + qcount = doquery(rt, nodeid.id, ks_dht_remote_t, ifv6); + printf("\n*** remote AF_INET6 query count expected 3, actual %d\n", qcount); fflush(stdout); + + qcount = doquery(rt, nodeid.id, ks_dht_both_t, ifv4); + printf("\n*** AF_INET count expected 4, actual %d\n", qcount); fflush(stdout); + + return; +} + +void test04() +{ + ks_dht_node_t* peer; + ks_dht_nodeid_t nodeid; + memset(nodeid.id, 0xef, KS_DHT_NODEID_SIZE); + + char ipv6[] = "1234:1234:1234:1234"; + char ipv4[] = "123.123.123.123"; + unsigned short port = 7000; + enum ipfamily both = ifboth; + + ks_status_t status; + + for (int i=0,i2=0; i<10000; ++i) { + if (i%40 == 0) { + ++nodeid.id[0]; + if(i2%40 == 0) { + ++nodeid.id[1]; + } + else { + ++nodeid.id[2]; + } + } + else { + ++nodeid.id[1]; + } + ks_dhtrt_create_node(rt, nodeid, ks_dht_remote_t, ipv4, port, &peer); + } + + + memset(nodeid.id, 0x2f, KS_DHT_NODEID_SIZE); + ks_time_t t0 = ks_time_now(); + int qcount = doquery(rt, nodeid.id, ks_dht_both_t, ifv4); + ks_time_t t1 = ks_time_now(); + + int tx = t1 - t0; + t1 /= 1000; + + printf("*** query on 10k nodes in %d ms\n", tx); + + + return; +} + + + +int main(int argx, char* argv[]) { + + printf("testdhtbuckets - start\n"); + + ks_init(); + + ks_status_t status; + char *str = NULL; + int bytes = 1024; + ks_dht_nodeid_t homeid; + ks_dht_nodeid_t nodeid, nodeid1, nodeid2; + ks_dht_node_t *peer, *peer1, *peer2; + + memset(homeid.id, 0xde, KS_DHT_NODEID_SIZE); + memset(nodeid.id, 0xef, KS_DHT_NODEID_SIZE); + + ks_init(); + status = ks_pool_open(&pool); + + printf("init/deinit routeable\n"); fflush(stdout); + + ks_dhtrt_initroute(&rt, pool); + ks_dhtrt_deinitroute(&rt); + + ks_dhtrt_initroute(&rt, pool); + test01(); + test02(); + test03(); + test04(); + + return 0; + +}