PeerMessageUtilTest.cc 4.0 KB

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