DefaultBtMessageDispatcherTest.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. #include "DefaultBtMessageDispatcher.h"
  2. #include <cassert>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "Util.h"
  5. #include "Exception.h"
  6. #include "MockPieceStorage.h"
  7. #include "MockPeerStorage.h"
  8. #include "DefaultBtContext.h"
  9. #include "MockBtMessage.h"
  10. #include "MockBtMessageFactory.h"
  11. #include "prefs.h"
  12. #include "BtCancelSendingPieceEvent.h"
  13. #include "BtHandshakeMessage.h"
  14. namespace aria2 {
  15. class DefaultBtMessageDispatcherTest:public CppUnit::TestFixture {
  16. CPPUNIT_TEST_SUITE(DefaultBtMessageDispatcherTest);
  17. CPPUNIT_TEST(testAddMessage);
  18. CPPUNIT_TEST(testSendMessages);
  19. CPPUNIT_TEST(testSendMessages_underUploadLimit);
  20. CPPUNIT_TEST(testSendMessages_overUploadLimit);
  21. CPPUNIT_TEST(testSendMessages_sendingInProgress);
  22. CPPUNIT_TEST(testDoCancelSendingPieceAction);
  23. CPPUNIT_TEST(testCheckRequestSlotAndDoNecessaryThing);
  24. CPPUNIT_TEST(testCheckRequestSlotAndDoNecessaryThing_timeout);
  25. CPPUNIT_TEST(testCheckRequestSlotAndDoNecessaryThing_completeBlock);
  26. CPPUNIT_TEST(testIsSendingInProgress);
  27. CPPUNIT_TEST(testCountOutstandingRequest);
  28. CPPUNIT_TEST(testIsOutstandingRequest);
  29. CPPUNIT_TEST(testGetOutstandingRequest);
  30. CPPUNIT_TEST(testRemoveOutstandingRequest);
  31. CPPUNIT_TEST_SUITE_END();
  32. private:
  33. SharedHandle<BtContext> btContext;
  34. SharedHandle<Peer> peer;
  35. SharedHandle<DefaultBtMessageDispatcher> btMessageDispatcher;
  36. SharedHandle<MockPeerStorage> peerStorage;
  37. SharedHandle<MockPieceStorage> pieceStorage;
  38. SharedHandle<MockBtMessageFactory> _messageFactory;
  39. public:
  40. void tearDown() {}
  41. void testAddMessage();
  42. void testSendMessages();
  43. void testSendMessages_underUploadLimit();
  44. void testSendMessages_overUploadLimit();
  45. void testSendMessages_sendingInProgress();
  46. void testDoCancelSendingPieceAction();
  47. void testCheckRequestSlotAndDoNecessaryThing();
  48. void testCheckRequestSlotAndDoNecessaryThing_timeout();
  49. void testCheckRequestSlotAndDoNecessaryThing_completeBlock();
  50. void testIsSendingInProgress();
  51. void testCountOutstandingRequest();
  52. void testIsOutstandingRequest();
  53. void testGetOutstandingRequest();
  54. void testRemoveOutstandingRequest();
  55. class MockBtMessage2 : public MockBtMessage {
  56. private:
  57. bool onQueuedCalled;
  58. bool sendCalled;
  59. bool doCancelActionCalled;
  60. public:
  61. std::string type;
  62. public:
  63. MockBtMessage2():onQueuedCalled(false),
  64. sendCalled(false),
  65. doCancelActionCalled(false)
  66. {}
  67. virtual ~MockBtMessage2() {}
  68. virtual void onQueued() {
  69. onQueuedCalled = true;
  70. }
  71. bool isOnQueuedCalled() const {
  72. return onQueuedCalled;
  73. }
  74. virtual void send() {
  75. sendCalled = true;
  76. }
  77. bool isSendCalled() const {
  78. return sendCalled;
  79. }
  80. virtual void handleEvent(const SharedHandle<BtEvent>& event) {
  81. BtCancelSendingPieceEvent* e =
  82. dynamic_cast<BtCancelSendingPieceEvent*>(event.get());
  83. if(e) {
  84. doCancelActionCalled = true;
  85. }
  86. }
  87. bool isDoCancelActionCalled() const {
  88. return doCancelActionCalled;
  89. }
  90. };
  91. class MockPieceStorage2 : public MockPieceStorage {
  92. private:
  93. SharedHandle<Piece> piece;
  94. public:
  95. virtual SharedHandle<Piece> getPiece(size_t index) {
  96. return piece;
  97. }
  98. void setPiece(const SharedHandle<Piece>& piece) {
  99. this->piece = piece;
  100. }
  101. };
  102. class MockBtMessageFactory2 : public MockBtMessageFactory {
  103. public:
  104. virtual SharedHandle<BtMessage>
  105. createCancelMessage(size_t index, uint32_t begin, size_t length) {
  106. SharedHandle<MockBtMessage2> btMsg(new MockBtMessage2());
  107. btMsg->type = "cancel";
  108. return btMsg;
  109. }
  110. };
  111. void setUp() {
  112. btContext.reset(new DefaultBtContext());
  113. btContext->load("test.torrent");
  114. peer.reset(new Peer("192.168.0.1", 6969));
  115. peer->allocateSessionResource(btContext->getPieceLength(),
  116. btContext->getTotalLength());
  117. peerStorage.reset(new MockPeerStorage());
  118. pieceStorage.reset(new MockPieceStorage());
  119. _messageFactory.reset(new MockBtMessageFactory2());
  120. btMessageDispatcher.reset(new DefaultBtMessageDispatcher());
  121. btMessageDispatcher->setPeer(peer);
  122. btMessageDispatcher->setBtContext(btContext);
  123. btMessageDispatcher->setPieceStorage(pieceStorage);
  124. btMessageDispatcher->setPeerStorage(peerStorage);
  125. btMessageDispatcher->setBtMessageFactory(_messageFactory);
  126. btMessageDispatcher->setCuid(1);
  127. btMessageDispatcher->setMaxUploadSpeedLimit(0);
  128. }
  129. };
  130. CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtMessageDispatcherTest);
  131. void DefaultBtMessageDispatcherTest::testAddMessage() {
  132. SharedHandle<MockBtMessage2> msg(new MockBtMessage2());
  133. CPPUNIT_ASSERT_EQUAL(false, msg->isOnQueuedCalled());
  134. btMessageDispatcher->addMessageToQueue(msg);
  135. CPPUNIT_ASSERT_EQUAL(true, msg->isOnQueuedCalled());
  136. CPPUNIT_ASSERT_EQUAL((size_t)1,
  137. btMessageDispatcher->getMessageQueue().size());
  138. }
  139. void DefaultBtMessageDispatcherTest::testSendMessages() {
  140. TransferStat stat;
  141. stat.setUploadSpeed(0);
  142. peerStorage->setStat(stat);
  143. SharedHandle<MockBtMessage2> msg1(new MockBtMessage2());
  144. msg1->setSendingInProgress(false);
  145. msg1->setUploading(false);
  146. SharedHandle<MockBtMessage2> msg2(new MockBtMessage2());
  147. msg2->setSendingInProgress(false);
  148. msg2->setUploading(false);
  149. btMessageDispatcher->addMessageToQueue(msg1);
  150. btMessageDispatcher->addMessageToQueue(msg2);
  151. btMessageDispatcher->sendMessages();
  152. CPPUNIT_ASSERT(msg1->isSendCalled());
  153. CPPUNIT_ASSERT(msg2->isSendCalled());
  154. }
  155. void DefaultBtMessageDispatcherTest::testSendMessages_underUploadLimit() {
  156. TransferStat stat;
  157. stat.setUploadSpeed(0);
  158. peerStorage->setStat(stat);
  159. SharedHandle<MockBtMessage2> msg1(new MockBtMessage2());
  160. msg1->setSendingInProgress(false);
  161. msg1->setUploading(true);
  162. SharedHandle<MockBtMessage2> msg2(new MockBtMessage2());
  163. msg2->setSendingInProgress(false);
  164. msg2->setUploading(true);
  165. btMessageDispatcher->addMessageToQueue(msg1);
  166. btMessageDispatcher->addMessageToQueue(msg2);
  167. btMessageDispatcher->sendMessages();
  168. CPPUNIT_ASSERT(msg1->isSendCalled());
  169. CPPUNIT_ASSERT(msg2->isSendCalled());
  170. }
  171. void DefaultBtMessageDispatcherTest::testSendMessages_overUploadLimit() {
  172. btMessageDispatcher->setMaxUploadSpeedLimit(100);
  173. TransferStat stat;
  174. stat.setUploadSpeed(150);
  175. peerStorage->setStat(stat);
  176. SharedHandle<MockBtMessage2> msg1(new MockBtMessage2());
  177. msg1->setSendingInProgress(false);
  178. msg1->setUploading(true);
  179. SharedHandle<MockBtMessage2> msg2(new MockBtMessage2());
  180. msg2->setSendingInProgress(false);
  181. msg2->setUploading(true);
  182. SharedHandle<MockBtMessage2> msg3(new MockBtMessage2());
  183. msg3->setSendingInProgress(false);
  184. msg3->setUploading(false);
  185. btMessageDispatcher->addMessageToQueue(msg1);
  186. btMessageDispatcher->addMessageToQueue(msg2);
  187. btMessageDispatcher->addMessageToQueue(msg3);
  188. btMessageDispatcher->sendMessages();
  189. CPPUNIT_ASSERT(!msg1->isSendCalled());
  190. CPPUNIT_ASSERT(!msg2->isSendCalled());
  191. CPPUNIT_ASSERT(msg3->isSendCalled());
  192. CPPUNIT_ASSERT_EQUAL((size_t)2,
  193. btMessageDispatcher->getMessageQueue().size());
  194. }
  195. void DefaultBtMessageDispatcherTest::testSendMessages_sendingInProgress() {
  196. SharedHandle<MockBtMessage2> msg1(new MockBtMessage2());
  197. msg1->setSendingInProgress(false);
  198. msg1->setUploading(false);
  199. SharedHandle<MockBtMessage2> msg2(new MockBtMessage2());
  200. msg2->setSendingInProgress(true);
  201. msg2->setUploading(false);
  202. SharedHandle<MockBtMessage2> msg3(new MockBtMessage2());
  203. msg3->setSendingInProgress(false);
  204. msg3->setUploading(false);
  205. btMessageDispatcher->addMessageToQueue(msg1);
  206. btMessageDispatcher->addMessageToQueue(msg2);
  207. btMessageDispatcher->addMessageToQueue(msg3);
  208. btMessageDispatcher->sendMessages();
  209. CPPUNIT_ASSERT(msg1->isSendCalled());
  210. CPPUNIT_ASSERT(msg2->isSendCalled());
  211. CPPUNIT_ASSERT(!msg3->isSendCalled());
  212. CPPUNIT_ASSERT_EQUAL((size_t)2,
  213. btMessageDispatcher->getMessageQueue().size());
  214. }
  215. void DefaultBtMessageDispatcherTest::testDoCancelSendingPieceAction() {
  216. SharedHandle<MockBtMessage2> msg1(new MockBtMessage2());
  217. SharedHandle<MockBtMessage2> msg2(new MockBtMessage2());
  218. btMessageDispatcher->addMessageToQueue(msg1);
  219. btMessageDispatcher->addMessageToQueue(msg2);
  220. btMessageDispatcher->doCancelSendingPieceAction(0, 0, 0);
  221. CPPUNIT_ASSERT_EQUAL(true, msg1->isDoCancelActionCalled());
  222. CPPUNIT_ASSERT_EQUAL(true, msg2->isDoCancelActionCalled());
  223. }
  224. int MY_PIECE_LENGTH = 16*1024;
  225. void DefaultBtMessageDispatcherTest::testCheckRequestSlotAndDoNecessaryThing() {
  226. SharedHandle<Piece> piece(new Piece(0, MY_PIECE_LENGTH));
  227. RequestSlot slot(0, 0, MY_PIECE_LENGTH, 0, piece);
  228. size_t index;
  229. CPPUNIT_ASSERT(piece->getMissingUnusedBlockIndex(index));
  230. CPPUNIT_ASSERT_EQUAL((size_t)0, index);
  231. SharedHandle<MockPieceStorage2> pieceStorage(new MockPieceStorage2());
  232. pieceStorage->setPiece(piece);
  233. btMessageDispatcher->setRequestTimeout(60);
  234. btMessageDispatcher->setPieceStorage(pieceStorage);
  235. btMessageDispatcher->addOutstandingRequest(slot);
  236. btMessageDispatcher->checkRequestSlotAndDoNecessaryThing();
  237. CPPUNIT_ASSERT_EQUAL((size_t)0,
  238. btMessageDispatcher->getMessageQueue().size());
  239. CPPUNIT_ASSERT_EQUAL((size_t)1,
  240. btMessageDispatcher->getRequestSlots().size());
  241. }
  242. void DefaultBtMessageDispatcherTest::testCheckRequestSlotAndDoNecessaryThing_timeout() {
  243. SharedHandle<Piece> piece(new Piece(0, MY_PIECE_LENGTH));
  244. RequestSlot slot(0, 0, MY_PIECE_LENGTH, 0, piece);
  245. // make this slot timeout
  246. slot.setDispatchedTime(0);
  247. size_t index;
  248. CPPUNIT_ASSERT(piece->getMissingUnusedBlockIndex(index));
  249. CPPUNIT_ASSERT_EQUAL((size_t)0, index);
  250. SharedHandle<MockPieceStorage2> pieceStorage(new MockPieceStorage2());
  251. pieceStorage->setPiece(piece);
  252. btMessageDispatcher->setRequestTimeout(60);
  253. btMessageDispatcher->setPieceStorage(pieceStorage);
  254. btMessageDispatcher->addOutstandingRequest(slot);
  255. btMessageDispatcher->checkRequestSlotAndDoNecessaryThing();
  256. CPPUNIT_ASSERT_EQUAL((size_t)0,
  257. btMessageDispatcher->getMessageQueue().size());
  258. CPPUNIT_ASSERT_EQUAL((size_t)0,
  259. btMessageDispatcher->getRequestSlots().size());
  260. CPPUNIT_ASSERT_EQUAL(false, piece->isBlockUsed(0));
  261. CPPUNIT_ASSERT_EQUAL(true, peer->snubbing());
  262. }
  263. void DefaultBtMessageDispatcherTest::testCheckRequestSlotAndDoNecessaryThing_completeBlock() {
  264. SharedHandle<Piece> piece(new Piece(0, MY_PIECE_LENGTH));
  265. piece->completeBlock(0);
  266. RequestSlot slot(0, 0, MY_PIECE_LENGTH, 0, piece);
  267. SharedHandle<MockPieceStorage2> pieceStorage(new MockPieceStorage2());
  268. pieceStorage->setPiece(piece);
  269. btMessageDispatcher->setRequestTimeout(60);
  270. btMessageDispatcher->setPieceStorage(pieceStorage);
  271. btMessageDispatcher->addOutstandingRequest(slot);
  272. btMessageDispatcher->checkRequestSlotAndDoNecessaryThing();
  273. CPPUNIT_ASSERT_EQUAL((size_t)1,
  274. btMessageDispatcher->getMessageQueue().size());
  275. CPPUNIT_ASSERT_EQUAL((size_t)0,
  276. btMessageDispatcher->getRequestSlots().size());
  277. }
  278. void DefaultBtMessageDispatcherTest::testIsSendingInProgress() {
  279. CPPUNIT_ASSERT(!btMessageDispatcher->isSendingInProgress());
  280. SharedHandle<MockBtMessage2> msg(new MockBtMessage2());
  281. msg->setSendingInProgress(false);
  282. btMessageDispatcher->addMessageToQueue(msg);
  283. CPPUNIT_ASSERT(!btMessageDispatcher->isSendingInProgress());
  284. msg->setSendingInProgress(true);
  285. CPPUNIT_ASSERT(btMessageDispatcher->isSendingInProgress());
  286. }
  287. void DefaultBtMessageDispatcherTest::testCountOutstandingRequest() {
  288. RequestSlot slot(0, 0, MY_PIECE_LENGTH, 0);
  289. btMessageDispatcher->addOutstandingRequest(slot);
  290. CPPUNIT_ASSERT_EQUAL((size_t)1,
  291. btMessageDispatcher->countOutstandingRequest());
  292. }
  293. void DefaultBtMessageDispatcherTest::testIsOutstandingRequest() {
  294. RequestSlot slot(0, 0, MY_PIECE_LENGTH, 0);
  295. btMessageDispatcher->addOutstandingRequest(slot);
  296. CPPUNIT_ASSERT(btMessageDispatcher->isOutstandingRequest(0, 0));
  297. CPPUNIT_ASSERT(!btMessageDispatcher->isOutstandingRequest(0, 1));
  298. CPPUNIT_ASSERT(!btMessageDispatcher->isOutstandingRequest(1, 0));
  299. CPPUNIT_ASSERT(!btMessageDispatcher->isOutstandingRequest(1, 1));
  300. }
  301. void DefaultBtMessageDispatcherTest::testGetOutstandingRequest() {
  302. RequestSlot slot(1, 1024, 16*1024, 10);
  303. btMessageDispatcher->addOutstandingRequest(slot);
  304. RequestSlot s2 = btMessageDispatcher->getOutstandingRequest(1, 1024, 16*1024);
  305. CPPUNIT_ASSERT(!RequestSlot::isNull(s2));
  306. RequestSlot s3 = btMessageDispatcher->getOutstandingRequest(1, 1024, 17*1024);
  307. CPPUNIT_ASSERT(RequestSlot::isNull(s3));
  308. RequestSlot s4 =
  309. btMessageDispatcher->getOutstandingRequest(1, 2*1024, 16*1024);
  310. CPPUNIT_ASSERT(RequestSlot::isNull(s4));
  311. RequestSlot s5 = btMessageDispatcher->getOutstandingRequest(2, 1024, 16*1024);
  312. CPPUNIT_ASSERT(RequestSlot::isNull(s5));
  313. }
  314. void DefaultBtMessageDispatcherTest::testRemoveOutstandingRequest() {
  315. RequestSlot slot(1, 1024, 16*1024, 10);
  316. btMessageDispatcher->addOutstandingRequest(slot);
  317. RequestSlot s2 = btMessageDispatcher->getOutstandingRequest(1, 1024, 16*1024);
  318. CPPUNIT_ASSERT(!RequestSlot::isNull(s2));
  319. btMessageDispatcher->removeOutstandingRequest(s2);
  320. RequestSlot s3 = btMessageDispatcher->getOutstandingRequest(1, 1024, 16*1024);
  321. CPPUNIT_ASSERT(RequestSlot::isNull(s3));
  322. }
  323. } // namespace aria2