DefaultBtRequestFactoryTest.cc 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #include "DefaultBtRequestFactory.h"
  2. #include "MockBtMessage.h"
  3. #include "MockBtMessageFactory.h"
  4. #include "MockBtMessageDispatcher.h"
  5. #include "MockBtContext.h"
  6. #include "BtRegistry.h"
  7. #include "MockPieceStorage.h"
  8. #include "Peer.h"
  9. #include "PeerObject.h"
  10. #include "BtMessageReceiver.h"
  11. #include "PeerConnection.h"
  12. #include "ExtensionMessageFactory.h"
  13. #include "FileEntry.h"
  14. #include "BtHandshakeMessage.h"
  15. #include <algorithm>
  16. #include <cppunit/extensions/HelperMacros.h>
  17. namespace aria2 {
  18. class DefaultBtRequestFactoryTest:public CppUnit::TestFixture {
  19. CPPUNIT_TEST_SUITE(DefaultBtRequestFactoryTest);
  20. CPPUNIT_TEST(testAddTargetPiece);
  21. CPPUNIT_TEST(testRemoveCompletedPiece);
  22. CPPUNIT_TEST(testCreateRequestMessages);
  23. CPPUNIT_TEST(testCreateRequestMessages_onEndGame);
  24. CPPUNIT_TEST(testRemoveTargetPiece);
  25. CPPUNIT_TEST_SUITE_END();
  26. private:
  27. SharedHandle<DefaultBtRequestFactory> btRequestFactory;
  28. SharedHandle<MockBtContext> btContext;
  29. public:
  30. void testAddTargetPiece();
  31. void testRemoveCompletedPiece();
  32. void testCreateRequestMessages();
  33. void testCreateRequestMessages_onEndGame();
  34. void testRemoveTargetPiece();
  35. class MockBtRequestMessage : public MockBtMessage {
  36. public:
  37. size_t index;
  38. size_t blockIndex;
  39. MockBtRequestMessage(size_t index, size_t blockIndex):index(index), blockIndex(blockIndex) {}
  40. };
  41. typedef SharedHandle<MockBtRequestMessage> MockBtRequestMessageHandle;
  42. class MockBtMessageFactory2 : public MockBtMessageFactory {
  43. public:
  44. virtual SharedHandle<BtMessage>
  45. createRequestMessage(const SharedHandle<Piece>& piece, size_t blockIndex) {
  46. return SharedHandle<BtMessage>
  47. (new MockBtRequestMessage(piece->getIndex(), blockIndex));
  48. }
  49. };
  50. class MockBtMessageDispatcher2 : public MockBtMessageDispatcher {
  51. public:
  52. virtual bool isOutstandingRequest(size_t index, size_t blockIndex) {
  53. return index == 0 && blockIndex == 0;
  54. }
  55. };
  56. class SortMockBtRequestMessage {
  57. public:
  58. bool operator()(const SharedHandle<MockBtRequestMessage>& a,
  59. const SharedHandle<MockBtRequestMessage>& b) {
  60. if(a->index < b->index) {
  61. return true;
  62. } else if(b->index < a->index) {
  63. return false;
  64. } else if(a->blockIndex < b->blockIndex) {
  65. return true;
  66. } else if(b->blockIndex < a->blockIndex) {
  67. return false;
  68. } else {
  69. return true;
  70. }
  71. }
  72. };
  73. void setUp() {
  74. BtRegistry::unregisterAll();
  75. btContext.reset(new MockBtContext());
  76. btContext->setInfoHash((const unsigned char*)"12345678901234567890");
  77. btContext->setPieceLength(16*1024);
  78. btContext->setTotalLength(256*1024);
  79. SharedHandle<MockPieceStorage> pieceStorage(new MockPieceStorage());
  80. BtRegistry::registerPieceStorage(btContext->getInfoHashAsString(),
  81. pieceStorage);
  82. SharedHandle<Peer> peer(new Peer("host", 6969));
  83. SharedHandle<PeerObjectCluster> cluster(new PeerObjectCluster());
  84. BtRegistry::registerPeerObjectCluster(btContext->getInfoHashAsString(),
  85. cluster);
  86. SharedHandle<PeerObject> peerObject(new PeerObject());
  87. peerObject->btMessageFactory.reset(new MockBtMessageFactory2());
  88. PEER_OBJECT_CLUSTER(btContext)->registerHandle(peer->getID(), peerObject);
  89. SharedHandle<MockBtMessageDispatcher> dispatcher
  90. (new MockBtMessageDispatcher());
  91. PEER_OBJECT(btContext, peer)->btMessageDispatcher = dispatcher;
  92. btRequestFactory.reset(new DefaultBtRequestFactory());
  93. btRequestFactory->setBtContext(btContext);
  94. btRequestFactory->setPeer(peer);
  95. btRequestFactory->setBtMessageDispatcher(dispatcher);
  96. btRequestFactory->setBtMessageFactory(peerObject->btMessageFactory);
  97. }
  98. void tearDown()
  99. {
  100. BtRegistry::unregisterAll();
  101. }
  102. };
  103. CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtRequestFactoryTest);
  104. void DefaultBtRequestFactoryTest::testAddTargetPiece() {
  105. {
  106. SharedHandle<Piece> piece(new Piece(0, 16*1024*10));
  107. btRequestFactory->addTargetPiece(piece);
  108. CPPUNIT_ASSERT_EQUAL((size_t)1, btRequestFactory->countTargetPiece());
  109. }
  110. {
  111. SharedHandle<Piece> piece(new Piece(1, 16*1024*9));
  112. piece->completeBlock(0);
  113. btRequestFactory->addTargetPiece(piece);
  114. CPPUNIT_ASSERT_EQUAL((size_t)2, btRequestFactory->countTargetPiece());
  115. }
  116. CPPUNIT_ASSERT_EQUAL((size_t)18, btRequestFactory->countMissingBlock());
  117. }
  118. void DefaultBtRequestFactoryTest::testRemoveCompletedPiece() {
  119. SharedHandle<Piece> piece1(new Piece(0, 16*1024));
  120. SharedHandle<Piece> piece2(new Piece(1, 16*1024));
  121. piece2->setAllBlock();
  122. btRequestFactory->addTargetPiece(piece1);
  123. btRequestFactory->addTargetPiece(piece2);
  124. CPPUNIT_ASSERT_EQUAL((size_t)2, btRequestFactory->countTargetPiece());
  125. btRequestFactory->removeCompletedPiece();
  126. CPPUNIT_ASSERT_EQUAL((size_t)1, btRequestFactory->countTargetPiece());
  127. CPPUNIT_ASSERT_EQUAL((size_t)0, btRequestFactory->getTargetPieces().front()->getIndex());
  128. }
  129. void DefaultBtRequestFactoryTest::testCreateRequestMessages() {
  130. int PIECE_LENGTH = 16*1024*2;
  131. SharedHandle<Piece> piece1(new Piece(0, PIECE_LENGTH));
  132. SharedHandle<Piece> piece2(new Piece(1, PIECE_LENGTH));
  133. btRequestFactory->addTargetPiece(piece1);
  134. btRequestFactory->addTargetPiece(piece2);
  135. std::deque<SharedHandle<BtMessage> > msgs;
  136. btRequestFactory->createRequestMessages(msgs, 3);
  137. CPPUNIT_ASSERT_EQUAL((size_t)3, msgs.size());
  138. std::deque<SharedHandle<BtMessage> >::iterator itr = msgs.begin();
  139. MockBtRequestMessage* msg = (MockBtRequestMessage*)itr->get();
  140. CPPUNIT_ASSERT_EQUAL((size_t)0, msg->index);
  141. CPPUNIT_ASSERT_EQUAL((size_t)0, msg->blockIndex);
  142. ++itr;
  143. msg = (MockBtRequestMessage*)itr->get();
  144. CPPUNIT_ASSERT_EQUAL((size_t)0, msg->index);
  145. CPPUNIT_ASSERT_EQUAL((size_t)1, msg->blockIndex);
  146. ++itr;
  147. msg = (MockBtRequestMessage*)itr->get();
  148. CPPUNIT_ASSERT_EQUAL((size_t)1, msg->index);
  149. CPPUNIT_ASSERT_EQUAL((size_t)0, msg->blockIndex);
  150. {
  151. std::deque<SharedHandle<BtMessage> > msgs;
  152. btRequestFactory->createRequestMessages(msgs, 3);
  153. CPPUNIT_ASSERT_EQUAL((size_t)1, msgs.size());
  154. }
  155. }
  156. void DefaultBtRequestFactoryTest::testCreateRequestMessages_onEndGame() {
  157. SharedHandle<MockBtMessageDispatcher2> dispatcher
  158. (new MockBtMessageDispatcher2());
  159. btRequestFactory->setBtMessageDispatcher(dispatcher);
  160. int PIECE_LENGTH = 16*1024*2;
  161. SharedHandle<Piece> piece1(new Piece(0, PIECE_LENGTH));
  162. SharedHandle<Piece> piece2(new Piece(1, PIECE_LENGTH));
  163. btRequestFactory->addTargetPiece(piece1);
  164. btRequestFactory->addTargetPiece(piece2);
  165. std::deque<SharedHandle<BtMessage> > msgs;
  166. btRequestFactory->createRequestMessagesOnEndGame(msgs, 3);
  167. std::deque<SharedHandle<MockBtRequestMessage> > mmsgs;
  168. for(std::deque<SharedHandle<BtMessage> >::iterator i = msgs.begin();
  169. i != msgs.end(); ++i) {
  170. mmsgs.push_back(dynamic_pointer_cast<MockBtRequestMessage>(*i));
  171. }
  172. std::sort(mmsgs.begin(), mmsgs.end(), SortMockBtRequestMessage());
  173. CPPUNIT_ASSERT_EQUAL((size_t)3, mmsgs.size());
  174. std::deque<SharedHandle<MockBtRequestMessage> >::iterator itr = mmsgs.begin();
  175. MockBtRequestMessage* msg = (*itr).get();
  176. CPPUNIT_ASSERT_EQUAL((size_t)0, msg->index);
  177. CPPUNIT_ASSERT_EQUAL((size_t)1, msg->blockIndex);
  178. ++itr;
  179. msg = (*itr).get();
  180. CPPUNIT_ASSERT_EQUAL((size_t)1, msg->index);
  181. CPPUNIT_ASSERT_EQUAL((size_t)0, msg->blockIndex);
  182. ++itr;
  183. msg = (*itr).get();
  184. CPPUNIT_ASSERT_EQUAL((size_t)1, msg->index);
  185. CPPUNIT_ASSERT_EQUAL((size_t)1, msg->blockIndex);
  186. }
  187. void DefaultBtRequestFactoryTest::testRemoveTargetPiece() {
  188. SharedHandle<Piece> piece1(new Piece(0, 16*1024));
  189. btRequestFactory->addTargetPiece(piece1);
  190. CPPUNIT_ASSERT(std::find(btRequestFactory->getTargetPieces().begin(),
  191. btRequestFactory->getTargetPieces().end(),
  192. piece1) != btRequestFactory->getTargetPieces().end());
  193. btRequestFactory->removeTargetPiece(piece1);
  194. CPPUNIT_ASSERT(std::find(btRequestFactory->getTargetPieces().begin(),
  195. btRequestFactory->getTargetPieces().end(),
  196. piece1) == btRequestFactory->getTargetPieces().end());
  197. }
  198. } // namespace aria2