XmlRpcMethodTest.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  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. namespace aria2 {
  19. namespace xmlrpc {
  20. class XmlRpcMethodTest:public CppUnit::TestFixture {
  21. CPPUNIT_TEST_SUITE(XmlRpcMethodTest);
  22. CPPUNIT_TEST(testAddUri);
  23. CPPUNIT_TEST(testAddUri_withoutUri);
  24. CPPUNIT_TEST(testAddUri_notUri);
  25. CPPUNIT_TEST(testAddUri_withBadOption);
  26. CPPUNIT_TEST(testAddUri_withPosition);
  27. CPPUNIT_TEST(testAddUri_withBadPosition);
  28. #ifdef ENABLE_BITTORRENT
  29. CPPUNIT_TEST(testAddTorrent);
  30. CPPUNIT_TEST(testAddTorrent_withoutTorrent);
  31. CPPUNIT_TEST(testAddTorrent_notBase64Torrent);
  32. CPPUNIT_TEST(testAddTorrent_withPosition);
  33. #endif // ENABLE_BITTORRENT
  34. #ifdef ENABLE_METALINK
  35. CPPUNIT_TEST(testAddMetalink);
  36. CPPUNIT_TEST(testAddMetalink_withoutMetalink);
  37. CPPUNIT_TEST(testAddMetalink_notBase64Metalink);
  38. CPPUNIT_TEST(testAddMetalink_withPosition);
  39. #endif // ENABLE_METALINK
  40. CPPUNIT_TEST(testChangeOption);
  41. CPPUNIT_TEST(testChangeOption_withBadOption);
  42. CPPUNIT_TEST(testChangeOption_withoutGid);
  43. CPPUNIT_TEST(testChangeGlobalOption);
  44. CPPUNIT_TEST(testChangeGlobalOption_withBadOption);
  45. CPPUNIT_TEST(testTellStatus_withoutGid);
  46. CPPUNIT_TEST(testTellWaiting);
  47. CPPUNIT_TEST(testTellWaiting_fail);
  48. CPPUNIT_TEST(testNoSuchMethod);
  49. CPPUNIT_TEST_SUITE_END();
  50. private:
  51. SharedHandle<DownloadEngine> _e;
  52. SharedHandle<Option> _option;
  53. public:
  54. void setUp()
  55. {
  56. RequestGroup::resetGIDCounter();
  57. _option.reset(new Option());
  58. _option->put(PREF_DIR, "/tmp");
  59. _option->put(PREF_SEGMENT_SIZE, "1048576");
  60. _e.reset(new DownloadEngine(SharedHandle<EventPoll>(new SelectEventPoll())));
  61. _e->option = _option.get();
  62. _e->_requestGroupMan.reset
  63. (new RequestGroupMan(std::deque<SharedHandle<RequestGroup> >(),
  64. 1, _option.get()));
  65. }
  66. void tearDown() {}
  67. void testAddUri();
  68. void testAddUri_withoutUri();
  69. void testAddUri_notUri();
  70. void testAddUri_withBadOption();
  71. void testAddUri_withPosition();
  72. void testAddUri_withBadPosition();
  73. #ifdef ENABLE_BITTORRENT
  74. void testAddTorrent();
  75. void testAddTorrent_withoutTorrent();
  76. void testAddTorrent_notBase64Torrent();
  77. void testAddTorrent_withPosition();
  78. #endif // ENABLE_BITTORRENT
  79. #ifdef ENABLE_METALINK
  80. void testAddMetalink();
  81. void testAddMetalink_withoutMetalink();
  82. void testAddMetalink_notBase64Metalink();
  83. void testAddMetalink_withPosition();
  84. #endif // ENABLE_METALINK
  85. void testChangeOption();
  86. void testChangeOption_withBadOption();
  87. void testChangeOption_withoutGid();
  88. void testChangeGlobalOption();
  89. void testChangeGlobalOption_withBadOption();
  90. void testTellStatus_withoutGid();
  91. void testTellWaiting();
  92. void testTellWaiting_fail();
  93. void testNoSuchMethod();
  94. };
  95. CPPUNIT_TEST_SUITE_REGISTRATION(XmlRpcMethodTest);
  96. void XmlRpcMethodTest::testAddUri()
  97. {
  98. AddUriXmlRpcMethod m;
  99. XmlRpcRequest req("aria2.addUri", BDE::list());
  100. req._params << BDE::list();
  101. req._params[0] << BDE("http://localhost/");
  102. {
  103. XmlRpcResponse res = m.execute(req, _e.get());
  104. CPPUNIT_ASSERT_EQUAL(0, res._code);
  105. const std::deque<SharedHandle<RequestGroup> > rgs =
  106. _e->_requestGroupMan->getReservedGroups();
  107. CPPUNIT_ASSERT_EQUAL((size_t)1, rgs.size());
  108. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/"),
  109. rgs.front()->getRemainingUris().front());
  110. }
  111. // with options
  112. BDE opt = BDE::dict();
  113. opt[PREF_DIR] = BDE("/sink");
  114. req._params << opt;
  115. {
  116. XmlRpcResponse res = m.execute(req, _e.get());
  117. CPPUNIT_ASSERT_EQUAL(0, res._code);
  118. CPPUNIT_ASSERT_EQUAL(std::string("/sink"),
  119. _e->_requestGroupMan->findReservedGroup(2)->
  120. getDownloadContext()->getDir());
  121. }
  122. }
  123. void XmlRpcMethodTest::testAddUri_withoutUri()
  124. {
  125. AddUriXmlRpcMethod m;
  126. XmlRpcRequest req("aria2.addUri", BDE::list());
  127. XmlRpcResponse res = m.execute(req, _e.get());
  128. CPPUNIT_ASSERT_EQUAL(1, res._code);
  129. }
  130. void XmlRpcMethodTest::testAddUri_notUri()
  131. {
  132. AddUriXmlRpcMethod m;
  133. XmlRpcRequest req("aria2.addUri", BDE::list());
  134. req._params << BDE::list();
  135. req._params[0] << BDE("not uri");
  136. XmlRpcResponse res = m.execute(req, _e.get());
  137. CPPUNIT_ASSERT_EQUAL(1, res._code);
  138. }
  139. void XmlRpcMethodTest::testAddUri_withBadOption()
  140. {
  141. AddUriXmlRpcMethod m;
  142. XmlRpcRequest req("aria2.addUri", BDE::list());
  143. req._params << BDE::list();
  144. req._params[0] << BDE("http://localhost");
  145. BDE opt = BDE::dict();
  146. opt[PREF_FILE_ALLOCATION] = BDE("badvalue");
  147. req._params << opt;
  148. XmlRpcResponse res = m.execute(req, _e.get());
  149. CPPUNIT_ASSERT_EQUAL(1, res._code);
  150. }
  151. void XmlRpcMethodTest::testAddUri_withPosition()
  152. {
  153. AddUriXmlRpcMethod m;
  154. XmlRpcRequest req1("aria2.addUri", BDE::list());
  155. req1._params << BDE::list();
  156. req1._params[0] << BDE("http://uri1");
  157. XmlRpcResponse res1 = m.execute(req1, _e.get());
  158. CPPUNIT_ASSERT_EQUAL(0, res1._code);
  159. XmlRpcRequest req2("aria2.addUri", BDE::list());
  160. req2._params << BDE::list();
  161. req2._params[0] << BDE("http://uri2");
  162. req2._params << BDE::dict();
  163. req2._params << BDE((int64_t)0);
  164. m.execute(req2, _e.get());
  165. std::string uri =
  166. _e->_requestGroupMan->getReservedGroups()[0]->getRemainingUris()[0];
  167. CPPUNIT_ASSERT_EQUAL(std::string("http://uri2"), uri);
  168. }
  169. void XmlRpcMethodTest::testAddUri_withBadPosition()
  170. {
  171. AddUriXmlRpcMethod m;
  172. XmlRpcRequest req("aria2.addUri", BDE::list());
  173. req._params << BDE::list();
  174. req._params[0] << BDE("http://localhost/");
  175. req._params << BDE::dict();
  176. req._params << BDE((int64_t)-1);
  177. XmlRpcResponse res = m.execute(req, _e.get());
  178. CPPUNIT_ASSERT_EQUAL(1, res._code);
  179. }
  180. #ifdef ENABLE_BITTORRENT
  181. void XmlRpcMethodTest::testAddTorrent()
  182. {
  183. AddTorrentXmlRpcMethod m;
  184. XmlRpcRequest req("aria2.addTorrent", BDE::list());
  185. req._params << BDE(readFile("single.torrent"));
  186. BDE uris = BDE::list();
  187. uris << BDE("http://localhost/aria2-0.8.2.tar.bz2");
  188. req._params << uris;
  189. {
  190. XmlRpcResponse res = m.execute(req, _e.get());
  191. CPPUNIT_ASSERT_EQUAL(0, res._code);
  192. CPPUNIT_ASSERT_EQUAL(std::string("1"), res._param.s());
  193. SharedHandle<RequestGroup> group = _e->_requestGroupMan->findReservedGroup(1);
  194. CPPUNIT_ASSERT(!group.isNull());
  195. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-0.8.2.tar.bz2"),
  196. group->getFilePath());
  197. CPPUNIT_ASSERT_EQUAL((size_t)1, group->getRemainingUris().size());
  198. CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/aria2-0.8.2.tar.bz2"),
  199. group->getRemainingUris()[0]);
  200. }
  201. // with options
  202. BDE opt = BDE::dict();
  203. opt[PREF_DIR] = BDE("/sink");
  204. req._params << opt;
  205. {
  206. XmlRpcResponse res = m.execute(req, _e.get());
  207. CPPUNIT_ASSERT_EQUAL(0, res._code);
  208. CPPUNIT_ASSERT_EQUAL(std::string("/sink/aria2-0.8.2.tar.bz2"),
  209. _e->_requestGroupMan->findReservedGroup(2)->getFilePath());
  210. }
  211. }
  212. void XmlRpcMethodTest::testAddTorrent_withoutTorrent()
  213. {
  214. AddTorrentXmlRpcMethod m;
  215. XmlRpcRequest req("aria2.addTorrent", BDE::list());
  216. XmlRpcResponse res = m.execute(req, _e.get());
  217. CPPUNIT_ASSERT_EQUAL(1, res._code);
  218. }
  219. void XmlRpcMethodTest::testAddTorrent_notBase64Torrent()
  220. {
  221. AddTorrentXmlRpcMethod m;
  222. XmlRpcRequest req("aria2.addTorrent", BDE::list());
  223. req._params << BDE("not torrent");
  224. XmlRpcResponse res = m.execute(req, _e.get());
  225. CPPUNIT_ASSERT_EQUAL(1, res._code);
  226. }
  227. void XmlRpcMethodTest::testAddTorrent_withPosition()
  228. {
  229. AddTorrentXmlRpcMethod m;
  230. XmlRpcRequest req1("aria2.addTorrent", BDE::list());
  231. req1._params << BDE(readFile("test.torrent"));
  232. req1._params << BDE::list();
  233. req1._params << BDE::dict();
  234. XmlRpcResponse res1 = m.execute(req1, _e.get());
  235. CPPUNIT_ASSERT_EQUAL(0, res1._code);
  236. XmlRpcRequest req2("aria2.addTorrent", BDE::list());
  237. req2._params << BDE(readFile("single.torrent"));
  238. req2._params << BDE::list();
  239. req2._params << BDE::dict();
  240. req2._params << BDE((int64_t)0);
  241. m.execute(req2, _e.get());
  242. CPPUNIT_ASSERT_EQUAL((size_t)1,
  243. _e->_requestGroupMan->getReservedGroups()[0]->
  244. getDownloadContext()->getFileEntries().size());
  245. }
  246. #endif // ENABLE_BITTORRENT
  247. #ifdef ENABLE_METALINK
  248. void XmlRpcMethodTest::testAddMetalink()
  249. {
  250. AddMetalinkXmlRpcMethod m;
  251. XmlRpcRequest req("aria2.addMetalink", BDE::list());
  252. req._params << BDE(readFile("2files.metalink"));
  253. {
  254. XmlRpcResponse res = m.execute(req, _e.get());
  255. CPPUNIT_ASSERT_EQUAL(0, res._code);
  256. CPPUNIT_ASSERT_EQUAL((size_t)2, res._param.size());
  257. CPPUNIT_ASSERT_EQUAL(std::string("1"), res._param[0].s());
  258. CPPUNIT_ASSERT_EQUAL(std::string("2"), res._param[1].s());
  259. SharedHandle<RequestGroup> tar = _e->_requestGroupMan->findReservedGroup(1);
  260. CPPUNIT_ASSERT(!tar.isNull());
  261. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.tar.bz2"),
  262. tar->getFilePath());
  263. SharedHandle<RequestGroup> deb = _e->_requestGroupMan->findReservedGroup(2);
  264. CPPUNIT_ASSERT(!deb.isNull());
  265. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.deb"),
  266. deb->getFilePath());
  267. }
  268. // with options
  269. BDE opt = BDE::dict();
  270. opt[PREF_DIR] = BDE("/sink");
  271. req._params << opt;
  272. {
  273. XmlRpcResponse res = m.execute(req, _e.get());
  274. CPPUNIT_ASSERT_EQUAL(0, res._code);
  275. CPPUNIT_ASSERT_EQUAL(std::string("/sink/aria2-5.0.0.tar.bz2"),
  276. _e->_requestGroupMan->findReservedGroup(3)->getFilePath());
  277. }
  278. }
  279. void XmlRpcMethodTest::testAddMetalink_withoutMetalink()
  280. {
  281. AddMetalinkXmlRpcMethod m;
  282. XmlRpcRequest req("aria2.addMetalink", BDE::list());
  283. XmlRpcResponse res = m.execute(req, _e.get());
  284. CPPUNIT_ASSERT_EQUAL(1, res._code);
  285. }
  286. void XmlRpcMethodTest::testAddMetalink_notBase64Metalink()
  287. {
  288. AddMetalinkXmlRpcMethod m;
  289. XmlRpcRequest req("aria2.addMetalink", BDE::list());
  290. req._params << BDE("not metalink");
  291. XmlRpcResponse res = m.execute(req, _e.get());
  292. CPPUNIT_ASSERT_EQUAL(1, res._code);
  293. }
  294. void XmlRpcMethodTest::testAddMetalink_withPosition()
  295. {
  296. AddUriXmlRpcMethod m1;
  297. XmlRpcRequest req1("aria2.addUri", BDE::list());
  298. req1._params << BDE::list();
  299. req1._params[0] << BDE("http://uri");
  300. XmlRpcResponse res1 = m1.execute(req1, _e.get());
  301. CPPUNIT_ASSERT_EQUAL(0, res1._code);
  302. AddMetalinkXmlRpcMethod m2;
  303. XmlRpcRequest req2("ari2.addMetalink", BDE::list());
  304. req2._params << BDE(readFile("2files.metalink"));
  305. req2._params << BDE::dict();
  306. req2._params << BDE((int64_t)0);
  307. XmlRpcResponse res2 = m2.execute(req2, _e.get());
  308. CPPUNIT_ASSERT_EQUAL(0, res2._code);
  309. CPPUNIT_ASSERT_EQUAL(std::string("/tmp/aria2-5.0.0.tar.bz2"),
  310. _e->_requestGroupMan->getReservedGroups()[0]->
  311. getFilePath());
  312. }
  313. #endif // ENABLE_METALINK
  314. void XmlRpcMethodTest::testChangeOption()
  315. {
  316. SharedHandle<RequestGroup> group
  317. (new RequestGroup(_option, std::deque<std::string>()));
  318. _e->_requestGroupMan->addReservedGroup(group);
  319. ChangeOptionXmlRpcMethod m;
  320. XmlRpcRequest req("aria2.changeOption", BDE::list());
  321. req._params << BDE("1");
  322. BDE opt = BDE::dict();
  323. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("100K");
  324. #ifdef ENABLE_BITTORRENT
  325. opt[PREF_MAX_UPLOAD_LIMIT] = BDE("50K");
  326. #endif // ENABLE_BITTORRENT
  327. req._params << opt;
  328. XmlRpcResponse res = m.execute(req, _e.get());
  329. CPPUNIT_ASSERT_EQUAL(0, res._code);
  330. CPPUNIT_ASSERT_EQUAL((unsigned int)100*1024,
  331. group->getMaxDownloadSpeedLimit());
  332. #ifdef ENABLE_BITTORRENT
  333. CPPUNIT_ASSERT_EQUAL((unsigned int)50*1024, group->getMaxUploadSpeedLimit());
  334. #endif // ENABLE_BITTORRENT
  335. }
  336. void XmlRpcMethodTest::testChangeOption_withBadOption()
  337. {
  338. SharedHandle<RequestGroup> group
  339. (new RequestGroup(_option, std::deque<std::string>()));
  340. _e->_requestGroupMan->addReservedGroup(group);
  341. ChangeOptionXmlRpcMethod m;
  342. XmlRpcRequest req("aria2.changeOption", BDE::list());
  343. req._params << BDE("1");
  344. BDE opt = BDE::dict();
  345. opt[PREF_MAX_DOWNLOAD_LIMIT] = BDE("badvalue");
  346. req._params << opt;
  347. XmlRpcResponse res = m.execute(req, _e.get());
  348. CPPUNIT_ASSERT_EQUAL(1, res._code);
  349. }
  350. void XmlRpcMethodTest::testChangeOption_withoutGid()
  351. {
  352. ChangeOptionXmlRpcMethod m;
  353. XmlRpcRequest req("aria2.changeOption", BDE::list());
  354. XmlRpcResponse res = m.execute(req, _e.get());
  355. CPPUNIT_ASSERT_EQUAL(1, res._code);
  356. }
  357. void XmlRpcMethodTest::testChangeGlobalOption()
  358. {
  359. ChangeGlobalOptionXmlRpcMethod m;
  360. XmlRpcRequest req("aria2.changeGlobalOption", BDE::list());
  361. BDE opt = BDE::dict();
  362. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("100K");
  363. #ifdef ENABLE_BITTORRENT
  364. opt[PREF_MAX_OVERALL_UPLOAD_LIMIT] = BDE("50K");
  365. #endif // ENABLE_BITTORRENT
  366. req._params << opt;
  367. XmlRpcResponse res = m.execute(req, _e.get());
  368. CPPUNIT_ASSERT_EQUAL(0, res._code);
  369. CPPUNIT_ASSERT_EQUAL((unsigned int)100*1024,
  370. _e->_requestGroupMan->getMaxOverallDownloadSpeedLimit());
  371. #ifdef ENABLE_BITTORRENT
  372. CPPUNIT_ASSERT_EQUAL((unsigned int)50*1024,
  373. _e->_requestGroupMan->getMaxOverallUploadSpeedLimit());
  374. #endif // ENABLE_BITTORRENT
  375. }
  376. void XmlRpcMethodTest::testChangeGlobalOption_withBadOption()
  377. {
  378. ChangeGlobalOptionXmlRpcMethod m;
  379. XmlRpcRequest req("aria2.changeGlobalOption", BDE::list());
  380. BDE opt = BDE::dict();
  381. opt[PREF_MAX_OVERALL_DOWNLOAD_LIMIT] = BDE("badvalue");
  382. req._params << opt;
  383. XmlRpcResponse res = m.execute(req, _e.get());
  384. CPPUNIT_ASSERT_EQUAL(1, res._code);
  385. }
  386. void XmlRpcMethodTest::testNoSuchMethod()
  387. {
  388. NoSuchMethodXmlRpcMethod m;
  389. XmlRpcRequest req("make.hamburger", BDE::none);
  390. XmlRpcResponse res = m.execute(req, 0);
  391. CPPUNIT_ASSERT_EQUAL(1, res._code);
  392. CPPUNIT_ASSERT_EQUAL(std::string("No such method: make.hamburger"),
  393. res._param["faultString"].s());
  394. CPPUNIT_ASSERT_EQUAL
  395. (std::string("<?xml version=\"1.0\"?>"
  396. "<methodResponse>"
  397. "<fault>"
  398. "<value>"
  399. "<struct>"
  400. "<member>"
  401. "<name>faultCode</name><value><int>1</int></value>"
  402. "</member>"
  403. "<member>"
  404. "<name>faultString</name>"
  405. "<value>"
  406. "<string>No such method: make.hamburger</string>"
  407. "</value>"
  408. "</member>"
  409. "</struct>"
  410. "</value>"
  411. "</fault>"
  412. "</methodResponse>"),
  413. res.toXml());
  414. }
  415. void XmlRpcMethodTest::testTellStatus_withoutGid()
  416. {
  417. TellStatusXmlRpcMethod m;
  418. XmlRpcRequest req("aria2.tellStatus", BDE::list());
  419. XmlRpcResponse res = m.execute(req, _e.get());
  420. CPPUNIT_ASSERT_EQUAL(1, res._code);
  421. }
  422. static void addUri(const std::string& uri,
  423. const SharedHandle<DownloadEngine>& e)
  424. {
  425. AddUriXmlRpcMethod m;
  426. XmlRpcRequest req("aria2.addUri", BDE::list());
  427. req._params << BDE::list();
  428. req._params[0] << BDE(uri);
  429. CPPUNIT_ASSERT_EQUAL(0, m.execute(req, e.get())._code);
  430. }
  431. void XmlRpcMethodTest::testTellWaiting()
  432. {
  433. addUri("http://1/", _e);
  434. addUri("http://2/", _e);
  435. addUri("http://3/", _e);
  436. addUri("http://4/", _e);
  437. TellWaitingXmlRpcMethod m;
  438. XmlRpcRequest req("aria2.tellWaiting", BDE::list());
  439. req._params << BDE((int64_t)1);
  440. req._params << BDE((int64_t)2);
  441. XmlRpcResponse res = m.execute(req, _e.get());
  442. CPPUNIT_ASSERT_EQUAL(0, res._code);
  443. CPPUNIT_ASSERT_EQUAL((size_t)2, res._param.size());
  444. CPPUNIT_ASSERT_EQUAL(std::string("2"), res._param[0]["gid"].s());
  445. CPPUNIT_ASSERT_EQUAL(std::string("3"), res._param[1]["gid"].s());
  446. // waiting.size() == offset+num
  447. req = XmlRpcRequest("aria2.tellWaiting", BDE::list());
  448. req._params << BDE((int64_t)1);
  449. req._params << BDE((int64_t)3);
  450. res = m.execute(req, _e.get());
  451. CPPUNIT_ASSERT_EQUAL(0, res._code);
  452. CPPUNIT_ASSERT_EQUAL((size_t)3, res._param.size());
  453. // waiting.size() < offset+num
  454. req = XmlRpcRequest("aria2.tellWaiting", BDE::list());
  455. req._params << BDE((int64_t)1);
  456. req._params << BDE((int64_t)4);
  457. res = m.execute(req, _e.get());
  458. CPPUNIT_ASSERT_EQUAL(0, res._code);
  459. CPPUNIT_ASSERT_EQUAL((size_t)3, res._param.size());
  460. }
  461. void XmlRpcMethodTest::testTellWaiting_fail()
  462. {
  463. TellWaitingXmlRpcMethod m;
  464. XmlRpcRequest req("aria2.tellWaiting", BDE::list());
  465. XmlRpcResponse res = m.execute(req, _e.get());
  466. CPPUNIT_ASSERT_EQUAL(1, res._code);
  467. }
  468. } // namespace xmlrpc
  469. } // namespace aria2