BtBitfieldMessageTest.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "BtBitfieldMessage.h"
  2. #include <cstring>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "bittorrent_helper.h"
  5. #include "Util.h"
  6. #include "Peer.h"
  7. #include "MockPieceStorage.h"
  8. #include "DlAbortEx.h"
  9. namespace aria2 {
  10. class BtBitfieldMessageTest:public CppUnit::TestFixture {
  11. CPPUNIT_TEST_SUITE(BtBitfieldMessageTest);
  12. CPPUNIT_TEST(testCreate);
  13. CPPUNIT_TEST(testGetMessage);
  14. CPPUNIT_TEST(testDoReceivedAction);
  15. CPPUNIT_TEST(testDoReceivedAction_goodByeSeeder);
  16. CPPUNIT_TEST(testToString);
  17. CPPUNIT_TEST_SUITE_END();
  18. private:
  19. public:
  20. void setUp() {
  21. }
  22. void testCreate();
  23. void testGetMessage();
  24. void testDoReceivedAction();
  25. void testDoReceivedAction_goodByeSeeder();
  26. void testToString();
  27. };
  28. CPPUNIT_TEST_SUITE_REGISTRATION(BtBitfieldMessageTest);
  29. void BtBitfieldMessageTest::testCreate() {
  30. unsigned char msg[5+2];
  31. bittorrent::createPeerMessageString(msg, sizeof(msg), 3, 5);
  32. unsigned char bitfield[2];
  33. memset(bitfield, 0xff, sizeof(bitfield));
  34. memcpy(&msg[5], bitfield, sizeof(bitfield));
  35. SharedHandle<BtBitfieldMessage> pm = BtBitfieldMessage::create(&msg[4], 3);
  36. CPPUNIT_ASSERT_EQUAL((uint8_t)5, pm->getId());
  37. CPPUNIT_ASSERT(memcmp(bitfield, pm->getBitfield(), sizeof(bitfield)) == 0);
  38. CPPUNIT_ASSERT_EQUAL((size_t)2, pm->getBitfieldLength());
  39. // case: payload size is wrong
  40. try {
  41. unsigned char msg[5];
  42. bittorrent::createPeerMessageString(msg, sizeof(msg), 1, 5);
  43. BtBitfieldMessage::create(&msg[4], 1);
  44. CPPUNIT_FAIL("exception must be thrown.");
  45. } catch(...) {
  46. }
  47. // case: id is wrong
  48. try {
  49. unsigned char msg[5+2];
  50. bittorrent::createPeerMessageString(msg, sizeof(msg), 3, 6);
  51. BtBitfieldMessage::create(&msg[4], 3);
  52. CPPUNIT_FAIL("exception must be thrown.");
  53. } catch(...) {
  54. }
  55. }
  56. void BtBitfieldMessageTest::testGetMessage() {
  57. BtBitfieldMessage msg;
  58. unsigned char bitfield[2];
  59. memset(bitfield, 0xff, sizeof(bitfield));
  60. msg.setBitfield(bitfield, sizeof(bitfield));
  61. unsigned char data[5+2];
  62. bittorrent::createPeerMessageString(data, sizeof(data), 3, 5);
  63. memcpy(&data[5], bitfield, sizeof(bitfield));
  64. CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 7) == 0);
  65. }
  66. void BtBitfieldMessageTest::testDoReceivedAction() {
  67. SharedHandle<Peer> peer(new Peer("host1", 6969));
  68. peer->allocateSessionResource(16*1024, 16*16*1024);
  69. BtBitfieldMessage msg;
  70. msg.setPeer(peer);
  71. SharedHandle<MockPieceStorage> pieceStorage(new MockPieceStorage());
  72. msg.setPieceStorage(pieceStorage);
  73. unsigned char bitfield[] = { 0xff, 0xff };
  74. msg.setBitfield(bitfield, sizeof(bitfield));
  75. CPPUNIT_ASSERT_EQUAL(std::string("0000"), util::toHex(peer->getBitfield(),
  76. peer->getBitfieldLength()));
  77. msg.doReceivedAction();
  78. CPPUNIT_ASSERT_EQUAL(std::string("ffff"), util::toHex(peer->getBitfield(),
  79. peer->getBitfieldLength()));
  80. }
  81. void BtBitfieldMessageTest::testDoReceivedAction_goodByeSeeder()
  82. {
  83. SharedHandle<Peer> peer(new Peer("ip", 6000));
  84. peer->allocateSessionResource(1024, 1024);
  85. BtBitfieldMessage msg;
  86. msg.setPeer(peer);
  87. SharedHandle<MockPieceStorage> pieceStorage(new MockPieceStorage());
  88. msg.setPieceStorage(pieceStorage);
  89. unsigned char bitfield[] = { 0x00 };
  90. msg.setBitfield(bitfield, sizeof(bitfield));
  91. // peer is not seeder and client have not completed download
  92. msg.doReceivedAction();
  93. pieceStorage->setDownloadFinished(true);
  94. // client completed download, but peer is not seeder
  95. msg.doReceivedAction();
  96. pieceStorage->setDownloadFinished(false);
  97. bitfield[0] = 0x80;
  98. msg.setBitfield(bitfield, sizeof(bitfield));
  99. // peer is seeder, but client have not completed download
  100. msg.doReceivedAction();
  101. pieceStorage->setDownloadFinished(true);
  102. try {
  103. msg.doReceivedAction();
  104. CPPUNIT_FAIL("exception must be thrown.");
  105. } catch(DlAbortEx& e) {
  106. // success
  107. }
  108. }
  109. void BtBitfieldMessageTest::testToString() {
  110. BtBitfieldMessage msg;
  111. unsigned char bitfield[] = { 0xff, 0xff };
  112. msg.setBitfield(bitfield, sizeof(bitfield));
  113. CPPUNIT_ASSERT_EQUAL(std::string("bitfield ffff"), msg.toString());
  114. }
  115. } // namespace aria2