DHTRoutingTableTest.cc 2.4 KB

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