| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 | #include "aria2api.h"#include <cppunit/extensions/HelperMacros.h>#include "TestUtil.h"#include "prefs.h"#include "OptionParser.h"#include "OptionHandler.h"#include "RequestGroupMan.h"#include "Context.h"#include "MultiUrlRequestInfo.h"#include "DownloadEngine.h"#include "Option.h"namespace aria2 {class Aria2ApiTest:public CppUnit::TestFixture {  CPPUNIT_TEST_SUITE(Aria2ApiTest);  CPPUNIT_TEST(testAddUri);  CPPUNIT_TEST(testAddMetalink);  CPPUNIT_TEST(testAddTorrent);  CPPUNIT_TEST(testRemovePause);  CPPUNIT_TEST(testChangePosition);  CPPUNIT_TEST(testChangeOption);  CPPUNIT_TEST(testChangeGlobalOption);  CPPUNIT_TEST(testDownloadResultDH);  CPPUNIT_TEST_SUITE_END();  Session* session_;public:  void setUp()  {    SessionConfig config;    KeyVals options;    session_ = sessionNew(options, config);  }  void tearDown()  {    sessionFinal(session_);  }  void testAddUri();  void testAddMetalink();  void testAddTorrent();  void testRemovePause();  void testChangePosition();  void testChangeOption();  void testChangeGlobalOption();  void testDownloadResultDH();};CPPUNIT_TEST_SUITE_REGISTRATION(Aria2ApiTest);void Aria2ApiTest::testAddUri(){  A2Gid gid;  std::vector<std::string> uris(1);  KeyVals options;  uris[0] = "http://localhost/1";  CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options));  CPPUNIT_ASSERT(!isNull(gid));  DownloadHandle* hd = getDownloadHandle(session_, gid);  CPPUNIT_ASSERT(hd);  CPPUNIT_ASSERT_EQUAL(1, hd->getNumFiles());  FileData file = hd->getFile(1);  CPPUNIT_ASSERT_EQUAL((size_t)1, file.uris.size());  CPPUNIT_ASSERT_EQUAL(uris[0], file.uris[0].uri);  deleteDownloadHandle(hd);  options.push_back(KeyVals::value_type("file-allocation", "foo"));  CPPUNIT_ASSERT_EQUAL(-1, addUri(session_, &gid, uris, options));}void Aria2ApiTest::testAddMetalink(){  std::string metalinkPath = A2_TEST_DIR"/metalink4.xml";  std::vector<A2Gid> gids;  KeyVals options;#ifdef ENABLE_METALINK  CPPUNIT_ASSERT_EQUAL(0, addMetalink(session_, &gids, metalinkPath, options));#ifdef ENABLE_BITTORRENT  CPPUNIT_ASSERT_EQUAL((size_t)2, gids.size());#else // !ENABLE_BITTORRENT  CPPUNIT_ASSERT_EQUAL((size_t)1, gids.size());#endif // !ENABLE_BITTORRENT  gids.clear();  options.push_back(KeyVals::value_type("file-allocation", "foo"));  CPPUNIT_ASSERT_EQUAL(-1, addMetalink(session_, &gids, metalinkPath,                                       options));#else // !ENABLE_METALINK  CPPUNIT_ASSERT_EQUAL(-1, addMetalink(session_, &gids, metalinkPath,                                       options));#endif // !ENABLE_METALINK}void Aria2ApiTest::testAddTorrent(){  std::string torrentPath = A2_TEST_DIR"/test.torrent";  A2Gid gid;  KeyVals options;#ifdef ENABLE_BITTORRENT  CPPUNIT_ASSERT_EQUAL(0, addTorrent(session_, &gid, torrentPath, options));  CPPUNIT_ASSERT(!isNull(gid));  options.push_back(KeyVals::value_type("file-allocation", "foo"));  CPPUNIT_ASSERT_EQUAL(-1, addTorrent(session_, &gid, torrentPath, options));#else // !ENABLE_BITTORRENT  CPPUNIT_ASSERT_EQUAL(-1, addTorrent(session_, &gid, torrentPath, options));#endif // !ENABLE_BITTORRENT}void Aria2ApiTest::testRemovePause(){  A2Gid gid;  std::vector<std::string> uris(1);  KeyVals options;  uris[0] = "http://localhost/1";  CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options));  DownloadHandle* hd = getDownloadHandle(session_, gid);  CPPUNIT_ASSERT(hd);  CPPUNIT_ASSERT_EQUAL(DOWNLOAD_WAITING, hd->getStatus());  deleteDownloadHandle(hd);  CPPUNIT_ASSERT_EQUAL(-1, pauseDownload(session_, (A2Gid)0));  CPPUNIT_ASSERT_EQUAL(0, pauseDownload(session_, gid));  hd = getDownloadHandle(session_, gid);  CPPUNIT_ASSERT(hd);  CPPUNIT_ASSERT_EQUAL(DOWNLOAD_PAUSED, hd->getStatus());  deleteDownloadHandle(hd);  CPPUNIT_ASSERT_EQUAL(-1, unpauseDownload(session_, (A2Gid)0));  CPPUNIT_ASSERT_EQUAL(0, unpauseDownload(session_, gid));  hd = getDownloadHandle(session_, gid);  CPPUNIT_ASSERT(hd);  CPPUNIT_ASSERT_EQUAL(DOWNLOAD_WAITING, hd->getStatus());  deleteDownloadHandle(hd);  CPPUNIT_ASSERT_EQUAL(-1, removeDownload(session_, (A2Gid)0));  CPPUNIT_ASSERT_EQUAL(0, removeDownload(session_, gid));  hd = getDownloadHandle(session_, gid);  CPPUNIT_ASSERT(!hd);}void Aria2ApiTest::testChangePosition(){  int N = 10;  std::vector<A2Gid> gids(N);  std::vector<std::string> uris(1);  KeyVals options;  uris[0] = "http://localhost/";  for(int i = 0; i < N; ++i) {    CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gids[i], uris, options));  }  CPPUNIT_ASSERT_EQUAL(-1, changePosition(session_, (A2Gid)0, -2,                                          OFFSET_MODE_CUR));  CPPUNIT_ASSERT_EQUAL(2, changePosition(session_, gids[4], -2,                                         OFFSET_MODE_CUR));  CPPUNIT_ASSERT_EQUAL(5, changePosition(session_, gids[4], 5,                                         OFFSET_MODE_SET));  CPPUNIT_ASSERT_EQUAL(7, changePosition(session_, gids[4], -2,                                         OFFSET_MODE_END));}void Aria2ApiTest::testChangeOption(){  A2Gid gid;  std::vector<std::string> uris(1);  KeyVals options;  uris[0] = "http://localhost/1";  options.push_back(KeyVals::value_type("dir", "mydownload"));  CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options));  DownloadHandle* hd = getDownloadHandle(session_, gid);  CPPUNIT_ASSERT(hd);  CPPUNIT_ASSERT_EQUAL(1, hd->getNumFiles());  FileData file = hd->getFile(1);  CPPUNIT_ASSERT_EQUAL((size_t)1, file.uris.size());  CPPUNIT_ASSERT_EQUAL(uris[0], file.uris[0].uri);  CPPUNIT_ASSERT_EQUAL(std::string("mydownload"), hd->getOption("dir"));  CPPUNIT_ASSERT(hd->getOption("unknown").empty());  KeyVals retopts = hd->getOptions();  CPPUNIT_ASSERT(std::find(retopts.begin(), retopts.end(),                           KeyVals::value_type("dir", "mydownload"))                 != retopts.end());  // Don't return hidden option  CPPUNIT_ASSERT(hd->getOption(PREF_STARTUP_IDLE_TIME->k).empty());  deleteDownloadHandle(hd);  // failure with null gid  CPPUNIT_ASSERT_EQUAL(-1, changeOption(session_, (A2Gid)0, options));  // change option  options.clear();  options.push_back(KeyVals::value_type("dir", "newlocation"));  CPPUNIT_ASSERT_EQUAL(0, changeOption(session_, gid, options));  hd = getDownloadHandle(session_, gid);  CPPUNIT_ASSERT_EQUAL(std::string("newlocation"), hd->getOption("dir"));  deleteDownloadHandle(hd);  // failure with bad option value  options.clear();  options.push_back(KeyVals::value_type("file-allocation", "foo"));  CPPUNIT_ASSERT_EQUAL(-1, changeOption(session_, gid, options));}void Aria2ApiTest::testChangeGlobalOption(){  CPPUNIT_ASSERT_EQUAL(OptionParser::getInstance()->find(PREF_FILE_ALLOCATION)                       ->getDefaultValue(),                       getGlobalOption(session_, PREF_FILE_ALLOCATION->k));  KeyVals options;  options.push_back(KeyVals::value_type(PREF_FILE_ALLOCATION->k, "none"));  CPPUNIT_ASSERT_EQUAL(0, changeGlobalOption(session_, options));  CPPUNIT_ASSERT_EQUAL(std::string("none"),                       getGlobalOption(session_, PREF_FILE_ALLOCATION->k));  // Don't return hidden option  CPPUNIT_ASSERT(getGlobalOption(session_, PREF_STARTUP_IDLE_TIME->k).empty());  // failure with bad option value  options.clear();  options.push_back(KeyVals::value_type(PREF_FILE_ALLOCATION->k, "foo"));  CPPUNIT_ASSERT_EQUAL(-1, changeGlobalOption(session_, options));}void Aria2ApiTest::testDownloadResultDH(){  std::shared_ptr<DownloadResult> dr1 =    createDownloadResult(error_code::TIME_OUT, "http://example.org/timeout");  dr1->option->put(PREF_DIR, "mydownload");  std::shared_ptr<DownloadResult> dr2 =    createDownloadResult(error_code::NETWORK_PROBLEM,                         "http://example.org/network");  auto& gman =    session_->context->reqinfo->getDownloadEngine()->getRequestGroupMan();  gman->addDownloadResult(dr1);  gman->addDownloadResult(dr2);  DownloadHandle* hd = getDownloadHandle(session_, dr1->gid->getNumericId());  CPPUNIT_ASSERT_EQUAL(DOWNLOAD_ERROR, hd->getStatus());  CPPUNIT_ASSERT_EQUAL((int)error_code::TIME_OUT, hd->getErrorCode());  CPPUNIT_ASSERT_EQUAL(std::string("mydownload"),                       hd->getOption(PREF_DIR->k));  // Don't return hidden option  CPPUNIT_ASSERT(hd->getOption(PREF_STARTUP_IDLE_TIME->k).empty());  KeyVals retopts = hd->getOptions();  CPPUNIT_ASSERT(std::find(retopts.begin(), retopts.end(),                           KeyVals::value_type(PREF_DIR->k, "mydownload"))                 != retopts.end());  deleteDownloadHandle(hd);}} // namespace aria2
 |