UTMetadataRequestExtensionMessageTest.cc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include "UTMetadataRequestExtensionMessage.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "Peer.h"
  5. #include "DownloadContext.h"
  6. #include "MockBtMessage.h"
  7. #include "MockBtMessageDispatcher.h"
  8. #include "MockBtMessageFactory.h"
  9. #include "bittorrent_helper.h"
  10. #include "BtHandshakeMessage.h"
  11. #include "UTMetadataRejectExtensionMessage.h"
  12. #include "UTMetadataDataExtensionMessage.h"
  13. #include "PieceStorage.h"
  14. #include "extension_message_test_helper.h"
  15. #include "DlAbortEx.h"
  16. #include "ExtensionMessageRegistry.h"
  17. namespace aria2 {
  18. class UTMetadataRequestExtensionMessageTest : public CppUnit::TestFixture {
  19. CPPUNIT_TEST_SUITE(UTMetadataRequestExtensionMessageTest);
  20. CPPUNIT_TEST(testGetExtensionMessageID);
  21. CPPUNIT_TEST(testGetExtensionName);
  22. CPPUNIT_TEST(testGetBencodedData);
  23. CPPUNIT_TEST(testToString);
  24. CPPUNIT_TEST(testDoReceivedAction_reject);
  25. CPPUNIT_TEST(testDoReceivedAction_data);
  26. CPPUNIT_TEST_SUITE_END();
  27. public:
  28. std::unique_ptr<DownloadContext> dctx_;
  29. std::unique_ptr<WrapExtBtMessageFactory> messageFactory_;
  30. std::unique_ptr<MockBtMessageDispatcher> dispatcher_;
  31. std::shared_ptr<Peer> peer_;
  32. void setUp()
  33. {
  34. messageFactory_ = make_unique<WrapExtBtMessageFactory>();
  35. dispatcher_ = make_unique<MockBtMessageDispatcher>();
  36. dctx_ = make_unique<DownloadContext>();
  37. dctx_->setAttribute(CTX_ATTR_BT, make_unique<TorrentAttribute>());
  38. peer_ = std::make_shared<Peer>("host", 6880);
  39. peer_->allocateSessionResource(0, 0);
  40. peer_->setExtension(ExtensionMessageRegistry::UT_METADATA, 1);
  41. }
  42. template <typename T> const T* getFirstDispatchedMessage()
  43. {
  44. CPPUNIT_ASSERT(BtExtendedMessage::ID ==
  45. dispatcher_->messageQueue.front()->getId());
  46. auto msg = static_cast<const BtExtendedMessage*>(
  47. dispatcher_->messageQueue.front().get());
  48. return dynamic_cast<const T*>(msg->getExtensionMessage().get());
  49. }
  50. void testGetExtensionMessageID();
  51. void testGetExtensionName();
  52. void testGetBencodedData();
  53. void testToString();
  54. void testDoReceivedAction_reject();
  55. void testDoReceivedAction_data();
  56. };
  57. CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataRequestExtensionMessageTest);
  58. void UTMetadataRequestExtensionMessageTest::testGetExtensionMessageID()
  59. {
  60. UTMetadataRequestExtensionMessage msg(1);
  61. CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
  62. }
  63. void UTMetadataRequestExtensionMessageTest::testGetExtensionName()
  64. {
  65. UTMetadataRequestExtensionMessage msg(1);
  66. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata"),
  67. std::string(msg.getExtensionName()));
  68. }
  69. void UTMetadataRequestExtensionMessageTest::testGetBencodedData()
  70. {
  71. UTMetadataRequestExtensionMessage msg(1);
  72. msg.setIndex(99);
  73. CPPUNIT_ASSERT_EQUAL(std::string("d8:msg_typei0e5:piecei99ee"),
  74. msg.getPayload());
  75. }
  76. void UTMetadataRequestExtensionMessageTest::testToString()
  77. {
  78. UTMetadataRequestExtensionMessage msg(1);
  79. msg.setIndex(100);
  80. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata request piece=100"),
  81. msg.toString());
  82. }
  83. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_reject()
  84. {
  85. UTMetadataRequestExtensionMessage msg(1);
  86. msg.setIndex(10);
  87. msg.setDownloadContext(dctx_.get());
  88. msg.setPeer(peer_);
  89. msg.setBtMessageFactory(messageFactory_.get());
  90. msg.setBtMessageDispatcher(dispatcher_.get());
  91. msg.doReceivedAction();
  92. auto m = getFirstDispatchedMessage<UTMetadataRejectExtensionMessage>();
  93. CPPUNIT_ASSERT(m);
  94. CPPUNIT_ASSERT_EQUAL((size_t)10, m->getIndex());
  95. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  96. }
  97. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_data()
  98. {
  99. UTMetadataRequestExtensionMessage msg(1);
  100. msg.setIndex(1);
  101. msg.setDownloadContext(dctx_.get());
  102. msg.setPeer(peer_);
  103. msg.setBtMessageFactory(messageFactory_.get());
  104. msg.setBtMessageDispatcher(dispatcher_.get());
  105. size_t metadataSize = METADATA_PIECE_SIZE * 2;
  106. auto attrs = bittorrent::getTorrentAttrs(dctx_.get());
  107. std::string first(METADATA_PIECE_SIZE, '0');
  108. std::string second(METADATA_PIECE_SIZE, '1');
  109. attrs->metadata = first + second;
  110. attrs->metadataSize = metadataSize;
  111. msg.doReceivedAction();
  112. auto m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  113. CPPUNIT_ASSERT(m);
  114. CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
  115. CPPUNIT_ASSERT_EQUAL(second, m->getData());
  116. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  117. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  118. dispatcher_->messageQueue.clear();
  119. msg.setIndex(2);
  120. metadataSize += 100;
  121. std::string third(100, '2');
  122. attrs->metadata = first + second + third;
  123. attrs->metadataSize = metadataSize;
  124. msg.doReceivedAction();
  125. m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  126. CPPUNIT_ASSERT(m);
  127. CPPUNIT_ASSERT_EQUAL((size_t)2, m->getIndex());
  128. CPPUNIT_ASSERT_EQUAL(third, m->getData());
  129. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  130. msg.setIndex(3);
  131. try {
  132. msg.doReceivedAction();
  133. CPPUNIT_FAIL("exception must be thrown.");
  134. }
  135. catch (DlAbortEx& e) {
  136. // success
  137. }
  138. }
  139. } // namespace aria2