XmlRpcMethodTest.cc 14 KB

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