diff options
author | irungentoo <irungentoo@gmail.com> | 2015-12-11 17:50:36 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2015-12-11 17:50:36 -0500 |
commit | 2d93eb204804b0d02318ffdb9914e148d5e67488 (patch) | |
tree | 90d3d8accd24ec84129e1bd817d7f14bfcc0e54f /auto_tests/dht_test.c | |
parent | 7494c65bee705450a0fbf507c54c612c1df301a2 (diff) |
Better DHT tests.
Diffstat (limited to 'auto_tests/dht_test.c')
-rw-r--r-- | auto_tests/dht_test.c | 304 |
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 | } |
367 | END_TEST | 367 | END_TEST |
368 | 368 | ||
369 | #define DHT_DEFAULT_PORT (TOX_PORT_DEFAULT + 20) | ||
370 | |||
371 | #define DHT_LIST_LENGTH 128 | ||
372 | |||
373 | void 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 | |||
384 | void 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 | |||
412 | void 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 | |||
561 | START_TEST(test_list) | ||
562 | { | ||
563 | unsigned int i; | ||
564 | |||
565 | for (i = 0; i < 10; ++i) | ||
566 | test_list_main(); | ||
567 | } | ||
568 | END_TEST | ||
569 | |||
570 | void 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 | |||
587 | START_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) { | ||
613 | loop_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 | } | ||
664 | END_TEST | ||
665 | |||
369 | Suite *dht_suite(void) | 666 | Suite *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 | ||