XmlRpcMethodTest.cc 28 KB

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