summaryrefslogtreecommitdiff
path: root/test/DHTMessageFactoryImplTest.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-07 14:15:21 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-07 14:15:21 +0000
commit26d66923767581d63fdfc303525cddebf9125bde (patch)
tree97eb6054d697b53c7296adfaeaa43fb8013de3f2 /test/DHTMessageFactoryImplTest.cc
parentbe7012272dbd029a7843df43466f4cd83e6fb9e3 (diff)
2010-08-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added IPv6 DHT. Added --dht-entry-porint6, --dht-file-path6, --dht-listen-addr6 and --enable-dht6 option. IPv6 DHT is disabled by default. To use IPv6 DHT, you need to use --enable-dht6 and specify a global unicast address to --dht-listen-addr6. IPv6 DHT is highly experimental. * src/BtSetup.cc * src/DHTAutoSaveCommand.cc * src/DHTAutoSaveCommand.h * src/DHTConnectionImpl.cc * src/DHTConnectionImpl.h * src/DHTEntryPointNameResolveCommand.cc * src/DHTFindNodeReplyMessage.cc * src/DHTFindNodeReplyMessage.h * src/DHTGetPeersMessage.cc * src/DHTGetPeersReplyMessage.cc * src/DHTGetPeersReplyMessage.h * src/DHTMessageFactory.h * src/DHTMessageFactoryImpl.cc * src/DHTMessageFactoryImpl.h * src/DHTMessageTracker.cc * src/DHTRegistry.cc * src/DHTRegistry.h * src/DHTRoutingTableDeserializer.cc * src/DHTRoutingTableDeserializer.h * src/DHTRoutingTableSerializer.cc * src/DHTRoutingTableSerializer.h * src/DHTSetup.cc * src/DHTSetup.h * src/FtpConnection.cc * src/LpdMessageReceiver.cc * src/OptionHandlerFactory.cc * src/OptionHandlerImpl.h * src/PeerInteractionCommand.cc * src/RequestGroup.cc * src/SocketCore.cc * src/SocketCore.h * src/bittorrent_helper.cc * src/bittorrent_helper.h * src/prefs.cc * src/prefs.h * src/usage_text.h * test/DHTConnectionImplTest.cc * test/DHTFindNodeReplyMessageTest.cc * test/DHTGetPeersMessageTest.cc * test/DHTGetPeersReplyMessageTest.cc * test/DHTMessageFactoryImplTest.cc * test/DHTRoutingTableDeserializerTest.cc * test/DHTRoutingTableSerializerTest.cc * test/LpdMessageDispatcherTest.cc * test/MockDHTMessageFactory.h
Diffstat (limited to 'test/DHTMessageFactoryImplTest.cc')
-rw-r--r--test/DHTMessageFactoryImplTest.cc134
1 files changed, 118 insertions, 16 deletions
diff --git a/test/DHTMessageFactoryImplTest.cc b/test/DHTMessageFactoryImplTest.cc
index 6210c27a..04bd2ff5 100644
--- a/test/DHTMessageFactoryImplTest.cc
+++ b/test/DHTMessageFactoryImplTest.cc
@@ -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]);