UTMetadataRequestExtensionMessageTest.cc 5.0 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>
  43. const T* getFirstDispatchedMessage()
  44. {
  45. CPPUNIT_ASSERT(BtExtendedMessage::ID ==
  46. dispatcher_->messageQueue.front()->getId());
  47. auto msg = static_cast<const BtExtendedMessage*>
  48. (dispatcher_->messageQueue.front().get());
  49. return dynamic_cast<const T*>(msg->getExtensionMessage().get());
  50. }
  51. void testGetExtensionMessageID();
  52. void testGetExtensionName();
  53. void testGetBencodedData();
  54. void testToString();
  55. void testDoReceivedAction_reject();
  56. void testDoReceivedAction_data();
  57. };
  58. CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataRequestExtensionMessageTest);
  59. void UTMetadataRequestExtensionMessageTest::testGetExtensionMessageID()
  60. {
  61. UTMetadataRequestExtensionMessage msg(1);
  62. CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
  63. }
  64. void UTMetadataRequestExtensionMessageTest::testGetExtensionName()
  65. {
  66. UTMetadataRequestExtensionMessage msg(1);
  67. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata"),
  68. std::string(msg.getExtensionName()));
  69. }
  70. void UTMetadataRequestExtensionMessageTest::testGetBencodedData()
  71. {
  72. UTMetadataRequestExtensionMessage msg(1);
  73. msg.setIndex(99);
  74. CPPUNIT_ASSERT_EQUAL
  75. (std::string("d8:msg_typei0e5:piecei99ee"), msg.getPayload());
  76. }
  77. void UTMetadataRequestExtensionMessageTest::testToString()
  78. {
  79. UTMetadataRequestExtensionMessage msg(1);
  80. msg.setIndex(100);
  81. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata request piece=100"),
  82. msg.toString());
  83. }
  84. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_reject()
  85. {
  86. UTMetadataRequestExtensionMessage msg(1);
  87. msg.setIndex(10);
  88. msg.setDownloadContext(dctx_.get());
  89. msg.setPeer(peer_);
  90. msg.setBtMessageFactory(messageFactory_.get());
  91. msg.setBtMessageDispatcher(dispatcher_.get());
  92. msg.doReceivedAction();
  93. auto m = getFirstDispatchedMessage<UTMetadataRejectExtensionMessage>();
  94. CPPUNIT_ASSERT(m);
  95. CPPUNIT_ASSERT_EQUAL((size_t)10, m->getIndex());
  96. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  97. }
  98. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_data()
  99. {
  100. UTMetadataRequestExtensionMessage msg(1);
  101. msg.setIndex(1);
  102. msg.setDownloadContext(dctx_.get());
  103. msg.setPeer(peer_);
  104. msg.setBtMessageFactory(messageFactory_.get());
  105. msg.setBtMessageDispatcher(dispatcher_.get());
  106. size_t metadataSize = METADATA_PIECE_SIZE*2;
  107. auto attrs = bittorrent::getTorrentAttrs(dctx_.get());
  108. std::string first(METADATA_PIECE_SIZE, '0');
  109. std::string second(METADATA_PIECE_SIZE, '1');
  110. attrs->metadata = first+second;
  111. attrs->metadataSize = metadataSize;
  112. msg.doReceivedAction();
  113. auto m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  114. CPPUNIT_ASSERT(m);
  115. CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
  116. CPPUNIT_ASSERT_EQUAL(second, m->getData());
  117. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  118. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  119. dispatcher_->messageQueue.clear();
  120. msg.setIndex(2);
  121. metadataSize += 100;
  122. std::string third(100, '2');
  123. attrs->metadata = first+second+third;
  124. attrs->metadataSize = metadataSize;
  125. msg.doReceivedAction();
  126. m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  127. CPPUNIT_ASSERT(m);
  128. CPPUNIT_ASSERT_EQUAL((size_t)2, m->getIndex());
  129. CPPUNIT_ASSERT_EQUAL(third, m->getData());
  130. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  131. msg.setIndex(3);
  132. try {
  133. msg.doReceivedAction();
  134. CPPUNIT_FAIL("exception must be thrown.");
  135. } catch(DlAbortEx& e) {
  136. // success
  137. }
  138. }
  139. } // namespace aria2