XmlRpcMethodTest.cc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. #include "XmlRpcMethod.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "DownloadEngine.h"
  4. #include "SelectEventPoll.h"
  5. #include "Option.h"
  6. #include "RequestGroupMan.h"
  7. #include "ServerStatMan.h"
  8. #include "RequestGroup.h"
  9. #include "XmlRpcMethodImpl.h"
  10. #include "BDE.h"
  11. #include "OptionParser.h"
  12. #include "OptionHandler.h"
  13. #include "XmlRpcRequest.h"
  14. #include "XmlRpcResponse.h"
  15. #include "prefs.h"
  16. #include "TestUtil.h"
  17. #include "DownloadContext.h"
  18. #include "FeatureConfig.h"
  19. #include "util.h"
  20. #ifdef ENABLE_BITTORRENT
  21. # include "BtRegistry.h"
  22. # include "BtRuntime.h"
  23. # include "PieceStorage.h"
  24. # include "PeerStorage.h"
  25. # include "BtProgressInfoFile.h"
  26. # include "BtAnnounce.h"
  27. #endif // ENABLE_BITTORRENT
  28. namespace aria2 {
  29. namespace xmlrpc {
  30. class XmlRpcMethodTest:public CppUnit::TestFixture {
  31. CPPUNIT_TEST_SUITE(XmlRpcMethodTest);
  32. CPPUNIT_TEST(testAddUri);
  33. CPPUNIT_TEST(testAddUri_withoutUri);
  34. CPPUNIT_TEST(testAddUri_notUri);
  35. CPPUNIT_TEST(testAddUri_withBadOption);
  36. CPPUNIT_TEST(testAddUri_withPosition);
  37. CPPUNIT_TEST(testAddUri_withBadPosition);
  38. #ifdef ENABLE_BITTORRENT
  39. CPPUNIT_TEST(testAddTorrent);
  40. CPPUNIT_TEST(testAddTorrent_withoutTorrent);
  41. CPPUNIT_TEST(testAddTorrent_notBase64Torrent);
  42. CPPUNIT_TEST(testAddTorrent_withPosition);
  43. #endif // ENABLE_BITTORRENT
  44. #ifdef ENABLE_METALINK
  45. CPPUNIT_TEST(testAddMetalink);
  46. CPPUNIT_TEST(testAddMetalink_withoutMetalink);
  47. CPPUNIT_TEST(testAddMetalink_notBase64Metalink);
  48. CPPUNIT_TEST(testAddMetalink_withPosition);
  49. #endif // ENABLE_METALINK
  50. CPPUNIT_TEST(testChangeOption);
  51. CPPUNIT_TEST(testChangeOption_withBadOption);
  52. CPPUNIT_TEST(testChangeOption_withNotAllowedOption);
  53. CPPUNIT_TEST(testChangeOption_withoutGid);
  54. CPPUNIT_TEST(testChangeGlobalOption);
  55. CPPUNIT_TEST(testChangeGlobalOption_withBadOption);
  56. CPPUNIT_TEST(testChangeGlobalOption_withNotAllowedOption);
  57. CPPUNIT_TEST(testTellStatus_withoutGid);
  58. CPPUNIT_TEST(testTellWaiting);
  59. CPPUNIT_TEST(testTellWaiting_fail);
  60. CPPUNIT_TEST(testGetVersion);
  61. CPPUNIT_TEST(testNoSuchMethod);
  62. CPPUNIT_TEST(testGatherStoppedDownload);
  63. CPPUNIT_TEST(testGatherProgressCommon);
  64. CPPUNIT_TEST(testChangePosition);
  65. CPPUNIT_TEST(testChangePosition_fail);
  66. CPPUNIT_TEST_SUITE_END();
  67. private:
  68. SharedHandle<DownloadEngine> _e;
  69. SharedHandle<Option> _option;
  70. public:
  71. void setUp()
  72. {
  73. RequestGroup::resetGIDCounter();
  74. _option.reset(new Option());
  75. _option->put(PREF_DIR, "/tmp");
  76. _option->put(PREF_SEGMENT_SIZE, "1048576");
  77. _e.reset(new DownloadEngine(SharedHandle<EventPoll>(new SelectEventPoll())));
  78. _e->option = _option.get();
  79. _e->_requestGroupMan.reset
  80. (new RequestGroupMan(std::deque<SharedHandle<RequestGroup> >(),
  81. 1, _option.get()));
  82. }
  83. void tearDown() {}
  84. void testAddUri();
  85. void testAddUri_withoutUri();
  86. void testAddUri_notUri();
  87. void testAddUri_withBadOption();
  88. void testAddUri_withPosition();
  89. void testAddUri_withBadPosition();
  90. #ifdef ENABLE_BITTORRENT
  91. void testAddTorrent();
  92. void testAddTorrent_withoutTorrent();
  93. void testAddTorrent_notBase64Torrent();
  94. void testAddTorrent_withPosition();
  95. #endif // ENABLE_BITTORRENT
  96. #ifdef ENABLE_METALINK
  97. void testAddMetalink();
  98. void testAddMetalink_withoutMetalink();
  99. void testAddMetalink_notBase64Metalink();
  100. void testAddMetalink_withPosition();
  101. #endif // ENABLE_METALINK
  102. void testChangeOption();
  103. void testChangeOption_withBadOption();
  104. void testChangeOption_withNotAllowedOption();
  105. void testChangeOption_withoutGid();
  106. void testChangeGlobalOption();
  107. void testChangeGlobalOption_withBadOption();
  108. void testChangeGlobalOption_withNotAllowedOption();
  109. void testTellStatus_withoutGid();
  110. void testTellWaiting();
  111. void testTellWaiting_fail();
  112. void testGetVersion();
  113. void testNoSuchMethod();
  114. void testGatherStoppedDownload();
  115. void testGatherProgressCommon();
  116. void testChangePosition();
  117. void testChangePosition_fail();
  118. };
  119. CPPUNIT_TEST_SUITE_REGISTRATION(XmlRpcMethodTest);
  120. void XmlRpcMethodTest::testAddUri()
  121. {
  122. AddUriXmlRpcMethod m;
  123. XmlRpcRequest req("aria2.addUri", BDE::list());
  124. req._params << BDE::list();
  125. req._params[0] << BDE("http://localhost/");
  126. {
  127. XmlRpcResponse res = m.execute(req, _e.get());
  128. CPPUNIT_ASSERT_EQUAL(0, res._code);
  129. const std::deque<SharedHandle<RequestGroup> > rgs =
  130. _e->_requestGroupMan->getReservedGroups();
  131. CPPUNIT_ASSERT_EQUAL((size_t)1, rgs.size());
  132. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/"),
  133. rgs.front()->getDownloadContext()->getFirstFileEntry()->getRemainingUris().front());
  134. }
  135. // with options
  136. BDE opt = BDE::dict();
  137. opt[PREF_DIR] = BDE("/sink");
  138. req._params << opt;
  139. {
  140. XmlRpcResponse res = m.execute(req, _e.get());
  141. CPPUNIT_ASSERT_EQUAL(0, res._code);
  142. CPPUNIT_ASSERT_EQUAL(std::string("/sink"),
  143. _e->_requestGroupMan->findReservedGroup(2)->
  144. getDownloadContext()->getDir());
  145. }
  146. }
  147. void XmlRpcMethodTest::testAddUri_withoutUri()
  148. {
  149. AddUriXmlRpcMethod m;
  150. XmlRpcRequest req("aria2.addUri", BDE::list());
  151. XmlRpcResponse res = m.execute(req, _e.get());
  152. CPPUNIT_ASSERT_EQUAL(1, res._code);
  153. }
  154. void XmlRpcMethodTest::testAddUri_notUri()
  155. {
  156. AddUriXmlRpcMethod m;
  157. XmlRpcRequest req("aria2.addUri", BDE::list());
  158. req._params << BDE::list();
  159. req._params[0] << BDE("not uri");
  160. XmlRpcResponse res = m.execute(req, _e.get());
  161. CPPUNIT_ASSERT_EQUAL(1, res._code);
  162. }
  163. void XmlRpcMethodTest::testAddUri_withBadOption()
  164. {
  165. AddUriXmlRpcMethod m;
  166. XmlRpcRequest req("aria2.addUri", BDE::list());
  167. req._params << BDE::list();
  168. req._params[0] << BDE("http://localhost");
  169. BDE opt = BDE::dict();
  170. opt[PREF_FILE_ALLOCATION] = BDE("badvalue");
  171. req._params << opt;
  172. XmlRpcResponse res = m.execute(req, _e.get());
  173. CPPUNIT_ASSERT_EQUAL(1, res._code);
  174. }
  175. void XmlRpcMethodTest::testAddUri_withPosition()
  176. {
  177. AddUriXmlRpcMethod m;
  178. XmlRpcRequest req1("aria2.addUri", BDE::list());
  179. req1._params << BDE::list();
  180. req1._params[0] << BDE("http://uri1");
  181. XmlRpcResponse res1 = m.execute(req1, _e.get());
  182. CPPUNIT_ASSERT_EQUAL(0, res1._code);
  183. XmlRpcRequest req2("aria2.addUri", BDE::list());
  184. req2._params << BDE::list();
  185. req2._params[0] << BDE("http://uri2");
  186. req2._params << BDE::dict();
  187. req2._params << BDE((int64_t)0);
  188. m.execute(req2, _e.get());
  189. std::string uri =
  190. _e->_requestGroupMan->getReservedGroups()[0]->getDownloadContext()->getFirstFileEntry()->getRemainingUris()[0];
  191. CPPUNIT_ASSERT_EQUAL(std::string("http://uri2"), uri);
  192. }
  193. void XmlRpcMethodTest::testAddUri_withBadPosition()
  194. {
  195. AddUriXmlRpcMethod m;
  196. XmlRpcRequest req("aria2.addUri", BDE::list());
  197. req._params << BDE::list();
  198. req._params[0] << BDE("http://localhost/");
  199. req._params << BDE::dict();
  200. req._params << BDE((int64_t)-1);
  201. XmlRpcResponse res = m.execute(req, _e.get());
  202. CPPUNIT_ASSERT_EQUAL(1, res._code);
  203. }
  204. #ifdef ENABLE_BITTORRENT
  205. void XmlRpcMethodTest::testAddTorrent()
  206. {
  207. AddTorrentXmlRpcMethod m;
  208. XmlRpcRequest req("aria2.addTorrent", BDE::list());
  209. req._params << BDE(readFile("single.torrent"));
  210. BDE uris = BDE::list();
  211. uris << BDE("http://localhost/aria2-0.8.2.tar.bz2");
  212. req._params << uris;
  213. {
  214. XmlRpcResponse res = m.execute(req, _e.get());
  215. CPPUNIT_ASSERT_EQUAL(0, res._code);
  216. CPPUNIT_ASSERT_EQUAL(std::string("1"), res._param.s());
  217. SharedHandle<RequestGroup> group = _e->_requestGroupMan->findReservedGroup(1);
  218. CPPUNIT_ASSERT(!group.isNull());
  219. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-0.8.2.tar.bz2"),
  220. group->getFirstFilePath());
  221. CPPUNIT_ASSERT_EQUAL((size_t)1, group->getDownloadContext()->getFirstFileEntry()->getRemainingUris().size());
  222. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/aria2-0.8.2.tar.bz2"),
  223. group->getDownloadContext()->getFirstFileEntry()->getRemainingUris()[0]);
  224. }
  225. // with options
  226. BDE opt = BDE::dict();
  227. opt[PREF_DIR] = BDE("/sink");
  228. req._params << opt;
  229. {
  230. XmlRpcResponse res = m.execute(req, _e.get());
  231. CPPUNIT_ASSERT_EQUAL(0, res._code);
  232. CPPUNIT_ASSERT_EQUAL(std::string("/sink/aria2-0.8.2.tar.bz2"),
  233. _e->_requestGroupMan->findReservedGroup(2)->getFirstFilePath());
  234. }
  235. }
  236. void XmlRpcMethodTest::testAddTorrent_withoutTorrent()
  237. {
  238. AddTorrentXmlRpcMethod m;
  239. XmlRpcRequest req("aria2.addTorrent", BDE::list());
  240. XmlRpcResponse res = m.execute(req, _e.get());
  241. CPPUNIT_ASSERT_EQUAL(1, res._code);
  242. }
  243. void XmlRpcMethodTest::testAddTorrent_notBase64Torrent()
  244. {
  245. AddTorrentXmlRpcMethod m;
  246. XmlRpcRequest req("aria2.addTorrent", BDE::list());
  247. req._params << BDE("not torrent");
  248. XmlRpcResponse res = m.execute(req, _e.get());
  249. CPPUNIT_ASSERT_EQUAL(1, res._code);
  250. }
  251. void XmlRpcMethodTest::testAddTorrent_withPosition()
  252. {
  253. AddTorrentXmlRpcMethod m;
  254. XmlRpcRequest req1("aria2.addTorrent", BDE::list());
  255. req1._params << BDE(readFile("test.torrent"));
  256. req1._params << BDE::list();
  257. req1._params << BDE::dict();
  258. XmlRpcResponse res1 = m.execute(req1, _e.get());
  259. CPPUNIT_ASSERT_EQUAL(0, res1._code);
  260. XmlRpcRequest req2("aria2.addTorrent", BDE::list());
  261. req2._params << BDE(readFile("single.torrent"));
  262. req2._params << BDE::list();
  263. req2._params << BDE::dict();
  264. req2._params << BDE((int64_t)0);
  265. m.execute(req2, _e.get());
  266. CPPUNIT_ASSERT_EQUAL((size_t)1,
  267. _e->_requestGroupMan->getReservedGroups()[0]->
  268. getDownloadContext()->getFileEntries().size());
  269. }
  270. #endif // ENABLE_BITTORRENT
  271. #ifdef ENABLE_METALINK
  272. void XmlRpcMethodTest::testAddMetalink()
  273. {
  274. AddMetalinkXmlRpcMethod m;
  275. XmlRpcRequest req("aria2.addMetalink", BDE::list());
  276. req._params << BDE(readFile("2files.metalink"));
  277. {
  278. XmlRpcResponse res = m.execute(req, _e.get());
  279. CPPUNIT_ASSERT_EQUAL(0, res._code);
  280. CPPUNIT_ASSERT_EQUAL((size_t)2, res._param.size());
  281. CPPUNIT_ASSERT_EQUAL(std::string("1"), res._param[0].s());
  282. CPPUNIT_ASSERT_EQUAL(std::string("2"), res._param[1].s());
  283. SharedHandle<RequestGroup> tar = _e->_requestGroupMan->findReservedGroup(1);
  284. CPPUNIT_ASSERT(!tar.isNull());
  285. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.tar.bz2"),
  286. tar->getFirstFilePath());
  287. SharedHandle<RequestGroup> deb = _e->_requestGroupMan->findReservedGroup(2);
  288. CPPUNIT_ASSERT(!deb.isNull());
  289. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.deb"),
  290. deb->getFirstFilePath());
  291. }
  292. // with options
  293. BDE opt = BDE::dict();
  294. opt[PREF_DIR] = BDE("/sink");
  295. req._params << opt;
  296. {
  297. XmlRpcResponse res = m.execute(req, _e.get());
  298. CPPUNIT_ASSERT_EQUAL(0, res._code);
  299. CPPUNIT_ASSERT_EQUAL(std::string("/sink/aria2-5.0.0.tar.bz2"),
  300. _e->_requestGroupMan->findReservedGroup(3)->getFirstFilePath());
  301. }
  302. }
  303. void XmlRpcMethodTest::testAddMetalink_withoutMetalink()
  304. {
  305. AddMetalinkXmlRpcMethod m;
  306. XmlRpcRequest req("aria2.addMetalink", BDE::list());
  307. XmlRpcResponse res = m.execute(req, _e.get());
  308. CPPUNIT_ASSERT_EQUAL(1, res._code);
  309. }
  310. void XmlRpcMethodTest::testAddMetalink_notBase64Metalink()
  311. {
  312. AddMetalinkXmlRpcMethod m;
  313. XmlRpcRequest req("aria2.addMetalink", BDE::list());
  314. req._params << BDE("not metalink");
  315. XmlRpcResponse res = m.execute(req, _e.get());
  316. CPPUNIT_ASSERT_EQUAL(1, res._code);
  317. }
  318. void XmlRpcMethodTest::testAddMetalink_withPosition()
  319. {
  320. AddUriXmlRpcMethod m1;
  321. XmlRpcRequest req1("aria2.addUri", BDE::list());
  322. req1._params << BDE::list();
  323. req1._params[0] << BDE("http://uri");
  324. XmlRpcResponse res1 = m1.execute(req1, _e.get());
  325. CPPUNIT_ASSERT_EQUAL(0, res1._code);
  326. AddMetalinkXmlRpcMethod m2;
  327. XmlRpcRequest req2("ari2.addMetalink", BDE::list());
  328. req2._params << BDE(readFile("2files.metalink"));
  329. req2._params << BDE::dict();
  330. req2._params << BDE((int64_t)0);
  331. XmlRpcResponse res2 = m2.execute(req2, _e.get());
  332. CPPUNIT_ASSERT_EQUAL(0, res2._code);
  333. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.tar.bz2"),
  334. _e->_requestGroupMan->getReservedGroups()[0]->
  335. getFirstFilePath());
  336. }
  337. #endif // ENABLE_METALINK
  338. void XmlRpcMethodTest::testChangeOption()
  339. {
  340. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  341. _e->_requestGroupMan->addReservedGroup(group);
  342. ChangeOptionXmlRpcMethod m;
  343. XmlRpcRequest req("aria2.changeOption", BDE::list());
  344. req._params << BDE("1");
  345. BDE opt = BDE::dict();
  346. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("100K");
  347. #ifdef ENABLE_BITTORRENT
  348. opt[PREF_BT_MAX_PEERS] = BDE("100");
  349. opt[PREF_BT_REQUEST_PEER_SPEED_LIMIT] = BDE("300K");
  350. opt[PREF_MAX_UPLOAD_LIMIT] = BDE("50K");
  351. BtObject btObject;
  352. btObject._btRuntime = SharedHandle<BtRuntime>(new BtRuntime());
  353. _e->getBtRegistry()->put(group->getGID(), btObject);
  354. #endif // ENABLE_BITTORRENT
  355. req._params << opt;
  356. XmlRpcResponse res = m.execute(req, _e.get());
  357. SharedHandle<Option> option = group->getOption();
  358. CPPUNIT_ASSERT_EQUAL(0, res._code);
  359. CPPUNIT_ASSERT_EQUAL((unsigned int)100*1024,
  360. group->getMaxDownloadSpeedLimit());
  361. CPPUNIT_ASSERT_EQUAL(std::string("102400"),
  362. option->get(PREF_MAX_DOWNLOAD_LIMIT));
  363. #ifdef ENABLE_BITTORRENT
  364. CPPUNIT_ASSERT_EQUAL(std::string("307200"),
  365. option->get(PREF_BT_REQUEST_PEER_SPEED_LIMIT));
  366. CPPUNIT_ASSERT_EQUAL(std::string("100"), option->get(PREF_BT_MAX_PEERS));
  367. CPPUNIT_ASSERT_EQUAL((unsigned int)100, btObject._btRuntime->getMaxPeers());
  368. CPPUNIT_ASSERT_EQUAL((unsigned int)50*1024,
  369. group->getMaxUploadSpeedLimit());
  370. CPPUNIT_ASSERT_EQUAL(std::string("51200"),
  371. option->get(PREF_MAX_UPLOAD_LIMIT));
  372. #endif // ENABLE_BITTORRENT
  373. }
  374. void XmlRpcMethodTest::testChangeOption_withBadOption()
  375. {
  376. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  377. _e->_requestGroupMan->addReservedGroup(group);
  378. ChangeOptionXmlRpcMethod m;
  379. XmlRpcRequest req("aria2.changeOption", BDE::list());
  380. req._params << BDE("1");
  381. BDE opt = BDE::dict();
  382. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("badvalue");
  383. req._params << opt;
  384. XmlRpcResponse res = m.execute(req, _e.get());
  385. CPPUNIT_ASSERT_EQUAL(1, res._code);
  386. }
  387. void XmlRpcMethodTest::testChangeOption_withNotAllowedOption()
  388. {
  389. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  390. _e->_requestGroupMan->addReservedGroup(group);
  391. ChangeOptionXmlRpcMethod m;
  392. XmlRpcRequest req("aria2.changeOption", BDE::list());
  393. req._params << BDE("1");
  394. BDE opt = BDE::dict();
  395. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("100K");
  396. req._params << opt;
  397. XmlRpcResponse res = m.execute(req, _e.get());
  398. CPPUNIT_ASSERT_EQUAL(1, res._code);
  399. }
  400. void XmlRpcMethodTest::testChangeOption_withoutGid()
  401. {
  402. ChangeOptionXmlRpcMethod m;
  403. XmlRpcRequest req("aria2.changeOption", BDE::list());
  404. XmlRpcResponse res = m.execute(req, _e.get());
  405. CPPUNIT_ASSERT_EQUAL(1, res._code);
  406. }
  407. void XmlRpcMethodTest::testChangeGlobalOption()
  408. {
  409. ChangeGlobalOptionXmlRpcMethod m;
  410. XmlRpcRequest req("aria2.changeGlobalOption", BDE::list());
  411. BDE opt = BDE::dict();
  412. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("100K");
  413. #ifdef ENABLE_BITTORRENT
  414. opt[PREF_MAX_OVERALL_UPLOAD_LIMIT] = BDE("50K");
  415. #endif // ENABLE_BITTORRENT
  416. req._params << opt;
  417. XmlRpcResponse res = m.execute(req, _e.get());
  418. CPPUNIT_ASSERT_EQUAL(0, res._code);
  419. CPPUNIT_ASSERT_EQUAL((unsigned int)100*1024,
  420. _e->_requestGroupMan->getMaxOverallDownloadSpeedLimit());
  421. CPPUNIT_ASSERT_EQUAL(std::string("102400"),
  422. _e->option->get(PREF_MAX_OVERALL_DOWNLOAD_LIMIT));
  423. #ifdef ENABLE_BITTORRENT
  424. CPPUNIT_ASSERT_EQUAL((unsigned int)50*1024,
  425. _e->_requestGroupMan->getMaxOverallUploadSpeedLimit());
  426. CPPUNIT_ASSERT_EQUAL(std::string("51200"),
  427. _e->option->get(PREF_MAX_OVERALL_UPLOAD_LIMIT));
  428. #endif // ENABLE_BITTORRENT
  429. }
  430. void XmlRpcMethodTest::testChangeGlobalOption_withBadOption()
  431. {
  432. ChangeGlobalOptionXmlRpcMethod m;
  433. XmlRpcRequest req("aria2.changeGlobalOption", BDE::list());
  434. BDE opt = BDE::dict();
  435. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("badvalue");
  436. req._params << opt;
  437. XmlRpcResponse res = m.execute(req, _e.get());
  438. CPPUNIT_ASSERT_EQUAL(1, res._code);
  439. }
  440. void XmlRpcMethodTest::testChangeGlobalOption_withNotAllowedOption()
  441. {
  442. ChangeGlobalOptionXmlRpcMethod m;
  443. XmlRpcRequest req("aria2.changeGlobalOption", BDE::list());
  444. BDE opt = BDE::dict();
  445. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("100K");
  446. req._params << opt;
  447. XmlRpcResponse res = m.execute(req, _e.get());
  448. CPPUNIT_ASSERT_EQUAL(1, res._code);
  449. }
  450. void XmlRpcMethodTest::testNoSuchMethod()
  451. {
  452. NoSuchMethodXmlRpcMethod m;
  453. XmlRpcRequest req("make.hamburger", BDE::none);
  454. XmlRpcResponse res = m.execute(req, 0);
  455. CPPUNIT_ASSERT_EQUAL(1, res._code);
  456. CPPUNIT_ASSERT_EQUAL(std::string("No such method: make.hamburger"),
  457. res._param["faultString"].s());
  458. CPPUNIT_ASSERT_EQUAL
  459. (std::string("<?xml version=\"1.0\"?>"
  460. "<methodResponse>"
  461. "<fault>"
  462. "<value>"
  463. "<struct>"
  464. "<member>"
  465. "<name>faultCode</name><value><int>1</int></value>"
  466. "</member>"
  467. "<member>"
  468. "<name>faultString</name>"
  469. "<value>"
  470. "<string>No such method: make.hamburger</string>"
  471. "</value>"
  472. "</member>"
  473. "</struct>"
  474. "</value>"
  475. "</fault>"
  476. "</methodResponse>"),
  477. res.toXml());
  478. }
  479. void XmlRpcMethodTest::testTellStatus_withoutGid()
  480. {
  481. TellStatusXmlRpcMethod m;
  482. XmlRpcRequest req("aria2.tellStatus", BDE::list());
  483. XmlRpcResponse res = m.execute(req, _e.get());
  484. CPPUNIT_ASSERT_EQUAL(1, res._code);
  485. }
  486. static void addUri(const std::string& uri,
  487. const SharedHandle<DownloadEngine>& e)
  488. {
  489. AddUriXmlRpcMethod m;
  490. XmlRpcRequest req("aria2.addUri", BDE::list());
  491. req._params << BDE::list();
  492. req._params[0] << BDE(uri);
  493. CPPUNIT_ASSERT_EQUAL(0, m.execute(req, e.get())._code);
  494. }
  495. #ifdef ENABLE_BITTORRENT
  496. static void addTorrent
  497. (const std::string& torrentFile, const SharedHandle<DownloadEngine>& e)
  498. {
  499. AddTorrentXmlRpcMethod m;
  500. XmlRpcRequest req("aria2.addTorrent", BDE::list());
  501. req._params << BDE(readFile(torrentFile));
  502. XmlRpcResponse res = m.execute(req, e.get());
  503. }
  504. #endif // ENABLE_BITTORRENT
  505. void XmlRpcMethodTest::testTellWaiting()
  506. {
  507. addUri("http://1/", _e);
  508. addUri("http://2/", _e);
  509. addUri("http://3/", _e);
  510. #ifdef ENABLE_BITTORRENT
  511. addTorrent("single.torrent", _e);
  512. #endif // ENABLE_BITTORRENT
  513. TellWaitingXmlRpcMethod m;
  514. XmlRpcRequest req("aria2.tellWaiting", BDE::list());
  515. req._params << BDE((int64_t)1);
  516. req._params << BDE((int64_t)2);
  517. XmlRpcResponse res = m.execute(req, _e.get());
  518. CPPUNIT_ASSERT_EQUAL(0, res._code);
  519. CPPUNIT_ASSERT_EQUAL((size_t)2, res._param.size());
  520. CPPUNIT_ASSERT_EQUAL(std::string("2"), res._param[0]["gid"].s());
  521. CPPUNIT_ASSERT_EQUAL(std::string("3"), res._param[1]["gid"].s());
  522. // waiting.size() == offset+num
  523. req = XmlRpcRequest("aria2.tellWaiting", BDE::list());
  524. req._params << BDE((int64_t)1);
  525. #ifdef ENABLE_BITTORRENT
  526. req._params << BDE((int64_t)3);
  527. #else // !ENABLE_BITTORRENT
  528. req._params << BDE((int64_t)2);
  529. #endif // !ENABLE_BITTORRENT
  530. res = m.execute(req, _e.get());
  531. CPPUNIT_ASSERT_EQUAL(0, res._code);
  532. #ifdef ENABLE_BITTORRENT
  533. CPPUNIT_ASSERT_EQUAL((size_t)3, res._param.size());
  534. #else // !ENABLE_BITTORRENT
  535. CPPUNIT_ASSERT_EQUAL((size_t)2, res._param.size());
  536. #endif // !ENABLE_BITTORRENT
  537. // waiting.size() < offset+num
  538. req = XmlRpcRequest("aria2.tellWaiting", BDE::list());
  539. req._params << BDE((int64_t)1);
  540. req._params << BDE((int64_t)4);
  541. res = m.execute(req, _e.get());
  542. CPPUNIT_ASSERT_EQUAL(0, res._code);
  543. #ifdef ENABLE_BITTORRENT
  544. CPPUNIT_ASSERT_EQUAL((size_t)3, res._param.size());
  545. #else //!ENABLE_BITTORRENT
  546. CPPUNIT_ASSERT_EQUAL((size_t)2, res._param.size());
  547. #endif // !ENABLE_BITTORRENT
  548. }
  549. void XmlRpcMethodTest::testTellWaiting_fail()
  550. {
  551. TellWaitingXmlRpcMethod m;
  552. XmlRpcRequest req("aria2.tellWaiting", BDE::list());
  553. XmlRpcResponse res = m.execute(req, _e.get());
  554. CPPUNIT_ASSERT_EQUAL(1, res._code);
  555. }
  556. void XmlRpcMethodTest::testGetVersion()
  557. {
  558. GetVersionXmlRpcMethod m;
  559. XmlRpcRequest req("aria2.getVersion", BDE::none);
  560. XmlRpcResponse res = m.execute(req, _e.get());
  561. CPPUNIT_ASSERT_EQUAL(0, res._code);
  562. CPPUNIT_ASSERT_EQUAL(std::string(PACKAGE_VERSION), res._param["version"].s());
  563. const BDE& featureList = res._param["enabledFeatures"];
  564. std::string features;
  565. for(BDE::List::const_iterator i = featureList.listBegin();
  566. i != featureList.listEnd(); ++i) {
  567. features += (*i).s();
  568. features += ", ";
  569. }
  570. CPPUNIT_ASSERT_EQUAL(FeatureConfig::getInstance()->featureSummary()+", ",
  571. features);
  572. }
  573. void XmlRpcMethodTest::testGatherStoppedDownload()
  574. {
  575. std::vector<SharedHandle<FileEntry> > fileEntries;
  576. std::vector<int32_t> followedBy;
  577. followedBy.push_back(3);
  578. followedBy.push_back(4);
  579. SharedHandle<DownloadResult> d
  580. (new DownloadResult(1,
  581. fileEntries,
  582. false,
  583. UINT64_MAX,
  584. 1000,
  585. downloadresultcode::FINISHED,
  586. followedBy,
  587. 2));
  588. BDE entry = BDE::dict();
  589. gatherStoppedDownload(entry, d);
  590. CPPUNIT_ASSERT_EQUAL(std::string("3"), entry["followedBy"][0].s());
  591. CPPUNIT_ASSERT_EQUAL(std::string("4"), entry["followedBy"][1].s());
  592. CPPUNIT_ASSERT_EQUAL(std::string("2"), entry["belongsTo"].s());
  593. }
  594. void XmlRpcMethodTest::testGatherProgressCommon()
  595. {
  596. SharedHandle<DownloadContext> dctx(new DownloadContext());
  597. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  598. group->setDownloadContext(dctx);
  599. std::vector<SharedHandle<RequestGroup> > followedBy;
  600. for(int i = 0; i < 2; ++i) {
  601. followedBy.push_back(SharedHandle<RequestGroup>(new RequestGroup(_option)));
  602. }
  603. group->followedBy(followedBy.begin(), followedBy.end());
  604. group->belongsTo(2);
  605. BDE entry = BDE::dict();
  606. gatherProgressCommon(entry, group);
  607. CPPUNIT_ASSERT_EQUAL(util::itos(followedBy[0]->getGID()),
  608. entry["followedBy"][0].s());
  609. CPPUNIT_ASSERT_EQUAL(util::itos(followedBy[1]->getGID()),
  610. entry["followedBy"][1].s());
  611. CPPUNIT_ASSERT_EQUAL(std::string("2"), entry["belongsTo"].s());
  612. }
  613. void XmlRpcMethodTest::testChangePosition()
  614. {
  615. _e->_requestGroupMan->addReservedGroup
  616. (SharedHandle<RequestGroup>(new RequestGroup(_option)));
  617. _e->_requestGroupMan->addReservedGroup
  618. (SharedHandle<RequestGroup>(new RequestGroup(_option)));
  619. ChangePositionXmlRpcMethod m;
  620. XmlRpcRequest req("aria2.changePosition", BDE::list());
  621. req._params << std::string("1");
  622. req._params << BDE((int64_t)1);
  623. req._params << std::string("POS_SET");
  624. XmlRpcResponse res = m.execute(req, _e.get());
  625. CPPUNIT_ASSERT_EQUAL(0, res._code);
  626. CPPUNIT_ASSERT_EQUAL((int64_t)1, res._param.i());
  627. CPPUNIT_ASSERT_EQUAL
  628. ((int32_t)1, _e->_requestGroupMan->getReservedGroups()[1]->getGID());
  629. }
  630. void XmlRpcMethodTest::testChangePosition_fail()
  631. {
  632. ChangePositionXmlRpcMethod m;
  633. XmlRpcRequest req("aria2.changePosition", BDE::list());
  634. XmlRpcResponse res = m.execute(req, _e.get());
  635. CPPUNIT_ASSERT_EQUAL(1, res._code);
  636. req._params << std::string("1");
  637. req._params << BDE((int64_t)2);
  638. req._params << std::string("bad keyword");
  639. CPPUNIT_ASSERT_EQUAL(1, res._code);
  640. }
  641. } // namespace xmlrpc
  642. } // namespace aria2