HandshakeExtensionMessageTest.cc 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "HandshakeExtensionMessage.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "Peer.h"
  5. #include "Exception.h"
  6. #include "FileEntry.h"
  7. #include "DownloadContext.h"
  8. #include "bittorrent_helper.h"
  9. #include "Option.h"
  10. #include "RequestGroup.h"
  11. namespace aria2 {
  12. class HandshakeExtensionMessageTest:public CppUnit::TestFixture {
  13. CPPUNIT_TEST_SUITE(HandshakeExtensionMessageTest);
  14. CPPUNIT_TEST(testGetExtensionMessageID);
  15. CPPUNIT_TEST(testGetExtensionName);
  16. CPPUNIT_TEST(testGetBencodedData);
  17. CPPUNIT_TEST(testToString);
  18. CPPUNIT_TEST(testDoReceivedAction);
  19. CPPUNIT_TEST(testCreate);
  20. CPPUNIT_TEST(testCreate_stringnum);
  21. CPPUNIT_TEST_SUITE_END();
  22. public:
  23. void setUp() {}
  24. void tearDown() {}
  25. void testGetExtensionMessageID();
  26. void testGetExtensionName();
  27. void testGetBencodedData();
  28. void testToString();
  29. void testDoReceivedAction();
  30. void testCreate();
  31. void testCreate_stringnum();
  32. };
  33. CPPUNIT_TEST_SUITE_REGISTRATION(HandshakeExtensionMessageTest);
  34. void HandshakeExtensionMessageTest::testGetExtensionMessageID()
  35. {
  36. HandshakeExtensionMessage msg;
  37. CPPUNIT_ASSERT_EQUAL((uint8_t)0, msg.getExtensionMessageID());
  38. }
  39. void HandshakeExtensionMessageTest::testGetExtensionName()
  40. {
  41. HandshakeExtensionMessage msg;
  42. CPPUNIT_ASSERT_EQUAL(std::string("handshake"),
  43. std::string(msg.getExtensionName()));
  44. }
  45. void HandshakeExtensionMessageTest::testGetBencodedData()
  46. {
  47. HandshakeExtensionMessage msg;
  48. msg.setClientVersion("aria2");
  49. msg.setTCPPort(6889);
  50. msg.setExtension(ExtensionMessageRegistry::UT_PEX, 1);
  51. msg.setExtension(ExtensionMessageRegistry::UT_METADATA, 2);
  52. msg.setMetadataSize(1024);
  53. CPPUNIT_ASSERT_EQUAL
  54. (std::string("d"
  55. "1:md11:ut_metadatai2e6:ut_pexi1ee"
  56. "13:metadata_sizei1024e"
  57. "1:pi6889e"
  58. "1:v5:aria2"
  59. "e"), msg.getPayload());
  60. msg.setMetadataSize(0);
  61. CPPUNIT_ASSERT
  62. (msg.getPayload().find("metadata_size") == std::string::npos);
  63. }
  64. void HandshakeExtensionMessageTest::testToString()
  65. {
  66. HandshakeExtensionMessage msg;
  67. msg.setClientVersion("aria2");
  68. msg.setTCPPort(6889);
  69. msg.setExtension(ExtensionMessageRegistry::UT_PEX, 1);
  70. msg.setExtension(ExtensionMessageRegistry::UT_METADATA, 2);
  71. msg.setMetadataSize(1024);
  72. CPPUNIT_ASSERT_EQUAL
  73. (std::string("handshake client=aria2, tcpPort=6889, metadataSize=1024,"
  74. " ut_metadata=2, ut_pex=1"), msg.toString());
  75. }
  76. void HandshakeExtensionMessageTest::testDoReceivedAction()
  77. {
  78. auto dctx = std::make_shared<DownloadContext>(METADATA_PIECE_SIZE, 0);
  79. auto op = std::make_shared<Option>();
  80. RequestGroup rg(GroupId::create(), op);
  81. rg.setDownloadContext(dctx);
  82. dctx->setAttribute(CTX_ATTR_BT, make_unique<TorrentAttribute>());
  83. dctx->markTotalLengthIsUnknown();
  84. auto peer = std::make_shared<Peer>("192.168.0.1", 0);
  85. peer->allocateSessionResource(1024, 1024*1024);
  86. HandshakeExtensionMessage msg;
  87. msg.setClientVersion("aria2");
  88. msg.setTCPPort(6889);
  89. msg.setExtension(ExtensionMessageRegistry::UT_PEX, 1);
  90. msg.setExtension(ExtensionMessageRegistry::UT_METADATA, 3);
  91. msg.setMetadataSize(1024);
  92. msg.setPeer(peer);
  93. msg.setDownloadContext(dctx.get());
  94. msg.doReceivedAction();
  95. CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->getPort());
  96. CPPUNIT_ASSERT_EQUAL((uint8_t)1,
  97. peer->getExtensionMessageID
  98. (ExtensionMessageRegistry::UT_PEX));
  99. CPPUNIT_ASSERT_EQUAL((uint8_t)3,
  100. peer->getExtensionMessageID
  101. (ExtensionMessageRegistry::UT_METADATA));
  102. CPPUNIT_ASSERT(peer->isSeeder());
  103. auto attrs = bittorrent::getTorrentAttrs(dctx);
  104. CPPUNIT_ASSERT_EQUAL((size_t)1024, attrs->metadataSize);
  105. CPPUNIT_ASSERT_EQUAL((int64_t)1024, dctx->getTotalLength());
  106. CPPUNIT_ASSERT(dctx->knowsTotalLength());
  107. // See Peer is not marked as seeder if !attrs->metadata.empty()
  108. peer->allocateSessionResource(1024, 1024*1024);
  109. attrs->metadataSize = 1024;
  110. attrs->metadata = std::string('0', attrs->metadataSize);
  111. msg.doReceivedAction();
  112. CPPUNIT_ASSERT(!peer->isSeeder());
  113. }
  114. void HandshakeExtensionMessageTest::testCreate()
  115. {
  116. std::string in =
  117. "0d1:pi6881e1:v5:aria21:md5:a2dhti2e6:ut_pexi1ee13:metadata_sizei1024ee";
  118. std::shared_ptr<HandshakeExtensionMessage> m
  119. (HandshakeExtensionMessage::create
  120. (reinterpret_cast<const unsigned char*>(in.c_str()),
  121. in.size()));
  122. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
  123. CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getTCPPort());
  124. CPPUNIT_ASSERT_EQUAL((uint8_t)1,
  125. m->getExtensionMessageID
  126. (ExtensionMessageRegistry::UT_PEX));
  127. CPPUNIT_ASSERT_EQUAL((size_t)1024, m->getMetadataSize());
  128. try {
  129. // bad payload format
  130. std::string in = "011:hello world";
  131. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  132. in.size());
  133. CPPUNIT_FAIL("exception must be thrown.");
  134. } catch(Exception& e) {
  135. std::cerr << e.stackTrace() << std::endl;
  136. }
  137. try {
  138. // malformed dencoded message
  139. std::string in = "011:hello";
  140. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  141. in.size());
  142. CPPUNIT_FAIL("exception must be thrown.");
  143. } catch(Exception& e) {
  144. std::cerr << e.stackTrace() << std::endl;
  145. }
  146. try {
  147. // 0 length data
  148. std::string in = "";
  149. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  150. in.size());
  151. CPPUNIT_FAIL("exception must be thrown.");
  152. } catch(Exception& e) {
  153. std::cerr << e.stackTrace() << std::endl;
  154. }
  155. }
  156. void HandshakeExtensionMessageTest::testCreate_stringnum()
  157. {
  158. std::string in = "0d1:p4:68811:v5:aria21:md6:ut_pex1:1ee";
  159. std::shared_ptr<HandshakeExtensionMessage> m
  160. (HandshakeExtensionMessage::create
  161. (reinterpret_cast<const unsigned char*>(in.c_str()),
  162. in.size()));
  163. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
  164. // port number in string is not allowed
  165. CPPUNIT_ASSERT_EQUAL((uint16_t)0, m->getTCPPort());
  166. // extension ID in string is not allowed
  167. CPPUNIT_ASSERT_EQUAL((uint8_t)0,
  168. m->getExtensionMessageID
  169. (ExtensionMessageRegistry::UT_PEX));
  170. }
  171. } // namespace aria2