BtChokeMessageTest.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "BtChokeMessage.h"
  2. #include "PeerMessageUtil.h"
  3. #include "MockBtMessageDispatcher.h"
  4. #include "MockBtContext.h"
  5. #include <cppunit/extensions/HelperMacros.h>
  6. using namespace std;
  7. class BtChokeMessageTest:public CppUnit::TestFixture {
  8. CPPUNIT_TEST_SUITE(BtChokeMessageTest);
  9. CPPUNIT_TEST(testCreate);
  10. CPPUNIT_TEST(testGetMessage);
  11. CPPUNIT_TEST(testDoReceivedAction);
  12. CPPUNIT_TEST(testOnSendComplete);
  13. CPPUNIT_TEST(testToString);
  14. CPPUNIT_TEST_SUITE_END();
  15. private:
  16. public:
  17. BtChokeMessageTest():peer(0), btContext(0) {}
  18. PeerHandle peer;
  19. MockBtContextHandle btContext;
  20. void setUp() {
  21. BtRegistry::clear();
  22. peer = new Peer("host", 6969, 16*1024, 256*1024);
  23. btContext = new MockBtContext();
  24. btContext->setInfoHash((const unsigned char*)"12345678901234567890");
  25. BtRegistry::registerPeerObjectCluster(btContext->getInfoHashAsString(),
  26. new PeerObjectCluster());
  27. PEER_OBJECT_CLUSTER(btContext)->registerHandle(peer->getId(), new PeerObject());
  28. }
  29. void testCreate();
  30. void testGetMessage();
  31. void testDoReceivedAction();
  32. void testOnSendComplete();
  33. void testToString();
  34. class MockBtMessageDispatcher2 : public MockBtMessageDispatcher {
  35. public:
  36. bool doChokedActionCalled;
  37. bool doChokingActionCalled;
  38. public:
  39. MockBtMessageDispatcher2():doChokedActionCalled(false), doChokingActionCalled(false) {}
  40. virtual void doChokedAction() {
  41. doChokedActionCalled = true;
  42. }
  43. virtual void doChokingAction() {
  44. doChokingActionCalled = true;
  45. }
  46. };
  47. typedef SharedHandle<MockBtMessageDispatcher2> MockBtMessageDispatcher2Handle;
  48. };
  49. CPPUNIT_TEST_SUITE_REGISTRATION(BtChokeMessageTest);
  50. void BtChokeMessageTest::testCreate() {
  51. unsigned char msg[5];
  52. PeerMessageUtil::createPeerMessageString(msg, sizeof(msg), 1, 0);
  53. BtChokeMessageHandle pm = BtChokeMessage::create(&msg[4], 1);
  54. CPPUNIT_ASSERT_EQUAL((uint8_t)0, pm->getId());
  55. // case: payload size is wrong
  56. try {
  57. unsigned char msg[6];
  58. PeerMessageUtil::createPeerMessageString(msg, sizeof(msg), 2, 0);
  59. BtChokeMessage::create(&msg[4], 2);
  60. CPPUNIT_FAIL("exception must be threw.");
  61. } catch(...) {
  62. }
  63. // case: id is wrong
  64. try {
  65. unsigned char msg[5];
  66. PeerMessageUtil::createPeerMessageString(msg, sizeof(msg), 1, 1);
  67. BtChokeMessage::create(&msg[4], 1);
  68. CPPUNIT_FAIL("exception must be threw.");
  69. } catch(...) {
  70. }
  71. }
  72. void BtChokeMessageTest::testGetMessage() {
  73. BtChokeMessage msg;
  74. unsigned char data[5];
  75. PeerMessageUtil::createPeerMessageString(data, sizeof(data), 1, 0);
  76. CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 5) == 0);
  77. }
  78. void BtChokeMessageTest::testDoReceivedAction() {
  79. BtChokeMessage msg;
  80. PeerHandle peer = new Peer("host", 6969, 16*1024, 256*1024);
  81. msg.setPeer(peer);
  82. msg.setBtContext(btContext);
  83. MockBtMessageDispatcher2Handle dispatcher = new MockBtMessageDispatcher2();
  84. PEER_OBJECT(btContext, peer)->btMessageDispatcher = dispatcher;
  85. msg.doReceivedAction();
  86. CPPUNIT_ASSERT(dispatcher->doChokedActionCalled);
  87. CPPUNIT_ASSERT(peer->peerChoking);
  88. }
  89. void BtChokeMessageTest::testOnSendComplete() {
  90. BtChokeMessage msg;
  91. PeerHandle peer = new Peer("host", 6969, 16*1024, 256*1024);
  92. msg.setPeer(peer);
  93. msg.setBtContext(btContext);
  94. MockBtMessageDispatcher2Handle dispatcher = new MockBtMessageDispatcher2();
  95. PEER_OBJECT(btContext, peer)->btMessageDispatcher = dispatcher;
  96. msg.onSendComplete();
  97. CPPUNIT_ASSERT(dispatcher->doChokingActionCalled);
  98. CPPUNIT_ASSERT(peer->amChoking);
  99. }
  100. void BtChokeMessageTest::testToString() {
  101. BtChokeMessage msg;
  102. CPPUNIT_ASSERT_EQUAL(string("choke"), msg.toString());
  103. }