TorrentManTest.cc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "TorrentMan.h"
  2. #include <string>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. using namespace std;
  5. class TorrentManTest:public CppUnit::TestFixture {
  6. CPPUNIT_TEST_SUITE(TorrentManTest);
  7. CPPUNIT_TEST(testUpdatePeers);
  8. //CPPUNIT_TEST(testUpdatePeer);
  9. CPPUNIT_TEST(testGetPeer);
  10. CPPUNIT_TEST(testGetMissingPiece);
  11. CPPUNIT_TEST(testCancelPiece);
  12. CPPUNIT_TEST(testAddPeer);
  13. CPPUNIT_TEST_SUITE_END();
  14. private:
  15. public:
  16. void setUp() {
  17. }
  18. void testUpdatePeers();
  19. //void testUpdatePeer();
  20. void testGetPeer();
  21. void testGetMissingPiece();
  22. void testCancelPiece();
  23. void testAddPeer();
  24. };
  25. CPPUNIT_TEST_SUITE_REGISTRATION( TorrentManTest );
  26. Peers createPeers() {
  27. Peers peers;
  28. Peer* peer1 = new Peer("192.168.0.1", 6881);
  29. peer1->entryId = 1;
  30. Peer* peer2 = new Peer("192.168.0.2", 6881);
  31. peer2->entryId = 2;
  32. Peer* peer3 = new Peer("192.168.0.3", 6881);
  33. peer3->entryId = 3;
  34. peers.push_back(peer1);
  35. peers.push_back(peer2);
  36. peers.push_back(peer3);
  37. return peers;
  38. }
  39. void TorrentManTest::testUpdatePeers() {
  40. TorrentMan tm;
  41. Peers peers = createPeers();
  42. tm.updatePeers(peers);
  43. const Peers& peersGot = tm.getPeers();
  44. Peers::const_iterator itr = peersGot.begin();
  45. CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), (*itr)->ipaddr);
  46. itr++;
  47. CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"), (*itr)->ipaddr);
  48. itr++;
  49. CPPUNIT_ASSERT_EQUAL(string("192.168.0.3"), (*itr)->ipaddr);
  50. itr++;
  51. }
  52. /*
  53. void TorrentManTest::testUpdatePeer() {
  54. TorrentMan tm;
  55. Peers peers = createPeers();
  56. tm.updatePeers(peers);
  57. Peer* peer = tm.getPeer(1);
  58. peer->amChocking = true;
  59. peer->amInterested = true;
  60. tm.updatePeer(peer);
  61. Peers::const_iterator itr = tm.getPeers().begin();
  62. CPPUNIT_ASSERT_EQUAL(3, (int)tm.getPeers().size());
  63. CPPUNIT_ASSERT_EQUAL(string("192.168.0.1"), itr->ipaddr);
  64. CPPUNIT_ASSERT_EQUAL(true, itr->amChocking);
  65. CPPUNIT_ASSERT_EQUAL(true, itr->amInterested);
  66. CPPUNIT_ASSERT_EQUAL(1, itr->cuid);
  67. itr++;
  68. CPPUNIT_ASSERT_EQUAL(string("192.168.0.2"), itr->ipaddr);
  69. CPPUNIT_ASSERT_EQUAL(false, itr->amChocking);
  70. CPPUNIT_ASSERT_EQUAL(false, itr->amInterested);
  71. CPPUNIT_ASSERT_EQUAL(0, itr->cuid);
  72. itr++;
  73. CPPUNIT_ASSERT_EQUAL(string("192.168.0.3"), itr->ipaddr);
  74. CPPUNIT_ASSERT_EQUAL(false, itr->amChocking);
  75. CPPUNIT_ASSERT_EQUAL(false, itr->amInterested);
  76. CPPUNIT_ASSERT_EQUAL(0, itr->cuid);
  77. itr++;
  78. }
  79. */
  80. void TorrentManTest::testGetPeer() {
  81. TorrentMan tm;
  82. Peers peers = createPeers();
  83. tm.updatePeers(peers);
  84. CPPUNIT_ASSERT(tm.getPeer(1) != Peer::nullPeer);
  85. CPPUNIT_ASSERT(tm.getPeer(2) != Peer::nullPeer);
  86. CPPUNIT_ASSERT(tm.getPeer(3) != Peer::nullPeer);
  87. CPPUNIT_ASSERT(tm.getPeer(4) == Peer::nullPeer);
  88. }
  89. void TorrentManTest::testGetMissingPiece() {
  90. TorrentMan tm;
  91. tm.pieceLength = 512*1024;
  92. tm.pieces = 10;
  93. tm.totalSize = 5242870;
  94. tm.initBitfield();
  95. unsigned char peerBitfield[2] = { 0xff, 0xff };
  96. Piece piece1 = tm.getMissingPiece(peerBitfield, 2);
  97. CPPUNIT_ASSERT_EQUAL(0, piece1.index);
  98. CPPUNIT_ASSERT_EQUAL(512*1024, piece1.length);
  99. Piece piece2 = tm.getMissingPiece(peerBitfield, 2);
  100. CPPUNIT_ASSERT_EQUAL(1, piece2.index);
  101. CPPUNIT_ASSERT_EQUAL(512*1024, piece2.length);
  102. tm.completePiece(piece1);
  103. int len = tm.getBitfieldLength();
  104. const unsigned char* bitfield = tm.getBitfield();
  105. CPPUNIT_ASSERT_EQUAL(2, len);
  106. CPPUNIT_ASSERT(bitfield[0]&(1 << 7));
  107. for(int i = 0; i < 7; i++) {
  108. CPPUNIT_ASSERT(!(bitfield[0]&(1 << i)));
  109. }
  110. tm.completePiece(piece2);
  111. bitfield = tm.getBitfield();
  112. CPPUNIT_ASSERT_EQUAL(2, len);
  113. CPPUNIT_ASSERT(bitfield[0]&(1 << 7));
  114. CPPUNIT_ASSERT(bitfield[0]&(1 << 6));
  115. for(int i = 0; i < 6; i++) {
  116. CPPUNIT_ASSERT(!(bitfield[0]&(1 << i)));
  117. }
  118. for(int i = 0; i < 8; i++) {
  119. CPPUNIT_ASSERT(!IS_NULL_PIECE(tm.getMissingPiece(peerBitfield, 2)));
  120. }
  121. CPPUNIT_ASSERT(IS_NULL_PIECE(tm.getMissingPiece(peerBitfield, 2)));
  122. }
  123. void TorrentManTest::testCancelPiece() {
  124. TorrentMan tm;
  125. tm.pieceLength = 512*1024;
  126. tm.pieces = 10;
  127. tm.totalSize = 5242870;
  128. tm.initBitfield();
  129. unsigned char peerBitfield[2] = { 0xff, 0xff };
  130. Piece piece = tm.getMissingPiece(peerBitfield, 2);
  131. CPPUNIT_ASSERT_EQUAL(0, piece.index);
  132. CPPUNIT_ASSERT_EQUAL(512*1024, piece.length);
  133. tm.cancelPiece(piece);
  134. int len = tm.getBitfieldLength();
  135. const unsigned char* bitfield = tm.getBitfield();
  136. for(int i = 0; i < 8; i++) {
  137. CPPUNIT_ASSERT(!(bitfield[0]&(1 << i)));
  138. }
  139. }
  140. void TorrentManTest::testAddPeer() {
  141. TorrentMan tm;
  142. Peers peers = createPeers();
  143. tm.updatePeers(peers);
  144. // try to add already added peer
  145. Peer* dupPeer = new Peer("192.168.0.2", 6881);
  146. CPPUNIT_ASSERT(!tm.addPeer(dupPeer));
  147. CPPUNIT_ASSERT_EQUAL(3, (int)tm.getPeers().size());
  148. // duplicate flag on
  149. CPPUNIT_ASSERT(tm.addPeer(dupPeer, true));
  150. CPPUNIT_ASSERT_EQUAL(4, (int)tm.getPeers().size());
  151. // cannot add error peer even though duplicte flag turns on
  152. dupPeer->error = 1;
  153. Peer* dupPeer2 = new Peer("192.168.0.2", 6881);
  154. CPPUNIT_ASSERT(!tm.addPeer(dupPeer2, true));
  155. CPPUNIT_ASSERT_EQUAL(4, (int)tm.getPeers().size());
  156. // try to add new peer
  157. Peer* newPeer = new Peer("10.1.0.1", 6881);
  158. CPPUNIT_ASSERT(tm.addPeer(newPeer));
  159. CPPUNIT_ASSERT_EQUAL(5, (int)tm.getPeers().size());
  160. }