BtRejectMessageTest.cc 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include "BtRejectMessage.h"
  2. #include <cstring>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "bittorrent_helper.h"
  5. #include "Peer.h"
  6. #include "FileEntry.h"
  7. #include "MockBtMessageDispatcher.h"
  8. namespace aria2 {
  9. class BtRejectMessageTest : public CppUnit::TestFixture {
  10. CPPUNIT_TEST_SUITE(BtRejectMessageTest);
  11. CPPUNIT_TEST(testCreate);
  12. CPPUNIT_TEST(testCreateMessage);
  13. CPPUNIT_TEST(testDoReceivedAction);
  14. CPPUNIT_TEST(testDoReceivedActionNoMatch);
  15. CPPUNIT_TEST(testDoReceivedActionFastExtensionDisabled);
  16. CPPUNIT_TEST(testToString);
  17. CPPUNIT_TEST_SUITE_END();
  18. private:
  19. public:
  20. void testCreate();
  21. void testCreateMessage();
  22. void testDoReceivedAction();
  23. void testDoReceivedActionNoMatch();
  24. void testDoReceivedActionFastExtensionDisabled();
  25. void testToString();
  26. class MockBtMessageDispatcher2 : public MockBtMessageDispatcher {
  27. public:
  28. std::unique_ptr<RequestSlot> slot;
  29. void setRequestSlot(std::unique_ptr<RequestSlot> s) { slot = std::move(s); }
  30. virtual const RequestSlot*
  31. getOutstandingRequest(size_t index, int32_t begin,
  32. int32_t length) CXX11_OVERRIDE
  33. {
  34. if (slot && slot->getIndex() == index && slot->getBegin() == begin &&
  35. slot->getLength() == length) {
  36. return slot.get();
  37. }
  38. else {
  39. return nullptr;
  40. }
  41. }
  42. virtual void removeOutstandingRequest(const RequestSlot* s) CXX11_OVERRIDE
  43. {
  44. if (slot->getIndex() == s->getIndex() &&
  45. slot->getBegin() == s->getBegin() &&
  46. slot->getLength() == s->getLength()) {
  47. slot.reset();
  48. }
  49. }
  50. };
  51. typedef std::shared_ptr<MockBtMessageDispatcher2>
  52. MockBtMessageDispatcher2Handle;
  53. std::shared_ptr<Peer> peer;
  54. std::shared_ptr<MockBtMessageDispatcher2> dispatcher;
  55. std::shared_ptr<BtRejectMessage> msg;
  56. void setUp()
  57. {
  58. peer.reset(new Peer("host", 6969));
  59. peer->allocateSessionResource(1_k, 1_m);
  60. dispatcher.reset(new MockBtMessageDispatcher2());
  61. msg.reset(new BtRejectMessage());
  62. msg->setPeer(peer);
  63. msg->setIndex(1);
  64. msg->setBegin(16);
  65. msg->setLength(32);
  66. msg->setBtMessageDispatcher(dispatcher.get());
  67. }
  68. };
  69. CPPUNIT_TEST_SUITE_REGISTRATION(BtRejectMessageTest);
  70. void BtRejectMessageTest::testCreate()
  71. {
  72. unsigned char msg[17];
  73. bittorrent::createPeerMessageString(msg, sizeof(msg), 13, 16);
  74. bittorrent::setIntParam(&msg[5], 12345);
  75. bittorrent::setIntParam(&msg[9], 256);
  76. bittorrent::setIntParam(&msg[13], 1_k);
  77. std::shared_ptr<BtRejectMessage> pm(BtRejectMessage::create(&msg[4], 13));
  78. CPPUNIT_ASSERT_EQUAL((uint8_t)16, pm->getId());
  79. CPPUNIT_ASSERT_EQUAL((size_t)12345, pm->getIndex());
  80. CPPUNIT_ASSERT_EQUAL(256, pm->getBegin());
  81. CPPUNIT_ASSERT_EQUAL((int32_t)1_k, pm->getLength());
  82. // case: payload size is wrong
  83. try {
  84. unsigned char msg[18];
  85. bittorrent::createPeerMessageString(msg, sizeof(msg), 14, 16);
  86. BtRejectMessage::create(&msg[4], 14);
  87. CPPUNIT_FAIL("exception must be thrown.");
  88. }
  89. catch (...) {
  90. }
  91. // case: id is wrong
  92. try {
  93. unsigned char msg[17];
  94. bittorrent::createPeerMessageString(msg, sizeof(msg), 13, 17);
  95. BtRejectMessage::create(&msg[4], 13);
  96. CPPUNIT_FAIL("exception must be thrown.");
  97. }
  98. catch (...) {
  99. }
  100. }
  101. void BtRejectMessageTest::testCreateMessage()
  102. {
  103. BtRejectMessage msg;
  104. msg.setIndex(12345);
  105. msg.setBegin(256);
  106. msg.setLength(1_k);
  107. unsigned char data[17];
  108. bittorrent::createPeerMessageString(data, sizeof(data), 13, 16);
  109. bittorrent::setIntParam(&data[5], 12345);
  110. bittorrent::setIntParam(&data[9], 256);
  111. bittorrent::setIntParam(&data[13], 1_k);
  112. unsigned char* rawmsg = msg.createMessage();
  113. CPPUNIT_ASSERT(memcmp(rawmsg, data, 17) == 0);
  114. delete[] rawmsg;
  115. }
  116. void BtRejectMessageTest::testDoReceivedAction()
  117. {
  118. peer->setFastExtensionEnabled(true);
  119. dispatcher->setRequestSlot(make_unique<RequestSlot>(1, 16, 32, 2));
  120. CPPUNIT_ASSERT(dispatcher->getOutstandingRequest(1, 16, 32));
  121. msg->doReceivedAction();
  122. CPPUNIT_ASSERT(!dispatcher->getOutstandingRequest(1, 16, 32));
  123. }
  124. void BtRejectMessageTest::testDoReceivedActionNoMatch()
  125. {
  126. peer->setFastExtensionEnabled(true);
  127. dispatcher->setRequestSlot(make_unique<RequestSlot>(2, 16, 32, 2));
  128. CPPUNIT_ASSERT(dispatcher->getOutstandingRequest(2, 16, 32));
  129. msg->doReceivedAction();
  130. CPPUNIT_ASSERT(dispatcher->getOutstandingRequest(2, 16, 32));
  131. }
  132. void BtRejectMessageTest::testDoReceivedActionFastExtensionDisabled()
  133. {
  134. RequestSlot slot(1, 16, 32, 2);
  135. dispatcher->setRequestSlot(make_unique<RequestSlot>(1, 16, 32, 2));
  136. CPPUNIT_ASSERT(dispatcher->getOutstandingRequest(1, 16, 32));
  137. try {
  138. msg->doReceivedAction();
  139. CPPUNIT_FAIL("exception must be thrown.");
  140. }
  141. catch (...) {
  142. }
  143. }
  144. void BtRejectMessageTest::testToString()
  145. {
  146. CPPUNIT_ASSERT_EQUAL(std::string("reject index=1, begin=16, length=32"),
  147. msg->toString());
  148. }
  149. } // namespace aria2