DHTRoutingTableTest.cc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "DHTRoutingTable.h"
  2. #include <cstring>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "Exception.h"
  5. #include "util.h"
  6. #include "DHTNode.h"
  7. #include "DHTBucket.h"
  8. #include "MockDHTTaskQueue.h"
  9. #include "MockDHTTaskFactory.h"
  10. #include "DHTTask.h"
  11. namespace aria2 {
  12. class DHTRoutingTableTest : public CppUnit::TestFixture {
  13. CPPUNIT_TEST_SUITE(DHTRoutingTableTest);
  14. CPPUNIT_TEST(testAddNode);
  15. CPPUNIT_TEST(testAddNode_localNode);
  16. CPPUNIT_TEST(testGetClosestKNodes);
  17. CPPUNIT_TEST_SUITE_END();
  18. public:
  19. void setUp() {}
  20. void tearDown() {}
  21. void testAddNode();
  22. void testAddNode_localNode();
  23. void testGetClosestKNodes();
  24. };
  25. CPPUNIT_TEST_SUITE_REGISTRATION(DHTRoutingTableTest);
  26. void DHTRoutingTableTest::testAddNode()
  27. {
  28. auto localNode = std::make_shared<DHTNode>();
  29. DHTRoutingTable table(localNode);
  30. auto taskFactory = make_unique<MockDHTTaskFactory>();
  31. table.setTaskFactory(taskFactory.get());
  32. auto taskQueue = make_unique<MockDHTTaskQueue>();
  33. table.setTaskQueue(taskQueue.get());
  34. uint32_t count = 0;
  35. for (int i = 0; i < 100; ++i) {
  36. if (table.addNode(std::make_shared<DHTNode>())) {
  37. ++count;
  38. }
  39. }
  40. table.showBuckets();
  41. }
  42. void DHTRoutingTableTest::testAddNode_localNode()
  43. {
  44. auto localNode = std::make_shared<DHTNode>();
  45. DHTRoutingTable table(localNode);
  46. auto taskFactory = make_unique<MockDHTTaskFactory>();
  47. table.setTaskFactory(taskFactory.get());
  48. auto taskQueue = make_unique<MockDHTTaskQueue>();
  49. table.setTaskQueue(taskQueue.get());
  50. auto newNode = std::make_shared<DHTNode>(localNode->getID());
  51. CPPUNIT_ASSERT(!table.addNode(newNode));
  52. }
  53. namespace {
  54. void createID(unsigned char* id, unsigned char firstChar,
  55. unsigned char lastChar)
  56. {
  57. memset(id, 0, DHT_ID_LENGTH);
  58. id[0] = firstChar;
  59. id[DHT_ID_LENGTH - 1] = lastChar;
  60. }
  61. } // namespace
  62. void DHTRoutingTableTest::testGetClosestKNodes()
  63. {
  64. unsigned char id[DHT_ID_LENGTH];
  65. createID(id, 0x81, 0);
  66. auto localNode = std::make_shared<DHTNode>(id);
  67. DHTRoutingTable table(localNode);
  68. std::shared_ptr<DHTNode> nodes1[8];
  69. std::shared_ptr<DHTNode> nodes2[8];
  70. std::shared_ptr<DHTNode> nodes3[8];
  71. for (size_t i = 0; i < DHTBucket::K; ++i) {
  72. createID(id, 0xf0, i);
  73. nodes1[i] = std::make_shared<DHTNode>(id);
  74. CPPUNIT_ASSERT(table.addNode(nodes1[i]));
  75. }
  76. for (size_t i = 0; i < DHTBucket::K; ++i) {
  77. createID(id, 0x80, i);
  78. nodes2[i] = std::make_shared<DHTNode>(id);
  79. CPPUNIT_ASSERT(table.addNode(nodes2[i]));
  80. }
  81. for (size_t i = 0; i < DHTBucket::K; ++i) {
  82. createID(id, 0x70, i);
  83. nodes3[i] = std::make_shared<DHTNode>(id);
  84. CPPUNIT_ASSERT(table.addNode(nodes3[i]));
  85. }
  86. {
  87. createID(id, 0x80, 0x10);
  88. std::vector<std::shared_ptr<DHTNode>> nodes;
  89. table.getClosestKNodes(nodes, id);
  90. CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size());
  91. for (size_t i = 0; i < nodes.size(); ++i) {
  92. CPPUNIT_ASSERT(
  93. memcmp(nodes2[0]->getID(), nodes[0]->getID(), DHT_ID_LENGTH) == 0);
  94. }
  95. }
  96. }
  97. } // namespace aria2