UTMetadataRequestExtensionMessageTest.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. namespace aria2 {
  16. class UTMetadataRequestExtensionMessageTest:public CppUnit::TestFixture {
  17. CPPUNIT_TEST_SUITE(UTMetadataRequestExtensionMessageTest);
  18. CPPUNIT_TEST(testGetExtensionMessageID);
  19. CPPUNIT_TEST(testGetExtensionName);
  20. CPPUNIT_TEST(testGetBencodedData);
  21. CPPUNIT_TEST(testToString);
  22. CPPUNIT_TEST(testDoReceivedAction_reject);
  23. CPPUNIT_TEST(testDoReceivedAction_data);
  24. CPPUNIT_TEST_SUITE_END();
  25. public:
  26. SharedHandle<DownloadContext> _dctx;
  27. SharedHandle<WrapExtBtMessageFactory> _messageFactory;
  28. SharedHandle<MockBtMessageDispatcher> _dispatcher;
  29. SharedHandle<Peer> _peer;
  30. void setUp()
  31. {
  32. _messageFactory.reset(new WrapExtBtMessageFactory());
  33. _dispatcher.reset(new MockBtMessageDispatcher());
  34. _dctx.reset(new DownloadContext());
  35. BDE attrs = BDE::dict();
  36. _dctx->setAttribute(bittorrent::BITTORRENT, attrs);
  37. _peer.reset(new Peer("host", 6880));
  38. _peer->allocateSessionResource(0, 0);
  39. _peer->setExtension("ut_metadata", 1);
  40. }
  41. template<typename T>
  42. SharedHandle<T> getFirstDispatchedMessage()
  43. {
  44. SharedHandle<WrapExtBtMessage> wrapmsg =
  45. dynamic_pointer_cast<WrapExtBtMessage>
  46. (_dispatcher->messageQueue.front());
  47. SharedHandle<T> msg = dynamic_pointer_cast<T>(wrapmsg->_m);
  48. return msg;
  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"), msg.getExtensionName());
  67. }
  68. void UTMetadataRequestExtensionMessageTest::testGetBencodedData()
  69. {
  70. UTMetadataRequestExtensionMessage msg(1);
  71. msg.setIndex(99);
  72. CPPUNIT_ASSERT_EQUAL
  73. (std::string("d8:msg_typei0e5:piecei99ee"), msg.getPayload());
  74. }
  75. void UTMetadataRequestExtensionMessageTest::testToString()
  76. {
  77. UTMetadataRequestExtensionMessage msg(1);
  78. msg.setIndex(100);
  79. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata request piece=100"),
  80. msg.toString());
  81. }
  82. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_reject()
  83. {
  84. UTMetadataRequestExtensionMessage msg(1);
  85. msg.setIndex(10);
  86. msg.setDownloadContext(_dctx);
  87. msg.setPeer(_peer);
  88. msg.setBtMessageFactory(_messageFactory);
  89. msg.setBtMessageDispatcher(_dispatcher);
  90. msg.doReceivedAction();
  91. SharedHandle<UTMetadataRejectExtensionMessage> m =
  92. getFirstDispatchedMessage<UTMetadataRejectExtensionMessage>();
  93. CPPUNIT_ASSERT(!m.isNull());
  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);
  102. msg.setPeer(_peer);
  103. msg.setBtMessageFactory(_messageFactory);
  104. msg.setBtMessageDispatcher(_dispatcher);
  105. size_t metadataSize = METADATA_PIECE_SIZE*2;
  106. BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT);
  107. std::string first(METADATA_PIECE_SIZE, '0');
  108. std::string second(METADATA_PIECE_SIZE, '1');
  109. attrs[bittorrent::METADATA] = first+second;
  110. attrs[bittorrent::METADATA_SIZE] = metadataSize;
  111. msg.doReceivedAction();
  112. SharedHandle<UTMetadataDataExtensionMessage> m =
  113. getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  114. CPPUNIT_ASSERT(!m.isNull());
  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[bittorrent::METADATA] = attrs[bittorrent::METADATA].s()+third;
  124. attrs[bittorrent::METADATA_SIZE] = metadataSize;
  125. msg.doReceivedAction();
  126. m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  127. CPPUNIT_ASSERT(!m.isNull());
  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