summaryrefslogtreecommitdiff
path: root/auto_tests/dht_test.c
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2015-12-11 17:50:36 -0500
committerirungentoo <irungentoo@gmail.com>2015-12-11 17:50:36 -0500
commit2d93eb204804b0d02318ffdb9914e148d5e67488 (patch)
tree90d3d8accd24ec84129e1bd817d7f14bfcc0e54f /auto_tests/dht_test.c
parent7494c65bee705450a0fbf507c54c612c1df301a2 (diff)
Better DHT tests.
Diffstat (limited to 'auto_tests/dht_test.c')
-rw-r--r--auto_tests/dht_test.c304
1 files changed, 302 insertions, 2 deletions
diff --git a/auto_tests/dht_test.c b/auto_tests/dht_test.c
index 8304a046..e18d3b74 100644
--- a/auto_tests/dht_test.c
+++ b/auto_tests/dht_test.c
@@ -366,12 +366,311 @@ START_TEST(test_addto_lists_ipv6)
366} 366}
367END_TEST 367END_TEST
368 368
369#define DHT_DEFAULT_PORT (TOX_PORT_DEFAULT + 20)
370
371#define DHT_LIST_LENGTH 128
372
373void print_pk(uint8_t *public_key)
374{
375 uint32_t j;
376
377 for (j = 0; j < crypto_box_PUBLICKEYBYTES; j++) {
378 printf("%02hhX", public_key[j]);
379 }
380
381 printf("\n");
382}
383
384void test_add_to_list(uint8_t cmp_list[][crypto_box_PUBLICKEYBYTES + 1], unsigned int length, const uint8_t *pk,
385 const uint8_t *cmp_pk)
386{
387 uint8_t p_b[crypto_box_PUBLICKEYBYTES];
388 unsigned int i;
389
390 for (i = 0; i < length; ++i) {
391 if (!cmp_list[i][crypto_box_PUBLICKEYBYTES]) {
392 memcpy(cmp_list[i], pk, crypto_box_PUBLICKEYBYTES);
393 cmp_list[i][crypto_box_PUBLICKEYBYTES] = 1;
394 return;
395 } else {
396 if (memcmp(cmp_list[i], pk, crypto_box_PUBLICKEYBYTES) == 0) {
397 return;
398 }
399 }
400 }
401
402 for (i = 0; i < length; ++i) {
403 if (id_closest(cmp_pk, cmp_list[i], pk) == 2) {
404 memcpy(p_b, cmp_list[i], crypto_box_PUBLICKEYBYTES);
405 memcpy(cmp_list[i], pk, crypto_box_PUBLICKEYBYTES);
406 test_add_to_list(cmp_list, length, p_b, cmp_pk);
407 break;
408 }
409 }
410}
411
412void test_list_main()
413{
414 uint8_t keys[DHT_LIST_LENGTH][crypto_box_PUBLICKEYBYTES];
415 uint8_t cmp_list1[LCLIENT_LIST][crypto_box_PUBLICKEYBYTES + 1];
416 uint8_t cmp_list2[LCLIENT_LIST][crypto_box_PUBLICKEYBYTES + 1];
417
418 memset(cmp_list1, 0, sizeof(cmp_list1));
419 memset(cmp_list2, 0, sizeof(cmp_list2));
420 IP ip;
421 ip_init(&ip, 1);
422
423 unsigned int i, j;
424
425 for (i = 0; i < DHT_LIST_LENGTH; ++i) {
426 for (j = 0; j < crypto_box_PUBLICKEYBYTES; ++j)
427 keys[i][j] = rand();
428 }
429
430 DHT *dht1 = new_DHT(new_networking(ip, DHT_DEFAULT_PORT)), *dht2 = new_DHT(new_networking(ip, DHT_DEFAULT_PORT + 1));
431
432 ck_assert_msg(dht1 && dht2, "Failed to create DHTs");
433 memcpy(dht2->self_public_key, dht1->self_public_key, crypto_box_PUBLICKEYBYTES);
434 memcpy(dht2->self_secret_key, dht1->self_secret_key, crypto_box_SECRETKEYBYTES);
435
436 for (i = 0; i < DHT_LIST_LENGTH; ++i) {
437 IP_Port ip_port;
438 ip_init(&ip_port.ip, 0);
439 ip_port.ip.ip4.uint32 = rand();
440 ip_port.port = rand() % (UINT16_MAX - 1);
441 ++ip_port.port;
442 addto_lists(dht1, ip_port, keys[i]);
443
444 ip_init(&ip_port.ip, 0);
445 ip_port.ip.ip4.uint32 = rand();
446 ip_port.port = rand() % (UINT16_MAX - 1);
447 ++ip_port.port;
448 addto_lists(dht2, ip_port, keys[(DHT_LIST_LENGTH - (i + 1))]);
449
450 test_add_to_list(cmp_list1, LCLIENT_LIST, keys[i], dht1->self_public_key);
451 test_add_to_list(cmp_list2, LCLIENT_LIST, keys[(DHT_LIST_LENGTH - (i + 1))], dht2->self_public_key);
452 }
453
454 /*
455 for (i = 0; i < LCLIENT_LIST; ++i) {
456 printf("----Entry %u----\n", i);
457
458 print_pk(cmp_list1[i]);
459 print_pk(cmp_list2[i]);
460 print_pk(dht1->close_clientlist[i].public_key);
461 print_pk(dht2->close_clientlist[i].public_key);
462 }
463 */
464 for (i = 0; i < LCLIENT_LIST; ++i) {
465 uint8_t *pk = cmp_list1[i];
466
467 unsigned int count = 0;
468
469 for (j = 0; j < LCLIENT_LIST; ++j) {
470 if (memcmp(pk, cmp_list2[j], crypto_box_PUBLICKEYBYTES) == 0)
471 ++count;
472 }
473
474 ck_assert_msg(count == 1, "Bad distance formula");
475 }
476
477 for (i = 0; i < LCLIENT_LIST; ++i) {
478 uint8_t *pk = cmp_list1[i];
479
480 unsigned int count = 0;
481
482 for (j = 0; j < LCLIENT_LIST; ++j) {
483 if (memcmp(pk, dht1->close_clientlist[j].public_key, crypto_box_PUBLICKEYBYTES) == 0)
484 ++count;
485 }
486
487 ck_assert_msg(count == 1, "Keys not in first close list, %u, %X %X", i, cmp_list1[i][0], dht1->self_public_key[0]);
488
489 for (j = 0; j < LCLIENT_LIST; ++j) {
490 if (memcmp(pk, dht2->close_clientlist[j].public_key, crypto_box_PUBLICKEYBYTES) == 0)
491 ++count;
492 }
493
494 ck_assert_msg(count == 2, "Keys not in second close list, %u, %X %X", i, cmp_list1[i][0], dht2->self_public_key[0]);
495 }
496
497 uint8_t cmp_list3[MAX_SENT_NODES][crypto_box_PUBLICKEYBYTES + 1];
498 memset(cmp_list3, 0, sizeof(cmp_list3));
499
500 for (i = 0; i < DHT_LIST_LENGTH; ++i) {
501 test_add_to_list(cmp_list3, MAX_SENT_NODES, keys[i], dht1->self_public_key);
502 }
503
504 Node_format n_list[MAX_SENT_NODES];
505 ck_assert_msg(get_close_nodes(dht1, dht1->self_public_key, n_list, 0, 1, 0) == MAX_SENT_NODES,
506 "Wrong number of nodes returned");
507 /*
508 for (i = 0; i < MAX_SENT_NODES; ++i) {
509 printf("----Close %u----\n", i);
510
511 print_pk(cmp_list3[i]);
512 print_pk(n_list[i].public_key);
513 }
514 */
515
516 for (i = 0; i < MAX_SENT_NODES; ++i) {
517 uint8_t *pk = cmp_list3[i];
518 unsigned int count = 0;
519
520 for (j = 0; j < MAX_SENT_NODES; ++j) {
521 if (memcmp(pk, n_list[j].public_key, crypto_box_PUBLICKEYBYTES) == 0)
522 ++count;
523 }
524
525 ck_assert_msg(count == 1, "Bad get_close_nodes");
526 }
527
528 uint8_t cmp_new[crypto_box_PUBLICKEYBYTES];
529 memcpy(cmp_new, cmp_list3[0], crypto_box_PUBLICKEYBYTES);
530 ck_assert_msg(get_close_nodes(dht1, cmp_new, n_list, 0, 1, 0) == MAX_SENT_NODES,
531 "Wrong number of nodes returned");
532
533 memset(cmp_list3, 0, sizeof(cmp_list3));
534
535 for (i = 0; i < DHT_LIST_LENGTH; ++i) {
536 test_add_to_list(cmp_list3, MAX_SENT_NODES, keys[i], cmp_new);
537 }
538
539 for (i = 0; i < MAX_SENT_NODES; ++i) {
540 uint8_t *pk = cmp_list3[i];
541 unsigned int count = 0;
542
543 for (j = 0; j < MAX_SENT_NODES; ++j) {
544 if (memcmp(pk, n_list[j].public_key, crypto_box_PUBLICKEYBYTES) == 0)
545 ++count;
546 }
547
548 ck_assert_msg(count == 1, "Bad get_close_nodes");
549 }
550
551 void *n = dht1->net;
552 kill_DHT(dht1);
553 kill_networking(n);
554
555 n = dht2->net;
556 kill_DHT(dht2);
557 kill_networking(n);
558}
559
560
561START_TEST(test_list)
562{
563 unsigned int i;
564
565 for (i = 0; i < 10; ++i)
566 test_list_main();
567}
568END_TEST
569
570void ip_callback(void *data, int32_t number, IP_Port ip_port)
571{
572
573
574}
575
576
577#if defined(_WIN32) || defined(__WIN32__) || defined (WIN32)
578#define c_sleep(x) Sleep(1*x)
579#else
580#include <unistd.h>
581#define c_sleep(x) usleep(1000*x)
582#endif
583
584#define NUM_DHT 100
585#define NUM_DHT_FRIENDS 20
586
587START_TEST(test_DHT_test)
588{
589 uint32_t to_comp = 8394782;
590 DHT *dhts[NUM_DHT];
591
592 unsigned int i, j;
593
594 for (i = 0; i < NUM_DHT; ++i) {
595 IP ip;
596 ip_init(&ip, 1);
597
598 dhts[i] = new_DHT(new_networking(ip, DHT_DEFAULT_PORT + i));
599 ck_assert_msg(dhts[i] != 0, "Failed to create dht instances %u", i);
600 ck_assert_msg(dhts[i]->net->port != DHT_DEFAULT_PORT + i, "Bound to wrong port");
601 }
602
603 struct {
604 uint16_t tox1;
605 uint16_t tox2;
606 } pairs[NUM_DHT_FRIENDS];
607
608 uint8_t address[TOX_ADDRESS_SIZE];
609
610 unsigned int num_f = 0;
611
612 for (i = 0; i < NUM_DHT_FRIENDS; ++i) {
613loop_top:
614 pairs[i].tox1 = rand() % NUM_DHT;
615 pairs[i].tox2 = (pairs[i].tox1 + (rand() % (NUM_DHT - 1)) + 1) % NUM_DHT;
616
617 for (j = 0; j < i; ++j) {
618 if (pairs[j].tox2 == pairs[i].tox2 && pairs[j].tox1 == pairs[i].tox1)
619 goto loop_top;
620 }
621
622 uint16_t lock_count = 0;
623 ck_assert_msg(DHT_addfriend(dhts[pairs[i].tox2], dhts[pairs[i].tox1]->self_public_key, &ip_callback, &to_comp, 1337,
624 &lock_count) == 0, "Failed to add friend");
625 ck_assert_msg(lock_count == 1, "bad lock count: %u %u", lock_count, i);
626 }
627
628 for (i = 0; i < NUM_DHT; ++i) {
629 IP_Port ip_port;
630 ip_init(&ip_port.ip, 1);
631 ip_port.ip.ip6.uint8[15] = 1;
632 ip_port.port = htons(DHT_DEFAULT_PORT + i);
633 DHT_bootstrap(dhts[(i - 1) % NUM_DHT], ip_port, dhts[i]->self_public_key);
634 }
635
636 while (1) {
637 uint16_t counter = 0;
638
639 for (i = 0; i < NUM_DHT_FRIENDS; ++i) {
640 IP_Port a;
641
642 if (DHT_getfriendip(dhts[pairs[i].tox2], dhts[pairs[i].tox1]->self_public_key, &a) == 1)
643 ++counter;
644 }
645
646 if (counter == NUM_DHT_FRIENDS) {
647 break;
648 }
649
650 for (i = 0; i < NUM_DHT; ++i) {
651 networking_poll(dhts[i]->net);
652 do_DHT(dhts[i]);
653 }
654
655 c_sleep(500);
656 }
657
658 for (i = 0; i < NUM_DHT; ++i) {
659 void *n = dhts[i]->net;
660 kill_DHT(dhts[i]);
661 kill_networking(n);
662 }
663}
664END_TEST
665
369Suite *dht_suite(void) 666Suite *dht_suite(void)
370{ 667{
371 Suite *s = suite_create("DHT"); 668 Suite *s = suite_create("DHT");
372 669
373 DEFTESTCASE(addto_lists_ipv4); 670 //DEFTESTCASE(addto_lists_ipv4);
374 DEFTESTCASE(addto_lists_ipv6); 671 //DEFTESTCASE(addto_lists_ipv6);
672 DEFTESTCASE(list);
673 DEFTESTCASE_SLOW(DHT_test, 50);
375 return s; 674 return s;
376} 675}
377 676
@@ -383,6 +682,7 @@ int main(int argc, char *argv[])
383 SRunner *test_runner = srunner_create(dht); 682 SRunner *test_runner = srunner_create(dht);
384 683
385 int number_failed = 0; 684 int number_failed = 0;
685 //srunner_set_fork_status(test_runner, CK_NOFORK);
386 srunner_run_all(test_runner, CK_NORMAL); 686 srunner_run_all(test_runner, CK_NORMAL);
387 number_failed = srunner_ntests_failed(test_runner); 687 number_failed = srunner_ntests_failed(test_runner);
388 688