|
@@ -31,9 +31,10 @@ class DHTMessageFactoryImplTest:public CppUnit::TestFixture {
|
|
|
CPPUNIT_TEST(testCreatePingReplyMessage);
|
|
|
CPPUNIT_TEST(testCreateFindNodeMessage);
|
|
|
CPPUNIT_TEST(testCreateFindNodeReplyMessage);
|
|
|
+ CPPUNIT_TEST(testCreateFindNodeReplyMessage6);
|
|
|
CPPUNIT_TEST(testCreateGetPeersMessage);
|
|
|
- CPPUNIT_TEST(testCreateGetPeersReplyMessage_nodes);
|
|
|
- CPPUNIT_TEST(testCreateGetPeersReplyMessage_values);
|
|
|
+ CPPUNIT_TEST(testCreateGetPeersReplyMessage);
|
|
|
+ CPPUNIT_TEST(testCreateGetPeersReplyMessage6);
|
|
|
CPPUNIT_TEST(testCreateAnnouncePeerMessage);
|
|
|
CPPUNIT_TEST(testCreateAnnouncePeerReplyMessage);
|
|
|
CPPUNIT_TEST(testReceivedErrorMessage);
|
|
@@ -52,7 +53,7 @@ public:
|
|
|
void setUp()
|
|
|
{
|
|
|
localNode.reset(new DHTNode());
|
|
|
- factory.reset(new DHTMessageFactoryImpl());
|
|
|
+ factory.reset(new DHTMessageFactoryImpl(AF_INET));
|
|
|
factory->setLocalNode(localNode);
|
|
|
memset(transactionID, 0xff, DHT_TRANSACTION_ID_LENGTH);
|
|
|
memset(remoteNodeID, 0x0f, DHT_ID_LENGTH);
|
|
@@ -66,9 +67,10 @@ public:
|
|
|
void testCreatePingReplyMessage();
|
|
|
void testCreateFindNodeMessage();
|
|
|
void testCreateFindNodeReplyMessage();
|
|
|
+ void testCreateFindNodeReplyMessage6();
|
|
|
void testCreateGetPeersMessage();
|
|
|
- void testCreateGetPeersReplyMessage_nodes();
|
|
|
- void testCreateGetPeersReplyMessage_values();
|
|
|
+ void testCreateGetPeersReplyMessage();
|
|
|
+ void testCreateGetPeersReplyMessage6();
|
|
|
void testCreateAnnouncePeerMessage();
|
|
|
void testCreateAnnouncePeerReplyMessage();
|
|
|
void testReceivedErrorMessage();
|
|
@@ -169,8 +171,10 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage()
|
|
|
nodes[i]->setPort(6881+i);
|
|
|
|
|
|
unsigned char buf[COMPACT_LEN_IPV6];
|
|
|
- bittorrent::packcompact
|
|
|
- (buf, nodes[i]->getIPAddress(), nodes[i]->getPort());
|
|
|
+ CPPUNIT_ASSERT_EQUAL
|
|
|
+ (COMPACT_LEN_IPV4,
|
|
|
+ bittorrent::packcompact
|
|
|
+ (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
|
|
|
compactNodeInfo +=
|
|
|
std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
|
|
|
std::string(&buf[0], &buf[COMPACT_LEN_IPV4]);
|
|
@@ -200,6 +204,58 @@ void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage6()
|
|
|
+{
|
|
|
+ factory.reset(new DHTMessageFactoryImpl(AF_INET6));
|
|
|
+ factory->setLocalNode(localNode);
|
|
|
+ factory->setRoutingTable(routingTable);
|
|
|
+ try {
|
|
|
+ Dict dict;
|
|
|
+ dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
|
|
|
+ dict.put("y", "r");
|
|
|
+ SharedHandle<Dict> rDict = Dict::g();
|
|
|
+ rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
|
|
|
+ std::string compactNodeInfo;
|
|
|
+ SharedHandle<DHTNode> nodes[8];
|
|
|
+ for(size_t i = 0; i < DHTBucket::K; ++i) {
|
|
|
+ nodes[i].reset(new DHTNode());
|
|
|
+ nodes[i]->setIPAddress("2001::000"+util::uitos(i+1));
|
|
|
+ nodes[i]->setPort(6881+i);
|
|
|
+
|
|
|
+ unsigned char buf[COMPACT_LEN_IPV6];
|
|
|
+ CPPUNIT_ASSERT_EQUAL
|
|
|
+ (COMPACT_LEN_IPV6,
|
|
|
+ bittorrent::packcompact
|
|
|
+ (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
|
|
|
+ compactNodeInfo +=
|
|
|
+ std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
|
|
|
+ std::string(&buf[0], &buf[COMPACT_LEN_IPV6]);
|
|
|
+ }
|
|
|
+ rDict->put("nodes6", compactNodeInfo);
|
|
|
+ dict.put("r", rDict);
|
|
|
+
|
|
|
+ SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
|
|
|
+ remoteNode->setIPAddress("2001::2001");
|
|
|
+ remoteNode->setPort(6881);
|
|
|
+
|
|
|
+ SharedHandle<DHTFindNodeReplyMessage> m
|
|
|
+ (dynamic_pointer_cast<DHTFindNodeReplyMessage>
|
|
|
+ (factory->createResponseMessage("find_node", &dict,
|
|
|
+ remoteNode->getIPAddress(),
|
|
|
+ remoteNode->getPort())));
|
|
|
+
|
|
|
+ CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
|
|
+ CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
|
|
+ CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
|
|
|
+ CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
|
|
|
+ CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
|
|
|
+ CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
|
|
|
+ util::toHex(m->getTransactionID()));
|
|
|
+ } catch(Exception& e) {
|
|
|
+ CPPUNIT_FAIL(e.stackTrace());
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void DHTMessageFactoryImplTest::testCreateGetPeersMessage()
|
|
|
{
|
|
|
Dict dict;
|
|
@@ -228,7 +284,7 @@ void DHTMessageFactoryImplTest::testCreateGetPeersMessage()
|
|
|
util::toHex(m->getInfoHash(), DHT_ID_LENGTH));
|
|
|
}
|
|
|
|
|
|
-void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage_nodes()
|
|
|
+void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage()
|
|
|
{
|
|
|
try {
|
|
|
Dict dict;
|
|
@@ -244,13 +300,30 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage_nodes()
|
|
|
nodes[i]->setPort(6881+i);
|
|
|
|
|
|
unsigned char buf[COMPACT_LEN_IPV6];
|
|
|
- bittorrent::packcompact
|
|
|
- (buf, nodes[i]->getIPAddress(), nodes[i]->getPort());
|
|
|
+ CPPUNIT_ASSERT_EQUAL
|
|
|
+ (COMPACT_LEN_IPV4,
|
|
|
+ bittorrent::packcompact
|
|
|
+ (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
|
|
|
compactNodeInfo +=
|
|
|
std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
|
|
|
std::string(&buf[0], &buf[COMPACT_LEN_IPV4]);
|
|
|
}
|
|
|
rDict->put("nodes", compactNodeInfo);
|
|
|
+
|
|
|
+ std::deque<SharedHandle<Peer> > peers;
|
|
|
+ SharedHandle<List> valuesList = List::g();
|
|
|
+ for(size_t i = 0; i < 4; ++i) {
|
|
|
+ SharedHandle<Peer> peer(new Peer("192.168.0."+util::uitos(i+1), 6881+i));
|
|
|
+ unsigned char buffer[COMPACT_LEN_IPV6];
|
|
|
+ CPPUNIT_ASSERT_EQUAL
|
|
|
+ (COMPACT_LEN_IPV4,
|
|
|
+ bittorrent::packcompact
|
|
|
+ (buffer, peer->getIPAddress(), peer->getPort()));
|
|
|
+ valuesList->append(String::g(buffer, COMPACT_LEN_IPV4));
|
|
|
+ peers.push_back(peer);
|
|
|
+ }
|
|
|
+ rDict->put("values", valuesList);
|
|
|
+
|
|
|
rDict->put("token", "token");
|
|
|
dict.put("r", rDict);
|
|
|
|
|
@@ -270,6 +343,9 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage_nodes()
|
|
|
CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
|
|
|
CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
|
|
|
CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
|
|
|
+ CPPUNIT_ASSERT_EQUAL((size_t)4, m->getValues().size());
|
|
|
+ CPPUNIT_ASSERT(peers[0] == m->getValues()[0]);
|
|
|
+ CPPUNIT_ASSERT(peers[3] == m->getValues()[3]);
|
|
|
CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
|
|
|
util::toHex(m->getTransactionID()));
|
|
|
} catch(Exception& e) {
|
|
@@ -277,31 +353,54 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage_nodes()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage_values()
|
|
|
+void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage6()
|
|
|
{
|
|
|
+ factory.reset(new DHTMessageFactoryImpl(AF_INET6));
|
|
|
+ factory->setLocalNode(localNode);
|
|
|
+ factory->setRoutingTable(routingTable);
|
|
|
try {
|
|
|
Dict dict;
|
|
|
dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
|
|
|
dict.put("y", "r");
|
|
|
SharedHandle<Dict> rDict = Dict::g();
|
|
|
rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
|
|
|
+ std::string compactNodeInfo;
|
|
|
+ SharedHandle<DHTNode> nodes[8];
|
|
|
+ for(size_t i = 0; i < DHTBucket::K; ++i) {
|
|
|
+ nodes[i].reset(new DHTNode());
|
|
|
+ nodes[i]->setIPAddress("2001::000"+util::uitos(i+1));
|
|
|
+ nodes[i]->setPort(6881+i);
|
|
|
+
|
|
|
+ unsigned char buf[COMPACT_LEN_IPV6];
|
|
|
+ CPPUNIT_ASSERT_EQUAL
|
|
|
+ (COMPACT_LEN_IPV6,
|
|
|
+ bittorrent::packcompact
|
|
|
+ (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
|
|
|
+ compactNodeInfo +=
|
|
|
+ std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
|
|
|
+ std::string(&buf[0], &buf[COMPACT_LEN_IPV6]);
|
|
|
+ }
|
|
|
+ rDict->put("nodes6", compactNodeInfo);
|
|
|
|
|
|
std::deque<SharedHandle<Peer> > peers;
|
|
|
SharedHandle<List> valuesList = List::g();
|
|
|
for(size_t i = 0; i < 4; ++i) {
|
|
|
- SharedHandle<Peer> peer(new Peer("192.168.0."+util::uitos(i+1), 6881+i));
|
|
|
+ SharedHandle<Peer> peer(new Peer("2001::100"+util::uitos(i+1), 6881+i));
|
|
|
unsigned char buffer[COMPACT_LEN_IPV6];
|
|
|
- bittorrent::packcompact
|
|
|
- (buffer, peer->getIPAddress(), peer->getPort());
|
|
|
- valuesList->append(String::g(buffer, COMPACT_LEN_IPV4));
|
|
|
+ CPPUNIT_ASSERT_EQUAL
|
|
|
+ (COMPACT_LEN_IPV6,
|
|
|
+ bittorrent::packcompact
|
|
|
+ (buffer, peer->getIPAddress(), peer->getPort()));
|
|
|
+ valuesList->append(String::g(buffer, COMPACT_LEN_IPV6));
|
|
|
peers.push_back(peer);
|
|
|
}
|
|
|
rDict->put("values", valuesList);
|
|
|
+
|
|
|
rDict->put("token", "token");
|
|
|
dict.put("r", rDict);
|
|
|
|
|
|
SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
|
|
|
- remoteNode->setIPAddress("192.168.0.1");
|
|
|
+ remoteNode->setIPAddress("2001::2001");
|
|
|
remoteNode->setPort(6881);
|
|
|
|
|
|
SharedHandle<DHTGetPeersReplyMessage> m
|
|
@@ -313,6 +412,9 @@ void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage_values()
|
|
|
CPPUNIT_ASSERT(localNode == m->getLocalNode());
|
|
|
CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
|
|
|
CPPUNIT_ASSERT_EQUAL(std::string("token"), m->getToken());
|
|
|
+ CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
|
|
|
+ CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
|
|
|
+ CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
|
|
|
CPPUNIT_ASSERT_EQUAL((size_t)4, m->getValues().size());
|
|
|
CPPUNIT_ASSERT(peers[0] == m->getValues()[0]);
|
|
|
CPPUNIT_ASSERT(peers[3] == m->getValues()[3]);
|