XmlRpcMethodTest.cc 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063
  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. #include "array_fun.h"
  21. #include "download_helper.h"
  22. #include "FileAllocationEntry.h"
  23. #include "CheckIntegrityEntry.h"
  24. #ifdef ENABLE_BITTORRENT
  25. # include "BtRegistry.h"
  26. # include "BtRuntime.h"
  27. # include "PieceStorage.h"
  28. # include "PeerStorage.h"
  29. # include "BtProgressInfoFile.h"
  30. # include "BtAnnounce.h"
  31. # include "bittorrent_helper.h"
  32. #endif // ENABLE_BITTORRENT
  33. namespace aria2 {
  34. namespace xmlrpc {
  35. class XmlRpcMethodTest:public CppUnit::TestFixture {
  36. CPPUNIT_TEST_SUITE(XmlRpcMethodTest);
  37. CPPUNIT_TEST(testAddUri);
  38. CPPUNIT_TEST(testAddUri_withoutUri);
  39. CPPUNIT_TEST(testAddUri_notUri);
  40. CPPUNIT_TEST(testAddUri_withBadOption);
  41. CPPUNIT_TEST(testAddUri_withPosition);
  42. CPPUNIT_TEST(testAddUri_withBadPosition);
  43. #ifdef ENABLE_BITTORRENT
  44. CPPUNIT_TEST(testAddTorrent);
  45. CPPUNIT_TEST(testAddTorrent_withoutTorrent);
  46. CPPUNIT_TEST(testAddTorrent_notBase64Torrent);
  47. CPPUNIT_TEST(testAddTorrent_withPosition);
  48. #endif // ENABLE_BITTORRENT
  49. #ifdef ENABLE_METALINK
  50. CPPUNIT_TEST(testAddMetalink);
  51. CPPUNIT_TEST(testAddMetalink_withoutMetalink);
  52. CPPUNIT_TEST(testAddMetalink_notBase64Metalink);
  53. CPPUNIT_TEST(testAddMetalink_withPosition);
  54. #endif // ENABLE_METALINK
  55. CPPUNIT_TEST(testChangeOption);
  56. CPPUNIT_TEST(testChangeOption_withBadOption);
  57. CPPUNIT_TEST(testChangeOption_withNotAllowedOption);
  58. CPPUNIT_TEST(testChangeOption_withoutGid);
  59. CPPUNIT_TEST(testChangeGlobalOption);
  60. CPPUNIT_TEST(testChangeGlobalOption_withBadOption);
  61. CPPUNIT_TEST(testChangeGlobalOption_withNotAllowedOption);
  62. CPPUNIT_TEST(testTellStatus_withoutGid);
  63. CPPUNIT_TEST(testTellWaiting);
  64. CPPUNIT_TEST(testTellWaiting_fail);
  65. CPPUNIT_TEST(testGetVersion);
  66. CPPUNIT_TEST(testNoSuchMethod);
  67. CPPUNIT_TEST(testGatherStoppedDownload);
  68. CPPUNIT_TEST(testGatherProgressCommon);
  69. #ifdef ENABLE_BITTORRENT
  70. CPPUNIT_TEST(testGatherBitTorrentMetadata);
  71. #endif // ENABLE_BITTORRENT
  72. CPPUNIT_TEST(testChangePosition);
  73. CPPUNIT_TEST(testChangePosition_fail);
  74. CPPUNIT_TEST(testGetSessionInfo);
  75. CPPUNIT_TEST(testChangeUri);
  76. CPPUNIT_TEST(testChangeUri_fail);
  77. CPPUNIT_TEST(testPause);
  78. CPPUNIT_TEST(testSystemMulticall);
  79. CPPUNIT_TEST(testSystemMulticall_fail);
  80. CPPUNIT_TEST_SUITE_END();
  81. private:
  82. SharedHandle<DownloadEngine> _e;
  83. SharedHandle<Option> _option;
  84. public:
  85. void setUp()
  86. {
  87. RequestGroup::resetGIDCounter();
  88. _option.reset(new Option());
  89. _option->put(PREF_DIR, "/tmp");
  90. _option->put(PREF_SEGMENT_SIZE, "1048576");
  91. _e.reset
  92. (new DownloadEngine(SharedHandle<EventPoll>(new SelectEventPoll())));
  93. _e->setOption(_option.get());
  94. _e->setRequestGroupMan
  95. (SharedHandle<RequestGroupMan>
  96. (new RequestGroupMan(std::vector<SharedHandle<RequestGroup> >(),
  97. 1, _option.get())));
  98. }
  99. void testAddUri();
  100. void testAddUri_withoutUri();
  101. void testAddUri_notUri();
  102. void testAddUri_withBadOption();
  103. void testAddUri_withPosition();
  104. void testAddUri_withBadPosition();
  105. #ifdef ENABLE_BITTORRENT
  106. void testAddTorrent();
  107. void testAddTorrent_withoutTorrent();
  108. void testAddTorrent_notBase64Torrent();
  109. void testAddTorrent_withPosition();
  110. #endif // ENABLE_BITTORRENT
  111. #ifdef ENABLE_METALINK
  112. void testAddMetalink();
  113. void testAddMetalink_withoutMetalink();
  114. void testAddMetalink_notBase64Metalink();
  115. void testAddMetalink_withPosition();
  116. #endif // ENABLE_METALINK
  117. void testChangeOption();
  118. void testChangeOption_withBadOption();
  119. void testChangeOption_withNotAllowedOption();
  120. void testChangeOption_withoutGid();
  121. void testChangeGlobalOption();
  122. void testChangeGlobalOption_withBadOption();
  123. void testChangeGlobalOption_withNotAllowedOption();
  124. void testTellStatus_withoutGid();
  125. void testTellWaiting();
  126. void testTellWaiting_fail();
  127. void testGetVersion();
  128. void testNoSuchMethod();
  129. void testGatherStoppedDownload();
  130. void testGatherProgressCommon();
  131. #ifdef ENABLE_BITTORRENT
  132. void testGatherBitTorrentMetadata();
  133. #endif // ENABLE_BITTORRENT
  134. void testChangePosition();
  135. void testChangePosition_fail();
  136. void testGetSessionInfo();
  137. void testChangeUri();
  138. void testChangeUri_fail();
  139. void testPause();
  140. void testSystemMulticall();
  141. void testSystemMulticall_fail();
  142. };
  143. CPPUNIT_TEST_SUITE_REGISTRATION(XmlRpcMethodTest);
  144. void XmlRpcMethodTest::testAddUri()
  145. {
  146. AddUriXmlRpcMethod m;
  147. XmlRpcRequest req(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  148. req.params << BDE::list();
  149. req.params[0] << BDE("http://localhost/");
  150. {
  151. XmlRpcResponse res = m.execute(req, _e.get());
  152. CPPUNIT_ASSERT_EQUAL(0, res.code);
  153. const std::deque<SharedHandle<RequestGroup> > rgs =
  154. _e->getRequestGroupMan()->getReservedGroups();
  155. CPPUNIT_ASSERT_EQUAL((size_t)1, rgs.size());
  156. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/"),
  157. rgs.front()->getDownloadContext()->
  158. getFirstFileEntry()->getRemainingUris().front());
  159. }
  160. // with options
  161. BDE opt = BDE::dict();
  162. opt[PREF_DIR] = BDE("/sink");
  163. req.params << opt;
  164. {
  165. XmlRpcResponse res = m.execute(req, _e.get());
  166. CPPUNIT_ASSERT_EQUAL(0, res.code);
  167. CPPUNIT_ASSERT_EQUAL(std::string("/sink"),
  168. _e->getRequestGroupMan()->findReservedGroup(2)->
  169. getDownloadContext()->getDir());
  170. }
  171. }
  172. void XmlRpcMethodTest::testAddUri_withoutUri()
  173. {
  174. AddUriXmlRpcMethod m;
  175. XmlRpcRequest req(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  176. XmlRpcResponse res = m.execute(req, _e.get());
  177. CPPUNIT_ASSERT_EQUAL(1, res.code);
  178. }
  179. void XmlRpcMethodTest::testAddUri_notUri()
  180. {
  181. AddUriXmlRpcMethod m;
  182. XmlRpcRequest req(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  183. req.params << BDE::list();
  184. req.params[0] << BDE("not uri");
  185. XmlRpcResponse res = m.execute(req, _e.get());
  186. CPPUNIT_ASSERT_EQUAL(1, res.code);
  187. }
  188. void XmlRpcMethodTest::testAddUri_withBadOption()
  189. {
  190. AddUriXmlRpcMethod m;
  191. XmlRpcRequest req(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  192. req.params << BDE::list();
  193. req.params[0] << BDE("http://localhost");
  194. BDE opt = BDE::dict();
  195. opt[PREF_FILE_ALLOCATION] = BDE("badvalue");
  196. req.params << opt;
  197. XmlRpcResponse res = m.execute(req, _e.get());
  198. CPPUNIT_ASSERT_EQUAL(1, res.code);
  199. }
  200. void XmlRpcMethodTest::testAddUri_withPosition()
  201. {
  202. AddUriXmlRpcMethod m;
  203. XmlRpcRequest req1(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  204. req1.params << BDE::list();
  205. req1.params[0] << BDE("http://uri1");
  206. XmlRpcResponse res1 = m.execute(req1, _e.get());
  207. CPPUNIT_ASSERT_EQUAL(0, res1.code);
  208. XmlRpcRequest req2(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  209. req2.params << BDE::list();
  210. req2.params[0] << BDE("http://uri2");
  211. req2.params << BDE::dict();
  212. req2.params << BDE((int64_t)0);
  213. m.execute(req2, _e.get());
  214. std::string uri =
  215. _e->getRequestGroupMan()->getReservedGroups()[0]->
  216. getDownloadContext()->getFirstFileEntry()->getRemainingUris()[0];
  217. CPPUNIT_ASSERT_EQUAL(std::string("http://uri2"), uri);
  218. }
  219. void XmlRpcMethodTest::testAddUri_withBadPosition()
  220. {
  221. AddUriXmlRpcMethod m;
  222. XmlRpcRequest req(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  223. req.params << BDE::list();
  224. req.params[0] << BDE("http://localhost/");
  225. req.params << BDE::dict();
  226. req.params << BDE((int64_t)-1);
  227. XmlRpcResponse res = m.execute(req, _e.get());
  228. CPPUNIT_ASSERT_EQUAL(1, res.code);
  229. }
  230. #ifdef ENABLE_BITTORRENT
  231. void XmlRpcMethodTest::testAddTorrent()
  232. {
  233. AddTorrentXmlRpcMethod m;
  234. XmlRpcRequest req(AddTorrentXmlRpcMethod::getMethodName(), BDE::list());
  235. req.params << BDE(readFile("single.torrent"));
  236. BDE uris = BDE::list();
  237. uris << BDE("http://localhost/aria2-0.8.2.tar.bz2");
  238. req.params << uris;
  239. {
  240. XmlRpcResponse res = m.execute(req, _e.get());
  241. CPPUNIT_ASSERT_EQUAL(0, res.code);
  242. CPPUNIT_ASSERT_EQUAL(std::string("1"), res.param.s());
  243. SharedHandle<RequestGroup> group =
  244. _e->getRequestGroupMan()->findReservedGroup(1);
  245. CPPUNIT_ASSERT(!group.isNull());
  246. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-0.8.2.tar.bz2"),
  247. group->getFirstFilePath());
  248. CPPUNIT_ASSERT_EQUAL((size_t)1,
  249. group->getDownloadContext()->getFirstFileEntry()->
  250. getRemainingUris().size());
  251. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/aria2-0.8.2.tar.bz2"),
  252. group->getDownloadContext()->getFirstFileEntry()->
  253. getRemainingUris()[0]);
  254. }
  255. // with options
  256. BDE opt = BDE::dict();
  257. opt[PREF_DIR] = BDE("/sink");
  258. req.params << opt;
  259. {
  260. XmlRpcResponse res = m.execute(req, _e.get());
  261. CPPUNIT_ASSERT_EQUAL(0, res.code);
  262. CPPUNIT_ASSERT_EQUAL(std::string("/sink/aria2-0.8.2.tar.bz2"),
  263. _e->getRequestGroupMan()->findReservedGroup(2)->
  264. getFirstFilePath());
  265. }
  266. }
  267. void XmlRpcMethodTest::testAddTorrent_withoutTorrent()
  268. {
  269. AddTorrentXmlRpcMethod m;
  270. XmlRpcRequest req(AddTorrentXmlRpcMethod::getMethodName(), BDE::list());
  271. XmlRpcResponse res = m.execute(req, _e.get());
  272. CPPUNIT_ASSERT_EQUAL(1, res.code);
  273. }
  274. void XmlRpcMethodTest::testAddTorrent_notBase64Torrent()
  275. {
  276. AddTorrentXmlRpcMethod m;
  277. XmlRpcRequest req(AddTorrentXmlRpcMethod::getMethodName(), BDE::list());
  278. req.params << BDE("not torrent");
  279. XmlRpcResponse res = m.execute(req, _e.get());
  280. CPPUNIT_ASSERT_EQUAL(1, res.code);
  281. }
  282. void XmlRpcMethodTest::testAddTorrent_withPosition()
  283. {
  284. AddTorrentXmlRpcMethod m;
  285. XmlRpcRequest req1(AddTorrentXmlRpcMethod::getMethodName(), BDE::list());
  286. req1.params << BDE(readFile("test.torrent"));
  287. req1.params << BDE::list();
  288. req1.params << BDE::dict();
  289. XmlRpcResponse res1 = m.execute(req1, _e.get());
  290. CPPUNIT_ASSERT_EQUAL(0, res1.code);
  291. XmlRpcRequest req2(AddTorrentXmlRpcMethod::getMethodName(), BDE::list());
  292. req2.params << BDE(readFile("single.torrent"));
  293. req2.params << BDE::list();
  294. req2.params << BDE::dict();
  295. req2.params << BDE((int64_t)0);
  296. m.execute(req2, _e.get());
  297. CPPUNIT_ASSERT_EQUAL((size_t)1,
  298. _e->getRequestGroupMan()->getReservedGroups()[0]->
  299. getDownloadContext()->getFileEntries().size());
  300. }
  301. #endif // ENABLE_BITTORRENT
  302. #ifdef ENABLE_METALINK
  303. void XmlRpcMethodTest::testAddMetalink()
  304. {
  305. AddMetalinkXmlRpcMethod m;
  306. XmlRpcRequest req(AddMetalinkXmlRpcMethod::getMethodName(), BDE::list());
  307. req.params << BDE(readFile("2files.metalink"));
  308. {
  309. XmlRpcResponse res = m.execute(req, _e.get());
  310. CPPUNIT_ASSERT_EQUAL(0, res.code);
  311. CPPUNIT_ASSERT_EQUAL((size_t)2, res.param.size());
  312. CPPUNIT_ASSERT_EQUAL(std::string("1"), res.param[0].s());
  313. CPPUNIT_ASSERT_EQUAL(std::string("2"), res.param[1].s());
  314. SharedHandle<RequestGroup> tar =
  315. _e->getRequestGroupMan()->findReservedGroup(1);
  316. CPPUNIT_ASSERT(!tar.isNull());
  317. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.tar.bz2"),
  318. tar->getFirstFilePath());
  319. SharedHandle<RequestGroup> deb =
  320. _e->getRequestGroupMan()->findReservedGroup(2);
  321. CPPUNIT_ASSERT(!deb.isNull());
  322. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.deb"),
  323. deb->getFirstFilePath());
  324. }
  325. // with options
  326. BDE opt = BDE::dict();
  327. opt[PREF_DIR] = BDE("/sink");
  328. req.params << opt;
  329. {
  330. XmlRpcResponse res = m.execute(req, _e.get());
  331. CPPUNIT_ASSERT_EQUAL(0, res.code);
  332. CPPUNIT_ASSERT_EQUAL(std::string("/sink/aria2-5.0.0.tar.bz2"),
  333. _e->getRequestGroupMan()->findReservedGroup(3)->
  334. getFirstFilePath());
  335. }
  336. }
  337. void XmlRpcMethodTest::testAddMetalink_withoutMetalink()
  338. {
  339. AddMetalinkXmlRpcMethod m;
  340. XmlRpcRequest req(AddMetalinkXmlRpcMethod::getMethodName(), BDE::list());
  341. XmlRpcResponse res = m.execute(req, _e.get());
  342. CPPUNIT_ASSERT_EQUAL(1, res.code);
  343. }
  344. void XmlRpcMethodTest::testAddMetalink_notBase64Metalink()
  345. {
  346. AddMetalinkXmlRpcMethod m;
  347. XmlRpcRequest req(AddMetalinkXmlRpcMethod::getMethodName(), BDE::list());
  348. req.params << BDE("not metalink");
  349. XmlRpcResponse res = m.execute(req, _e.get());
  350. CPPUNIT_ASSERT_EQUAL(1, res.code);
  351. }
  352. void XmlRpcMethodTest::testAddMetalink_withPosition()
  353. {
  354. AddUriXmlRpcMethod m1;
  355. XmlRpcRequest req1(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  356. req1.params << BDE::list();
  357. req1.params[0] << BDE("http://uri");
  358. XmlRpcResponse res1 = m1.execute(req1, _e.get());
  359. CPPUNIT_ASSERT_EQUAL(0, res1.code);
  360. AddMetalinkXmlRpcMethod m2;
  361. XmlRpcRequest req2("ari2.addMetalink", BDE::list());
  362. req2.params << BDE(readFile("2files.metalink"));
  363. req2.params << BDE::dict();
  364. req2.params << BDE((int64_t)0);
  365. XmlRpcResponse res2 = m2.execute(req2, _e.get());
  366. CPPUNIT_ASSERT_EQUAL(0, res2.code);
  367. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.tar.bz2"),
  368. _e->getRequestGroupMan()->getReservedGroups()[0]->
  369. getFirstFilePath());
  370. }
  371. #endif // ENABLE_METALINK
  372. void XmlRpcMethodTest::testChangeOption()
  373. {
  374. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  375. _e->getRequestGroupMan()->addReservedGroup(group);
  376. ChangeOptionXmlRpcMethod m;
  377. XmlRpcRequest req(ChangeOptionXmlRpcMethod::getMethodName(), BDE::list());
  378. req.params << BDE("1");
  379. BDE opt = BDE::dict();
  380. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("100K");
  381. #ifdef ENABLE_BITTORRENT
  382. opt[PREF_BT_MAX_PEERS] = BDE("100");
  383. opt[PREF_BT_REQUEST_PEER_SPEED_LIMIT] = BDE("300K");
  384. opt[PREF_MAX_UPLOAD_LIMIT] = BDE("50K");
  385. BtObject btObject;
  386. btObject._btRuntime = SharedHandle<BtRuntime>(new BtRuntime());
  387. _e->getBtRegistry()->put(group->getGID(), btObject);
  388. #endif // ENABLE_BITTORRENT
  389. req.params << opt;
  390. XmlRpcResponse res = m.execute(req, _e.get());
  391. SharedHandle<Option> option = group->getOption();
  392. CPPUNIT_ASSERT_EQUAL(0, res.code);
  393. CPPUNIT_ASSERT_EQUAL((unsigned int)100*1024,
  394. group->getMaxDownloadSpeedLimit());
  395. CPPUNIT_ASSERT_EQUAL(std::string("102400"),
  396. option->get(PREF_MAX_DOWNLOAD_LIMIT));
  397. #ifdef ENABLE_BITTORRENT
  398. CPPUNIT_ASSERT_EQUAL(std::string("307200"),
  399. option->get(PREF_BT_REQUEST_PEER_SPEED_LIMIT));
  400. CPPUNIT_ASSERT_EQUAL(std::string("100"), option->get(PREF_BT_MAX_PEERS));
  401. CPPUNIT_ASSERT_EQUAL((unsigned int)100, btObject._btRuntime->getMaxPeers());
  402. CPPUNIT_ASSERT_EQUAL((unsigned int)50*1024,
  403. group->getMaxUploadSpeedLimit());
  404. CPPUNIT_ASSERT_EQUAL(std::string("51200"),
  405. option->get(PREF_MAX_UPLOAD_LIMIT));
  406. #endif // ENABLE_BITTORRENT
  407. }
  408. void XmlRpcMethodTest::testChangeOption_withBadOption()
  409. {
  410. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  411. _e->getRequestGroupMan()->addReservedGroup(group);
  412. ChangeOptionXmlRpcMethod m;
  413. XmlRpcRequest req(ChangeOptionXmlRpcMethod::getMethodName(), BDE::list());
  414. req.params << BDE("1");
  415. BDE opt = BDE::dict();
  416. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("badvalue");
  417. req.params << opt;
  418. XmlRpcResponse res = m.execute(req, _e.get());
  419. CPPUNIT_ASSERT_EQUAL(1, res.code);
  420. }
  421. void XmlRpcMethodTest::testChangeOption_withNotAllowedOption()
  422. {
  423. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  424. _e->getRequestGroupMan()->addReservedGroup(group);
  425. ChangeOptionXmlRpcMethod m;
  426. XmlRpcRequest req(ChangeOptionXmlRpcMethod::getMethodName(), BDE::list());
  427. req.params << BDE("1");
  428. BDE opt = BDE::dict();
  429. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("100K");
  430. req.params << opt;
  431. XmlRpcResponse res = m.execute(req, _e.get());
  432. CPPUNIT_ASSERT_EQUAL(1, res.code);
  433. }
  434. void XmlRpcMethodTest::testChangeOption_withoutGid()
  435. {
  436. ChangeOptionXmlRpcMethod m;
  437. XmlRpcRequest req(ChangeOptionXmlRpcMethod::getMethodName(), BDE::list());
  438. XmlRpcResponse res = m.execute(req, _e.get());
  439. CPPUNIT_ASSERT_EQUAL(1, res.code);
  440. }
  441. void XmlRpcMethodTest::testChangeGlobalOption()
  442. {
  443. ChangeGlobalOptionXmlRpcMethod m;
  444. XmlRpcRequest req
  445. (ChangeGlobalOptionXmlRpcMethod::getMethodName(), BDE::list());
  446. BDE opt = BDE::dict();
  447. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("100K");
  448. #ifdef ENABLE_BITTORRENT
  449. opt[PREF_MAX_OVERALL_UPLOAD_LIMIT] = BDE("50K");
  450. #endif // ENABLE_BITTORRENT
  451. req.params << opt;
  452. XmlRpcResponse res = m.execute(req, _e.get());
  453. CPPUNIT_ASSERT_EQUAL(0, res.code);
  454. CPPUNIT_ASSERT_EQUAL
  455. ((unsigned int)100*1024,
  456. _e->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit());
  457. CPPUNIT_ASSERT_EQUAL(std::string("102400"),
  458. _e->getOption()->get(PREF_MAX_OVERALL_DOWNLOAD_LIMIT));
  459. #ifdef ENABLE_BITTORRENT
  460. CPPUNIT_ASSERT_EQUAL
  461. ((unsigned int)50*1024,
  462. _e->getRequestGroupMan()->getMaxOverallUploadSpeedLimit());
  463. CPPUNIT_ASSERT_EQUAL(std::string("51200"),
  464. _e->getOption()->get(PREF_MAX_OVERALL_UPLOAD_LIMIT));
  465. #endif // ENABLE_BITTORRENT
  466. }
  467. void XmlRpcMethodTest::testChangeGlobalOption_withBadOption()
  468. {
  469. ChangeGlobalOptionXmlRpcMethod m;
  470. XmlRpcRequest req
  471. (ChangeGlobalOptionXmlRpcMethod::getMethodName(), BDE::list());
  472. BDE opt = BDE::dict();
  473. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("badvalue");
  474. req.params << opt;
  475. XmlRpcResponse res = m.execute(req, _e.get());
  476. CPPUNIT_ASSERT_EQUAL(1, res.code);
  477. }
  478. void XmlRpcMethodTest::testChangeGlobalOption_withNotAllowedOption()
  479. {
  480. ChangeGlobalOptionXmlRpcMethod m;
  481. XmlRpcRequest req
  482. (ChangeGlobalOptionXmlRpcMethod::getMethodName(), BDE::list());
  483. BDE opt = BDE::dict();
  484. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("100K");
  485. req.params << opt;
  486. XmlRpcResponse res = m.execute(req, _e.get());
  487. CPPUNIT_ASSERT_EQUAL(1, res.code);
  488. }
  489. void XmlRpcMethodTest::testNoSuchMethod()
  490. {
  491. NoSuchMethodXmlRpcMethod m;
  492. XmlRpcRequest req("make.hamburger", BDE::none);
  493. XmlRpcResponse res = m.execute(req, 0);
  494. CPPUNIT_ASSERT_EQUAL(1, res.code);
  495. CPPUNIT_ASSERT_EQUAL(std::string("No such method: make.hamburger"),
  496. res.param["faultString"].s());
  497. CPPUNIT_ASSERT_EQUAL
  498. (std::string("<?xml version=\"1.0\"?>"
  499. "<methodResponse>"
  500. "<fault>"
  501. "<value>"
  502. "<struct>"
  503. "<member>"
  504. "<name>faultCode</name><value><int>1</int></value>"
  505. "</member>"
  506. "<member>"
  507. "<name>faultString</name>"
  508. "<value>"
  509. "<string>No such method: make.hamburger</string>"
  510. "</value>"
  511. "</member>"
  512. "</struct>"
  513. "</value>"
  514. "</fault>"
  515. "</methodResponse>"),
  516. res.toXml());
  517. }
  518. void XmlRpcMethodTest::testTellStatus_withoutGid()
  519. {
  520. TellStatusXmlRpcMethod m;
  521. XmlRpcRequest req(TellStatusXmlRpcMethod::getMethodName(), BDE::list());
  522. XmlRpcResponse res = m.execute(req, _e.get());
  523. CPPUNIT_ASSERT_EQUAL(1, res.code);
  524. }
  525. static void addUri(const std::string& uri,
  526. const SharedHandle<DownloadEngine>& e)
  527. {
  528. AddUriXmlRpcMethod m;
  529. XmlRpcRequest req(AddUriXmlRpcMethod::getMethodName(), BDE::list());
  530. req.params << BDE::list();
  531. req.params[0] << BDE(uri);
  532. CPPUNIT_ASSERT_EQUAL(0, m.execute(req, e.get()).code);
  533. }
  534. #ifdef ENABLE_BITTORRENT
  535. static void addTorrent
  536. (const std::string& torrentFile, const SharedHandle<DownloadEngine>& e)
  537. {
  538. AddTorrentXmlRpcMethod m;
  539. XmlRpcRequest req(AddTorrentXmlRpcMethod::getMethodName(), BDE::list());
  540. req.params << BDE(readFile(torrentFile));
  541. XmlRpcResponse res = m.execute(req, e.get());
  542. }
  543. #endif // ENABLE_BITTORRENT
  544. void XmlRpcMethodTest::testTellWaiting()
  545. {
  546. addUri("http://1/", _e);
  547. addUri("http://2/", _e);
  548. addUri("http://3/", _e);
  549. #ifdef ENABLE_BITTORRENT
  550. addTorrent("single.torrent", _e);
  551. #else // !ENABLE_BITTORRENT
  552. addUri("http://4/", _e);
  553. #endif // !ENABLE_BITTORRENT
  554. TellWaitingXmlRpcMethod m;
  555. XmlRpcRequest req(TellWaitingXmlRpcMethod::getMethodName(), BDE::list());
  556. req.params << BDE((int64_t)1);
  557. req.params << BDE((int64_t)2);
  558. XmlRpcResponse res = m.execute(req, _e.get());
  559. CPPUNIT_ASSERT_EQUAL(0, res.code);
  560. CPPUNIT_ASSERT_EQUAL((size_t)2, res.param.size());
  561. CPPUNIT_ASSERT_EQUAL(std::string("2"), res.param[0]["gid"].s());
  562. CPPUNIT_ASSERT_EQUAL(std::string("3"), res.param[1]["gid"].s());
  563. // waiting.size() == offset+num
  564. req = XmlRpcRequest(TellWaitingXmlRpcMethod::getMethodName(), BDE::list());
  565. req.params << BDE((int64_t)1);
  566. req.params << BDE((int64_t)3);
  567. res = m.execute(req, _e.get());
  568. CPPUNIT_ASSERT_EQUAL(0, res.code);
  569. CPPUNIT_ASSERT_EQUAL((size_t)3, res.param.size());
  570. // waiting.size() < offset+num
  571. req = XmlRpcRequest(TellWaitingXmlRpcMethod::getMethodName(), BDE::list());
  572. req.params << BDE((int64_t)1);
  573. req.params << BDE((int64_t)4);
  574. res = m.execute(req, _e.get());
  575. CPPUNIT_ASSERT_EQUAL(0, res.code);
  576. CPPUNIT_ASSERT_EQUAL((size_t)3, res.param.size());
  577. // negative offset
  578. req = XmlRpcRequest(TellWaitingXmlRpcMethod::getMethodName(), BDE::list());
  579. req.params << BDE((int64_t)-1);
  580. req.params << BDE((int64_t)2);
  581. res = m.execute(req, _e.get());
  582. CPPUNIT_ASSERT_EQUAL(0, res.code);
  583. CPPUNIT_ASSERT_EQUAL((size_t)2, res.param.size());
  584. CPPUNIT_ASSERT_EQUAL(std::string("4"), res.param[0]["gid"].s());
  585. CPPUNIT_ASSERT_EQUAL(std::string("3"), res.param[1]["gid"].s());
  586. // negative offset and size < num
  587. req.params[1] = BDE((int64_t)100);
  588. res = m.execute(req, _e.get());
  589. CPPUNIT_ASSERT_EQUAL(0, res.code);
  590. CPPUNIT_ASSERT_EQUAL((size_t)4, res.param.size());
  591. // nagative offset and normalized offset < 0
  592. req.params[0] = BDE((int64_t)-5);
  593. res = m.execute(req, _e.get());
  594. CPPUNIT_ASSERT_EQUAL(0, res.code);
  595. CPPUNIT_ASSERT_EQUAL((size_t)0, res.param.size());
  596. // nagative offset and normalized offset == 0
  597. req.params[0] = BDE((int64_t)-4);
  598. res = m.execute(req, _e.get());
  599. CPPUNIT_ASSERT_EQUAL(0, res.code);
  600. CPPUNIT_ASSERT_EQUAL((size_t)1, res.param.size());
  601. }
  602. void XmlRpcMethodTest::testTellWaiting_fail()
  603. {
  604. TellWaitingXmlRpcMethod m;
  605. XmlRpcRequest req(TellWaitingXmlRpcMethod::getMethodName(), BDE::list());
  606. XmlRpcResponse res = m.execute(req, _e.get());
  607. CPPUNIT_ASSERT_EQUAL(1, res.code);
  608. }
  609. void XmlRpcMethodTest::testGetVersion()
  610. {
  611. GetVersionXmlRpcMethod m;
  612. XmlRpcRequest req(GetVersionXmlRpcMethod::getMethodName(), BDE::none);
  613. XmlRpcResponse res = m.execute(req, _e.get());
  614. CPPUNIT_ASSERT_EQUAL(0, res.code);
  615. CPPUNIT_ASSERT_EQUAL(std::string(PACKAGE_VERSION), res.param["version"].s());
  616. const BDE& featureList = res.param["enabledFeatures"];
  617. std::string features;
  618. for(BDE::List::const_iterator i = featureList.listBegin();
  619. i != featureList.listEnd(); ++i) {
  620. features += (*i).s();
  621. features += ", ";
  622. }
  623. CPPUNIT_ASSERT_EQUAL(FeatureConfig::getInstance()->featureSummary()+", ",
  624. features);
  625. }
  626. void XmlRpcMethodTest::testGatherStoppedDownload()
  627. {
  628. std::vector<SharedHandle<FileEntry> > fileEntries;
  629. std::vector<gid_t> followedBy;
  630. followedBy.push_back(3);
  631. followedBy.push_back(4);
  632. SharedHandle<DownloadResult> d(new DownloadResult());
  633. d->gid = 1;
  634. d->fileEntries = fileEntries;
  635. d->inMemoryDownload = false;
  636. d->sessionDownloadLength = UINT64_MAX;
  637. d->sessionTime = 1000;
  638. d->result = downloadresultcode::FINISHED;
  639. d->followedBy = followedBy;
  640. d->belongsTo = 2;
  641. BDE entry = BDE::dict();
  642. gatherStoppedDownload(entry, d);
  643. CPPUNIT_ASSERT_EQUAL(std::string("3"), entry["followedBy"][0].s());
  644. CPPUNIT_ASSERT_EQUAL(std::string("4"), entry["followedBy"][1].s());
  645. CPPUNIT_ASSERT_EQUAL(std::string("2"), entry["belongsTo"].s());
  646. }
  647. void XmlRpcMethodTest::testGatherProgressCommon()
  648. {
  649. SharedHandle<DownloadContext> dctx(new DownloadContext(0, 0,"aria2.tar.bz2"));
  650. std::string uris[] = { "http://localhost/aria2.tar.bz2" };
  651. dctx->getFirstFileEntry()->addUris(vbegin(uris), vend(uris));
  652. dctx->setDir(_option->get(PREF_DIR));
  653. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  654. group->setDownloadContext(dctx);
  655. std::vector<SharedHandle<RequestGroup> > followedBy;
  656. for(int i = 0; i < 2; ++i) {
  657. followedBy.push_back(SharedHandle<RequestGroup>(new RequestGroup(_option)));
  658. }
  659. group->followedBy(followedBy.begin(), followedBy.end());
  660. group->belongsTo(2);
  661. BDE entry = BDE::dict();
  662. gatherProgressCommon(entry, group);
  663. CPPUNIT_ASSERT_EQUAL(util::itos(followedBy[0]->getGID()),
  664. entry["followedBy"][0].s());
  665. CPPUNIT_ASSERT_EQUAL(util::itos(followedBy[1]->getGID()),
  666. entry["followedBy"][1].s());
  667. CPPUNIT_ASSERT_EQUAL(std::string("2"), entry["belongsTo"].s());
  668. CPPUNIT_ASSERT_EQUAL((size_t)1, entry["files"].size());
  669. CPPUNIT_ASSERT_EQUAL(std::string("aria2.tar.bz2"),
  670. entry["files"][0]["path"].s());
  671. CPPUNIT_ASSERT_EQUAL(uris[0], entry["files"][0]["uris"][0]["uri"].s());
  672. CPPUNIT_ASSERT_EQUAL(std::string("/tmp"), entry["dir"].s());
  673. }
  674. #ifdef ENABLE_BITTORRENT
  675. void XmlRpcMethodTest::testGatherBitTorrentMetadata()
  676. {
  677. SharedHandle<DownloadContext> dctx(new DownloadContext());
  678. bittorrent::load("test.torrent", dctx);
  679. BDE btDict = BDE::dict();
  680. gatherBitTorrentMetadata(btDict, bittorrent::getTorrentAttrs(dctx));
  681. CPPUNIT_ASSERT_EQUAL(std::string("REDNOAH.COM RULES"), btDict["comment"].s());
  682. CPPUNIT_ASSERT_EQUAL((int64_t)1123456789, btDict["creationDate"].i());
  683. CPPUNIT_ASSERT_EQUAL(std::string("multi"), btDict["mode"].s());
  684. CPPUNIT_ASSERT_EQUAL(std::string("aria2-test"), btDict["info"]["name"].s());
  685. const BDE& announceList = btDict["announceList"];
  686. CPPUNIT_ASSERT_EQUAL((size_t)3, announceList.size());
  687. CPPUNIT_ASSERT_EQUAL(std::string("http://tracker1"), announceList[0][0].s());
  688. CPPUNIT_ASSERT_EQUAL(std::string("http://tracker2"), announceList[1][0].s());
  689. CPPUNIT_ASSERT_EQUAL(std::string("http://tracker3"), announceList[2][0].s());
  690. // Remove some keys
  691. SharedHandle<TorrentAttribute> modBtAttrs = bittorrent::getTorrentAttrs(dctx);
  692. modBtAttrs->comment.clear();
  693. modBtAttrs->creationDate = 0;
  694. modBtAttrs->mode.clear();
  695. modBtAttrs->metadata.clear();
  696. btDict = BDE::dict();
  697. gatherBitTorrentMetadata(btDict, modBtAttrs);
  698. CPPUNIT_ASSERT(!btDict.containsKey("comment"));
  699. CPPUNIT_ASSERT(!btDict.containsKey("creationDate"));
  700. CPPUNIT_ASSERT(!btDict.containsKey("mode"));
  701. CPPUNIT_ASSERT(!btDict.containsKey("info"));
  702. CPPUNIT_ASSERT(btDict.containsKey("announceList"));
  703. }
  704. #endif // ENABLE_BITTORRENT
  705. void XmlRpcMethodTest::testChangePosition()
  706. {
  707. _e->getRequestGroupMan()->addReservedGroup
  708. (SharedHandle<RequestGroup>(new RequestGroup(_option)));
  709. _e->getRequestGroupMan()->addReservedGroup
  710. (SharedHandle<RequestGroup>(new RequestGroup(_option)));
  711. ChangePositionXmlRpcMethod m;
  712. XmlRpcRequest req(ChangePositionXmlRpcMethod::getMethodName(), BDE::list());
  713. req.params << std::string("1");
  714. req.params << BDE((int64_t)1);
  715. req.params << std::string("POS_SET");
  716. XmlRpcResponse res = m.execute(req, _e.get());
  717. CPPUNIT_ASSERT_EQUAL(0, res.code);
  718. CPPUNIT_ASSERT_EQUAL((int64_t)1, res.param.i());
  719. CPPUNIT_ASSERT_EQUAL
  720. ((gid_t)1, _e->getRequestGroupMan()->getReservedGroups()[1]->getGID());
  721. }
  722. void XmlRpcMethodTest::testChangePosition_fail()
  723. {
  724. ChangePositionXmlRpcMethod m;
  725. XmlRpcRequest req(ChangePositionXmlRpcMethod::getMethodName(), BDE::list());
  726. XmlRpcResponse res = m.execute(req, _e.get());
  727. CPPUNIT_ASSERT_EQUAL(1, res.code);
  728. req.params << std::string("1");
  729. req.params << BDE((int64_t)2);
  730. req.params << std::string("bad keyword");
  731. CPPUNIT_ASSERT_EQUAL(1, res.code);
  732. }
  733. void XmlRpcMethodTest::testChangeUri()
  734. {
  735. SharedHandle<FileEntry> files[3];
  736. for(int i = 0; i < 3; ++i) {
  737. files[i].reset(new FileEntry());
  738. }
  739. files[1]->addUri("http://example.org/aria2.tar.bz2");
  740. files[1]->addUri("http://example.org/mustremove1");
  741. files[1]->addUri("http://example.org/mustremove2");
  742. SharedHandle<DownloadContext> dctx(new DownloadContext());
  743. dctx->setFileEntries(&files[0], &files[3]);
  744. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  745. group->setDownloadContext(dctx);
  746. _e->getRequestGroupMan()->addReservedGroup(group);
  747. ChangeUriXmlRpcMethod m;
  748. XmlRpcRequest req(ChangeUriXmlRpcMethod::getMethodName(), BDE::list());
  749. req.params << std::string("1"); // GID
  750. req.params << 2; // index of FileEntry
  751. BDE removeuris = BDE::list();
  752. removeuris << std::string("http://example.org/mustremove1");
  753. removeuris << std::string("http://example.org/mustremove2");
  754. removeuris << std::string("http://example.org/notexist");
  755. req.params << removeuris;
  756. BDE adduris = BDE::list();
  757. adduris << std::string("http://example.org/added1");
  758. adduris << std::string("http://example.org/added2");
  759. adduris << std::string("baduri");
  760. adduris << std::string("http://example.org/added3");
  761. req.params << adduris;
  762. XmlRpcResponse res = m.execute(req, _e.get());
  763. CPPUNIT_ASSERT_EQUAL(0, res.code);
  764. CPPUNIT_ASSERT_EQUAL((int64_t)2, res.param[0].i());
  765. CPPUNIT_ASSERT_EQUAL((int64_t)3, res.param[1].i());
  766. CPPUNIT_ASSERT_EQUAL((size_t)0, files[0]->getRemainingUris().size());
  767. CPPUNIT_ASSERT_EQUAL((size_t)0, files[2]->getRemainingUris().size());
  768. std::deque<std::string> uris = files[1]->getRemainingUris();
  769. CPPUNIT_ASSERT_EQUAL((size_t)4, uris.size());
  770. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/aria2.tar.bz2"),uris[0]);
  771. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1"), uris[1]);
  772. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added2"), uris[2]);
  773. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added3"), uris[3]);
  774. // Change adduris
  775. adduris = BDE::list();
  776. adduris << std::string("http://example.org/added1-1");
  777. adduris << std::string("http://example.org/added1-2");
  778. req.params[3] = adduris;
  779. // Set position parameter
  780. req.params << 2;
  781. res = m.execute(req, _e.get());
  782. CPPUNIT_ASSERT_EQUAL(0, res.code);
  783. CPPUNIT_ASSERT_EQUAL((int64_t)0, res.param[0].i());
  784. CPPUNIT_ASSERT_EQUAL((int64_t)2, res.param[1].i());
  785. uris = files[1]->getRemainingUris();
  786. CPPUNIT_ASSERT_EQUAL((size_t)6, uris.size());
  787. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-1"), uris[2]);
  788. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-2"), uris[3]);
  789. // Change index of FileEntry
  790. req.params[1] = 1;
  791. // Set position far beyond the size of uris in FileEntry.
  792. req.params[4] = 1000;
  793. res = m.execute(req, _e.get());
  794. CPPUNIT_ASSERT_EQUAL(0, res.code);
  795. CPPUNIT_ASSERT_EQUAL((int64_t)0, res.param[0].i());
  796. CPPUNIT_ASSERT_EQUAL((int64_t)2, res.param[1].i());
  797. uris = files[0]->getRemainingUris();
  798. CPPUNIT_ASSERT_EQUAL((size_t)2, uris.size());
  799. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-1"), uris[0]);
  800. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-2"), uris[1]);
  801. }
  802. void XmlRpcMethodTest::testChangeUri_fail()
  803. {
  804. SharedHandle<FileEntry> files[3];
  805. for(int i = 0; i < 3; ++i) {
  806. files[i].reset(new FileEntry());
  807. }
  808. SharedHandle<DownloadContext> dctx(new DownloadContext());
  809. dctx->setFileEntries(&files[0], &files[3]);
  810. SharedHandle<RequestGroup> group(new RequestGroup(_option));
  811. group->setDownloadContext(dctx);
  812. _e->getRequestGroupMan()->addReservedGroup(group);
  813. ChangeUriXmlRpcMethod m;
  814. XmlRpcRequest req(ChangeUriXmlRpcMethod::getMethodName(), BDE::list());
  815. req.params << std::string("1"); // GID
  816. req.params << 1; // index of FileEntry
  817. BDE removeuris = BDE::list();
  818. req.params << removeuris;
  819. BDE adduris = BDE::list();
  820. req.params << adduris;
  821. XmlRpcResponse res = m.execute(req, _e.get());
  822. CPPUNIT_ASSERT_EQUAL(0, res.code);
  823. req.params[0] = std::string("2");
  824. res = m.execute(req, _e.get());
  825. // RPC request fails because GID#2 does not exist.
  826. CPPUNIT_ASSERT_EQUAL(1, res.code);
  827. req.params[0] = std::string("1");
  828. req.params[1] = 4;
  829. res = m.execute(req, _e.get());
  830. // RPC request fails because FileEntry#3 does not exist.
  831. CPPUNIT_ASSERT_EQUAL(1, res.code);
  832. req.params[1] = std::string("0");
  833. res = m.execute(req, _e.get());
  834. // RPC request fails because index of FileEntry is string.
  835. CPPUNIT_ASSERT_EQUAL(1, res.code);
  836. req.params[1] = 1;
  837. req.params[2] = std::string("http://url");
  838. res = m.execute(req, _e.get());
  839. // RPC request fails because 3rd param is not list.
  840. CPPUNIT_ASSERT_EQUAL(1, res.code);
  841. req.params[2] = BDE::list();
  842. req.params[3] = std::string("http://url");
  843. res = m.execute(req, _e.get());
  844. // RPC request fails because 4th param is not list.
  845. CPPUNIT_ASSERT_EQUAL(1, res.code);
  846. }
  847. void XmlRpcMethodTest::testGetSessionInfo()
  848. {
  849. GetSessionInfoXmlRpcMethod m;
  850. XmlRpcRequest req(GetSessionInfoXmlRpcMethod::getMethodName(), BDE::list());
  851. XmlRpcResponse res = m.execute(req, _e.get());
  852. CPPUNIT_ASSERT_EQUAL(0, res.code);
  853. CPPUNIT_ASSERT_EQUAL(util::toHex(_e->getSessionId()),
  854. res.param["sessionId"].s());
  855. }
  856. void XmlRpcMethodTest::testPause()
  857. {
  858. const std::string URIS[] = {
  859. "http://url1",
  860. "http://url2",
  861. "http://url3",
  862. };
  863. std::vector<std::string> uris(vbegin(URIS), vend(URIS));
  864. _option->put(PREF_FORCE_SEQUENTIAL, V_TRUE);
  865. std::vector<SharedHandle<RequestGroup> > groups;
  866. createRequestGroupForUri(groups, _option, uris);
  867. CPPUNIT_ASSERT_EQUAL((size_t)3, groups.size());
  868. _e->getRequestGroupMan()->addReservedGroup(groups);
  869. {
  870. PauseXmlRpcMethod m;
  871. XmlRpcRequest req(PauseXmlRpcMethod::getMethodName(), BDE::list());
  872. req.params << std::string("1");
  873. XmlRpcResponse res = m.execute(req, _e.get());
  874. CPPUNIT_ASSERT_EQUAL(0, res.code);
  875. }
  876. CPPUNIT_ASSERT(groups[0]->isPauseRequested());
  877. {
  878. UnpauseXmlRpcMethod m;
  879. XmlRpcRequest req(UnpauseXmlRpcMethod::getMethodName(), BDE::list());
  880. req.params << std::string("1");
  881. XmlRpcResponse res = m.execute(req, _e.get());
  882. CPPUNIT_ASSERT_EQUAL(0, res.code);
  883. }
  884. CPPUNIT_ASSERT(!groups[0]->isPauseRequested());
  885. {
  886. PauseAllXmlRpcMethod m;
  887. XmlRpcRequest req(PauseAllXmlRpcMethod::getMethodName(), BDE::list());
  888. XmlRpcResponse res = m.execute(req, _e.get());
  889. CPPUNIT_ASSERT_EQUAL(0, res.code);
  890. }
  891. for(size_t i = 0; i < groups.size(); ++i) {
  892. CPPUNIT_ASSERT(groups[i]->isPauseRequested());
  893. }
  894. {
  895. UnpauseAllXmlRpcMethod m;
  896. XmlRpcRequest req(UnpauseAllXmlRpcMethod::getMethodName(), BDE::list());
  897. XmlRpcResponse res = m.execute(req, _e.get());
  898. CPPUNIT_ASSERT_EQUAL(0, res.code);
  899. }
  900. for(size_t i = 0; i < groups.size(); ++i) {
  901. CPPUNIT_ASSERT(!groups[i]->isPauseRequested());
  902. }
  903. {
  904. ForcePauseAllXmlRpcMethod m;
  905. XmlRpcRequest req(ForcePauseAllXmlRpcMethod::getMethodName(), BDE::list());
  906. XmlRpcResponse res = m.execute(req, _e.get());
  907. CPPUNIT_ASSERT_EQUAL(0, res.code);
  908. }
  909. for(size_t i = 0; i < groups.size(); ++i) {
  910. CPPUNIT_ASSERT(groups[i]->isPauseRequested());
  911. }
  912. }
  913. void XmlRpcMethodTest::testSystemMulticall()
  914. {
  915. SystemMulticallXmlRpcMethod m;
  916. XmlRpcRequest req("system.multicall", BDE::list());
  917. BDE reqparams = BDE::list();
  918. req.params << reqparams;
  919. for(int i = 0; i < 2; ++i) {
  920. BDE dict = BDE::dict();
  921. dict["methodName"] = std::string(AddUriXmlRpcMethod::getMethodName());
  922. BDE params = BDE::list();
  923. params << BDE::list();
  924. params[0] << BDE("http://localhost/"+util::itos(i));
  925. dict["params"] = params;
  926. reqparams << dict;
  927. }
  928. {
  929. BDE dict = BDE::dict();
  930. dict["methodName"] = std::string("not exists");
  931. dict["params"] = BDE::list();
  932. reqparams << dict;
  933. }
  934. {
  935. reqparams << std::string("not struct");
  936. }
  937. {
  938. BDE dict = BDE::dict();
  939. dict["methodName"] = std::string("system.multicall");
  940. dict["params"] = BDE::list();
  941. reqparams << dict;
  942. }
  943. {
  944. // missing params
  945. BDE dict = BDE::dict();
  946. dict["methodName"] = std::string(GetVersionXmlRpcMethod::getMethodName());
  947. reqparams << dict;
  948. }
  949. {
  950. BDE dict = BDE::dict();
  951. dict["methodName"] = std::string(GetVersionXmlRpcMethod::getMethodName());
  952. dict["params"] = BDE::list();
  953. reqparams << dict;
  954. }
  955. XmlRpcResponse res = m.execute(req, _e.get());
  956. CPPUNIT_ASSERT_EQUAL(0, res.code);
  957. CPPUNIT_ASSERT_EQUAL((size_t)7, res.param.size());
  958. CPPUNIT_ASSERT_EQUAL(std::string("1"), res.param[0][0].s());
  959. CPPUNIT_ASSERT_EQUAL(std::string("2"), res.param[1][0].s());
  960. CPPUNIT_ASSERT_EQUAL((int64_t)1, res.param[2]["faultCode"].i());
  961. CPPUNIT_ASSERT_EQUAL((int64_t)1, res.param[3]["faultCode"].i());
  962. CPPUNIT_ASSERT_EQUAL((int64_t)1, res.param[4]["faultCode"].i());
  963. CPPUNIT_ASSERT_EQUAL((int64_t)1, res.param[5]["faultCode"].i());
  964. CPPUNIT_ASSERT(res.param[6].isList());
  965. }
  966. void XmlRpcMethodTest::testSystemMulticall_fail()
  967. {
  968. SystemMulticallXmlRpcMethod m;
  969. XmlRpcRequest req("system.multicall", BDE::list());
  970. XmlRpcResponse res = m.execute(req, _e.get());
  971. CPPUNIT_ASSERT_EQUAL(1, res.code);
  972. }
  973. } // namespace xmlrpc
  974. } // namespace aria2