XmlRpcMethodTest.cc 28 KB

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