HandshakeExtensionMessageTest.cc 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "HandshakeExtensionMessage.h"
  2. #include "Peer.h"
  3. #include "MockBtContext.h"
  4. #include "MockPeerStorage.h"
  5. #include "BtRegistry.h"
  6. #include <cppunit/extensions/HelperMacros.h>
  7. class HandshakeExtensionMessageTest:public CppUnit::TestFixture {
  8. CPPUNIT_TEST_SUITE(HandshakeExtensionMessageTest);
  9. CPPUNIT_TEST(testGetExtensionMessageID);
  10. CPPUNIT_TEST(testGetExtensionName);
  11. CPPUNIT_TEST(testGetBencodedData);
  12. CPPUNIT_TEST(testToString);
  13. CPPUNIT_TEST(testDoReceivedAction);
  14. CPPUNIT_TEST(testCreate);
  15. CPPUNIT_TEST(testCreate_stringnum);
  16. CPPUNIT_TEST_SUITE_END();
  17. private:
  18. BtContextHandle _btContext;
  19. public:
  20. HandshakeExtensionMessageTest():_btContext(0) {}
  21. void setUp()
  22. {
  23. BtRegistry::unregisterAll();
  24. MockBtContextHandle btContext = new MockBtContext();
  25. unsigned char infohash[20];
  26. memset(infohash, 0, sizeof(infohash));
  27. btContext->setInfoHash(infohash);
  28. _btContext = btContext;
  29. MockPeerStorageHandle peerStorage = new MockPeerStorage();
  30. BtRegistry::registerPeerStorage(_btContext->getInfoHashAsString(),
  31. peerStorage);
  32. }
  33. void tearDown()
  34. {
  35. BtRegistry::unregisterAll();
  36. }
  37. void testGetExtensionMessageID();
  38. void testGetExtensionName();
  39. void testGetBencodedData();
  40. void testToString();
  41. void testDoReceivedAction();
  42. void testCreate();
  43. void testCreate_stringnum();
  44. };
  45. CPPUNIT_TEST_SUITE_REGISTRATION(HandshakeExtensionMessageTest);
  46. void HandshakeExtensionMessageTest::testGetExtensionMessageID()
  47. {
  48. HandshakeExtensionMessage msg;
  49. CPPUNIT_ASSERT_EQUAL((uint8_t)0, msg.getExtensionMessageID());
  50. }
  51. void HandshakeExtensionMessageTest::testGetExtensionName()
  52. {
  53. HandshakeExtensionMessage msg;
  54. CPPUNIT_ASSERT_EQUAL(string("handshake"), msg.getExtensionName());
  55. }
  56. void HandshakeExtensionMessageTest::testGetBencodedData()
  57. {
  58. HandshakeExtensionMessage msg;
  59. msg.setClientVersion("aria2");
  60. msg.setTCPPort(6889);
  61. msg.setExtension("ut_pex", 1);
  62. msg.setExtension("a2_dht", 2);
  63. CPPUNIT_ASSERT_EQUAL(string("d1:v5:aria21:pi6889e1:md6:a2_dhti2e6:ut_pexi1eee"), msg.getBencodedData());
  64. }
  65. void HandshakeExtensionMessageTest::testToString()
  66. {
  67. HandshakeExtensionMessage msg;
  68. msg.setClientVersion("aria2");
  69. msg.setTCPPort(6889);
  70. msg.setExtension("ut_pex", 1);
  71. msg.setExtension("a2_dht", 2);
  72. CPPUNIT_ASSERT_EQUAL(string("handshake client=aria2, tcpPort=6889, a2_dht=2, ut_pex=1"), msg.toString());
  73. }
  74. void HandshakeExtensionMessageTest::testDoReceivedAction()
  75. {
  76. PeerHandle peer = new Peer("192.168.0.1", 0, 1, 1);
  77. HandshakeExtensionMessage msg;
  78. msg.setClientVersion("aria2");
  79. msg.setTCPPort(6889);
  80. msg.setExtension("ut_pex", 1);
  81. msg.setExtension("a2_dht", 2);
  82. msg.setPeer(peer);
  83. msg.setBtContext(_btContext);
  84. msg.doReceivedAction();
  85. CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->port);
  86. CPPUNIT_ASSERT_EQUAL((uint8_t)1, peer->getExtensionMessageID("ut_pex"));
  87. CPPUNIT_ASSERT_EQUAL((uint8_t)2, peer->getExtensionMessageID("a2_dht"));
  88. CPPUNIT_ASSERT_EQUAL((size_t)1, PEER_STORAGE(_btContext)->getPeers().size());
  89. PeerHandle p1 = PEER_STORAGE(_btContext)->getPeers().front();
  90. CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), p1->ipaddr);
  91. CPPUNIT_ASSERT_EQUAL((uint16_t)6889, p1->port);
  92. }
  93. void HandshakeExtensionMessageTest::testCreate()
  94. {
  95. string in = "0d1:pi6881e1:v5:aria21:md6:ut_pexi1eee";
  96. HandshakeExtensionMessageHandle m =
  97. HandshakeExtensionMessage::create(in.c_str(), in.size());
  98. CPPUNIT_ASSERT_EQUAL(string("aria2"), m->getClientVersion());
  99. CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getTCPPort());
  100. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID("ut_pex"));
  101. try {
  102. // bad payload format
  103. string in = "011:hello world";
  104. HandshakeExtensionMessage::create(in.c_str(), in.size());
  105. CPPUNIT_FAIL("exception must be thrown.");
  106. } catch(Exception* e) {
  107. cerr << *e << endl;
  108. delete e;
  109. }
  110. try {
  111. // malformed dencoded message
  112. string in = "011:hello";
  113. HandshakeExtensionMessage::create(in.c_str(), in.size());
  114. CPPUNIT_FAIL("exception must be thrown.");
  115. } catch(Exception* e) {
  116. cerr << *e << endl;
  117. delete e;
  118. }
  119. try {
  120. // 0 length data
  121. string in = "";
  122. HandshakeExtensionMessage::create(in.c_str(), in.size());
  123. CPPUNIT_FAIL("exception must be thrown.");
  124. } catch(Exception* e) {
  125. cerr << *e << endl;
  126. delete e;
  127. }
  128. }
  129. void HandshakeExtensionMessageTest::testCreate_stringnum()
  130. {
  131. string in = "0d1:p4:68811:v5:aria21:md6:ut_pex1:1ee";
  132. HandshakeExtensionMessageHandle m =
  133. HandshakeExtensionMessage::create(in.c_str(), in.size());
  134. CPPUNIT_ASSERT_EQUAL(string("aria2"), m->getClientVersion());
  135. CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getTCPPort());
  136. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID("ut_pex"));
  137. }