HandshakeExtensionMessageTest.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. namespace aria2 {
  10. class HandshakeExtensionMessageTest:public CppUnit::TestFixture {
  11. CPPUNIT_TEST_SUITE(HandshakeExtensionMessageTest);
  12. CPPUNIT_TEST(testGetExtensionMessageID);
  13. CPPUNIT_TEST(testGetExtensionName);
  14. CPPUNIT_TEST(testGetBencodedData);
  15. CPPUNIT_TEST(testToString);
  16. CPPUNIT_TEST(testDoReceivedAction);
  17. CPPUNIT_TEST(testCreate);
  18. CPPUNIT_TEST(testCreate_stringnum);
  19. CPPUNIT_TEST_SUITE_END();
  20. public:
  21. void setUp() {}
  22. void tearDown() {}
  23. void testGetExtensionMessageID();
  24. void testGetExtensionName();
  25. void testGetBencodedData();
  26. void testToString();
  27. void testDoReceivedAction();
  28. void testCreate();
  29. void testCreate_stringnum();
  30. };
  31. CPPUNIT_TEST_SUITE_REGISTRATION(HandshakeExtensionMessageTest);
  32. void HandshakeExtensionMessageTest::testGetExtensionMessageID()
  33. {
  34. HandshakeExtensionMessage msg;
  35. CPPUNIT_ASSERT_EQUAL((uint8_t)0, msg.getExtensionMessageID());
  36. }
  37. void HandshakeExtensionMessageTest::testGetExtensionName()
  38. {
  39. HandshakeExtensionMessage msg;
  40. CPPUNIT_ASSERT_EQUAL(std::string("handshake"), msg.getExtensionName());
  41. }
  42. void HandshakeExtensionMessageTest::testGetBencodedData()
  43. {
  44. HandshakeExtensionMessage msg;
  45. msg.setClientVersion("aria2");
  46. msg.setTCPPort(6889);
  47. msg.setExtension("ut_pex", 1);
  48. msg.setExtension("a2_dht", 2);
  49. msg.setMetadataSize(1024);
  50. CPPUNIT_ASSERT_EQUAL
  51. (std::string("d"
  52. "1:md6:a2_dhti2e6:ut_pexi1ee"
  53. "13:metadata_sizei1024e"
  54. "1:pi6889e"
  55. "1:v5:aria2"
  56. "e"), msg.getBencodedData());
  57. msg.setMetadataSize(0);
  58. CPPUNIT_ASSERT
  59. (msg.getBencodedData().find("metadata_size") == std::string::npos);
  60. }
  61. void HandshakeExtensionMessageTest::testToString()
  62. {
  63. HandshakeExtensionMessage msg;
  64. msg.setClientVersion("aria2");
  65. msg.setTCPPort(6889);
  66. msg.setExtension("ut_pex", 1);
  67. msg.setExtension("a2_dht", 2);
  68. msg.setMetadataSize(1024);
  69. CPPUNIT_ASSERT_EQUAL
  70. (std::string("handshake client=aria2, tcpPort=6889, metadataSize=1024,"
  71. " a2_dht=2, ut_pex=1"), msg.toString());
  72. }
  73. void HandshakeExtensionMessageTest::testDoReceivedAction()
  74. {
  75. SharedHandle<DownloadContext> ctx(new DownloadContext());
  76. BDE attrs = BDE::dict();
  77. ctx->setAttribute(bittorrent::BITTORRENT, attrs);
  78. SharedHandle<Peer> peer(new Peer("192.168.0.1", 0));
  79. peer->allocateSessionResource(1024, 1024*1024);
  80. HandshakeExtensionMessage msg;
  81. msg.setClientVersion("aria2");
  82. msg.setTCPPort(6889);
  83. msg.setExtension("ut_pex", 1);
  84. msg.setExtension("a2_dht", 2);
  85. msg.setMetadataSize(1024);
  86. msg.setPeer(peer);
  87. msg.setDownloadContext(ctx);
  88. msg.doReceivedAction();
  89. CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->port);
  90. CPPUNIT_ASSERT_EQUAL((uint8_t)1, peer->getExtensionMessageID("ut_pex"));
  91. CPPUNIT_ASSERT_EQUAL((uint8_t)2, peer->getExtensionMessageID("a2_dht"));
  92. CPPUNIT_ASSERT_EQUAL((int64_t)1024, attrs[bittorrent::METADATA_SIZE].i());
  93. }
  94. void HandshakeExtensionMessageTest::testCreate()
  95. {
  96. std::string in =
  97. "0d1:pi6881e1:v5:aria21:md6:ut_pexi1ee13:metadata_sizei1024ee";
  98. SharedHandle<HandshakeExtensionMessage> m =
  99. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  100. in.size());
  101. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
  102. CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getTCPPort());
  103. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID("ut_pex"));
  104. CPPUNIT_ASSERT_EQUAL((size_t)1024, m->getMetadataSize());
  105. try {
  106. // bad payload format
  107. std::string in = "011:hello world";
  108. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  109. in.size());
  110. CPPUNIT_FAIL("exception must be thrown.");
  111. } catch(Exception& e) {
  112. std::cerr << e.stackTrace() << std::endl;
  113. }
  114. try {
  115. // malformed dencoded message
  116. std::string in = "011:hello";
  117. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  118. in.size());
  119. CPPUNIT_FAIL("exception must be thrown.");
  120. } catch(Exception& e) {
  121. std::cerr << e.stackTrace() << std::endl;
  122. }
  123. try {
  124. // 0 length data
  125. std::string in = "";
  126. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  127. in.size());
  128. CPPUNIT_FAIL("exception must be thrown.");
  129. } catch(Exception& e) {
  130. std::cerr << e.stackTrace() << std::endl;
  131. }
  132. }
  133. void HandshakeExtensionMessageTest::testCreate_stringnum()
  134. {
  135. std::string in = "0d1:p4:68811:v5:aria21:md6:ut_pex1:1ee";
  136. SharedHandle<HandshakeExtensionMessage> m =
  137. HandshakeExtensionMessage::create
  138. (reinterpret_cast<const unsigned char*>(in.c_str()),
  139. in.size());
  140. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
  141. // port number in string is not allowed
  142. CPPUNIT_ASSERT_EQUAL((uint16_t)0, m->getTCPPort());
  143. // extension ID in string is not allowed
  144. CPPUNIT_ASSERT_EQUAL((uint8_t)0, m->getExtensionMessageID("ut_pex"));
  145. }
  146. } // namespace aria2