Aria2ApiTest.cc 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "aria2api.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "TestUtil.h"
  4. #include "prefs.h"
  5. #include "OptionParser.h"
  6. #include "OptionHandler.h"
  7. #include "RequestGroupMan.h"
  8. #include "Context.h"
  9. #include "MultiUrlRequestInfo.h"
  10. #include "DownloadEngine.h"
  11. #include "Option.h"
  12. namespace aria2 {
  13. class Aria2ApiTest:public CppUnit::TestFixture {
  14. CPPUNIT_TEST_SUITE(Aria2ApiTest);
  15. CPPUNIT_TEST(testAddUri);
  16. CPPUNIT_TEST(testAddMetalink);
  17. CPPUNIT_TEST(testAddTorrent);
  18. CPPUNIT_TEST(testRemovePause);
  19. CPPUNIT_TEST(testChangePosition);
  20. CPPUNIT_TEST(testChangeOption);
  21. CPPUNIT_TEST(testChangeGlobalOption);
  22. CPPUNIT_TEST(testDownloadResultDH);
  23. CPPUNIT_TEST_SUITE_END();
  24. Session* session_;
  25. public:
  26. void setUp()
  27. {
  28. SessionConfig config;
  29. KeyVals options = {{"no-conf", "true"}};
  30. session_ = sessionNew(options, config);
  31. }
  32. void tearDown()
  33. {
  34. sessionFinal(session_);
  35. }
  36. void testAddUri();
  37. void testAddMetalink();
  38. void testAddTorrent();
  39. void testRemovePause();
  40. void testChangePosition();
  41. void testChangeOption();
  42. void testChangeGlobalOption();
  43. void testDownloadResultDH();
  44. };
  45. CPPUNIT_TEST_SUITE_REGISTRATION(Aria2ApiTest);
  46. void Aria2ApiTest::testAddUri()
  47. {
  48. A2Gid gid;
  49. std::vector<std::string> uris(1);
  50. KeyVals options;
  51. uris[0] = "http://localhost/1";
  52. CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options));
  53. CPPUNIT_ASSERT(!isNull(gid));
  54. DownloadHandle* hd = getDownloadHandle(session_, gid);
  55. CPPUNIT_ASSERT(hd);
  56. CPPUNIT_ASSERT_EQUAL(1, hd->getNumFiles());
  57. FileData file = hd->getFile(1);
  58. CPPUNIT_ASSERT_EQUAL((size_t)1, file.uris.size());
  59. CPPUNIT_ASSERT_EQUAL(uris[0], file.uris[0].uri);
  60. deleteDownloadHandle(hd);
  61. options.push_back(KeyVals::value_type("file-allocation", "foo"));
  62. CPPUNIT_ASSERT_EQUAL(-1, addUri(session_, &gid, uris, options));
  63. }
  64. void Aria2ApiTest::testAddMetalink()
  65. {
  66. std::string metalinkPath = A2_TEST_DIR"/metalink4.xml";
  67. std::vector<A2Gid> gids;
  68. KeyVals options;
  69. #ifdef ENABLE_METALINK
  70. CPPUNIT_ASSERT_EQUAL(0, addMetalink(session_, &gids, metalinkPath, options));
  71. #ifdef ENABLE_BITTORRENT
  72. CPPUNIT_ASSERT_EQUAL((size_t)2, gids.size());
  73. #else // !ENABLE_BITTORRENT
  74. CPPUNIT_ASSERT_EQUAL((size_t)1, gids.size());
  75. #endif // !ENABLE_BITTORRENT
  76. gids.clear();
  77. options.push_back(KeyVals::value_type("file-allocation", "foo"));
  78. CPPUNIT_ASSERT_EQUAL(-1, addMetalink(session_, &gids, metalinkPath,
  79. options));
  80. #else // !ENABLE_METALINK
  81. CPPUNIT_ASSERT_EQUAL(-1, addMetalink(session_, &gids, metalinkPath,
  82. options));
  83. #endif // !ENABLE_METALINK
  84. }
  85. void Aria2ApiTest::testAddTorrent()
  86. {
  87. std::string torrentPath = A2_TEST_DIR"/test.torrent";
  88. A2Gid gid;
  89. KeyVals options;
  90. #ifdef ENABLE_BITTORRENT
  91. CPPUNIT_ASSERT_EQUAL(0, addTorrent(session_, &gid, torrentPath, options));
  92. CPPUNIT_ASSERT(!isNull(gid));
  93. options.push_back(KeyVals::value_type("file-allocation", "foo"));
  94. CPPUNIT_ASSERT_EQUAL(-1, addTorrent(session_, &gid, torrentPath, options));
  95. #else // !ENABLE_BITTORRENT
  96. CPPUNIT_ASSERT_EQUAL(-1, addTorrent(session_, &gid, torrentPath, options));
  97. #endif // !ENABLE_BITTORRENT
  98. }
  99. void Aria2ApiTest::testRemovePause()
  100. {
  101. A2Gid gid;
  102. std::vector<std::string> uris(1);
  103. KeyVals options;
  104. uris[0] = "http://localhost/1";
  105. CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options));
  106. DownloadHandle* hd = getDownloadHandle(session_, gid);
  107. CPPUNIT_ASSERT(hd);
  108. CPPUNIT_ASSERT_EQUAL(DOWNLOAD_WAITING, hd->getStatus());
  109. deleteDownloadHandle(hd);
  110. CPPUNIT_ASSERT_EQUAL(-1, pauseDownload(session_, (A2Gid)0));
  111. CPPUNIT_ASSERT_EQUAL(0, pauseDownload(session_, gid));
  112. hd = getDownloadHandle(session_, gid);
  113. CPPUNIT_ASSERT(hd);
  114. CPPUNIT_ASSERT_EQUAL(DOWNLOAD_PAUSED, hd->getStatus());
  115. deleteDownloadHandle(hd);
  116. CPPUNIT_ASSERT_EQUAL(-1, unpauseDownload(session_, (A2Gid)0));
  117. CPPUNIT_ASSERT_EQUAL(0, unpauseDownload(session_, gid));
  118. hd = getDownloadHandle(session_, gid);
  119. CPPUNIT_ASSERT(hd);
  120. CPPUNIT_ASSERT_EQUAL(DOWNLOAD_WAITING, hd->getStatus());
  121. deleteDownloadHandle(hd);
  122. CPPUNIT_ASSERT_EQUAL(-1, removeDownload(session_, (A2Gid)0));
  123. CPPUNIT_ASSERT_EQUAL(0, removeDownload(session_, gid));
  124. hd = getDownloadHandle(session_, gid);
  125. CPPUNIT_ASSERT(!hd);
  126. }
  127. void Aria2ApiTest::testChangePosition()
  128. {
  129. int N = 10;
  130. std::vector<A2Gid> gids(N);
  131. std::vector<std::string> uris(1);
  132. KeyVals options;
  133. uris[0] = "http://localhost/";
  134. for(int i = 0; i < N; ++i) {
  135. CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gids[i], uris, options));
  136. }
  137. CPPUNIT_ASSERT_EQUAL(-1, changePosition(session_, (A2Gid)0, -2,
  138. OFFSET_MODE_CUR));
  139. CPPUNIT_ASSERT_EQUAL(2, changePosition(session_, gids[4], -2,
  140. OFFSET_MODE_CUR));
  141. CPPUNIT_ASSERT_EQUAL(5, changePosition(session_, gids[4], 5,
  142. OFFSET_MODE_SET));
  143. CPPUNIT_ASSERT_EQUAL(7, changePosition(session_, gids[4], -2,
  144. OFFSET_MODE_END));
  145. }
  146. void Aria2ApiTest::testChangeOption()
  147. {
  148. A2Gid gid;
  149. std::vector<std::string> uris(1);
  150. KeyVals options;
  151. uris[0] = "http://localhost/1";
  152. options.push_back(KeyVals::value_type("dir", "mydownload"));
  153. CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options));
  154. DownloadHandle* hd = getDownloadHandle(session_, gid);
  155. CPPUNIT_ASSERT(hd);
  156. CPPUNIT_ASSERT_EQUAL(1, hd->getNumFiles());
  157. FileData file = hd->getFile(1);
  158. CPPUNIT_ASSERT_EQUAL((size_t)1, file.uris.size());
  159. CPPUNIT_ASSERT_EQUAL(uris[0], file.uris[0].uri);
  160. CPPUNIT_ASSERT_EQUAL(std::string("mydownload"), hd->getOption("dir"));
  161. CPPUNIT_ASSERT(hd->getOption("unknown").empty());
  162. KeyVals retopts = hd->getOptions();
  163. CPPUNIT_ASSERT(std::find(retopts.begin(), retopts.end(),
  164. KeyVals::value_type("dir", "mydownload"))
  165. != retopts.end());
  166. // Don't return hidden option
  167. CPPUNIT_ASSERT(hd->getOption(PREF_STARTUP_IDLE_TIME->k).empty());
  168. deleteDownloadHandle(hd);
  169. // failure with null gid
  170. CPPUNIT_ASSERT_EQUAL(-1, changeOption(session_, (A2Gid)0, options));
  171. // change option
  172. options.clear();
  173. options.push_back(KeyVals::value_type("dir", "newlocation"));
  174. CPPUNIT_ASSERT_EQUAL(0, changeOption(session_, gid, options));
  175. hd = getDownloadHandle(session_, gid);
  176. CPPUNIT_ASSERT_EQUAL(std::string("newlocation"), hd->getOption("dir"));
  177. deleteDownloadHandle(hd);
  178. // failure with bad option value
  179. options.clear();
  180. options.push_back(KeyVals::value_type("file-allocation", "foo"));
  181. CPPUNIT_ASSERT_EQUAL(-1, changeOption(session_, gid, options));
  182. }
  183. void Aria2ApiTest::testChangeGlobalOption()
  184. {
  185. CPPUNIT_ASSERT_EQUAL(OptionParser::getInstance()->find(PREF_FILE_ALLOCATION)
  186. ->getDefaultValue(),
  187. getGlobalOption(session_, PREF_FILE_ALLOCATION->k));
  188. KeyVals options;
  189. options.push_back(KeyVals::value_type(PREF_FILE_ALLOCATION->k, "none"));
  190. CPPUNIT_ASSERT_EQUAL(0, changeGlobalOption(session_, options));
  191. CPPUNIT_ASSERT_EQUAL(std::string("none"),
  192. getGlobalOption(session_, PREF_FILE_ALLOCATION->k));
  193. // Don't return hidden option
  194. CPPUNIT_ASSERT(getGlobalOption(session_, PREF_STARTUP_IDLE_TIME->k).empty());
  195. // failure with bad option value
  196. options.clear();
  197. options.push_back(KeyVals::value_type(PREF_FILE_ALLOCATION->k, "foo"));
  198. CPPUNIT_ASSERT_EQUAL(-1, changeGlobalOption(session_, options));
  199. }
  200. void Aria2ApiTest::testDownloadResultDH()
  201. {
  202. std::shared_ptr<DownloadResult> dr1 =
  203. createDownloadResult(error_code::TIME_OUT, "http://example.org/timeout");
  204. dr1->option->put(PREF_DIR, "mydownload");
  205. std::shared_ptr<DownloadResult> dr2 =
  206. createDownloadResult(error_code::NETWORK_PROBLEM,
  207. "http://example.org/network");
  208. auto& gman =
  209. session_->context->reqinfo->getDownloadEngine()->getRequestGroupMan();
  210. gman->addDownloadResult(dr1);
  211. gman->addDownloadResult(dr2);
  212. DownloadHandle* hd = getDownloadHandle(session_, dr1->gid->getNumericId());
  213. CPPUNIT_ASSERT_EQUAL(DOWNLOAD_ERROR, hd->getStatus());
  214. CPPUNIT_ASSERT_EQUAL((int)error_code::TIME_OUT, hd->getErrorCode());
  215. CPPUNIT_ASSERT_EQUAL(std::string("mydownload"),
  216. hd->getOption(PREF_DIR->k));
  217. // Don't return hidden option
  218. CPPUNIT_ASSERT(hd->getOption(PREF_STARTUP_IDLE_TIME->k).empty());
  219. KeyVals retopts = hd->getOptions();
  220. CPPUNIT_ASSERT(std::find(retopts.begin(), retopts.end(),
  221. KeyVals::value_type(PREF_DIR->k, "mydownload"))
  222. != retopts.end());
  223. deleteDownloadHandle(hd);
  224. }
  225. } // namespace aria2