BNodeTest.cc 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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(SharedHandle<DHTNode>(new DHTNode(id)));
  115. bucket2->getRandomNodeID(id);
  116. bucket2->addNode(SharedHandle<DHTNode>(new DHTNode(id)));
  117. bucket3->getRandomNodeID(id);
  118. bucket3->addNode(SharedHandle<DHTNode>(new DHTNode(id)));
  119. bucket4->getRandomNodeID(id);
  120. bucket4->addNode(SharedHandle<DHTNode>(new DHTNode(id)));
  121. bucket5->getRandomNodeID(id);
  122. bucket5->addNode(SharedHandle<DHTNode>(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;
  128. BNode::findClosestKNodes(nodes, bp4, targetID);
  129. CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size());
  130. CPPUNIT_ASSERT(bucket4->isInRange(nodes[0]));
  131. CPPUNIT_ASSERT(bucket4->isInRange(nodes[1]));
  132. CPPUNIT_ASSERT(bucket5->isInRange(nodes[2]));
  133. CPPUNIT_ASSERT(bucket5->isInRange(nodes[3]));
  134. CPPUNIT_ASSERT(bucket3->isInRange(nodes[4]));
  135. CPPUNIT_ASSERT(bucket3->isInRange(nodes[5]));
  136. CPPUNIT_ASSERT(bucket1->isInRange(nodes[6]));
  137. CPPUNIT_ASSERT(bucket1->isInRange(nodes[7]));
  138. }
  139. {
  140. unsigned char targetID[DHT_ID_LENGTH];
  141. memset(targetID, 0xf0, DHT_ID_LENGTH);
  142. std::deque<SharedHandle<DHTNode> > nodes;
  143. BNode::findClosestKNodes(nodes, bp4, targetID);
  144. CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size());
  145. CPPUNIT_ASSERT(bucket1->isInRange(nodes[0]));
  146. CPPUNIT_ASSERT(bucket1->isInRange(nodes[1]));
  147. CPPUNIT_ASSERT(bucket3->isInRange(nodes[2]));
  148. CPPUNIT_ASSERT(bucket3->isInRange(nodes[3]));
  149. CPPUNIT_ASSERT(bucket5->isInRange(nodes[4]));
  150. CPPUNIT_ASSERT(bucket5->isInRange(nodes[5]));
  151. CPPUNIT_ASSERT(bucket4->isInRange(nodes[6]));
  152. CPPUNIT_ASSERT(bucket4->isInRange(nodes[7]));
  153. }
  154. {
  155. for(size_t i = 0; i < 6; ++i) {
  156. bucket4->getRandomNodeID(id);
  157. bucket4->addNode(SharedHandle<DHTNode>(new DHTNode(id)));
  158. }
  159. unsigned char targetID[DHT_ID_LENGTH];
  160. memset(targetID, 0x80, DHT_ID_LENGTH);
  161. std::deque<SharedHandle<DHTNode> > nodes;
  162. BNode::findClosestKNodes(nodes, bp4, targetID);
  163. CPPUNIT_ASSERT_EQUAL((size_t)8, nodes.size());
  164. for(size_t i = 0; i < DHTBucket::K; ++i) {
  165. CPPUNIT_ASSERT(bucket4->isInRange(nodes[i]));
  166. }
  167. }
  168. delete bp4;
  169. }
  170. }
  171. void BNodeTest::testEnumerateBucket()
  172. {
  173. unsigned char localNodeID[DHT_ID_LENGTH];
  174. memset(localNodeID, 0xaa, DHT_ID_LENGTH);
  175. SharedHandle<DHTNode> localNode(new DHTNode(localNodeID));
  176. SharedHandle<DHTBucket> bucket1(new DHTBucket(localNode));
  177. SharedHandle<DHTBucket> bucket2 = bucket1->split();
  178. SharedHandle<DHTBucket> bucket3 = bucket1->split();
  179. SharedHandle<DHTBucket> bucket4 = bucket3->split();
  180. SharedHandle<DHTBucket> bucket5 = bucket3->split();
  181. {
  182. BNode b(bucket1);
  183. std::deque<SharedHandle<DHTBucket> > buckets;
  184. BNode::enumerateBucket(buckets, &b);
  185. CPPUNIT_ASSERT_EQUAL((size_t)1, buckets.size());
  186. CPPUNIT_ASSERT(bucket1 == buckets[0]);
  187. }
  188. {
  189. BNode* b1 = new BNode(bucket1);
  190. BNode* b2 = new BNode(bucket2);
  191. BNode* b3 = new BNode(bucket3);
  192. BNode* b4 = new BNode(bucket4);
  193. BNode* b5 = new BNode(bucket5);
  194. BNode* bp1 = new BNode();
  195. bp1->setLeft(b3);
  196. bp1->setRight(b5);
  197. BNode* bp2 = new BNode();
  198. bp2->setLeft(bp1);
  199. bp2->setRight(b4);
  200. BNode* bp3 = new BNode();
  201. bp3->setLeft(b1);
  202. bp3->setRight(bp2);
  203. BNode* bp4 = new BNode();
  204. bp4->setLeft(bp3);
  205. bp4->setRight(b2);
  206. std::deque<SharedHandle<DHTBucket> > buckets;
  207. BNode::enumerateBucket(buckets, bp4);
  208. CPPUNIT_ASSERT_EQUAL((size_t)5, buckets.size());
  209. CPPUNIT_ASSERT(bucket1 == buckets[0]);
  210. CPPUNIT_ASSERT(bucket3 == buckets[1]);
  211. CPPUNIT_ASSERT(bucket5 == buckets[2]);
  212. CPPUNIT_ASSERT(bucket4 == buckets[3]);
  213. CPPUNIT_ASSERT(bucket2 == buckets[4]);
  214. delete bp4;
  215. }
  216. }
  217. } // namespace aria2