UTMetadataRequestExtensionMessageTest.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. namespace aria2 {
  17. class UTMetadataRequestExtensionMessageTest:public CppUnit::TestFixture {
  18. CPPUNIT_TEST_SUITE(UTMetadataRequestExtensionMessageTest);
  19. CPPUNIT_TEST(testGetExtensionMessageID);
  20. CPPUNIT_TEST(testGetExtensionName);
  21. CPPUNIT_TEST(testGetBencodedData);
  22. CPPUNIT_TEST(testToString);
  23. CPPUNIT_TEST(testDoReceivedAction_reject);
  24. CPPUNIT_TEST(testDoReceivedAction_data);
  25. CPPUNIT_TEST_SUITE_END();
  26. public:
  27. SharedHandle<DownloadContext> dctx_;
  28. SharedHandle<WrapExtBtMessageFactory> messageFactory_;
  29. SharedHandle<MockBtMessageDispatcher> dispatcher_;
  30. SharedHandle<Peer> peer_;
  31. void setUp()
  32. {
  33. messageFactory_.reset(new WrapExtBtMessageFactory());
  34. dispatcher_.reset(new MockBtMessageDispatcher());
  35. dctx_.reset(new DownloadContext());
  36. SharedHandle<TorrentAttribute> attrs(new TorrentAttribute());
  37. dctx_->setAttribute(bittorrent::BITTORRENT, attrs);
  38. peer_.reset(new Peer("host", 6880));
  39. peer_->allocateSessionResource(0, 0);
  40. peer_->setExtension("ut_metadata", 1);
  41. }
  42. template<typename T>
  43. SharedHandle<T> getFirstDispatchedMessage()
  44. {
  45. SharedHandle<WrapExtBtMessage> wrapmsg =
  46. dynamic_pointer_cast<WrapExtBtMessage>
  47. (dispatcher_->messageQueue.front());
  48. SharedHandle<T> msg = dynamic_pointer_cast<T>(wrapmsg->m_);
  49. return msg;
  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"), msg.getExtensionName());
  68. }
  69. void UTMetadataRequestExtensionMessageTest::testGetBencodedData()
  70. {
  71. UTMetadataRequestExtensionMessage msg(1);
  72. msg.setIndex(99);
  73. CPPUNIT_ASSERT_EQUAL
  74. (std::string("d8:msg_typei0e5:piecei99ee"), 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_);
  88. msg.setPeer(peer_);
  89. msg.setBtMessageFactory(messageFactory_.get());
  90. msg.setBtMessageDispatcher(dispatcher_.get());
  91. msg.doReceivedAction();
  92. SharedHandle<UTMetadataRejectExtensionMessage> m =
  93. 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_);
  103. msg.setPeer(peer_);
  104. msg.setBtMessageFactory(messageFactory_.get());
  105. msg.setBtMessageDispatcher(dispatcher_.get());
  106. size_t metadataSize = METADATA_PIECE_SIZE*2;
  107. SharedHandle<TorrentAttribute> attrs = bittorrent::getTorrentAttrs(dctx_);
  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. SharedHandle<UTMetadataDataExtensionMessage> m =
  114. getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  115. CPPUNIT_ASSERT(m);
  116. CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
  117. CPPUNIT_ASSERT_EQUAL(second, m->getData());
  118. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  119. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  120. dispatcher_->messageQueue.clear();
  121. msg.setIndex(2);
  122. metadataSize += 100;
  123. std::string third(100, '2');
  124. attrs->metadata = first+second+third;
  125. attrs->metadataSize = metadataSize;
  126. msg.doReceivedAction();
  127. m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  128. CPPUNIT_ASSERT(m);
  129. CPPUNIT_ASSERT_EQUAL((size_t)2, m->getIndex());
  130. CPPUNIT_ASSERT_EQUAL(third, m->getData());
  131. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  132. msg.setIndex(3);
  133. try {
  134. msg.doReceivedAction();
  135. CPPUNIT_FAIL("exception must be thrown.");
  136. } catch(DlAbortEx& e) {
  137. // success
  138. }
  139. }
  140. } // namespace aria2