HandshakeExtensionMessageTest.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "HandshakeExtensionMessage.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "Peer.h"
  5. #include "MockBtContext.h"
  6. #include "Exception.h"
  7. #include "FileEntry.h"
  8. namespace aria2 {
  9. class HandshakeExtensionMessageTest:public CppUnit::TestFixture {
  10. CPPUNIT_TEST_SUITE(HandshakeExtensionMessageTest);
  11. CPPUNIT_TEST(testGetExtensionMessageID);
  12. CPPUNIT_TEST(testGetExtensionName);
  13. CPPUNIT_TEST(testGetBencodedData);
  14. CPPUNIT_TEST(testToString);
  15. CPPUNIT_TEST(testDoReceivedAction);
  16. CPPUNIT_TEST(testCreate);
  17. CPPUNIT_TEST(testCreate_stringnum);
  18. CPPUNIT_TEST_SUITE_END();
  19. private:
  20. SharedHandle<BtContext> _btContext;
  21. public:
  22. void setUp() {}
  23. void tearDown() {}
  24. void testGetExtensionMessageID();
  25. void testGetExtensionName();
  26. void testGetBencodedData();
  27. void testToString();
  28. void testDoReceivedAction();
  29. void testCreate();
  30. void testCreate_stringnum();
  31. };
  32. CPPUNIT_TEST_SUITE_REGISTRATION(HandshakeExtensionMessageTest);
  33. void HandshakeExtensionMessageTest::testGetExtensionMessageID()
  34. {
  35. HandshakeExtensionMessage msg;
  36. CPPUNIT_ASSERT_EQUAL((uint8_t)0, msg.getExtensionMessageID());
  37. }
  38. void HandshakeExtensionMessageTest::testGetExtensionName()
  39. {
  40. HandshakeExtensionMessage msg;
  41. CPPUNIT_ASSERT_EQUAL(std::string("handshake"), msg.getExtensionName());
  42. }
  43. void HandshakeExtensionMessageTest::testGetBencodedData()
  44. {
  45. HandshakeExtensionMessage msg;
  46. msg.setClientVersion("aria2");
  47. msg.setTCPPort(6889);
  48. msg.setExtension("ut_pex", 1);
  49. msg.setExtension("a2_dht", 2);
  50. CPPUNIT_ASSERT_EQUAL(std::string("d"
  51. "1:md6:a2_dhti2e6:ut_pexi1ee"
  52. "1:pi6889e"
  53. "1:v5:aria2"
  54. "e"), msg.getBencodedData());
  55. }
  56. void HandshakeExtensionMessageTest::testToString()
  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(std::string("handshake client=aria2, tcpPort=6889, a2_dht=2, ut_pex=1"), msg.toString());
  64. }
  65. void HandshakeExtensionMessageTest::testDoReceivedAction()
  66. {
  67. SharedHandle<Peer> peer(new Peer("192.168.0.1", 0));
  68. peer->allocateSessionResource(1024, 1024*1024);
  69. HandshakeExtensionMessage msg;
  70. msg.setClientVersion("aria2");
  71. msg.setTCPPort(6889);
  72. msg.setExtension("ut_pex", 1);
  73. msg.setExtension("a2_dht", 2);
  74. msg.setPeer(peer);
  75. msg.setBtContext(_btContext);
  76. msg.doReceivedAction();
  77. CPPUNIT_ASSERT_EQUAL((uint16_t)6889, peer->port);
  78. CPPUNIT_ASSERT_EQUAL((uint8_t)1, peer->getExtensionMessageID("ut_pex"));
  79. CPPUNIT_ASSERT_EQUAL((uint8_t)2, peer->getExtensionMessageID("a2_dht"));
  80. }
  81. void HandshakeExtensionMessageTest::testCreate()
  82. {
  83. std::string in = "0d1:pi6881e1:v5:aria21:md6:ut_pexi1eee";
  84. SharedHandle<HandshakeExtensionMessage> m =
  85. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  86. in.size());
  87. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
  88. CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getTCPPort());
  89. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID("ut_pex"));
  90. try {
  91. // bad payload format
  92. std::string in = "011:hello world";
  93. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  94. in.size());
  95. CPPUNIT_FAIL("exception must be thrown.");
  96. } catch(Exception& e) {
  97. std::cerr << e.stackTrace() << std::endl;
  98. }
  99. try {
  100. // malformed dencoded message
  101. std::string in = "011:hello";
  102. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  103. in.size());
  104. CPPUNIT_FAIL("exception must be thrown.");
  105. } catch(Exception& e) {
  106. std::cerr << e.stackTrace() << std::endl;
  107. }
  108. try {
  109. // 0 length data
  110. std::string in = "";
  111. HandshakeExtensionMessage::create(reinterpret_cast<const unsigned char*>(in.c_str()),
  112. in.size());
  113. CPPUNIT_FAIL("exception must be thrown.");
  114. } catch(Exception& e) {
  115. std::cerr << e.stackTrace() << std::endl;
  116. }
  117. }
  118. void HandshakeExtensionMessageTest::testCreate_stringnum()
  119. {
  120. std::string in = "0d1:p4:68811:v5:aria21:md6:ut_pex1:1ee";
  121. SharedHandle<HandshakeExtensionMessage> m =
  122. HandshakeExtensionMessage::create
  123. (reinterpret_cast<const unsigned char*>(in.c_str()),
  124. in.size());
  125. CPPUNIT_ASSERT_EQUAL(std::string("aria2"), m->getClientVersion());
  126. // port number in string is not allowed
  127. CPPUNIT_ASSERT_EQUAL((uint16_t)0, m->getTCPPort());
  128. // extension ID in string is not allowed
  129. CPPUNIT_ASSERT_EQUAL((uint8_t)0, m->getExtensionMessageID("ut_pex"));
  130. }
  131. } // namespace aria2