BNodeTest.cc 6.7 KB

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