DHTGetPeersReplyMessageTest.cc 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include "DHTGetPeersReplyMessage.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 "List.h"
  12. #include "Peer.h"
  13. #include <cppunit/extensions/HelperMacros.h>
  14. class DHTGetPeersReplyMessageTest:public CppUnit::TestFixture {
  15. CPPUNIT_TEST_SUITE(DHTGetPeersReplyMessageTest);
  16. CPPUNIT_TEST(testGetBencodedMessage);
  17. CPPUNIT_TEST_SUITE_END();
  18. public:
  19. void setUp() {}
  20. void tearDown() {}
  21. void testGetBencodedMessage();
  22. };
  23. CPPUNIT_TEST_SUITE_REGISTRATION(DHTGetPeersReplyMessageTest);
  24. void DHTGetPeersReplyMessageTest::testGetBencodedMessage()
  25. {
  26. DHTNodeHandle localNode = new DHTNode();
  27. DHTNodeHandle remoteNode = new DHTNode();
  28. char tid[DHT_TRANSACTION_ID_LENGTH];
  29. DHTUtil::generateRandomData(tid, DHT_TRANSACTION_ID_LENGTH);
  30. string transactionID(&tid[0], &tid[DHT_TRANSACTION_ID_LENGTH]);
  31. string token = "token";
  32. DHTGetPeersReplyMessage msg(localNode, remoteNode, token, transactionID);
  33. SharedHandle<Dictionary> cm = new Dictionary();
  34. cm->put("t", new Data(transactionID));
  35. cm->put("y", new Data("r"));
  36. Dictionary* r = new Dictionary();
  37. cm->put("r", r);
  38. r->put("id", new Data(reinterpret_cast<const char*>(localNode->getID()), DHT_ID_LENGTH));
  39. r->put("token", new Data(token));
  40. {
  41. string compactNodeInfo;
  42. DHTNodeHandle nodes[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  43. for(size_t i = 0; i < DHTBucket::K; ++i) {
  44. nodes[i] = new DHTNode();
  45. nodes[i]->setIPAddress("192.168.0."+Util::uitos(i+1));
  46. nodes[i]->setPort(6881+i);
  47. char buf[6];
  48. CPPUNIT_ASSERT(PeerMessageUtil::createcompact(buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
  49. compactNodeInfo +=
  50. string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
  51. string(&buf[0], &buf[sizeof(buf)]);
  52. }
  53. msg.setClosestKNodes(DHTNodes(&nodes[0], &nodes[DHTBucket::K]));
  54. string msgbody = msg.getBencodedMessage();
  55. r->put("nodes", new Data(compactNodeInfo));
  56. BencodeVisitor v;
  57. cm->accept(&v);
  58. CPPUNIT_ASSERT_EQUAL(Util::urlencode(v.getBencodedData()),
  59. Util::urlencode(msgbody));
  60. }
  61. r->remove("nodes");
  62. {
  63. Peers peers;
  64. List* values = new List();
  65. r->put("values", values);
  66. for(size_t i = 0; i < 4; ++i) {
  67. PeerHandle peer = new Peer("192.168.0."+Util::uitos(i+1), 6881+i);
  68. char buffer[6];
  69. CPPUNIT_ASSERT(PeerMessageUtil::createcompact(buffer, peer->ipaddr, peer->port));
  70. values->add(new Data(buffer, sizeof(buffer)));
  71. peers.push_back(peer);
  72. }
  73. msg.setValues(peers);
  74. string msgbody = msg.getBencodedMessage();
  75. BencodeVisitor v;
  76. cm->accept(&v);
  77. CPPUNIT_ASSERT_EQUAL(Util::urlencode(v.getBencodedData()),
  78. Util::urlencode(msgbody));
  79. }
  80. }