UTMetadataRequestExtensionMessageTest.cc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. SharedHandle<DownloadContext> dctx_;
  29. SharedHandle<WrapExtBtMessageFactory> messageFactory_;
  30. SharedHandle<MockBtMessageDispatcher> dispatcher_;
  31. SharedHandle<Peer> peer_;
  32. void setUp()
  33. {
  34. messageFactory_.reset(new WrapExtBtMessageFactory());
  35. dispatcher_.reset(new MockBtMessageDispatcher());
  36. dctx_.reset(new DownloadContext());
  37. SharedHandle<TorrentAttribute> attrs(new TorrentAttribute());
  38. dctx_->setAttribute(CTX_ATTR_BT, attrs);
  39. peer_.reset(new Peer("host", 6880));
  40. peer_->allocateSessionResource(0, 0);
  41. peer_->setExtension(ExtensionMessageRegistry::UT_METADATA, 1);
  42. }
  43. template<typename T>
  44. SharedHandle<T> getFirstDispatchedMessage()
  45. {
  46. SharedHandle<WrapExtBtMessage> wrapmsg =
  47. dynamic_pointer_cast<WrapExtBtMessage>
  48. (dispatcher_->messageQueue.front());
  49. SharedHandle<T> msg = dynamic_pointer_cast<T>(wrapmsg->m_);
  50. return msg;
  51. }
  52. void testGetExtensionMessageID();
  53. void testGetExtensionName();
  54. void testGetBencodedData();
  55. void testToString();
  56. void testDoReceivedAction_reject();
  57. void testDoReceivedAction_data();
  58. };
  59. CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataRequestExtensionMessageTest);
  60. void UTMetadataRequestExtensionMessageTest::testGetExtensionMessageID()
  61. {
  62. UTMetadataRequestExtensionMessage msg(1);
  63. CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
  64. }
  65. void UTMetadataRequestExtensionMessageTest::testGetExtensionName()
  66. {
  67. UTMetadataRequestExtensionMessage msg(1);
  68. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata"),
  69. std::string(msg.getExtensionName()));
  70. }
  71. void UTMetadataRequestExtensionMessageTest::testGetBencodedData()
  72. {
  73. UTMetadataRequestExtensionMessage msg(1);
  74. msg.setIndex(99);
  75. CPPUNIT_ASSERT_EQUAL
  76. (std::string("d8:msg_typei0e5:piecei99ee"), msg.getPayload());
  77. }
  78. void UTMetadataRequestExtensionMessageTest::testToString()
  79. {
  80. UTMetadataRequestExtensionMessage msg(1);
  81. msg.setIndex(100);
  82. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata request piece=100"),
  83. msg.toString());
  84. }
  85. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_reject()
  86. {
  87. UTMetadataRequestExtensionMessage msg(1);
  88. msg.setIndex(10);
  89. msg.setDownloadContext(dctx_);
  90. msg.setPeer(peer_);
  91. msg.setBtMessageFactory(messageFactory_.get());
  92. msg.setBtMessageDispatcher(dispatcher_.get());
  93. msg.doReceivedAction();
  94. SharedHandle<UTMetadataRejectExtensionMessage> m =
  95. getFirstDispatchedMessage<UTMetadataRejectExtensionMessage>();
  96. CPPUNIT_ASSERT(m);
  97. CPPUNIT_ASSERT_EQUAL((size_t)10, m->getIndex());
  98. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  99. }
  100. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_data()
  101. {
  102. UTMetadataRequestExtensionMessage msg(1);
  103. msg.setIndex(1);
  104. msg.setDownloadContext(dctx_);
  105. msg.setPeer(peer_);
  106. msg.setBtMessageFactory(messageFactory_.get());
  107. msg.setBtMessageDispatcher(dispatcher_.get());
  108. size_t metadataSize = METADATA_PIECE_SIZE*2;
  109. SharedHandle<TorrentAttribute> attrs = bittorrent::getTorrentAttrs(dctx_);
  110. std::string first(METADATA_PIECE_SIZE, '0');
  111. std::string second(METADATA_PIECE_SIZE, '1');
  112. attrs->metadata = first+second;
  113. attrs->metadataSize = metadataSize;
  114. msg.doReceivedAction();
  115. SharedHandle<UTMetadataDataExtensionMessage> m =
  116. getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  117. CPPUNIT_ASSERT(m);
  118. CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
  119. CPPUNIT_ASSERT_EQUAL(second, m->getData());
  120. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  121. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  122. dispatcher_->messageQueue.clear();
  123. msg.setIndex(2);
  124. metadataSize += 100;
  125. std::string third(100, '2');
  126. attrs->metadata = first+second+third;
  127. attrs->metadataSize = metadataSize;
  128. msg.doReceivedAction();
  129. m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  130. CPPUNIT_ASSERT(m);
  131. CPPUNIT_ASSERT_EQUAL((size_t)2, m->getIndex());
  132. CPPUNIT_ASSERT_EQUAL(third, m->getData());
  133. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  134. msg.setIndex(3);
  135. try {
  136. msg.doReceivedAction();
  137. CPPUNIT_FAIL("exception must be thrown.");
  138. } catch(DlAbortEx& e) {
  139. // success
  140. }
  141. }
  142. } // namespace aria2