DefaultBtRequestFactoryTest.cc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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 <algorithm>
  15. #include <cppunit/extensions/HelperMacros.h>
  16. namespace aria2 {
  17. class DefaultBtRequestFactoryTest:public CppUnit::TestFixture {
  18. CPPUNIT_TEST_SUITE(DefaultBtRequestFactoryTest);
  19. CPPUNIT_TEST(testAddTargetPiece);
  20. CPPUNIT_TEST(testRemoveCompletedPiece);
  21. CPPUNIT_TEST(testCreateRequestMessages);
  22. CPPUNIT_TEST(testCreateRequestMessages_onEndGame);
  23. CPPUNIT_TEST(testRemoveTargetPiece);
  24. CPPUNIT_TEST_SUITE_END();
  25. private:
  26. SharedHandle<DefaultBtRequestFactory> btRequestFactory;
  27. SharedHandle<MockBtContext> btContext;
  28. public:
  29. DefaultBtRequestFactoryTest():btRequestFactory(0), btContext(0) {}
  30. void testAddTargetPiece();
  31. void testRemoveCompletedPiece();
  32. void testCreateRequestMessages();
  33. void testCreateRequestMessages_onEndGame();
  34. void testRemoveTargetPiece();
  35. class MockBtRequestMessage : public MockBtMessage {
  36. public:
  37. int index;
  38. int blockIndex;
  39. MockBtRequestMessage(int index, int 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, int32_t blockIndex) {
  46. return new MockBtRequestMessage(piece->getIndex(), blockIndex);
  47. }
  48. };
  49. class MockBtMessageDispatcher2 : public MockBtMessageDispatcher {
  50. public:
  51. virtual bool isOutstandingRequest(int32_t index, int32_t blockIndex) {
  52. return index == 0 && blockIndex == 0;
  53. }
  54. };
  55. class SortMockBtRequestMessage {
  56. public:
  57. bool operator()(const SharedHandle<MockBtRequestMessage>& a,
  58. const SharedHandle<MockBtRequestMessage>& b) {
  59. if(a->index < b->index) {
  60. return true;
  61. } else if(b->index < a->index) {
  62. return false;
  63. } else if(a->blockIndex < b->blockIndex) {
  64. return true;
  65. } else if(b->blockIndex < a->blockIndex) {
  66. return false;
  67. } else {
  68. return true;
  69. }
  70. }
  71. };
  72. void setUp() {
  73. BtRegistry::unregisterAll();
  74. btContext = new MockBtContext();
  75. btContext->setInfoHash((const unsigned char*)"12345678901234567890");
  76. btContext->setPieceLength(16*1024);
  77. btContext->setTotalLength(256*1024);
  78. BtRegistry::registerPieceStorage(btContext->getInfoHashAsString(),
  79. new MockPieceStorage());
  80. SharedHandle<Peer> peer = new Peer("host", 6969);
  81. BtRegistry::registerPeerObjectCluster(btContext->getInfoHashAsString(),
  82. new PeerObjectCluster());
  83. SharedHandle<PeerObject> peerObject = new PeerObject();
  84. peerObject->btMessageFactory = new MockBtMessageFactory2();
  85. PEER_OBJECT_CLUSTER(btContext)->registerHandle(peer->getID(), peerObject);
  86. btRequestFactory = new DefaultBtRequestFactory();
  87. btRequestFactory->setBtContext(btContext);
  88. btRequestFactory->setPeer(peer);
  89. btRequestFactory->setBtMessageDispatcher(new MockBtMessageDispatcher());
  90. btRequestFactory->setBtMessageFactory(peerObject->btMessageFactory);
  91. }
  92. };
  93. CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtRequestFactoryTest);
  94. void DefaultBtRequestFactoryTest::testAddTargetPiece() {
  95. SharedHandle<Piece> piece = new Piece(0, 16*1024);
  96. btRequestFactory->addTargetPiece(piece);
  97. CPPUNIT_ASSERT_EQUAL((int32_t)1, btRequestFactory->countTargetPiece());
  98. }
  99. void DefaultBtRequestFactoryTest::testRemoveCompletedPiece() {
  100. SharedHandle<Piece> piece1 = new Piece(0, 16*1024);
  101. SharedHandle<Piece> piece2 = new Piece(1, 16*1024);
  102. piece2->setAllBlock();
  103. btRequestFactory->addTargetPiece(piece1);
  104. btRequestFactory->addTargetPiece(piece2);
  105. CPPUNIT_ASSERT_EQUAL((int32_t)2, btRequestFactory->countTargetPiece());
  106. btRequestFactory->removeCompletedPiece();
  107. CPPUNIT_ASSERT_EQUAL((int32_t)1, btRequestFactory->countTargetPiece());
  108. CPPUNIT_ASSERT_EQUAL((int32_t)0, btRequestFactory->getTargetPieces().front()->getIndex());
  109. }
  110. void DefaultBtRequestFactoryTest::testCreateRequestMessages() {
  111. int PIECE_LENGTH = 16*1024*2;
  112. SharedHandle<Piece> piece1 = new Piece(0, PIECE_LENGTH);
  113. SharedHandle<Piece> piece2 = new Piece(1, PIECE_LENGTH);
  114. btRequestFactory->addTargetPiece(piece1);
  115. btRequestFactory->addTargetPiece(piece2);
  116. std::deque<SharedHandle<BtMessage> > msgs = btRequestFactory->createRequestMessages(3);
  117. CPPUNIT_ASSERT_EQUAL((size_t)3, msgs.size());
  118. std::deque<SharedHandle<BtMessage> >::iterator itr = msgs.begin();
  119. MockBtRequestMessage* msg = (MockBtRequestMessage*)itr->get();
  120. CPPUNIT_ASSERT_EQUAL(0, msg->index);
  121. CPPUNIT_ASSERT_EQUAL(0, msg->blockIndex);
  122. ++itr;
  123. msg = (MockBtRequestMessage*)itr->get();
  124. CPPUNIT_ASSERT_EQUAL(0, msg->index);
  125. CPPUNIT_ASSERT_EQUAL(1, msg->blockIndex);
  126. ++itr;
  127. msg = (MockBtRequestMessage*)itr->get();
  128. CPPUNIT_ASSERT_EQUAL(1, msg->index);
  129. CPPUNIT_ASSERT_EQUAL(0, msg->blockIndex);
  130. CPPUNIT_ASSERT_EQUAL((size_t)1, btRequestFactory->createRequestMessages(3).size());
  131. }
  132. void DefaultBtRequestFactoryTest::testCreateRequestMessages_onEndGame() {
  133. MockBtMessageDispatcher2* dispatcher = new MockBtMessageDispatcher2();
  134. btRequestFactory->setBtMessageDispatcher(dispatcher);
  135. int PIECE_LENGTH = 16*1024*2;
  136. SharedHandle<Piece> piece1 = new Piece(0, PIECE_LENGTH);
  137. SharedHandle<Piece> piece2 = new Piece(1, PIECE_LENGTH);
  138. btRequestFactory->addTargetPiece(piece1);
  139. btRequestFactory->addTargetPiece(piece2);
  140. std::deque<SharedHandle<BtMessage> > msgs = btRequestFactory->createRequestMessagesOnEndGame(3);
  141. std::sort(msgs.begin(), msgs.end(), SortMockBtRequestMessage());
  142. CPPUNIT_ASSERT_EQUAL((size_t)3, msgs.size());
  143. std::deque<SharedHandle<BtMessage> >::iterator itr = msgs.begin();
  144. MockBtRequestMessage* msg = (MockBtRequestMessage*)itr->get();
  145. CPPUNIT_ASSERT_EQUAL(0, msg->index);
  146. CPPUNIT_ASSERT_EQUAL(1, msg->blockIndex);
  147. ++itr;
  148. msg = (MockBtRequestMessage*)itr->get();
  149. CPPUNIT_ASSERT_EQUAL(1, msg->index);
  150. CPPUNIT_ASSERT_EQUAL(0, msg->blockIndex);
  151. ++itr;
  152. msg = (MockBtRequestMessage*)itr->get();
  153. CPPUNIT_ASSERT_EQUAL(1, msg->index);
  154. CPPUNIT_ASSERT_EQUAL(1, msg->blockIndex);
  155. }
  156. void DefaultBtRequestFactoryTest::testRemoveTargetPiece() {
  157. SharedHandle<Piece> piece1 = new Piece(0, 16*1024);
  158. btRequestFactory->addTargetPiece(piece1);
  159. CPPUNIT_ASSERT(std::find(btRequestFactory->getTargetPieces().begin(),
  160. btRequestFactory->getTargetPieces().end(),
  161. piece1) != btRequestFactory->getTargetPieces().end());
  162. btRequestFactory->removeTargetPiece(piece1);
  163. CPPUNIT_ASSERT(std::find(btRequestFactory->getTargetPieces().begin(),
  164. btRequestFactory->getTargetPieces().end(),
  165. piece1) == btRequestFactory->getTargetPieces().end());
  166. }
  167. } // namespace aria2