BNodeTest.cc 7.3 KB

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