XmlRpcMethodTest.cc 11 KB

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