DHTMessageFactoryImplTest.cc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. #include "DHTMessageFactoryImpl.h"
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cppunit/extensions/HelperMacros.h>
  5. #include "RecoverableException.h"
  6. #include "util.h"
  7. #include "DHTNode.h"
  8. #include "DHTRoutingTable.h"
  9. #include "Peer.h"
  10. #include "bittorrent_helper.h"
  11. #include "DHTBucket.h"
  12. #include "DHTPingMessage.h"
  13. #include "DHTPingReplyMessage.h"
  14. #include "DHTFindNodeMessage.h"
  15. #include "DHTFindNodeReplyMessage.h"
  16. #include "DHTGetPeersMessage.h"
  17. #include "DHTGetPeersReplyMessage.h"
  18. #include "DHTAnnouncePeerMessage.h"
  19. #include "DHTAnnouncePeerReplyMessage.h"
  20. #include "bencode2.h"
  21. namespace aria2 {
  22. class DHTMessageFactoryImplTest:public CppUnit::TestFixture {
  23. CPPUNIT_TEST_SUITE(DHTMessageFactoryImplTest);
  24. CPPUNIT_TEST(testCreatePingMessage);
  25. CPPUNIT_TEST(testCreatePingReplyMessage);
  26. CPPUNIT_TEST(testCreateFindNodeMessage);
  27. CPPUNIT_TEST(testCreateFindNodeReplyMessage);
  28. #ifdef HAVE_INET_NTOP
  29. CPPUNIT_TEST(testCreateFindNodeReplyMessage6);
  30. #endif // HAVE_INET_NTOP
  31. CPPUNIT_TEST(testCreateGetPeersMessage);
  32. CPPUNIT_TEST(testCreateGetPeersReplyMessage);
  33. #ifdef HAVE_INET_NTOP
  34. CPPUNIT_TEST(testCreateGetPeersReplyMessage6);
  35. #endif // HAVE_INET_NTOP
  36. CPPUNIT_TEST(testCreateAnnouncePeerMessage);
  37. CPPUNIT_TEST(testCreateAnnouncePeerReplyMessage);
  38. CPPUNIT_TEST(testReceivedErrorMessage);
  39. CPPUNIT_TEST_SUITE_END();
  40. public:
  41. SharedHandle<DHTMessageFactoryImpl> factory;
  42. SharedHandle<DHTRoutingTable> routingTable;
  43. SharedHandle<DHTNode> localNode;
  44. unsigned char transactionID[DHT_TRANSACTION_ID_LENGTH];
  45. unsigned char remoteNodeID[DHT_ID_LENGTH];
  46. void setUp()
  47. {
  48. localNode.reset(new DHTNode());
  49. factory.reset(new DHTMessageFactoryImpl(AF_INET));
  50. factory->setLocalNode(localNode);
  51. memset(transactionID, 0xff, DHT_TRANSACTION_ID_LENGTH);
  52. memset(remoteNodeID, 0x0f, DHT_ID_LENGTH);
  53. routingTable.reset(new DHTRoutingTable(localNode));
  54. factory->setRoutingTable(routingTable);
  55. }
  56. void tearDown() {}
  57. void testCreatePingMessage();
  58. void testCreatePingReplyMessage();
  59. void testCreateFindNodeMessage();
  60. void testCreateFindNodeReplyMessage();
  61. void testCreateFindNodeReplyMessage6();
  62. void testCreateGetPeersMessage();
  63. void testCreateGetPeersReplyMessage();
  64. void testCreateGetPeersReplyMessage6();
  65. void testCreateAnnouncePeerMessage();
  66. void testCreateAnnouncePeerReplyMessage();
  67. void testReceivedErrorMessage();
  68. };
  69. CPPUNIT_TEST_SUITE_REGISTRATION(DHTMessageFactoryImplTest);
  70. void DHTMessageFactoryImplTest::testCreatePingMessage()
  71. {
  72. Dict dict;
  73. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  74. dict.put("y", "q");
  75. dict.put("q", "ping");
  76. SharedHandle<Dict> aDict = Dict::g();
  77. aDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  78. dict.put("a", aDict);
  79. SharedHandle<DHTPingMessage> m
  80. (dynamic_pointer_cast<DHTPingMessage>
  81. (factory->createQueryMessage(&dict, "192.168.0.1", 6881)));
  82. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  83. remoteNode->setIPAddress("192.168.0.1");
  84. remoteNode->setPort(6881);
  85. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  86. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  87. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  88. util::toHex(m->getTransactionID()));
  89. }
  90. void DHTMessageFactoryImplTest::testCreatePingReplyMessage()
  91. {
  92. Dict dict;
  93. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  94. dict.put("y", "r");
  95. SharedHandle<Dict> rDict = Dict::g();
  96. rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  97. dict.put("r", rDict);
  98. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  99. remoteNode->setIPAddress("192.168.0.1");
  100. remoteNode->setPort(6881);
  101. SharedHandle<DHTPingReplyMessage> m
  102. (dynamic_pointer_cast<DHTPingReplyMessage>
  103. (factory->createResponseMessage("ping", &dict,
  104. remoteNode->getIPAddress(),
  105. remoteNode->getPort())));
  106. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  107. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  108. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  109. util::toHex(m->getTransactionID()));
  110. }
  111. void DHTMessageFactoryImplTest::testCreateFindNodeMessage()
  112. {
  113. Dict dict;
  114. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  115. dict.put("y", "q");
  116. dict.put("q", "find_node");
  117. SharedHandle<Dict> aDict = Dict::g();
  118. aDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  119. unsigned char targetNodeID[DHT_ID_LENGTH];
  120. memset(targetNodeID, 0x11, DHT_ID_LENGTH);
  121. aDict->put("target", String::g(targetNodeID, DHT_ID_LENGTH));
  122. dict.put("a", aDict);
  123. SharedHandle<DHTFindNodeMessage> m
  124. (dynamic_pointer_cast<DHTFindNodeMessage>
  125. (factory->createQueryMessage(&dict, "192.168.0.1", 6881)));
  126. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  127. remoteNode->setIPAddress("192.168.0.1");
  128. remoteNode->setPort(6881);
  129. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  130. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  131. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  132. util::toHex(m->getTransactionID()));
  133. CPPUNIT_ASSERT_EQUAL(util::toHex(targetNodeID, DHT_ID_LENGTH),
  134. util::toHex(m->getTargetNodeID(), DHT_ID_LENGTH));
  135. }
  136. void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage()
  137. {
  138. try {
  139. Dict dict;
  140. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  141. dict.put("y", "r");
  142. SharedHandle<Dict> rDict = Dict::g();
  143. rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  144. std::string compactNodeInfo;
  145. SharedHandle<DHTNode> nodes[8];
  146. for(size_t i = 0; i < DHTBucket::K; ++i) {
  147. nodes[i].reset(new DHTNode());
  148. nodes[i]->setIPAddress("192.168.0."+util::uitos(i+1));
  149. nodes[i]->setPort(6881+i);
  150. unsigned char buf[COMPACT_LEN_IPV6];
  151. CPPUNIT_ASSERT_EQUAL
  152. (COMPACT_LEN_IPV4,
  153. bittorrent::packcompact
  154. (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
  155. compactNodeInfo +=
  156. std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
  157. std::string(&buf[0], &buf[COMPACT_LEN_IPV4]);
  158. }
  159. rDict->put("nodes", compactNodeInfo);
  160. dict.put("r", rDict);
  161. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  162. remoteNode->setIPAddress("192.168.0.1");
  163. remoteNode->setPort(6881);
  164. SharedHandle<DHTFindNodeReplyMessage> m
  165. (dynamic_pointer_cast<DHTFindNodeReplyMessage>
  166. (factory->createResponseMessage("find_node", &dict,
  167. remoteNode->getIPAddress(),
  168. remoteNode->getPort())));
  169. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  170. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  171. CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
  172. CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
  173. CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
  174. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  175. util::toHex(m->getTransactionID()));
  176. } catch(Exception& e) {
  177. CPPUNIT_FAIL(e.stackTrace());
  178. }
  179. }
  180. #ifdef HAVE_INET_NTOP
  181. void DHTMessageFactoryImplTest::testCreateFindNodeReplyMessage6()
  182. {
  183. factory.reset(new DHTMessageFactoryImpl(AF_INET6));
  184. factory->setLocalNode(localNode);
  185. factory->setRoutingTable(routingTable);
  186. try {
  187. Dict dict;
  188. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  189. dict.put("y", "r");
  190. SharedHandle<Dict> rDict = Dict::g();
  191. rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  192. std::string compactNodeInfo;
  193. SharedHandle<DHTNode> nodes[8];
  194. for(size_t i = 0; i < DHTBucket::K; ++i) {
  195. nodes[i].reset(new DHTNode());
  196. nodes[i]->setIPAddress("2001::000"+util::uitos(i+1));
  197. nodes[i]->setPort(6881+i);
  198. unsigned char buf[COMPACT_LEN_IPV6];
  199. CPPUNIT_ASSERT_EQUAL
  200. (COMPACT_LEN_IPV6,
  201. bittorrent::packcompact
  202. (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
  203. compactNodeInfo +=
  204. std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
  205. std::string(&buf[0], &buf[COMPACT_LEN_IPV6]);
  206. }
  207. rDict->put("nodes6", compactNodeInfo);
  208. dict.put("r", rDict);
  209. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  210. remoteNode->setIPAddress("2001::2001");
  211. remoteNode->setPort(6881);
  212. SharedHandle<DHTFindNodeReplyMessage> m
  213. (dynamic_pointer_cast<DHTFindNodeReplyMessage>
  214. (factory->createResponseMessage("find_node", &dict,
  215. remoteNode->getIPAddress(),
  216. remoteNode->getPort())));
  217. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  218. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  219. CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
  220. CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
  221. CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
  222. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  223. util::toHex(m->getTransactionID()));
  224. } catch(Exception& e) {
  225. CPPUNIT_FAIL(e.stackTrace());
  226. }
  227. }
  228. #endif // HAVE_INET_NTOP
  229. void DHTMessageFactoryImplTest::testCreateGetPeersMessage()
  230. {
  231. Dict dict;
  232. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  233. dict.put("y", "q");
  234. dict.put("q", "get_peers");
  235. SharedHandle<Dict> aDict = Dict::g();
  236. aDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  237. unsigned char infoHash[DHT_ID_LENGTH];
  238. memset(infoHash, 0x11, DHT_ID_LENGTH);
  239. aDict->put("info_hash", String::g(infoHash, DHT_ID_LENGTH));
  240. dict.put("a", aDict);
  241. SharedHandle<DHTGetPeersMessage> m
  242. (dynamic_pointer_cast<DHTGetPeersMessage>
  243. (factory->createQueryMessage(&dict, "192.168.0.1", 6881)));
  244. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  245. remoteNode->setIPAddress("192.168.0.1");
  246. remoteNode->setPort(6881);
  247. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  248. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  249. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  250. util::toHex(m->getTransactionID()));
  251. CPPUNIT_ASSERT_EQUAL(util::toHex(infoHash, DHT_ID_LENGTH),
  252. util::toHex(m->getInfoHash(), DHT_ID_LENGTH));
  253. }
  254. void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage()
  255. {
  256. try {
  257. Dict dict;
  258. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  259. dict.put("y", "r");
  260. SharedHandle<Dict> rDict = Dict::g();
  261. rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  262. std::string compactNodeInfo;
  263. SharedHandle<DHTNode> nodes[8];
  264. for(size_t i = 0; i < DHTBucket::K; ++i) {
  265. nodes[i].reset(new DHTNode());
  266. nodes[i]->setIPAddress("192.168.0."+util::uitos(i+1));
  267. nodes[i]->setPort(6881+i);
  268. unsigned char buf[COMPACT_LEN_IPV6];
  269. CPPUNIT_ASSERT_EQUAL
  270. (COMPACT_LEN_IPV4,
  271. bittorrent::packcompact
  272. (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
  273. compactNodeInfo +=
  274. std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
  275. std::string(&buf[0], &buf[COMPACT_LEN_IPV4]);
  276. }
  277. rDict->put("nodes", compactNodeInfo);
  278. std::deque<SharedHandle<Peer> > peers;
  279. SharedHandle<List> valuesList = List::g();
  280. for(size_t i = 0; i < 4; ++i) {
  281. SharedHandle<Peer> peer(new Peer("192.168.0."+util::uitos(i+1), 6881+i));
  282. unsigned char buffer[COMPACT_LEN_IPV6];
  283. CPPUNIT_ASSERT_EQUAL
  284. (COMPACT_LEN_IPV4,
  285. bittorrent::packcompact
  286. (buffer, peer->getIPAddress(), peer->getPort()));
  287. valuesList->append(String::g(buffer, COMPACT_LEN_IPV4));
  288. peers.push_back(peer);
  289. }
  290. rDict->put("values", valuesList);
  291. rDict->put("token", "token");
  292. dict.put("r", rDict);
  293. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  294. remoteNode->setIPAddress("192.168.0.1");
  295. remoteNode->setPort(6881);
  296. SharedHandle<DHTGetPeersReplyMessage> m
  297. (dynamic_pointer_cast<DHTGetPeersReplyMessage>
  298. (factory->createResponseMessage("get_peers", &dict,
  299. remoteNode->getIPAddress(),
  300. remoteNode->getPort())));
  301. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  302. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  303. CPPUNIT_ASSERT_EQUAL(std::string("token"), m->getToken());
  304. CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
  305. CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
  306. CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
  307. CPPUNIT_ASSERT_EQUAL((size_t)4, m->getValues().size());
  308. CPPUNIT_ASSERT(peers[0] == m->getValues()[0]);
  309. CPPUNIT_ASSERT(peers[3] == m->getValues()[3]);
  310. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  311. util::toHex(m->getTransactionID()));
  312. } catch(Exception& e) {
  313. CPPUNIT_FAIL(e.stackTrace());
  314. }
  315. }
  316. #ifdef HAVE_INET_NTOP
  317. void DHTMessageFactoryImplTest::testCreateGetPeersReplyMessage6()
  318. {
  319. factory.reset(new DHTMessageFactoryImpl(AF_INET6));
  320. factory->setLocalNode(localNode);
  321. factory->setRoutingTable(routingTable);
  322. try {
  323. Dict dict;
  324. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  325. dict.put("y", "r");
  326. SharedHandle<Dict> rDict = Dict::g();
  327. rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  328. std::string compactNodeInfo;
  329. SharedHandle<DHTNode> nodes[8];
  330. for(size_t i = 0; i < DHTBucket::K; ++i) {
  331. nodes[i].reset(new DHTNode());
  332. nodes[i]->setIPAddress("2001::000"+util::uitos(i+1));
  333. nodes[i]->setPort(6881+i);
  334. unsigned char buf[COMPACT_LEN_IPV6];
  335. CPPUNIT_ASSERT_EQUAL
  336. (COMPACT_LEN_IPV6,
  337. bittorrent::packcompact
  338. (buf, nodes[i]->getIPAddress(), nodes[i]->getPort()));
  339. compactNodeInfo +=
  340. std::string(&nodes[i]->getID()[0], &nodes[i]->getID()[DHT_ID_LENGTH])+
  341. std::string(&buf[0], &buf[COMPACT_LEN_IPV6]);
  342. }
  343. rDict->put("nodes6", compactNodeInfo);
  344. std::deque<SharedHandle<Peer> > peers;
  345. SharedHandle<List> valuesList = List::g();
  346. for(size_t i = 0; i < 4; ++i) {
  347. SharedHandle<Peer> peer(new Peer("2001::100"+util::uitos(i+1), 6881+i));
  348. unsigned char buffer[COMPACT_LEN_IPV6];
  349. CPPUNIT_ASSERT_EQUAL
  350. (COMPACT_LEN_IPV6,
  351. bittorrent::packcompact
  352. (buffer, peer->getIPAddress(), peer->getPort()));
  353. valuesList->append(String::g(buffer, COMPACT_LEN_IPV6));
  354. peers.push_back(peer);
  355. }
  356. rDict->put("values", valuesList);
  357. rDict->put("token", "token");
  358. dict.put("r", rDict);
  359. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  360. remoteNode->setIPAddress("2001::2001");
  361. remoteNode->setPort(6881);
  362. SharedHandle<DHTGetPeersReplyMessage> m
  363. (dynamic_pointer_cast<DHTGetPeersReplyMessage>
  364. (factory->createResponseMessage("get_peers", &dict,
  365. remoteNode->getIPAddress(),
  366. remoteNode->getPort())));
  367. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  368. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  369. CPPUNIT_ASSERT_EQUAL(std::string("token"), m->getToken());
  370. CPPUNIT_ASSERT_EQUAL((size_t)DHTBucket::K, m->getClosestKNodes().size());
  371. CPPUNIT_ASSERT(nodes[0] == m->getClosestKNodes()[0]);
  372. CPPUNIT_ASSERT(nodes[7] == m->getClosestKNodes()[7]);
  373. CPPUNIT_ASSERT_EQUAL((size_t)4, m->getValues().size());
  374. CPPUNIT_ASSERT(peers[0] == m->getValues()[0]);
  375. CPPUNIT_ASSERT(peers[3] == m->getValues()[3]);
  376. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  377. util::toHex(m->getTransactionID()));
  378. } catch(Exception& e) {
  379. CPPUNIT_FAIL(e.stackTrace());
  380. }
  381. }
  382. #endif // HAVE_INET_NTOP
  383. void DHTMessageFactoryImplTest::testCreateAnnouncePeerMessage()
  384. {
  385. try {
  386. Dict dict;
  387. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  388. dict.put("y", "q");
  389. dict.put("q", "announce_peer");
  390. SharedHandle<Dict> aDict = Dict::g();
  391. aDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  392. unsigned char infoHash[DHT_ID_LENGTH];
  393. memset(infoHash, 0x11, DHT_ID_LENGTH);
  394. aDict->put("info_hash", String::g(infoHash, DHT_ID_LENGTH));
  395. std::string token = "ffff";
  396. uint16_t port = 6881;
  397. aDict->put("port", Integer::g(port));
  398. aDict->put("token", token);
  399. dict.put("a", aDict);
  400. SharedHandle<DHTAnnouncePeerMessage> m
  401. (dynamic_pointer_cast<DHTAnnouncePeerMessage>
  402. (factory->createQueryMessage(&dict, "192.168.0.1", 6882)));
  403. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  404. remoteNode->setIPAddress("192.168.0.1");
  405. remoteNode->setPort(6882);
  406. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  407. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  408. CPPUNIT_ASSERT_EQUAL(token, m->getToken());
  409. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  410. util::toHex(m->getTransactionID()));
  411. CPPUNIT_ASSERT_EQUAL(util::toHex(infoHash, DHT_ID_LENGTH),
  412. util::toHex(m->getInfoHash(), DHT_ID_LENGTH));
  413. CPPUNIT_ASSERT_EQUAL(port, m->getTCPPort());
  414. } catch(Exception& e) {
  415. CPPUNIT_FAIL(e.stackTrace());
  416. }
  417. }
  418. void DHTMessageFactoryImplTest::testCreateAnnouncePeerReplyMessage()
  419. {
  420. Dict dict;
  421. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  422. dict.put("y", "r");
  423. SharedHandle<Dict> rDict = Dict::g();
  424. rDict->put("id", String::g(remoteNodeID, DHT_ID_LENGTH));
  425. dict.put("r", rDict);
  426. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  427. remoteNode->setIPAddress("192.168.0.1");
  428. remoteNode->setPort(6881);
  429. SharedHandle<DHTAnnouncePeerReplyMessage> m
  430. (dynamic_pointer_cast<DHTAnnouncePeerReplyMessage>
  431. (factory->createResponseMessage("announce_peer", &dict,
  432. remoteNode->getIPAddress(),
  433. remoteNode->getPort())));
  434. CPPUNIT_ASSERT(localNode == m->getLocalNode());
  435. CPPUNIT_ASSERT(remoteNode == m->getRemoteNode());
  436. CPPUNIT_ASSERT_EQUAL(util::toHex(transactionID, DHT_TRANSACTION_ID_LENGTH),
  437. util::toHex(m->getTransactionID()));
  438. }
  439. void DHTMessageFactoryImplTest::testReceivedErrorMessage()
  440. {
  441. Dict dict;
  442. dict.put("t", String::g(transactionID, DHT_TRANSACTION_ID_LENGTH));
  443. dict.put("y", "e");
  444. SharedHandle<List> list = List::g();
  445. list->append(Integer::g(404));
  446. list->append("Not found");
  447. dict.put("e", list);
  448. SharedHandle<DHTNode> remoteNode(new DHTNode(remoteNodeID));
  449. remoteNode->setIPAddress("192.168.0.1");
  450. remoteNode->setPort(6881);
  451. try {
  452. factory->createResponseMessage("announce_peer", &dict,
  453. remoteNode->getIPAddress(),
  454. remoteNode->getPort());
  455. CPPUNIT_FAIL("exception must be thrown.");
  456. } catch(RecoverableException& e) {
  457. std::cerr << e.stackTrace() << std::endl;
  458. }
  459. }
  460. } // namespace aria2