summaryrefslogtreecommitdiff
path: root/test/BtExtendedMessageTest.cc
blob: 5375152e0be954eb3861456a839012484caa239f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "BtExtendedMessage.h"
#include "PeerMessageUtil.h"
#include "MockBtContext.h"
#include "MockExtensionMessageFactory.h"
#include "BtRegistry.h"
#include "Peer.h"
#include "PeerObject.h"
#include "BtMessageFactory.h"
#include "BtRequestFactory.h"
#include "BtMessageDispatcher.h"
#include "BtMessageReceiver.h"
#include "PeerConnection.h"
#include "Exception.h"
#include "FileEntry.h"
#include <cstring>
#include <iostream>
#include <cppunit/extensions/HelperMacros.h>

namespace aria2 {

class BtExtendedMessageTest:public CppUnit::TestFixture {

  CPPUNIT_TEST_SUITE(BtExtendedMessageTest);
  CPPUNIT_TEST(testCreate);
  CPPUNIT_TEST(testGetMessage);
  CPPUNIT_TEST(testDoReceivedAction);
  CPPUNIT_TEST(testToString);
  CPPUNIT_TEST_SUITE_END();
private:

public:
  void setUp()
  {
    BtRegistry::unregisterAll();
  }

  void tearDown()
  {
    BtRegistry::unregisterAll();
  }

  void testCreate();
  void testGetMessage();
  void testDoReceivedAction();
  void testToString();
};


CPPUNIT_TEST_SUITE_REGISTRATION(BtExtendedMessageTest);

void BtExtendedMessageTest::testCreate() {
  SharedHandle<Peer> peer = new Peer("192.168.0.1", 6969);
  peer->allocateSessionResource(1024, 1024*1024);
  SharedHandle<MockBtContext> ctx = new MockBtContext();
  unsigned char infohash[20];
  memset(infohash, 0, sizeof(infohash));
  ctx->setInfoHash(infohash);
  SharedHandle<MockExtensionMessageFactory> exmsgFactory = new MockExtensionMessageFactory();
  

  BtRegistry::registerPeerObjectCluster(ctx->getInfoHashAsString(), new PeerObjectCluster());
  SharedHandle<PeerObject> peerObject = new PeerObject();
  peerObject->extensionMessageFactory = exmsgFactory;

  PEER_OBJECT_CLUSTER(ctx)->registerHandle(peer->getID(), peerObject);

  // payload:{4:name3:foo}->11bytes
  std::string payload = "4:name3:foo";
  char msg[17];// 6+11bytes
  PeerMessageUtil::createPeerMessageString((unsigned char*)msg, sizeof(msg), 13, 20);
  msg[5] = 1; // Set dummy extended message ID 1
  memcpy(msg+6, payload.c_str(), payload.size());
  SharedHandle<BtExtendedMessage> pm = BtExtendedMessage::create(ctx,
								 peer,
								 &msg[4], 13);
  CPPUNIT_ASSERT_EQUAL((int8_t)20, pm->getId());
  
  // case: payload size is wrong
  try {
    char msg[5];
    PeerMessageUtil::createPeerMessageString((unsigned char*)msg, sizeof(msg), 1, 20);
    BtExtendedMessage::create(ctx, peer, &msg[4], 1);
    CPPUNIT_FAIL("exception must be thrown.");
  } catch(Exception* e) {
    std::cerr << *e << std::endl;
    delete e;
  }
  // case: id is wrong
  try {
    char msg[6];
    PeerMessageUtil::createPeerMessageString((unsigned char*)msg, sizeof(msg), 2, 21);
    BtExtendedMessage::create(ctx, peer, &msg[4], 2);
    CPPUNIT_FAIL("exception must be thrown.");
  } catch(Exception* e) {
    std::cerr << *e << std::endl;
    delete e;
  }
}

void BtExtendedMessageTest::testGetMessage() {
  std::string payload = "4:name3:foo";
  uint8_t extendedMessageID = 1;
  SharedHandle<MockExtensionMessage> exmsg =
    new MockExtensionMessage("charlie", extendedMessageID,
			     payload.c_str(),
			     payload.size());
  BtExtendedMessage msg(exmsg);

  char data[17];
  PeerMessageUtil::createPeerMessageString((unsigned char*)data, sizeof(data), 13, 20);
  *(data+5) = extendedMessageID;
  memcpy(data+6, payload.c_str(), payload.size());
  CPPUNIT_ASSERT(memcmp(msg.getMessage(), data, 17) == 0);
}

void BtExtendedMessageTest::testDoReceivedAction() {
  SharedHandle<MockExtensionMessage> exmsg =
    new MockExtensionMessage("charlie", 1, "", 0);
  BtExtendedMessage msg(exmsg);
  msg.doReceivedAction();
  CPPUNIT_ASSERT(exmsg->_doReceivedActionCalled);
}
  
void BtExtendedMessageTest::testToString() {
  std::string payload = "4:name3:foo";
  uint8_t extendedMessageID = 1;
  SharedHandle<MockExtensionMessage> exmsg =
    new MockExtensionMessage("charlie", extendedMessageID,
			     payload.c_str(),
			     payload.size());
  BtExtendedMessage msg(exmsg);
  CPPUNIT_ASSERT_EQUAL(std::string("extended charlie"), msg.toString());
}

} // namespace aria2