]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-9775: add tests for dht buckets
authorcolm <colm@freeswitch1>
Sat, 10 Dec 2016 18:20:18 +0000 (13:20 -0500)
committerMike Jerris <mike@jerris.com>
Wed, 25 Jan 2017 20:59:35 +0000 (14:59 -0600)
libs/libks/test/Makefile.am
libs/libks/test/testbuckets.c [new file with mode: 0644]

index d32802aa9ea600b56cde6582c08eb297b72b2981..89e1fd45fe6ec6701ef7fe9d8e2a96e2e1388108 100644 (file)
@@ -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 (file)
index 0000000..4c7c4d0
--- /dev/null
@@ -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;
+
+}