BtChokeMessageTest.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #include "BtChokeMessage.h"
  2. #include <cstring>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "bittorrent_helper.h"
  5. #include "MockBtMessageDispatcher.h"
  6. #include "MockBtRequestFactory.h"
  7. #include "Peer.h"
  8. #include "FileEntry.h"
  9. #include "SocketBuffer.h"
  10. namespace aria2 {
  11. class BtChokeMessageTest : public CppUnit::TestFixture {
  12. CPPUNIT_TEST_SUITE(BtChokeMessageTest);
  13. CPPUNIT_TEST(testCreate);
  14. CPPUNIT_TEST(testCreateMessage);
  15. CPPUNIT_TEST(testDoReceivedAction);
  16. CPPUNIT_TEST(testOnSendComplete);
  17. CPPUNIT_TEST(testToString);
  18. CPPUNIT_TEST_SUITE_END();
  19. private:
  20. public:
  21. std::shared_ptr<Peer> peer;
  22. void setUp()
  23. {
  24. peer.reset(new Peer("host", 6969));
  25. peer->allocateSessionResource(1_k, 1_m);
  26. }
  27. void testCreate();
  28. void testCreateMessage();
  29. void testDoReceivedAction();
  30. void testOnSendComplete();
  31. void testToString();
  32. class MockBtMessageDispatcher2 : public MockBtMessageDispatcher {
  33. public:
  34. bool doChokedActionCalled;
  35. bool doChokingActionCalled;
  36. public:
  37. MockBtMessageDispatcher2()
  38. : doChokedActionCalled{false}, doChokingActionCalled{false}
  39. {
  40. }
  41. virtual void doChokedAction() CXX11_OVERRIDE
  42. {
  43. doChokedActionCalled = true;
  44. }
  45. virtual void doChokingAction() CXX11_OVERRIDE
  46. {
  47. doChokingActionCalled = true;
  48. }
  49. };
  50. class MockBtRequestFactory2 : public MockBtRequestFactory {
  51. public:
  52. bool doChokedActionCalled;
  53. public:
  54. MockBtRequestFactory2() : doChokedActionCalled{false} {}
  55. virtual void doChokedAction() CXX11_OVERRIDE
  56. {
  57. doChokedActionCalled = true;
  58. }
  59. };
  60. };
  61. CPPUNIT_TEST_SUITE_REGISTRATION(BtChokeMessageTest);
  62. void BtChokeMessageTest::testCreate()
  63. {
  64. unsigned char msg[5];
  65. bittorrent::createPeerMessageString(msg, sizeof(msg), 1, 0);
  66. auto pm = BtChokeMessage::create(&msg[4], 1);
  67. CPPUNIT_ASSERT_EQUAL((uint8_t)0, pm->getId());
  68. // case: payload size is wrong
  69. try {
  70. unsigned char msg[6];
  71. bittorrent::createPeerMessageString(msg, sizeof(msg), 2, 0);
  72. BtChokeMessage::create(&msg[4], 2);
  73. CPPUNIT_FAIL("exception must be thrown.");
  74. }
  75. catch (...) {
  76. }
  77. // case: id is wrong
  78. try {
  79. unsigned char msg[5];
  80. bittorrent::createPeerMessageString(msg, sizeof(msg), 1, 1);
  81. BtChokeMessage::create(&msg[4], 1);
  82. CPPUNIT_FAIL("exception must be thrown.");
  83. }
  84. catch (...) {
  85. }
  86. }
  87. void BtChokeMessageTest::testCreateMessage()
  88. {
  89. BtChokeMessage msg;
  90. unsigned char data[5];
  91. bittorrent::createPeerMessageString(data, sizeof(data), 1, 0);
  92. auto rawmsg = msg.createMessage();
  93. CPPUNIT_ASSERT_EQUAL((size_t)5, rawmsg.size());
  94. CPPUNIT_ASSERT(std::equal(std::begin(rawmsg), std::end(rawmsg), data));
  95. }
  96. void BtChokeMessageTest::testDoReceivedAction()
  97. {
  98. BtChokeMessage msg;
  99. msg.setPeer(peer);
  100. auto dispatcher = make_unique<MockBtMessageDispatcher2>();
  101. msg.setBtMessageDispatcher(dispatcher.get());
  102. auto requestFactory = make_unique<MockBtRequestFactory2>();
  103. msg.setBtRequestFactory(requestFactory.get());
  104. msg.doReceivedAction();
  105. CPPUNIT_ASSERT(dispatcher->doChokedActionCalled);
  106. CPPUNIT_ASSERT(peer->peerChoking());
  107. }
  108. void BtChokeMessageTest::testOnSendComplete()
  109. {
  110. BtChokeMessage msg;
  111. msg.setPeer(peer);
  112. auto dispatcher = make_unique<MockBtMessageDispatcher2>();
  113. msg.setBtMessageDispatcher(dispatcher.get());
  114. auto pu = std::unique_ptr<ProgressUpdate>{msg.getProgressUpdate()};
  115. pu->update(0, true);
  116. CPPUNIT_ASSERT(dispatcher->doChokingActionCalled);
  117. CPPUNIT_ASSERT(peer->amChoking());
  118. }
  119. void BtChokeMessageTest::testToString()
  120. {
  121. BtChokeMessage msg;
  122. CPPUNIT_ASSERT_EQUAL(std::string("choke"), msg.toString());
  123. }
  124. } // namespace aria2