DHTFindNodeReplyMessageTest.cc 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "DHTFindNodeReplyMessage.h"
  2. #include "DHTNode.h"
  3. #include "DHTUtil.h"
  4. #include "BencodeVisitor.h"
  5. #include "Dictionary.h"
  6. #include "Data.h"
  7. #include "Exception.h"
  8. #include "Util.h"
  9. #include "DHTBucket.h"
  10. #include "PeerMessageUtil.h"
  11. #include <cppunit/extensions/HelperMacros.h>
  12. class DHTFindNodeReplyMessageTest:public CppUnit::TestFixture {
  13. CPPUNIT_TEST_SUITE(DHTFindNodeReplyMessageTest);
  14. CPPUNIT_TEST(testGetBencodedMessage);
  15. CPPUNIT_TEST_SUITE_END();
  16. public:
  17. void setUp() {}
  18. void tearDown() {}
  19. void testGetBencodedMessage();
  20. };
  21. CPPUNIT_TEST_SUITE_REGISTRATION(DHTFindNodeReplyMessageTest);
  22. void DHTFindNodeReplyMessageTest::testGetBencodedMessage()
  23. {
  24. DHTNodeHandle localNode = new DHTNode();
  25. DHTNodeHandle remoteNode = new DHTNode();
  26. char tid[DHT_TRANSACTION_ID_LENGTH];
  27. DHTUtil::generateRandomData(tid, DHT_TRANSACTION_ID_LENGTH);
  28. string transactionID(&tid[0], &tid[DHT_TRANSACTION_ID_LENGTH]);
  29. DHTFindNodeReplyMessage msg(localNode, remoteNode, transactionID);
  30. string compactNodeInfo;
  31. DHTNodeHandle nodes[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  32. for(size_t i = 0; i < DHTBucket::K; ++i) {
  33. nodes[i] = new DHTNode();
  34. nodes[i]->setIPAddress("192.168.0."+Util::uitos(i+1));
  35. nodes[i]->setPort(6881+i);
  36. char buf[6];
  37. CPPUNIT_ASSERT(PeerMessageUtil::createcompact(buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
  38. compactNodeInfo +=
  39. string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
  40. string(&buf[0], &buf[sizeof(buf)]);
  41. }
  42. msg.setClosestKNodes(DHTNodes(&nodes[0], &nodes[DHTBucket::K]));
  43. string msgbody = msg.getBencodedMessage();
  44. SharedHandle<Dictionary> cm = new Dictionary();
  45. cm->put("t", new Data(transactionID));
  46. cm->put("y", new Data("r"));
  47. Dictionary* r = new Dictionary();
  48. cm->put("r", r);
  49. r->put("id", new Data(reinterpret_cast<const char*>(localNode->getID()), DHT_ID_LENGTH));
  50. r->put("nodes", new Data(compactNodeInfo));
  51. BencodeVisitor v;
  52. cm->accept(&v);
  53. CPPUNIT_ASSERT_EQUAL(v.getBencodedData(), msgbody);
  54. }