UTMetadataRequestExtensionMessageTest.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. namespace aria2 {
  14. class UTMetadataRequestExtensionMessageTest:public CppUnit::TestFixture {
  15. CPPUNIT_TEST_SUITE(UTMetadataRequestExtensionMessageTest);
  16. CPPUNIT_TEST(testGetExtensionMessageID);
  17. CPPUNIT_TEST(testGetExtensionName);
  18. CPPUNIT_TEST(testGetBencodedData);
  19. CPPUNIT_TEST(testToString);
  20. CPPUNIT_TEST(testDoReceivedAction_reject);
  21. CPPUNIT_TEST(testDoReceivedAction_data);
  22. CPPUNIT_TEST_SUITE_END();
  23. public:
  24. class MockExtensionMessage:public MockBtMessage {
  25. public:
  26. SharedHandle<ExtensionMessage> _m;
  27. MockExtensionMessage(const SharedHandle<ExtensionMessage>& m):_m(m) {}
  28. };
  29. class MockBtMessageFactory2:public MockBtMessageFactory {
  30. public:
  31. virtual SharedHandle<BtMessage>
  32. createBtExtendedMessage(const SharedHandle<ExtensionMessage>& extmsg)
  33. {
  34. return SharedHandle<BtMessage>(new MockExtensionMessage(extmsg));
  35. }
  36. };
  37. SharedHandle<DownloadContext> _dctx;
  38. SharedHandle<MockBtMessageFactory2> _messageFactory;
  39. SharedHandle<MockBtMessageDispatcher> _dispatcher;
  40. SharedHandle<Peer> _peer;
  41. void setUp()
  42. {
  43. _messageFactory.reset(new MockBtMessageFactory2());
  44. _dispatcher.reset(new MockBtMessageDispatcher());
  45. _dctx.reset(new DownloadContext());
  46. BDE attrs = BDE::dict();
  47. _dctx->setAttribute(bittorrent::BITTORRENT, attrs);
  48. _peer.reset(new Peer("host", 6880));
  49. _peer->allocateSessionResource(0, 0);
  50. _peer->setExtension("ut_metadata", 1);
  51. }
  52. template<typename T>
  53. SharedHandle<T> getFirstDispatchedMessage()
  54. {
  55. SharedHandle<MockExtensionMessage> wrapmsg =
  56. dynamic_pointer_cast<MockExtensionMessage>
  57. (_dispatcher->messageQueue.front());
  58. SharedHandle<T> msg = dynamic_pointer_cast<T>(wrapmsg->_m);
  59. return msg;
  60. }
  61. void testGetExtensionMessageID();
  62. void testGetExtensionName();
  63. void testGetBencodedData();
  64. void testToString();
  65. void testDoReceivedAction_reject();
  66. void testDoReceivedAction_data();
  67. };
  68. CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataRequestExtensionMessageTest);
  69. void UTMetadataRequestExtensionMessageTest::testGetExtensionMessageID()
  70. {
  71. UTMetadataRequestExtensionMessage msg(1);
  72. CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID());
  73. }
  74. void UTMetadataRequestExtensionMessageTest::testGetExtensionName()
  75. {
  76. UTMetadataRequestExtensionMessage msg(1);
  77. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata"), msg.getExtensionName());
  78. }
  79. void UTMetadataRequestExtensionMessageTest::testGetBencodedData()
  80. {
  81. UTMetadataRequestExtensionMessage msg(1);
  82. msg.setIndex(99);
  83. CPPUNIT_ASSERT_EQUAL
  84. (std::string("d8:msg_typei0e5:piecei99ee"), msg.getBencodedData());
  85. }
  86. void UTMetadataRequestExtensionMessageTest::testToString()
  87. {
  88. UTMetadataRequestExtensionMessage msg(1);
  89. msg.setIndex(100);
  90. CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata request piece=100"),
  91. msg.toString());
  92. }
  93. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_reject()
  94. {
  95. UTMetadataRequestExtensionMessage msg(1);
  96. msg.setIndex(10);
  97. msg.setDownloadContext(_dctx);
  98. msg.setPeer(_peer);
  99. msg.setBtMessageFactory(_messageFactory);
  100. msg.setBtMessageDispatcher(_dispatcher);
  101. msg.doReceivedAction();
  102. SharedHandle<UTMetadataRejectExtensionMessage> m =
  103. getFirstDispatchedMessage<UTMetadataRejectExtensionMessage>();
  104. CPPUNIT_ASSERT(!m.isNull());
  105. CPPUNIT_ASSERT_EQUAL((size_t)10, m->getIndex());
  106. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  107. }
  108. void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_data()
  109. {
  110. UTMetadataRequestExtensionMessage msg(1);
  111. msg.setIndex(1);
  112. msg.setDownloadContext(_dctx);
  113. msg.setPeer(_peer);
  114. msg.setBtMessageFactory(_messageFactory);
  115. msg.setBtMessageDispatcher(_dispatcher);
  116. size_t metadataSize = METADATA_PIECE_SIZE*2;
  117. BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT);
  118. std::string first(METADATA_PIECE_SIZE, '0');
  119. std::string second(METADATA_PIECE_SIZE, '1');
  120. attrs[bittorrent::METADATA] = first+second;
  121. attrs[bittorrent::METADATA_SIZE] = metadataSize;
  122. msg.doReceivedAction();
  123. SharedHandle<UTMetadataDataExtensionMessage> m =
  124. getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  125. CPPUNIT_ASSERT(!m.isNull());
  126. CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex());
  127. CPPUNIT_ASSERT_EQUAL(second, m->getData());
  128. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  129. CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID());
  130. _dispatcher->messageQueue.clear();
  131. msg.setIndex(2);
  132. metadataSize += 100;
  133. std::string third(100, '2');
  134. attrs[bittorrent::METADATA] = attrs[bittorrent::METADATA].s()+third;
  135. attrs[bittorrent::METADATA_SIZE] = metadataSize;
  136. msg.doReceivedAction();
  137. m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>();
  138. CPPUNIT_ASSERT(!m.isNull());
  139. CPPUNIT_ASSERT_EQUAL((size_t)2, m->getIndex());
  140. CPPUNIT_ASSERT_EQUAL(third, m->getData());
  141. CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize());
  142. msg.setIndex(3);
  143. try {
  144. msg.doReceivedAction();
  145. CPPUNIT_FAIL("exception must be thrown.");
  146. } catch(DlAbortEx& e) {
  147. // success
  148. }
  149. }
  150. } // namespace aria2