XmlRpcMethodTest.cc 27 KB

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