BNodeTest.cc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #include "BNode.h"
  2. #include "DHTNode.h"
  3. #include "DHTBucket.h"
  4. #include "DHTUtil.h"
  5. #include "Exception.h"
  6. #include "Util.h"
  7. #include <cstring>
  8. #include <cppunit/extensions/HelperMacros.h>
  9. namespace aria2 {
  10. class BNodeTest:public CppUnit::TestFixture {
  11. CPPUNIT_TEST_SUITE(BNodeTest);
  12. CPPUNIT_TEST(testIsInRange);
  13. CPPUNIT_TEST(testFindBucketFor);
  14. CPPUNIT_TEST(testFindClosestKNodes);
  15. CPPUNIT_TEST(testEnumerateBucket);
  16. CPPUNIT_TEST_SUITE_END();
  17. public:
  18. void setUp() {}
  19. void tearDown() {}
  20. void testIsInRange();
  21. void testFindBucketFor();
  22. void testFindClosestKNodes();
  23. void testEnumerateBucket();
  24. };
  25. CPPUNIT_TEST_SUITE_REGISTRATION(BNodeTest);
  26. void BNodeTest::testIsInRange()
  27. {
  28. unsigned char localNodeID[DHT_ID_LENGTH];
  29. memset(localNodeID, 0xff, DHT_ID_LENGTH);
  30. SharedHandle<DHTNode> localNode = new DHTNode(localNodeID);
  31. SharedHandle<DHTBucket> bucket1 = new DHTBucket(localNode);
  32. SharedHandle<DHTBucket> bucket2 = bucket1->split();
  33. SharedHandle<DHTBucket> bucket3 = bucket1->split();
  34. {
  35. BNode b(bucket1);
  36. CPPUNIT_ASSERT(b.isInRange(localNode->getID()));
  37. }
  38. {
  39. BNode b(bucket2);
  40. CPPUNIT_ASSERT(!b.isInRange(localNode->getID()));
  41. }
  42. }
  43. void BNodeTest::testFindBucketFor()
  44. {
  45. unsigned char localNodeID[DHT_ID_LENGTH];
  46. memset(localNodeID, 0xaa, DHT_ID_LENGTH);
  47. SharedHandle<DHTNode> localNode = new DHTNode(localNodeID);
  48. SharedHandle<DHTBucket> bucket1 = new DHTBucket(localNode);
  49. SharedHandle<DHTBucket> bucket2 = bucket1->split();
  50. SharedHandle<DHTBucket> bucket3 = bucket1->split();
  51. SharedHandle<DHTBucket> bucket4 = bucket3->split();
  52. SharedHandle<DHTBucket> bucket5 = bucket3->split();
  53. {
  54. BNode b(bucket5);
  55. CPPUNIT_ASSERT(bucket5 == BNode::findBucketFor(&b, localNodeID));
  56. }
  57. {
  58. BNode b(bucket1);
  59. CPPUNIT_ASSERT(BNode::findBucketFor(&b, localNodeID).isNull());
  60. }
  61. {
  62. BNode* b1 = new BNode(bucket1);
  63. BNode* b2 = new BNode(bucket2);
  64. BNode* b3 = new BNode(bucket3);
  65. BNode* b4 = new BNode(bucket4);
  66. BNode* b5 = new BNode(bucket5);
  67. BNode* bp1 = new BNode();
  68. bp1->setLeft(b3);
  69. bp1->setRight(b5);
  70. BNode* bp2 = new BNode();
  71. bp2->setLeft(bp1);
  72. bp2->setRight(b4);
  73. BNode* bp3 = new BNode();
  74. bp3->setLeft(b1);
  75. bp3->setRight(bp2);
  76. BNode* bp4 = new BNode();
  77. bp4->setLeft(bp3);
  78. bp4->setRight(b2);
  79. CPPUNIT_ASSERT(bucket5 == BNode::findBucketFor(bp4, localNode->getID()));
  80. delete bp4;
  81. }
  82. }
  83. void BNodeTest::testFindClosestKNodes()
  84. {
  85. unsigned char localNodeID[DHT_ID_LENGTH];
  86. memset(localNodeID, 0xaa, DHT_ID_LENGTH);
  87. SharedHandle<DHTNode> localNode = new DHTNode(localNodeID);
  88. SharedHandle<DHTBucket> bucket1 = new DHTBucket(localNode);
  89. SharedHandle<DHTBucket> bucket2 = bucket1->split();
  90. SharedHandle<DHTBucket> bucket3 = bucket1->split();
  91. SharedHandle<DHTBucket> bucket4 = bucket3->split();
  92. SharedHandle<DHTBucket> bucket5 = bucket3->split();
  93. unsigned char id[DHT_ID_LENGTH];
  94. {
  95. BNode* b1 = new BNode(bucket1);
  96. BNode* b2 = new BNode(bucket2);
  97. BNode* b3 = new BNode(bucket3);
  98. BNode* b4 = new BNode(bucket4);
  99. BNode* b5 = new BNode(bucket5);
  100. BNode* bp1 = new BNode();
  101. bp1->setLeft(b3);
  102. bp1->setRight(b5);
  103. BNode* bp2 = new BNode();
  104. bp2->setLeft(bp1);
  105. bp2->setRight(b4);
  106. BNode* bp3 = new BNode();
  107. bp3->setLeft(b1);
  108. bp3->setRight(bp2);
  109. BNode* bp4 = new BNode();
  110. bp4->setLeft(bp3);
  111. bp4->setRight(b2);
  112. for(size_t i = 0; i < 2; ++i) {
  113. bucket1->getRandomNodeID(id);
  114. bucket1->addNode(new DHTNode(id));
  115. bucket2->getRandomNodeID(id);
  116. bucket2->addNode(new DHTNode(id));
  117. bucket3->getRandomNodeID(id);
  118. bucket3->addNode(new DHTNode(id));
  119. bucket4->getRandomNodeID(id);
  120. bucket4->addNode(new DHTNode(id));
  121. bucket5->getRandomNodeID(id);
  122. bucket5->addNode(new DHTNode(id));
  123. }
  124. {
  125. unsigned char targetID[DHT_ID_LENGTH];
  126. memset(targetID, 0x80, DHT_ID_LENGTH);
  127. std::deque<SharedHandle<DHTNode> > nodes = BNode::findClosestKNodes(bp4, targetID);
  128. CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size());
  129. CPPUNIT_ASSERT(bucket4->isInRange(nodes[0]));
  130. CPPUNIT_ASSERT(bucket4->isInRange(nodes[1]));
  131. CPPUNIT_ASSERT(bucket5->isInRange(nodes[2]));
  132. CPPUNIT_ASSERT(bucket5->isInRange(nodes[3]));
  133. CPPUNIT_ASSERT(bucket3->isInRange(nodes[4]));
  134. CPPUNIT_ASSERT(bucket3->isInRange(nodes[5]));
  135. CPPUNIT_ASSERT(bucket1->isInRange(nodes[6]));
  136. CPPUNIT_ASSERT(bucket1->isInRange(nodes[7]));
  137. }
  138. {
  139. unsigned char targetID[DHT_ID_LENGTH];
  140. memset(targetID, 0xf0, DHT_ID_LENGTH);
  141. std::deque<SharedHandle<DHTNode> > nodes = BNode::findClosestKNodes(bp4, targetID);
  142. CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size());
  143. CPPUNIT_ASSERT(bucket1->isInRange(nodes[0]));
  144. CPPUNIT_ASSERT(bucket1->isInRange(nodes[1]));
  145. CPPUNIT_ASSERT(bucket3->isInRange(nodes[2]));
  146. CPPUNIT_ASSERT(bucket3->isInRange(nodes[3]));
  147. CPPUNIT_ASSERT(bucket5->isInRange(nodes[4]));
  148. CPPUNIT_ASSERT(bucket5->isInRange(nodes[5]));
  149. CPPUNIT_ASSERT(bucket4->isInRange(nodes[6]));
  150. CPPUNIT_ASSERT(bucket4->isInRange(nodes[7]));
  151. }
  152. {
  153. for(size_t i = 0; i < 6; ++i) {
  154. bucket4->getRandomNodeID(id);
  155. bucket4->addNode(new DHTNode(id));
  156. }
  157. unsigned char targetID[DHT_ID_LENGTH];
  158. memset(targetID, 0x80, DHT_ID_LENGTH);
  159. std::deque<SharedHandle<DHTNode> > nodes = BNode::findClosestKNodes(bp4, targetID);
  160. CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size());
  161. for(size_t i = 0; i < DHTBucket::K; ++i) {
  162. CPPUNIT_ASSERT(bucket4->isInRange(nodes[i]));
  163. }
  164. }
  165. delete bp4;
  166. }
  167. }
  168. void BNodeTest::testEnumerateBucket()
  169. {
  170. unsigned char localNodeID[DHT_ID_LENGTH];
  171. memset(localNodeID, 0xaa, DHT_ID_LENGTH);
  172. SharedHandle<DHTNode> localNode = new DHTNode(localNodeID);
  173. SharedHandle<DHTBucket> bucket1 = new DHTBucket(localNode);
  174. SharedHandle<DHTBucket> bucket2 = bucket1->split();
  175. SharedHandle<DHTBucket> bucket3 = bucket1->split();
  176. SharedHandle<DHTBucket> bucket4 = bucket3->split();
  177. SharedHandle<DHTBucket> bucket5 = bucket3->split();
  178. {
  179. BNode b(bucket1);
  180. std::deque<SharedHandle<DHTBucket> > buckets = BNode::enumerateBucket(&b);
  181. CPPUNIT_ASSERT_EQUAL((size_t)1, buckets.size());
  182. CPPUNIT_ASSERT(bucket1 == buckets[0]);
  183. }
  184. {
  185. BNode* b1 = new BNode(bucket1);
  186. BNode* b2 = new BNode(bucket2);
  187. BNode* b3 = new BNode(bucket3);
  188. BNode* b4 = new BNode(bucket4);
  189. BNode* b5 = new BNode(bucket5);
  190. BNode* bp1 = new BNode();
  191. bp1->setLeft(b3);
  192. bp1->setRight(b5);
  193. BNode* bp2 = new BNode();
  194. bp2->setLeft(bp1);
  195. bp2->setRight(b4);
  196. BNode* bp3 = new BNode();
  197. bp3->setLeft(b1);
  198. bp3->setRight(bp2);
  199. BNode* bp4 = new BNode();
  200. bp4->setLeft(bp3);
  201. bp4->setRight(b2);
  202. std::deque<SharedHandle<DHTBucket> > buckets = BNode::enumerateBucket(bp4);
  203. CPPUNIT_ASSERT_EQUAL((size_t)5, buckets.size());
  204. CPPUNIT_ASSERT(bucket1 == buckets[0]);
  205. CPPUNIT_ASSERT(bucket3 == buckets[1]);
  206. CPPUNIT_ASSERT(bucket5 == buckets[2]);
  207. CPPUNIT_ASSERT(bucket4 == buckets[3]);
  208. CPPUNIT_ASSERT(bucket2 == buckets[4]);
  209. delete bp4;
  210. }
  211. }
  212. } // namespace aria2