DefaultBtAnnounceTest.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. #include "DefaultBtAnnounce.h"
  2. #include <iostream>
  3. #include <cppunit/extensions/HelperMacros.h>
  4. #include "Option.h"
  5. #include "Util.h"
  6. #include "Exception.h"
  7. #include "MockPieceStorage.h"
  8. #include "MockPeerStorage.h"
  9. #include "BtRuntime.h"
  10. #include "AnnounceTier.h"
  11. #include "FixedNumberRandomizer.h"
  12. #include "FileEntry.h"
  13. #include "prefs.h"
  14. #include "DownloadContext.h"
  15. #include "bittorrent_helper.h"
  16. #include "array_fun.h"
  17. namespace aria2 {
  18. class DefaultBtAnnounceTest:public CppUnit::TestFixture {
  19. CPPUNIT_TEST_SUITE(DefaultBtAnnounceTest);
  20. CPPUNIT_TEST(testGetAnnounceUrl);
  21. CPPUNIT_TEST(testGetAnnounceUrl_withQuery);
  22. CPPUNIT_TEST(testGetAnnounceUrl_externalIP);
  23. CPPUNIT_TEST(testNoMoreAnnounce);
  24. CPPUNIT_TEST(testIsAllAnnounceFailed);
  25. CPPUNIT_TEST(testURLOrderInStoppedEvent);
  26. CPPUNIT_TEST(testURLOrderInCompletedEvent);
  27. CPPUNIT_TEST(testProcessAnnounceResponse_malformed);
  28. CPPUNIT_TEST(testProcessAnnounceResponse_failureReason);
  29. CPPUNIT_TEST(testProcessAnnounceResponse);
  30. CPPUNIT_TEST_SUITE_END();
  31. private:
  32. SharedHandle<DownloadContext> _dctx;
  33. SharedHandle<MockPieceStorage> _pieceStorage;
  34. SharedHandle<MockPeerStorage> _peerStorage;
  35. SharedHandle<BtRuntime> _btRuntime;
  36. Option* _option;
  37. public:
  38. void setUp() {
  39. _option = new Option();
  40. int64_t totalLength = 4*1024*1024;
  41. int32_t pieceLength = 256*1024;
  42. static const unsigned char infoHash[] = { 0x01, 0x23, 0x45, 0x67,
  43. 0x89, 0xab, 0xcd, 0xef,
  44. 0x01, 0x23, 0x45, 0x67,
  45. 0x89, 0xab, 0xcd, 0xef,
  46. 0x01, 0x23, 0x45, 0x67 };
  47. std::string peerId = "-aria2-ultrafastdltl";
  48. _dctx.reset(new DownloadContext(pieceLength, totalLength));
  49. BDE torrentAttrs = BDE::dict();
  50. torrentAttrs[bittorrent::INFO_HASH] =
  51. std::string(&infoHash[0], &infoHash[arrayLength(infoHash)]);
  52. _dctx->setAttribute(bittorrent::BITTORRENT, torrentAttrs);
  53. bittorrent::setStaticPeerId(peerId);
  54. _pieceStorage.reset(new MockPieceStorage());
  55. _pieceStorage->setTotalLength(totalLength);
  56. _pieceStorage->setCompletedLength(pieceLength*10);
  57. _peerStorage.reset(new MockPeerStorage());
  58. TransferStat stat;
  59. stat.setSessionDownloadLength(pieceLength*5);
  60. stat.setSessionUploadLength(pieceLength*6);
  61. _peerStorage->setStat(stat);
  62. _btRuntime.reset(new BtRuntime());
  63. _btRuntime->setListenPort(6989);
  64. }
  65. void tearDown()
  66. {
  67. delete _option;
  68. }
  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. };
  80. CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtAnnounceTest);
  81. template<typename InputIterator>
  82. static BDE createAnnounceTier(InputIterator first, InputIterator last)
  83. {
  84. BDE announceTier = BDE::list();
  85. for(; first != last; ++first) {
  86. announceTier << BDE(*first);
  87. }
  88. return announceTier;
  89. }
  90. static BDE createAnnounceTier(const std::string& uri)
  91. {
  92. BDE announceTier = BDE::list();
  93. announceTier << uri;
  94. return announceTier;
  95. }
  96. static void setAnnounceList(const SharedHandle<DownloadContext>& dctx,
  97. const BDE& announceList)
  98. {
  99. dctx->getAttribute(bittorrent::BITTORRENT)[bittorrent::ANNOUNCE_LIST] =
  100. announceList;
  101. }
  102. void DefaultBtAnnounceTest::testNoMoreAnnounce()
  103. {
  104. BDE announceList = BDE::list();
  105. announceList << createAnnounceTier("http://localhost/announce");
  106. announceList << createAnnounceTier("http://backup/announce");
  107. setAnnounceList(_dctx, announceList);
  108. DefaultBtAnnounce btAnnounce(_dctx, _option);
  109. btAnnounce.setPieceStorage(_pieceStorage);
  110. btAnnounce.setPeerStorage(_peerStorage);
  111. btAnnounce.setBtRuntime(_btRuntime);
  112. btAnnounce.setRandomizer(SharedHandle<Randomizer>(new FixedNumberRandomizer()));
  113. btAnnounce.generateKey();
  114. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  115. btAnnounce.announceSuccess();
  116. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  117. btAnnounce.announceFailure();
  118. CPPUNIT_ASSERT_EQUAL(std::string("http://backup/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  119. btAnnounce.announceSuccess();
  120. _pieceStorage->setAllDownloadFinished(true);
  121. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=completed&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  122. btAnnounce.announceSuccess();
  123. CPPUNIT_ASSERT_EQUAL(std::string("http://backup/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=completed&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  124. btAnnounce.announceSuccess();
  125. _btRuntime->setHalt(true);
  126. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  127. btAnnounce.announceSuccess();
  128. CPPUNIT_ASSERT_EQUAL(std::string("http://backup/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  129. btAnnounce.announceSuccess();
  130. CPPUNIT_ASSERT(btAnnounce.noMoreAnnounce());
  131. }
  132. void DefaultBtAnnounceTest::testGetAnnounceUrl()
  133. {
  134. BDE announceList = BDE::list();
  135. announceList << createAnnounceTier("http://localhost/announce");
  136. setAnnounceList(_dctx, announceList);
  137. DefaultBtAnnounce btAnnounce(_dctx, _option);
  138. btAnnounce.setPieceStorage(_pieceStorage);
  139. btAnnounce.setPeerStorage(_peerStorage);
  140. btAnnounce.setBtRuntime(_btRuntime);
  141. btAnnounce.setRandomizer(SharedHandle<Randomizer>(new FixedNumberRandomizer()));
  142. btAnnounce.generateKey();
  143. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  144. btAnnounce.announceSuccess();
  145. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  146. btAnnounce.announceSuccess();
  147. _pieceStorage->setAllDownloadFinished(true);
  148. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=completed&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  149. btAnnounce.announceSuccess();
  150. _btRuntime->setHalt(true);
  151. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  152. }
  153. void DefaultBtAnnounceTest::testGetAnnounceUrl_withQuery()
  154. {
  155. BDE announceList = BDE::list();
  156. announceList << createAnnounceTier("http://localhost/announce?k=v");
  157. setAnnounceList(_dctx, announceList);
  158. DefaultBtAnnounce btAnnounce(_dctx, _option);
  159. btAnnounce.setPieceStorage(_pieceStorage);
  160. btAnnounce.setPeerStorage(_peerStorage);
  161. btAnnounce.setBtRuntime(_btRuntime);
  162. btAnnounce.setRandomizer(SharedHandle<Randomizer>(new FixedNumberRandomizer()));
  163. btAnnounce.generateKey();
  164. CPPUNIT_ASSERT_EQUAL
  165. (std::string("http://localhost/announce?k=v&"
  166. "info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&"
  167. "peer_id=%2Daria2%2Dultrafastdltl&"
  168. "uploaded=1572864&downloaded=1310720&left=1572864&compact=1&"
  169. "key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&"
  170. "supportcrypto=1"),
  171. btAnnounce.getAnnounceUrl());
  172. }
  173. void DefaultBtAnnounceTest::testGetAnnounceUrl_externalIP()
  174. {
  175. BDE announceList = BDE::list();
  176. announceList << createAnnounceTier("http://localhost/announce");
  177. setAnnounceList(_dctx, announceList);
  178. _option->put(PREF_BT_EXTERNAL_IP, "192.168.1.1");
  179. DefaultBtAnnounce btAnnounce(_dctx, _option);
  180. btAnnounce.setPieceStorage(_pieceStorage);
  181. btAnnounce.setPeerStorage(_peerStorage);
  182. btAnnounce.setBtRuntime(_btRuntime);
  183. btAnnounce.setRandomizer(SharedHandle<Randomizer>(new FixedNumberRandomizer()));
  184. btAnnounce.generateKey();
  185. CPPUNIT_ASSERT_EQUAL
  186. (std::string("http://localhost/announce?"
  187. "info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&"
  188. "peer_id=%2Daria2%2Dultrafastdltl&"
  189. "uploaded=1572864&downloaded=1310720&left=1572864&compact=1&"
  190. "key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&"
  191. "supportcrypto=1&ip=192.168.1.1"),
  192. btAnnounce.getAnnounceUrl());
  193. }
  194. void DefaultBtAnnounceTest::testIsAllAnnounceFailed()
  195. {
  196. BDE announceList = BDE::list();
  197. announceList << createAnnounceTier("http://localhost/announce");
  198. announceList << createAnnounceTier("http://backup/announce");
  199. setAnnounceList(_dctx, announceList);
  200. DefaultBtAnnounce btAnnounce(_dctx, _option);
  201. btAnnounce.setPieceStorage(_pieceStorage);
  202. btAnnounce.setPeerStorage(_peerStorage);
  203. btAnnounce.setBtRuntime(_btRuntime);
  204. btAnnounce.setRandomizer(SharedHandle<Randomizer>(new FixedNumberRandomizer()));
  205. btAnnounce.generateKey();
  206. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  207. btAnnounce.announceFailure();
  208. CPPUNIT_ASSERT_EQUAL(std::string("http://backup/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  209. btAnnounce.announceFailure();
  210. CPPUNIT_ASSERT(!btAnnounce.isAnnounceReady());
  211. CPPUNIT_ASSERT_EQUAL(std::string(""), btAnnounce.getAnnounceUrl());
  212. CPPUNIT_ASSERT(btAnnounce.isAllAnnounceFailed());
  213. btAnnounce.resetAnnounce();
  214. CPPUNIT_ASSERT(!btAnnounce.isAllAnnounceFailed());
  215. }
  216. void DefaultBtAnnounceTest::testURLOrderInStoppedEvent()
  217. {
  218. const char* urls[] = { "http://localhost1/announce",
  219. "http://localhost2/announce" };
  220. BDE announceList = BDE::list();
  221. announceList << createAnnounceTier(&urls[0], &urls[arrayLength(urls)]);
  222. setAnnounceList(_dctx, announceList);
  223. DefaultBtAnnounce btAnnounce(_dctx, _option);
  224. btAnnounce.setPieceStorage(_pieceStorage);
  225. btAnnounce.setPeerStorage(_peerStorage);
  226. btAnnounce.setBtRuntime(_btRuntime);
  227. btAnnounce.setRandomizer(SharedHandle<Randomizer>(new FixedNumberRandomizer()));
  228. btAnnounce.generateKey();
  229. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost1/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  230. btAnnounce.announceSuccess();
  231. _btRuntime->setHalt(true);
  232. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost1/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  233. btAnnounce.announceFailure();
  234. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost2/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  235. btAnnounce.announceSuccess();
  236. }
  237. void DefaultBtAnnounceTest::testURLOrderInCompletedEvent()
  238. {
  239. const char* urls[] = { "http://localhost1/announce",
  240. "http://localhost2/announce" };
  241. BDE announceList = BDE::list();
  242. announceList << createAnnounceTier(&urls[0], &urls[arrayLength(urls)]);
  243. setAnnounceList(_dctx, announceList);
  244. DefaultBtAnnounce btAnnounce(_dctx, _option);
  245. btAnnounce.setPieceStorage(_pieceStorage);
  246. btAnnounce.setPeerStorage(_peerStorage);
  247. btAnnounce.setBtRuntime(_btRuntime);
  248. btAnnounce.setRandomizer(SharedHandle<Randomizer>(new FixedNumberRandomizer()));
  249. btAnnounce.generateKey();
  250. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost1/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  251. btAnnounce.announceSuccess();
  252. _pieceStorage->setAllDownloadFinished(true);
  253. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost1/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=completed&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  254. btAnnounce.announceFailure();
  255. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost2/announce?info_hash=%01%23Eg%89%AB%CD%EF%01%23Eg%89%AB%CD%EF%01%23Eg&peer_id=%2Daria2%2Dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=completed&supportcrypto=1"), btAnnounce.getAnnounceUrl());
  256. btAnnounce.announceSuccess();
  257. }
  258. void DefaultBtAnnounceTest::testProcessAnnounceResponse_malformed()
  259. {
  260. try {
  261. std::string res = "i123e";
  262. DefaultBtAnnounce(_dctx, _option).processAnnounceResponse(reinterpret_cast<const unsigned char*>(res.c_str()), res.size());
  263. CPPUNIT_FAIL("exception must be thrown.");
  264. } catch(Exception& e) {
  265. std::cerr << e.stackTrace() << std::endl;
  266. }
  267. }
  268. void DefaultBtAnnounceTest::testProcessAnnounceResponse_failureReason()
  269. {
  270. try {
  271. std::string res = "d14:failure reason11:hello worlde";
  272. DefaultBtAnnounce(_dctx, _option).processAnnounceResponse(reinterpret_cast<const unsigned char*>(res.c_str()), res.size());
  273. CPPUNIT_FAIL("exception must be thrown.");
  274. } catch(Exception& e) {
  275. std::cerr << e.stackTrace() << std::endl;
  276. }
  277. }
  278. void DefaultBtAnnounceTest::testProcessAnnounceResponse()
  279. {
  280. std::string res = "d"
  281. "15:warning message11:hello world"
  282. "10:tracker id3:foo"
  283. "8:intervali3000e"
  284. "12:min intervali1800e"
  285. "8:completei100e"
  286. "10:incompletei200e"
  287. "e";
  288. DefaultBtAnnounce an(_dctx, _option);
  289. an.processAnnounceResponse(reinterpret_cast<const unsigned char*>(res.c_str()), res.size());
  290. CPPUNIT_ASSERT_EQUAL(std::string("foo"), an.getTrackerID());
  291. CPPUNIT_ASSERT_EQUAL((time_t)3000, an.getInterval());
  292. CPPUNIT_ASSERT_EQUAL((time_t)1800, an.getMinInterval());
  293. CPPUNIT_ASSERT_EQUAL((unsigned int)100, an.getComplete());
  294. CPPUNIT_ASSERT_EQUAL((unsigned int)200, an.getIncomplete());
  295. }
  296. } // namespace aria2