DefaultBtAnnounceTest.cc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. #include "DefaultBtAnnounce.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "TestUtil.h"
  5. #include "Option.h"
  6. #include "util.h"
  7. #include "Exception.h"
  8. #include "MockPieceStorage.h"
  9. #include "MockPeerStorage.h"
  10. #include "BtRuntime.h"
  11. #include "AnnounceTier.h"
  12. #include "FixedNumberRandomizer.h"
  13. #include "FileEntry.h"
  14. #include "prefs.h"
  15. #include "DownloadContext.h"
  16. #include "bittorrent_helper.h"
  17. #include "array_fun.h"
  18. #include "UDPTrackerRequest.h"
  19. #include "SocketCore.h"
  20. namespace aria2 {
  21. class DefaultBtAnnounceTest : public CppUnit::TestFixture {
  22. CPPUNIT_TEST_SUITE(DefaultBtAnnounceTest);
  23. CPPUNIT_TEST(testGetAnnounceUrl);
  24. CPPUNIT_TEST(testGetAnnounceUrl_withQuery);
  25. CPPUNIT_TEST(testGetAnnounceUrl_externalIP);
  26. CPPUNIT_TEST(testNoMoreAnnounce);
  27. CPPUNIT_TEST(testIsAllAnnounceFailed);
  28. CPPUNIT_TEST(testURLOrderInStoppedEvent);
  29. CPPUNIT_TEST(testURLOrderInCompletedEvent);
  30. CPPUNIT_TEST(testProcessAnnounceResponse_malformed);
  31. CPPUNIT_TEST(testProcessAnnounceResponse_failureReason);
  32. CPPUNIT_TEST(testProcessAnnounceResponse);
  33. CPPUNIT_TEST(testProcessUDPTrackerResponse);
  34. CPPUNIT_TEST_SUITE_END();
  35. private:
  36. std::shared_ptr<DownloadContext> dctx_;
  37. std::shared_ptr<MockPieceStorage> pieceStorage_;
  38. std::shared_ptr<MockPeerStorage> peerStorage_;
  39. std::shared_ptr<BtRuntime> btRuntime_;
  40. std::unique_ptr<Randomizer> randomizer_;
  41. Option* option_;
  42. public:
  43. void setUp()
  44. {
  45. option_ = new Option();
  46. int64_t totalLength = 4_m;
  47. int32_t pieceLength = 256_k;
  48. static const unsigned char infoHash[] = {
  49. 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23,
  50. 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67};
  51. std::string peerId = "-aria2-ultrafastdltl";
  52. dctx_.reset(new DownloadContext(pieceLength, totalLength));
  53. {
  54. auto torrentAttrs = make_unique<TorrentAttribute>();
  55. torrentAttrs->infoHash.assign(std::begin(infoHash), std::end(infoHash));
  56. dctx_->setAttribute(CTX_ATTR_BT, std::move(torrentAttrs));
  57. }
  58. dctx_->getNetStat().updateDownload(pieceLength * 5);
  59. dctx_->getNetStat().updateUpload(pieceLength * 6);
  60. bittorrent::setStaticPeerId(peerId);
  61. pieceStorage_.reset(new MockPieceStorage());
  62. pieceStorage_->setTotalLength(totalLength);
  63. pieceStorage_->setCompletedLength(pieceLength * 10);
  64. peerStorage_.reset(new MockPeerStorage());
  65. btRuntime_.reset(new BtRuntime());
  66. randomizer_.reset(new FixedNumberRandomizer());
  67. }
  68. void tearDown() { delete option_; }
  69. void testGetAnnounceUrl();
  70. void testGetAnnounceUrl_withQuery();
  71. void testGetAnnounceUrl_externalIP();
  72. void testNoMoreAnnounce();
  73. void testIsAllAnnounceFailed();
  74. void testURLOrderInStoppedEvent();
  75. void testURLOrderInCompletedEvent();
  76. void testProcessAnnounceResponse_malformed();
  77. void testProcessAnnounceResponse_failureReason();
  78. void testProcessAnnounceResponse();
  79. void testProcessUDPTrackerResponse();
  80. };
  81. CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtAnnounceTest);
  82. namespace {
  83. template <typename InputIterator>
  84. std::unique_ptr<List> createAnnounceTier(InputIterator first,
  85. InputIterator last)
  86. {
  87. auto announceTier = List::g();
  88. for (; first != last; ++first) {
  89. announceTier->append(String::g(*first));
  90. }
  91. return announceTier;
  92. }
  93. } // namespace
  94. namespace {
  95. std::unique_ptr<List> createAnnounceTier(const std::string& uri)
  96. {
  97. auto announceTier = List::g();
  98. announceTier->append(String::g(uri));
  99. return announceTier;
  100. }
  101. } // namespace
  102. namespace {
  103. void setAnnounceList(const std::shared_ptr<DownloadContext>& dctx,
  104. const List* announceList)
  105. {
  106. std::vector<std::vector<std::string>> dest;
  107. for (auto tierIter = announceList->begin(), eoi = announceList->end();
  108. tierIter != eoi; ++tierIter) {
  109. std::vector<std::string> ntier;
  110. const List* tier = downcast<List>(*tierIter);
  111. for (auto uriIter = tier->begin(), eoi2 = tier->end(); uriIter != eoi2;
  112. ++uriIter) {
  113. const String* uri = downcast<String>(*uriIter);
  114. ntier.push_back(uri->s());
  115. }
  116. dest.push_back(std::move(ntier));
  117. }
  118. bittorrent::getTorrentAttrs(dctx)->announceList.swap(dest);
  119. }
  120. } // namespace
  121. void DefaultBtAnnounceTest::testNoMoreAnnounce()
  122. {
  123. auto announceList = List::g();
  124. announceList->append(createAnnounceTier("http://localhost/announce"));
  125. announceList->append(createAnnounceTier("http://backup/announce"));
  126. setAnnounceList(dctx_, announceList.get());
  127. DefaultBtAnnounce btAnnounce(dctx_.get(), option_);
  128. btAnnounce.setPieceStorage(pieceStorage_);
  129. btAnnounce.setPeerStorage(peerStorage_);
  130. btAnnounce.setBtRuntime(btRuntime_);
  131. btAnnounce.setRandomizer(randomizer_.get());
  132. btAnnounce.setTcpPort(6989);
  133. CPPUNIT_ASSERT_EQUAL(
  134. std::string("http://localhost/"
  135. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  136. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  137. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  138. "numwant=50&no_peer_id=1&port=6989&event=started&"
  139. "supportcrypto=1"),
  140. btAnnounce.getAnnounceUrl());
  141. btAnnounce.announceSuccess();
  142. CPPUNIT_ASSERT_EQUAL(
  143. std::string("http://localhost/"
  144. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  145. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  146. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  147. "numwant=50&no_peer_id=1&port=6989&supportcrypto=1"),
  148. btAnnounce.getAnnounceUrl());
  149. btAnnounce.announceFailure();
  150. CPPUNIT_ASSERT_EQUAL(
  151. std::string("http://backup/"
  152. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  153. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  154. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  155. "numwant=50&no_peer_id=1&port=6989&event=started&"
  156. "supportcrypto=1"),
  157. btAnnounce.getAnnounceUrl());
  158. btAnnounce.announceSuccess();
  159. pieceStorage_->setAllDownloadFinished(true);
  160. CPPUNIT_ASSERT_EQUAL(
  161. std::string("http://localhost/"
  162. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  163. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  164. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  165. "numwant=50&no_peer_id=1&port=6989&event=completed&"
  166. "supportcrypto=1"),
  167. btAnnounce.getAnnounceUrl());
  168. btAnnounce.announceSuccess();
  169. CPPUNIT_ASSERT_EQUAL(
  170. std::string("http://backup/"
  171. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  172. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  173. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  174. "numwant=50&no_peer_id=1&port=6989&event=completed&"
  175. "supportcrypto=1"),
  176. btAnnounce.getAnnounceUrl());
  177. btAnnounce.announceSuccess();
  178. btRuntime_->setHalt(true);
  179. CPPUNIT_ASSERT_EQUAL(
  180. std::string("http://localhost/"
  181. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  182. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  183. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  184. "numwant=0&no_peer_id=1&port=6989&event=stopped&"
  185. "supportcrypto=1"),
  186. btAnnounce.getAnnounceUrl());
  187. btAnnounce.announceSuccess();
  188. CPPUNIT_ASSERT_EQUAL(
  189. std::string("http://backup/"
  190. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  191. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  192. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  193. "numwant=0&no_peer_id=1&port=6989&event=stopped&"
  194. "supportcrypto=1"),
  195. btAnnounce.getAnnounceUrl());
  196. btAnnounce.announceSuccess();
  197. CPPUNIT_ASSERT(btAnnounce.noMoreAnnounce());
  198. }
  199. void DefaultBtAnnounceTest::testGetAnnounceUrl()
  200. {
  201. auto announceList = List::g();
  202. announceList->append(createAnnounceTier("http://localhost/announce"));
  203. setAnnounceList(dctx_, announceList.get());
  204. DefaultBtAnnounce btAnnounce(dctx_.get(), option_);
  205. btAnnounce.setPieceStorage(pieceStorage_);
  206. btAnnounce.setPeerStorage(peerStorage_);
  207. btAnnounce.setBtRuntime(btRuntime_);
  208. btAnnounce.setRandomizer(randomizer_.get());
  209. btAnnounce.setTcpPort(6989);
  210. std::shared_ptr<UDPTrackerRequest> req;
  211. CPPUNIT_ASSERT_EQUAL(
  212. std::string("http://localhost/"
  213. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  214. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  215. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  216. "numwant=50&no_peer_id=1&port=6989&event=started&"
  217. "supportcrypto=1"),
  218. btAnnounce.getAnnounceUrl());
  219. req = btAnnounce.createUDPTrackerRequest("localhost", 80, 6989);
  220. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->remoteAddr);
  221. CPPUNIT_ASSERT_EQUAL((uint16_t)80, req->remotePort);
  222. CPPUNIT_ASSERT_EQUAL((int)UDPT_ACT_ANNOUNCE, req->action);
  223. CPPUNIT_ASSERT_EQUAL(bittorrent::getInfoHashString(dctx_),
  224. util::toHex(req->infohash));
  225. CPPUNIT_ASSERT_EQUAL(std::string("-aria2-ultrafastdltl"), req->peerId);
  226. CPPUNIT_ASSERT_EQUAL((int64_t)1310720, req->downloaded);
  227. CPPUNIT_ASSERT_EQUAL((int64_t)1572864, req->left);
  228. CPPUNIT_ASSERT_EQUAL((int64_t)1572864, req->uploaded);
  229. CPPUNIT_ASSERT_EQUAL((int)UDPT_EVT_STARTED, req->event);
  230. CPPUNIT_ASSERT_EQUAL((uint32_t)0, req->ip);
  231. CPPUNIT_ASSERT_EQUAL((int32_t)50, req->numWant);
  232. CPPUNIT_ASSERT_EQUAL((uint16_t)6989, req->port);
  233. CPPUNIT_ASSERT_EQUAL((uint16_t)0, req->extensions);
  234. btAnnounce.announceSuccess();
  235. CPPUNIT_ASSERT_EQUAL(
  236. std::string("http://localhost/"
  237. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  238. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  239. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  240. "numwant=50&no_peer_id=1&port=6989&supportcrypto=1"),
  241. btAnnounce.getAnnounceUrl());
  242. req = btAnnounce.createUDPTrackerRequest("localhost", 80, 6989);
  243. CPPUNIT_ASSERT_EQUAL((int)UDPT_ACT_ANNOUNCE, req->action);
  244. CPPUNIT_ASSERT_EQUAL((int)UDPT_EVT_NONE, req->event);
  245. btAnnounce.announceSuccess();
  246. pieceStorage_->setAllDownloadFinished(true);
  247. CPPUNIT_ASSERT_EQUAL(
  248. std::string("http://localhost/"
  249. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  250. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  251. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  252. "numwant=50&no_peer_id=1&port=6989&event=completed&"
  253. "supportcrypto=1"),
  254. btAnnounce.getAnnounceUrl());
  255. req = btAnnounce.createUDPTrackerRequest("localhost", 80, 6989);
  256. CPPUNIT_ASSERT_EQUAL((int)UDPT_ACT_ANNOUNCE, req->action);
  257. CPPUNIT_ASSERT_EQUAL((int)UDPT_EVT_COMPLETED, req->event);
  258. btAnnounce.announceSuccess();
  259. btRuntime_->setHalt(true);
  260. CPPUNIT_ASSERT_EQUAL(
  261. std::string("http://localhost/"
  262. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  263. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  264. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  265. "numwant=0&no_peer_id=1&port=6989&event=stopped&"
  266. "supportcrypto=1"),
  267. btAnnounce.getAnnounceUrl());
  268. req = btAnnounce.createUDPTrackerRequest("localhost", 80, 6989);
  269. CPPUNIT_ASSERT_EQUAL((int)UDPT_ACT_ANNOUNCE, req->action);
  270. CPPUNIT_ASSERT_EQUAL((int)UDPT_EVT_STOPPED, req->event);
  271. }
  272. void DefaultBtAnnounceTest::testGetAnnounceUrl_withQuery()
  273. {
  274. auto announceList = List::g();
  275. announceList->append(createAnnounceTier("http://localhost/announce?k=v"));
  276. setAnnounceList(dctx_, announceList.get());
  277. DefaultBtAnnounce btAnnounce(dctx_.get(), option_);
  278. btAnnounce.setPieceStorage(pieceStorage_);
  279. btAnnounce.setPeerStorage(peerStorage_);
  280. btAnnounce.setBtRuntime(btRuntime_);
  281. btAnnounce.setRandomizer(randomizer_.get());
  282. btAnnounce.setTcpPort(6989);
  283. CPPUNIT_ASSERT_EQUAL(
  284. std::string(
  285. "http://localhost/announce?k=v&"
  286. "info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&"
  287. "peer_id=-aria2-ultrafastdltl&"
  288. "uploaded=1572864&downloaded=1310720&left=1572864&compact=1&"
  289. "key=fastdltl&numwant=50&no_peer_id=1&port=6989&event=started&"
  290. "supportcrypto=1"),
  291. btAnnounce.getAnnounceUrl());
  292. }
  293. void DefaultBtAnnounceTest::testGetAnnounceUrl_externalIP()
  294. {
  295. auto announceList = List::g();
  296. announceList->append(createAnnounceTier("http://localhost/announce"));
  297. setAnnounceList(dctx_, announceList.get());
  298. option_->put(PREF_BT_EXTERNAL_IP, "192.168.1.1");
  299. DefaultBtAnnounce btAnnounce(dctx_.get(), option_);
  300. btAnnounce.setPieceStorage(pieceStorage_);
  301. btAnnounce.setPeerStorage(peerStorage_);
  302. btAnnounce.setBtRuntime(btRuntime_);
  303. btAnnounce.setRandomizer(randomizer_.get());
  304. btAnnounce.setTcpPort(6989);
  305. CPPUNIT_ASSERT_EQUAL(
  306. std::string(
  307. "http://localhost/announce?"
  308. "info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&"
  309. "peer_id=-aria2-ultrafastdltl&"
  310. "uploaded=1572864&downloaded=1310720&left=1572864&compact=1&"
  311. "key=fastdltl&numwant=50&no_peer_id=1&port=6989&event=started&"
  312. "supportcrypto=1&ip=192.168.1.1"),
  313. btAnnounce.getAnnounceUrl());
  314. std::shared_ptr<UDPTrackerRequest> req;
  315. req = btAnnounce.createUDPTrackerRequest("localhost", 80, 6989);
  316. char host[NI_MAXHOST];
  317. int rv = inetNtop(AF_INET, &req->ip, host, sizeof(host));
  318. CPPUNIT_ASSERT_EQUAL(0, rv);
  319. CPPUNIT_ASSERT_EQUAL(std::string("192.168.1.1"), std::string(host));
  320. }
  321. void DefaultBtAnnounceTest::testIsAllAnnounceFailed()
  322. {
  323. auto announceList = List::g();
  324. announceList->append(createAnnounceTier("http://localhost/announce"));
  325. announceList->append(createAnnounceTier("http://backup/announce"));
  326. setAnnounceList(dctx_, announceList.get());
  327. DefaultBtAnnounce btAnnounce(dctx_.get(), option_);
  328. btAnnounce.setPieceStorage(pieceStorage_);
  329. btAnnounce.setPeerStorage(peerStorage_);
  330. btAnnounce.setBtRuntime(btRuntime_);
  331. btAnnounce.setRandomizer(randomizer_.get());
  332. btAnnounce.setTcpPort(6989);
  333. CPPUNIT_ASSERT_EQUAL(
  334. std::string("http://localhost/"
  335. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  336. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  337. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  338. "numwant=50&no_peer_id=1&port=6989&event=started&"
  339. "supportcrypto=1"),
  340. btAnnounce.getAnnounceUrl());
  341. btAnnounce.announceFailure();
  342. CPPUNIT_ASSERT_EQUAL(
  343. std::string("http://backup/"
  344. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  345. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  346. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  347. "numwant=50&no_peer_id=1&port=6989&event=started&"
  348. "supportcrypto=1"),
  349. btAnnounce.getAnnounceUrl());
  350. btAnnounce.announceFailure();
  351. CPPUNIT_ASSERT(!btAnnounce.isAnnounceReady());
  352. CPPUNIT_ASSERT_EQUAL(std::string(""), btAnnounce.getAnnounceUrl());
  353. CPPUNIT_ASSERT(btAnnounce.isAllAnnounceFailed());
  354. btAnnounce.resetAnnounce();
  355. CPPUNIT_ASSERT(!btAnnounce.isAllAnnounceFailed());
  356. }
  357. void DefaultBtAnnounceTest::testURLOrderInStoppedEvent()
  358. {
  359. const char* urls[] = {"http://localhost1/announce",
  360. "http://localhost2/announce"};
  361. auto announceList = List::g();
  362. announceList->append(createAnnounceTier(std::begin(urls), std::end(urls)));
  363. setAnnounceList(dctx_, announceList.get());
  364. DefaultBtAnnounce btAnnounce(dctx_.get(), option_);
  365. btAnnounce.setPieceStorage(pieceStorage_);
  366. btAnnounce.setPeerStorage(peerStorage_);
  367. btAnnounce.setBtRuntime(btRuntime_);
  368. btAnnounce.setRandomizer(randomizer_.get());
  369. btAnnounce.setTcpPort(6989);
  370. CPPUNIT_ASSERT_EQUAL(
  371. std::string("http://localhost1/"
  372. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  373. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  374. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  375. "numwant=50&no_peer_id=1&port=6989&event=started&"
  376. "supportcrypto=1"),
  377. btAnnounce.getAnnounceUrl());
  378. btAnnounce.announceSuccess();
  379. btRuntime_->setHalt(true);
  380. CPPUNIT_ASSERT_EQUAL(
  381. std::string("http://localhost1/"
  382. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  383. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  384. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  385. "numwant=0&no_peer_id=1&port=6989&event=stopped&"
  386. "supportcrypto=1"),
  387. btAnnounce.getAnnounceUrl());
  388. btAnnounce.announceFailure();
  389. CPPUNIT_ASSERT_EQUAL(
  390. std::string("http://localhost2/"
  391. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  392. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  393. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  394. "numwant=0&no_peer_id=1&port=6989&event=stopped&"
  395. "supportcrypto=1"),
  396. btAnnounce.getAnnounceUrl());
  397. btAnnounce.announceSuccess();
  398. }
  399. void DefaultBtAnnounceTest::testURLOrderInCompletedEvent()
  400. {
  401. const char* urls[] = {"http://localhost1/announce",
  402. "http://localhost2/announce"};
  403. auto announceList = List::g();
  404. announceList->append(createAnnounceTier(std::begin(urls), std::end(urls)));
  405. setAnnounceList(dctx_, announceList.get());
  406. DefaultBtAnnounce btAnnounce(dctx_.get(), option_);
  407. btAnnounce.setPieceStorage(pieceStorage_);
  408. btAnnounce.setPeerStorage(peerStorage_);
  409. btAnnounce.setBtRuntime(btRuntime_);
  410. btAnnounce.setRandomizer(randomizer_.get());
  411. btAnnounce.setTcpPort(6989);
  412. CPPUNIT_ASSERT_EQUAL(
  413. std::string("http://localhost1/"
  414. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  415. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  416. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  417. "numwant=50&no_peer_id=1&port=6989&event=started&"
  418. "supportcrypto=1"),
  419. btAnnounce.getAnnounceUrl());
  420. btAnnounce.announceSuccess();
  421. pieceStorage_->setAllDownloadFinished(true);
  422. CPPUNIT_ASSERT_EQUAL(
  423. std::string("http://localhost1/"
  424. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  425. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  426. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  427. "numwant=50&no_peer_id=1&port=6989&event=completed&"
  428. "supportcrypto=1"),
  429. btAnnounce.getAnnounceUrl());
  430. btAnnounce.announceFailure();
  431. CPPUNIT_ASSERT_EQUAL(
  432. std::string("http://localhost2/"
  433. "announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%"
  434. "01%23Eg&peer_id=-aria2-ultrafastdltl&uploaded=1572864&"
  435. "downloaded=1310720&left=1572864&compact=1&key=fastdltl&"
  436. "numwant=50&no_peer_id=1&port=6989&event=completed&"
  437. "supportcrypto=1"),
  438. btAnnounce.getAnnounceUrl());
  439. btAnnounce.announceSuccess();
  440. }
  441. void DefaultBtAnnounceTest::testProcessAnnounceResponse_malformed()
  442. {
  443. try {
  444. std::string res = "i123e";
  445. DefaultBtAnnounce(dctx_.get(), option_)
  446. .processAnnounceResponse(
  447. reinterpret_cast<const unsigned char*>(res.c_str()), res.size());
  448. CPPUNIT_FAIL("exception must be thrown.");
  449. }
  450. catch (Exception& e) {
  451. std::cerr << e.stackTrace() << std::endl;
  452. }
  453. }
  454. void DefaultBtAnnounceTest::testProcessAnnounceResponse_failureReason()
  455. {
  456. try {
  457. std::string res = "d14:failure reason11:hello worlde";
  458. DefaultBtAnnounce(dctx_.get(), option_)
  459. .processAnnounceResponse(
  460. reinterpret_cast<const unsigned char*>(res.c_str()), res.size());
  461. CPPUNIT_FAIL("exception must be thrown.");
  462. }
  463. catch (Exception& e) {
  464. std::cerr << e.stackTrace() << std::endl;
  465. }
  466. }
  467. void DefaultBtAnnounceTest::testProcessAnnounceResponse()
  468. {
  469. std::string res = "d"
  470. "15:warning message11:hello world"
  471. "10:tracker id3:foo"
  472. "8:intervali3000e"
  473. "12:min intervali1800e"
  474. "8:completei100e"
  475. "10:incompletei200e";
  476. res += "5:peers6:";
  477. res += fromHex("c0a800011ae1");
  478. res += "6:peers618:";
  479. res += fromHex("100210354527354678541237324732171ae1");
  480. res += "e";
  481. DefaultBtAnnounce an(dctx_.get(), option_);
  482. an.setPeerStorage(peerStorage_);
  483. an.setBtRuntime(btRuntime_);
  484. an.processAnnounceResponse(
  485. reinterpret_cast<const unsigned char*>(res.c_str()), res.size());
  486. CPPUNIT_ASSERT_EQUAL(std::string("foo"), an.getTrackerID());
  487. CPPUNIT_ASSERT_EQUAL((int64_t)3000, an.getInterval().count());
  488. CPPUNIT_ASSERT_EQUAL((int64_t)1800, an.getMinInterval().count());
  489. CPPUNIT_ASSERT_EQUAL(100, an.getComplete());
  490. CPPUNIT_ASSERT_EQUAL(200, an.getIncomplete());
  491. CPPUNIT_ASSERT_EQUAL((size_t)2, peerStorage_->getUnusedPeers().size());
  492. std::shared_ptr<Peer> peer = peerStorage_->getUnusedPeers()[0];
  493. CPPUNIT_ASSERT_EQUAL(std::string("192.168.0.1"), peer->getIPAddress());
  494. peer = peerStorage_->getUnusedPeers()[1];
  495. CPPUNIT_ASSERT_EQUAL(std::string("1002:1035:4527:3546:7854:1237:3247:3217"),
  496. peer->getIPAddress());
  497. }
  498. void DefaultBtAnnounceTest::testProcessUDPTrackerResponse()
  499. {
  500. std::shared_ptr<UDPTrackerRequest> req(new UDPTrackerRequest());
  501. req->action = UDPT_ACT_ANNOUNCE;
  502. std::shared_ptr<UDPTrackerReply> reply(new UDPTrackerReply());
  503. reply->interval = 1800;
  504. reply->leechers = 200;
  505. reply->seeders = 100;
  506. for (int i = 0; i < 2; ++i) {
  507. reply->peers.push_back(
  508. std::make_pair("192.168.0." + util::uitos(i + 1), 6890 + i));
  509. }
  510. req->reply = reply;
  511. DefaultBtAnnounce an(dctx_.get(), option_);
  512. an.setPeerStorage(peerStorage_);
  513. an.setBtRuntime(btRuntime_);
  514. an.processUDPTrackerResponse(req);
  515. CPPUNIT_ASSERT_EQUAL((int64_t)1800, an.getInterval().count());
  516. CPPUNIT_ASSERT_EQUAL((int64_t)1800, an.getMinInterval().count());
  517. CPPUNIT_ASSERT_EQUAL(100, an.getComplete());
  518. CPPUNIT_ASSERT_EQUAL(200, an.getIncomplete());
  519. CPPUNIT_ASSERT_EQUAL((size_t)2, peerStorage_->getUnusedPeers().size());
  520. for (int i = 0; i < 2; ++i) {
  521. std::shared_ptr<Peer> peer;
  522. peer = peerStorage_->getUnusedPeers()[i];
  523. CPPUNIT_ASSERT_EQUAL("192.168.0." + util::uitos(i + 1),
  524. peer->getIPAddress());
  525. CPPUNIT_ASSERT_EQUAL((uint16_t)(6890 + i), peer->getPort());
  526. }
  527. }
  528. } // namespace aria2