XmlRpcMethodTest.cc 11 KB

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