DownloadHelperTest.cc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. #include "download_helper.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <algorithm>
  5. #include <cppunit/extensions/HelperMacros.h>
  6. #include "RequestGroup.h"
  7. #include "DownloadContext.h"
  8. #include "Option.h"
  9. #include "array_fun.h"
  10. #include "prefs.h"
  11. #include "Exception.h"
  12. #include "util.h"
  13. namespace aria2 {
  14. class DownloadHelperTest:public CppUnit::TestFixture {
  15. CPPUNIT_TEST_SUITE(DownloadHelperTest);
  16. CPPUNIT_TEST(testCreateRequestGroupForUri);
  17. CPPUNIT_TEST(testCreateRequestGroupForUri_parameterized);
  18. CPPUNIT_TEST(testCreateRequestGroupForUriList);
  19. #ifdef ENABLE_BITTORRENT
  20. CPPUNIT_TEST(testCreateRequestGroupForUri_BitTorrent);
  21. CPPUNIT_TEST(testCreateRequestGroupForBitTorrent);
  22. #endif // ENABLE_BITTORRENT
  23. #ifdef ENABLE_METALINK
  24. CPPUNIT_TEST(testCreateRequestGroupForUri_Metalink);
  25. CPPUNIT_TEST(testCreateRequestGroupForMetalink);
  26. #endif // ENABLE_METALINK
  27. CPPUNIT_TEST_SUITE_END();
  28. private:
  29. SharedHandle<Option> _option;
  30. public:
  31. void setUp()
  32. {
  33. _option.reset(new Option());
  34. }
  35. void tearDown() {}
  36. void testCreateRequestGroupForUri();
  37. void testCreateRequestGroupForUri_parameterized();
  38. void testCreateRequestGroupForUriList();
  39. #ifdef ENABLE_BITTORRENT
  40. void testCreateRequestGroupForUri_BitTorrent();
  41. void testCreateRequestGroupForBitTorrent();
  42. #endif // ENABLE_BITTORRENT
  43. #ifdef ENABLE_METALINK
  44. void testCreateRequestGroupForUri_Metalink();
  45. void testCreateRequestGroupForMetalink();
  46. #endif // ENABLE_METALINK
  47. };
  48. CPPUNIT_TEST_SUITE_REGISTRATION(DownloadHelperTest);
  49. void DownloadHelperTest::testCreateRequestGroupForUri()
  50. {
  51. std::string array[] = {
  52. "http://alpha/file",
  53. "http://bravo/file",
  54. "http://charlie/file"
  55. };
  56. std::vector<std::string> uris(vbegin(array), vend(array));
  57. _option->put(PREF_SPLIT, "3");
  58. _option->put(PREF_DIR, "/tmp");
  59. _option->put(PREF_OUT, "file.out");
  60. {
  61. std::vector<SharedHandle<RequestGroup> > result;
  62. createRequestGroupForUri(result, _option, uris);
  63. CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
  64. SharedHandle<RequestGroup> group = result[0];
  65. std::vector<std::string> uris;
  66. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  67. CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size());
  68. for(size_t i = 0; i < arrayLength(array); ++i) {
  69. CPPUNIT_ASSERT_EQUAL(array[i], uris[i]);
  70. }
  71. CPPUNIT_ASSERT_EQUAL((unsigned int)3, group->getNumConcurrentCommand());
  72. SharedHandle<DownloadContext> ctx = group->getDownloadContext();
  73. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), ctx->getDir());
  74. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/file.out"), ctx->getBasePath());
  75. }
  76. _option->put(PREF_SPLIT, "5");
  77. {
  78. std::vector<SharedHandle<RequestGroup> > result;
  79. createRequestGroupForUri(result, _option, uris);
  80. CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
  81. SharedHandle<RequestGroup> group = result[0];
  82. std::vector<std::string> uris;
  83. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  84. CPPUNIT_ASSERT_EQUAL((size_t)5, uris.size());
  85. for(size_t i = 0; i < arrayLength(array); ++i) {
  86. CPPUNIT_ASSERT_EQUAL(array[i], uris[i]);
  87. }
  88. for(size_t i = 0; i < 5-arrayLength(array); ++i) {
  89. CPPUNIT_ASSERT_EQUAL(array[i], uris[i+arrayLength(array)]);
  90. }
  91. CPPUNIT_ASSERT_EQUAL((unsigned int)5, group->getNumConcurrentCommand());
  92. }
  93. _option->put(PREF_SPLIT, "2");
  94. {
  95. std::vector<SharedHandle<RequestGroup> > result;
  96. createRequestGroupForUri(result, _option, uris);
  97. CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
  98. SharedHandle<RequestGroup> group = result[0];
  99. std::vector<std::string> uris;
  100. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  101. CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size());
  102. for(size_t i = 0; i < arrayLength(array); ++i) {
  103. CPPUNIT_ASSERT_EQUAL(array[i], uris[i]);
  104. }
  105. CPPUNIT_ASSERT_EQUAL((unsigned int)2, group->getNumConcurrentCommand());
  106. }
  107. _option->put(PREF_FORCE_SEQUENTIAL, V_TRUE);
  108. {
  109. std::vector<SharedHandle<RequestGroup> > result;
  110. createRequestGroupForUri(result, _option, uris);
  111. CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
  112. // for alpha server
  113. SharedHandle<RequestGroup> alphaGroup = result[0];
  114. std::vector<std::string> alphaURIs;
  115. alphaGroup->getDownloadContext()->getFirstFileEntry()->getUris(alphaURIs);
  116. CPPUNIT_ASSERT_EQUAL((size_t)2, alphaURIs.size());
  117. for(size_t i = 0; i < 2; ++i) {
  118. CPPUNIT_ASSERT_EQUAL(array[0], uris[0]);
  119. }
  120. CPPUNIT_ASSERT_EQUAL((unsigned int)2,
  121. alphaGroup->getNumConcurrentCommand());
  122. SharedHandle<DownloadContext> alphaCtx = alphaGroup->getDownloadContext();
  123. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), alphaCtx->getDir());
  124. // See filename is not assigned yet
  125. CPPUNIT_ASSERT_EQUAL(std::string(""), alphaCtx->getBasePath());
  126. }
  127. }
  128. void DownloadHelperTest::testCreateRequestGroupForUri_parameterized()
  129. {
  130. std::string array[] = {
  131. "http://{alpha, bravo}/file",
  132. "http://charlie/file"
  133. };
  134. std::vector<std::string> uris(vbegin(array), vend(array));
  135. _option->put(PREF_SPLIT, "3");
  136. _option->put(PREF_DIR, "/tmp");
  137. _option->put(PREF_OUT, "file.out");
  138. _option->put(PREF_PARAMETERIZED_URI, V_TRUE);
  139. {
  140. std::vector<SharedHandle<RequestGroup> > result;
  141. createRequestGroupForUri(result, _option, uris);
  142. CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
  143. SharedHandle<RequestGroup> group = result[0];
  144. std::vector<std::string> uris;
  145. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  146. CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size());
  147. CPPUNIT_ASSERT_EQUAL(std::string("http://alpha/file"), uris[0]);
  148. CPPUNIT_ASSERT_EQUAL(std::string("http://bravo/file"), uris[1]);
  149. CPPUNIT_ASSERT_EQUAL(std::string("http://charlie/file"), uris[2]);
  150. CPPUNIT_ASSERT_EQUAL((unsigned int)3, group->getNumConcurrentCommand());
  151. SharedHandle<DownloadContext> ctx = group->getDownloadContext();
  152. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), ctx->getDir());
  153. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/file.out"), ctx->getBasePath());
  154. }
  155. }
  156. #ifdef ENABLE_BITTORRENT
  157. void DownloadHelperTest::testCreateRequestGroupForUri_BitTorrent()
  158. {
  159. std::string array[] = {
  160. "http://alpha/file",
  161. "test.torrent",
  162. "http://bravo/file",
  163. "http://charlie/file"
  164. };
  165. std::vector<std::string> uris(vbegin(array), vend(array));
  166. _option->put(PREF_SPLIT, "3");
  167. _option->put(PREF_DIR, "/tmp");
  168. _option->put(PREF_OUT, "file.out");
  169. {
  170. std::vector<SharedHandle<RequestGroup> > result;
  171. createRequestGroupForUri(result, _option, uris);
  172. CPPUNIT_ASSERT_EQUAL((size_t)2, result.size());
  173. SharedHandle<RequestGroup> group = result[0];
  174. std::vector<std::string> uris;
  175. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  176. CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size());
  177. CPPUNIT_ASSERT_EQUAL(array[0], uris[0]);
  178. CPPUNIT_ASSERT_EQUAL(array[2], uris[1]);
  179. CPPUNIT_ASSERT_EQUAL(array[3], uris[2]);
  180. CPPUNIT_ASSERT_EQUAL((unsigned int)3, group->getNumConcurrentCommand());
  181. SharedHandle<DownloadContext> ctx = group->getDownloadContext();
  182. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), ctx->getDir());
  183. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/file.out"),
  184. ctx->getBasePath());
  185. SharedHandle<RequestGroup> torrentGroup = result[1];
  186. std::vector<std::string> auxURIs;
  187. torrentGroup->getDownloadContext()->getFirstFileEntry()->getUris(auxURIs);
  188. CPPUNIT_ASSERT(auxURIs.empty());
  189. CPPUNIT_ASSERT_EQUAL((unsigned int)3,
  190. torrentGroup->getNumConcurrentCommand());
  191. SharedHandle<DownloadContext> btctx = torrentGroup->getDownloadContext();
  192. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), btctx->getDir());
  193. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-test"),
  194. btctx->getBasePath());
  195. }
  196. }
  197. #endif // ENABLE_BITTORRENT
  198. #ifdef ENABLE_METALINK
  199. void DownloadHelperTest::testCreateRequestGroupForUri_Metalink()
  200. {
  201. std::string array[] = {
  202. "http://alpha/file",
  203. "http://bravo/file",
  204. "http://charlie/file",
  205. "test.xml"
  206. };
  207. std::vector<std::string> uris(vbegin(array), vend(array));
  208. _option->put(PREF_SPLIT, "3");
  209. _option->put(PREF_METALINK_SERVERS, "2");
  210. _option->put(PREF_DIR, "/tmp");
  211. _option->put(PREF_OUT, "file.out");
  212. {
  213. std::vector<SharedHandle<RequestGroup> > result;
  214. createRequestGroupForUri(result, _option, uris);
  215. // group1: http://alpha/file, ...
  216. // group2-7: 6 file entry in Metalink and 1 torrent file download
  217. #ifdef ENABLE_BITTORRENT
  218. CPPUNIT_ASSERT_EQUAL((size_t)7, result.size());
  219. #else // !ENABLE_BITTORRENT
  220. CPPUNIT_ASSERT_EQUAL((size_t)6, result.size());
  221. #endif // !ENABLE_BITTORRENT
  222. SharedHandle<RequestGroup> group = result[0];
  223. std::vector<std::string> uris;
  224. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  225. CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size());
  226. for(size_t i = 0; i < 3; ++i) {
  227. CPPUNIT_ASSERT_EQUAL(array[i], uris[i]);
  228. }
  229. CPPUNIT_ASSERT_EQUAL((unsigned int)3, group->getNumConcurrentCommand());
  230. SharedHandle<DownloadContext> ctx = group->getDownloadContext();
  231. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), ctx->getDir());
  232. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/file.out"),
  233. ctx->getBasePath());
  234. SharedHandle<RequestGroup> aria2052Group = result[1];
  235. CPPUNIT_ASSERT_EQUAL((unsigned int)1, // because of maxconnections attribute
  236. aria2052Group->getNumConcurrentCommand());
  237. SharedHandle<DownloadContext> aria2052Ctx =
  238. aria2052Group->getDownloadContext();
  239. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), aria2052Ctx->getDir());
  240. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-0.5.2.tar.bz2"),
  241. aria2052Ctx->getBasePath());
  242. SharedHandle<RequestGroup> aria2051Group = result[2];
  243. CPPUNIT_ASSERT_EQUAL((unsigned int)2,
  244. aria2051Group->getNumConcurrentCommand());
  245. }
  246. }
  247. #endif // ENABLE_METALINK
  248. void DownloadHelperTest::testCreateRequestGroupForUriList()
  249. {
  250. _option->put(PREF_SPLIT, "3");
  251. _option->put(PREF_INPUT_FILE, "input_uris.txt");
  252. _option->put(PREF_DIR, "/tmp");
  253. _option->put(PREF_OUT, "file.out");
  254. std::vector<SharedHandle<RequestGroup> > result;
  255. createRequestGroupForUriList(result, _option);
  256. CPPUNIT_ASSERT_EQUAL((size_t)2, result.size());
  257. SharedHandle<RequestGroup> fileGroup = result[0];
  258. std::vector<std::string> fileURIs;
  259. fileGroup->getDownloadContext()->getFirstFileEntry()->getUris(fileURIs);
  260. CPPUNIT_ASSERT_EQUAL(std::string("http://alpha/file"), fileURIs[0]);
  261. CPPUNIT_ASSERT_EQUAL(std::string("http://bravo/file"), fileURIs[1]);
  262. CPPUNIT_ASSERT_EQUAL(std::string("http://charlie/file"), fileURIs[2]);
  263. CPPUNIT_ASSERT_EQUAL((unsigned int)3, fileGroup->getNumConcurrentCommand());
  264. SharedHandle<DownloadContext> fileCtx = fileGroup->getDownloadContext();
  265. CPPUNIT_ASSERT_EQUAL(std::string("/mydownloads"), fileCtx->getDir());
  266. CPPUNIT_ASSERT_EQUAL(std::string("/mydownloads/myfile.out"),
  267. fileCtx->getBasePath());
  268. SharedHandle<RequestGroup> fileISOGroup = result[1];
  269. SharedHandle<DownloadContext> fileISOCtx = fileISOGroup->getDownloadContext();
  270. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), fileISOCtx->getDir());
  271. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/file.out"),
  272. fileISOCtx->getBasePath());
  273. }
  274. #ifdef ENABLE_BITTORRENT
  275. void DownloadHelperTest::testCreateRequestGroupForBitTorrent()
  276. {
  277. std::string array[] = {
  278. "http://alpha/file",
  279. "http://bravo/file",
  280. "http://charlie/file"
  281. };
  282. std::vector<std::string> auxURIs(vbegin(array), vend(array));
  283. _option->put(PREF_SPLIT, "5");
  284. _option->put(PREF_TORRENT_FILE, "test.torrent");
  285. _option->put(PREF_DIR, "/tmp");
  286. _option->put(PREF_OUT, "file.out");
  287. {
  288. std::vector<SharedHandle<RequestGroup> > result;
  289. createRequestGroupForBitTorrent(result, _option, auxURIs);
  290. CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
  291. SharedHandle<RequestGroup> group = result[0];
  292. std::vector<std::string> uris;
  293. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  294. // See -s option is ignored
  295. CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size());
  296. for(size_t i = 0; i < arrayLength(array); ++i) {
  297. CPPUNIT_ASSERT_EQUAL(array[i]+"/aria2-test/aria2/src/aria2c", uris[i]);
  298. }
  299. CPPUNIT_ASSERT_EQUAL((unsigned int)5, group->getNumConcurrentCommand());
  300. }
  301. {
  302. // no URIs are given
  303. std::vector<SharedHandle<RequestGroup> > result;
  304. std::vector<std::string> emptyURIs;
  305. createRequestGroupForBitTorrent(result, _option, emptyURIs);
  306. CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
  307. SharedHandle<RequestGroup> group = result[0];
  308. std::vector<std::string> uris;
  309. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  310. CPPUNIT_ASSERT_EQUAL((size_t)0, uris.size());
  311. }
  312. _option->put(PREF_FORCE_SEQUENTIAL, V_TRUE);
  313. {
  314. std::vector<SharedHandle<RequestGroup> > result;
  315. createRequestGroupForBitTorrent(result, _option, auxURIs);
  316. // See --force-requencial is ignored
  317. CPPUNIT_ASSERT_EQUAL((size_t)1, result.size());
  318. }
  319. }
  320. #endif // ENABLE_BITTORRENT
  321. #ifdef ENABLE_METALINK
  322. void DownloadHelperTest::testCreateRequestGroupForMetalink()
  323. {
  324. _option->put(PREF_SPLIT, "3");
  325. _option->put(PREF_METALINK_FILE, "test.xml");
  326. _option->put(PREF_METALINK_SERVERS, "5");
  327. _option->put(PREF_DIR, "/tmp");
  328. _option->put(PREF_OUT, "file.out");
  329. {
  330. std::vector<SharedHandle<RequestGroup> > result;
  331. createRequestGroupForMetalink(result, _option);
  332. #ifdef ENABLE_BITTORRENT
  333. CPPUNIT_ASSERT_EQUAL((size_t)6, result.size());
  334. #else // !ENABLE_BITTORRENT
  335. CPPUNIT_ASSERT_EQUAL((size_t)5, result.size());
  336. #endif // !ENABLE_BITTORRENT
  337. SharedHandle<RequestGroup> group = result[0];
  338. std::vector<std::string> uris;
  339. group->getDownloadContext()->getFirstFileEntry()->getUris(uris);
  340. std::sort(uris.begin(), uris.end());
  341. CPPUNIT_ASSERT_EQUAL((size_t)2, uris.size());
  342. CPPUNIT_ASSERT_EQUAL(std::string("ftp://ftphost/aria2-0.5.2.tar.bz2"),
  343. uris[0]);
  344. CPPUNIT_ASSERT_EQUAL(std::string("http://httphost/aria2-0.5.2.tar.bz2"),
  345. uris[1]);
  346. // See numConcurrentCommand is 1 because of maxconnections attribute.
  347. CPPUNIT_ASSERT_EQUAL((unsigned int)1, group->getNumConcurrentCommand());
  348. }
  349. }
  350. #endif // ENABLE_METALINK
  351. } // namespace aria2