PeerMessageUtilTest.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "PeerMessageUtil.h"
  2. #include "UnchokeMessage.h"
  3. #include "InterestedMessage.h"
  4. #include "NotInterestedMessage.h"
  5. #include "HaveMessage.h"
  6. #include "BitfieldMessage.h"
  7. #include "RequestMessage.h"
  8. #include "PieceMessage.h"
  9. #include "CancelMessage.h"
  10. #include <netinet/in.h>
  11. #include <string>
  12. #include <cppunit/extensions/HelperMacros.h>
  13. using namespace std;
  14. class PeerMessageUtilTest:public CppUnit::TestFixture {
  15. CPPUNIT_TEST_SUITE(PeerMessageUtilTest);
  16. CPPUNIT_TEST(testCheckIntegrityHave);
  17. CPPUNIT_TEST(testCheckIntegrityBitfield);
  18. CPPUNIT_TEST(testCheckIntegrityRequest);
  19. CPPUNIT_TEST_SUITE_END();
  20. private:
  21. public:
  22. void setUp() {
  23. }
  24. void testCreatePeerMessageUnchoke();
  25. void testCreatePeerMessageInterested();
  26. void testCreatePeerMessageNotInterested();
  27. void testCreatePeerMessageHave();
  28. void testCreatePeerMessageBitfield();
  29. void testCreatePeerMessageRequest();
  30. void testCreatePeerMessagePiece();
  31. void testCreatePeerMessageCancel();
  32. void testCreatePortMessage();
  33. void testCheckIntegrityHave();
  34. void testCheckIntegrityBitfield();
  35. void testCheckIntegrityRequest();
  36. };
  37. CPPUNIT_TEST_SUITE_REGISTRATION( PeerMessageUtilTest );
  38. void setIntParam(char* dest, int param) {
  39. int nParam = htonl(param);
  40. memcpy(dest, &nParam, 4);
  41. }
  42. void setShortIntParam(char* dest, int param) {
  43. short int nParam = htons(param);
  44. memcpy(dest, &nParam, 2);
  45. }
  46. void createNLengthMessage(char* msg, int msgLen, int payloadLen, int id) {
  47. memset(msg, 0, msgLen);
  48. setIntParam(msg, payloadLen);
  49. msg[4] = (char)id;
  50. }
  51. void PeerMessageUtilTest::testCheckIntegrityHave() {
  52. HaveMessage* pm = new HaveMessage();
  53. pm->setIndex(119);
  54. pm->setPieces(120);
  55. try {
  56. pm->check();
  57. } catch(Exception* ex) {
  58. cerr << ex->getMsg() << endl;
  59. CPPUNIT_FAIL("");
  60. }
  61. pm->setIndex(120);
  62. try {
  63. pm->check();
  64. CPPUNIT_FAIL("exception must be threw.");
  65. } catch(...) {}
  66. }
  67. void PeerMessageUtilTest::testCheckIntegrityBitfield() {
  68. BitfieldMessage* pm = new BitfieldMessage();
  69. int bitfieldLength = 15;
  70. unsigned char* bitfield = new unsigned char[bitfieldLength];
  71. memset(bitfield, 0xff, bitfieldLength);
  72. pm->setBitfield(bitfield, bitfieldLength);
  73. pm->setPieces(120);
  74. try {
  75. pm->check();
  76. } catch(Exception* ex) {
  77. cerr << ex->getMsg() << endl;
  78. CPPUNIT_FAIL("");
  79. }
  80. delete [] bitfield;
  81. bitfieldLength = 16;
  82. bitfield = new unsigned char[bitfieldLength];
  83. memset(bitfield, 0xff, bitfieldLength);
  84. pm->setBitfield(bitfield, bitfieldLength);
  85. try {
  86. pm->check();
  87. CPPUNIT_FAIL("exception must be threw.");
  88. } catch(Exception* ex) {
  89. }
  90. delete [] bitfield;
  91. bitfieldLength = 14;
  92. bitfield = new unsigned char[bitfieldLength];
  93. memset(bitfield, 0xff, bitfieldLength);
  94. pm->setBitfield(bitfield, bitfieldLength);
  95. try {
  96. pm->check();
  97. CPPUNIT_FAIL("exception must be threw.");
  98. } catch(Exception* ex) {
  99. }
  100. delete [] bitfield;
  101. bitfieldLength = 15;
  102. bitfield = new unsigned char[bitfieldLength];
  103. memset(bitfield, 0xff, bitfieldLength);
  104. bitfield[bitfieldLength-1] &= 0xfe;
  105. pm->setBitfield(bitfield, bitfieldLength);
  106. pm->setPieces(119);
  107. try {
  108. pm->check();
  109. } catch(Exception* ex) {
  110. cerr << ex->getMsg() << endl;
  111. CPPUNIT_FAIL("");
  112. }
  113. delete [] bitfield;
  114. bitfieldLength = 15;
  115. bitfield = new unsigned char[bitfieldLength];
  116. memset(bitfield, 0xff, bitfieldLength);
  117. pm->setBitfield(bitfield, bitfieldLength);
  118. try {
  119. pm->check();
  120. CPPUNIT_FAIL("exception must be threw.");
  121. } catch(Exception* ex) {
  122. }
  123. delete [] bitfield;
  124. }
  125. void PeerMessageUtilTest::testCheckIntegrityRequest() {
  126. RequestMessage* pm = new RequestMessage();
  127. pm->setIndex(119);
  128. pm->setBegin(0);
  129. pm->setLength(16*1024);
  130. pm->setPieces(120);
  131. pm->setPieceLength(256*1024);
  132. try {
  133. pm->check();
  134. } catch(Exception* ex) {
  135. cerr << ex->getMsg() << endl;
  136. CPPUNIT_FAIL("");
  137. }
  138. pm->setBegin(256*1024);
  139. pm->setLength(16*1024);
  140. try {
  141. pm->check();
  142. CPPUNIT_FAIL("exception must be threw.");
  143. } catch(Exception* ex) {}
  144. pm->setBegin(0);
  145. pm->setLength(256*1024);
  146. try {
  147. pm->check();
  148. CPPUNIT_FAIL("exception must be threw.");
  149. } catch(Exception* ex) {}
  150. pm->setBegin(0);
  151. pm->setLength(5);
  152. try {
  153. pm->check();
  154. CPPUNIT_FAIL("exception must be threw.");
  155. } catch(Exception* ex) {}
  156. }