diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-03-14 16:38:54 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-03-14 16:38:54 +0900 |
| commit | f0cfbb21c1c0e68aef0de8e2380ac744be832d13 (patch) | |
| tree | afe910230bee65b8f16b5bf2e20f680d7bf2b695 /test/RpcMethodTest.cc | |
| parent | 5a1fb3875fdb27076e71a87e35359aad0aba108c (diff) | |
Renamed classes in abstract layer of RPC service from XmlRpc* to Rpc*.
Now JSON-RPC is available by default regardless of XML library.
XML-RPC becomes available when XML library is available.
Diffstat (limited to 'test/RpcMethodTest.cc')
| -rw-r--r-- | test/RpcMethodTest.cc | 1145 |
1 files changed, 1145 insertions, 0 deletions
diff --git a/test/RpcMethodTest.cc b/test/RpcMethodTest.cc new file mode 100644 index 00000000..d0a85741 --- /dev/null +++ b/test/RpcMethodTest.cc @@ -0,0 +1,1145 @@ +#include "RpcMethod.h" + +#include <cppunit/extensions/HelperMacros.h> + +#include "DownloadEngine.h" +#include "SelectEventPoll.h" +#include "Option.h" +#include "RequestGroupMan.h" +#include "RequestGroup.h" +#include "RpcMethodImpl.h" +#include "OptionParser.h" +#include "OptionHandler.h" +#include "RpcRequest.h" +#include "RpcResponse.h" +#include "prefs.h" +#include "TestUtil.h" +#include "DownloadContext.h" +#include "FeatureConfig.h" +#include "util.h" +#include "array_fun.h" +#include "download_helper.h" +#include "FileEntry.h" +#ifdef ENABLE_BITTORRENT +# include "BtRegistry.h" +# include "BtRuntime.h" +# include "bittorrent_helper.h" +#endif // ENABLE_BITTORRENT + +namespace aria2 { + +namespace rpc { + +class RpcMethodTest:public CppUnit::TestFixture { + + CPPUNIT_TEST_SUITE(RpcMethodTest); + CPPUNIT_TEST(testAddUri); + CPPUNIT_TEST(testAddUri_withoutUri); + CPPUNIT_TEST(testAddUri_notUri); + CPPUNIT_TEST(testAddUri_withBadOption); + CPPUNIT_TEST(testAddUri_withPosition); + CPPUNIT_TEST(testAddUri_withBadPosition); +#ifdef ENABLE_BITTORRENT + CPPUNIT_TEST(testAddTorrent); + CPPUNIT_TEST(testAddTorrent_withoutTorrent); + CPPUNIT_TEST(testAddTorrent_notBase64Torrent); + CPPUNIT_TEST(testAddTorrent_withPosition); +#endif // ENABLE_BITTORRENT +#ifdef ENABLE_METALINK + CPPUNIT_TEST(testAddMetalink); + CPPUNIT_TEST(testAddMetalink_withoutMetalink); + CPPUNIT_TEST(testAddMetalink_notBase64Metalink); + CPPUNIT_TEST(testAddMetalink_withPosition); +#endif // ENABLE_METALINK + CPPUNIT_TEST(testChangeOption); + CPPUNIT_TEST(testChangeOption_withBadOption); + CPPUNIT_TEST(testChangeOption_withNotAllowedOption); + CPPUNIT_TEST(testChangeOption_withoutGid); + CPPUNIT_TEST(testChangeGlobalOption); + CPPUNIT_TEST(testChangeGlobalOption_withBadOption); + CPPUNIT_TEST(testChangeGlobalOption_withNotAllowedOption); + CPPUNIT_TEST(testTellStatus_withoutGid); + CPPUNIT_TEST(testTellWaiting); + CPPUNIT_TEST(testTellWaiting_fail); + CPPUNIT_TEST(testGetVersion); + CPPUNIT_TEST(testNoSuchMethod); + CPPUNIT_TEST(testGatherStoppedDownload); + CPPUNIT_TEST(testGatherProgressCommon); +#ifdef ENABLE_BITTORRENT + CPPUNIT_TEST(testGatherBitTorrentMetadata); +#endif // ENABLE_BITTORRENT + CPPUNIT_TEST(testChangePosition); + CPPUNIT_TEST(testChangePosition_fail); + CPPUNIT_TEST(testGetSessionInfo); + CPPUNIT_TEST(testChangeUri); + CPPUNIT_TEST(testChangeUri_fail); + CPPUNIT_TEST(testPause); + CPPUNIT_TEST(testSystemMulticall); + CPPUNIT_TEST(testSystemMulticall_fail); + CPPUNIT_TEST_SUITE_END(); +private: + SharedHandle<DownloadEngine> e_; + SharedHandle<Option> option_; +public: + void setUp() + { + RequestGroup::resetGIDCounter(); + option_.reset(new Option()); + option_->put(PREF_DIR, A2_TEST_OUT_DIR"/aria2_RpcMethodTest"); + option_->put(PREF_SEGMENT_SIZE, "1048576"); + File(option_->get(PREF_DIR)).mkdirs(); + e_.reset + (new DownloadEngine(SharedHandle<EventPoll>(new SelectEventPoll()))); + e_->setOption(option_.get()); + e_->setRequestGroupMan + (SharedHandle<RequestGroupMan> + (new RequestGroupMan(std::vector<SharedHandle<RequestGroup> >(), + 1, option_.get()))); + } + + void testAddUri(); + void testAddUri_withoutUri(); + void testAddUri_notUri(); + void testAddUri_withBadOption(); + void testAddUri_withPosition(); + void testAddUri_withBadPosition(); +#ifdef ENABLE_BITTORRENT + void testAddTorrent(); + void testAddTorrent_withoutTorrent(); + void testAddTorrent_notBase64Torrent(); + void testAddTorrent_withPosition(); +#endif // ENABLE_BITTORRENT +#ifdef ENABLE_METALINK + void testAddMetalink(); + void testAddMetalink_withoutMetalink(); + void testAddMetalink_notBase64Metalink(); + void testAddMetalink_withPosition(); +#endif // ENABLE_METALINK + void testChangeOption(); + void testChangeOption_withBadOption(); + void testChangeOption_withNotAllowedOption(); + void testChangeOption_withoutGid(); + void testChangeGlobalOption(); + void testChangeGlobalOption_withBadOption(); + void testChangeGlobalOption_withNotAllowedOption(); + void testTellStatus_withoutGid(); + void testTellWaiting(); + void testTellWaiting_fail(); + void testGetVersion(); + void testNoSuchMethod(); + void testGatherStoppedDownload(); + void testGatherProgressCommon(); +#ifdef ENABLE_BITTORRENT + void testGatherBitTorrentMetadata(); +#endif // ENABLE_BITTORRENT + void testChangePosition(); + void testChangePosition_fail(); + void testGetSessionInfo(); + void testChangeUri(); + void testChangeUri_fail(); + void testPause(); + void testSystemMulticall(); + void testSystemMulticall_fail(); +}; + + +CPPUNIT_TEST_SUITE_REGISTRATION(RpcMethodTest); + +namespace { +std::string getString(const Dict* dict, const std::string& key) +{ + return asString(dict->get(key))->s(); +} +} // namespace + +void RpcMethodTest::testAddUri() +{ + AddUriRpcMethod m; + RpcRequest req(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam = List::g(); + urisParam->append("http://localhost/"); + req.params->append(urisParam); + { + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + const std::deque<SharedHandle<RequestGroup> > rgs = + e_->getRequestGroupMan()->getReservedGroups(); + CPPUNIT_ASSERT_EQUAL((size_t)1, rgs.size()); + CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/"), + rgs.front()->getDownloadContext()-> + getFirstFileEntry()->getRemainingUris().front()); + } + // with options + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_DIR, "/sink"); + req.params->append(opt); + { + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL(std::string("/sink"), + e_->getRequestGroupMan()->findReservedGroup(2)-> + getOption()->get(PREF_DIR)); + } +} + +void RpcMethodTest::testAddUri_withoutUri() +{ + AddUriRpcMethod m; + RpcRequest req(AddUriRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testAddUri_notUri() +{ + AddUriRpcMethod m; + RpcRequest req(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam = List::g(); + urisParam->append("not uri"); + req.params->append(urisParam); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testAddUri_withBadOption() +{ + AddUriRpcMethod m; + RpcRequest req(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam = List::g(); + urisParam->append("http://localhost"); + req.params->append(urisParam); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_FILE_ALLOCATION, "badvalue"); + req.params->append(opt); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testAddUri_withPosition() +{ + AddUriRpcMethod m; + RpcRequest req1(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam1 = List::g(); + urisParam1->append("http://uri1"); + req1.params->append(urisParam1); + RpcResponse res1 = m.execute(req1, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res1.code); + + RpcRequest req2(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam2 = List::g(); + urisParam2->append("http://uri2"); + req2.params->append(urisParam2); + req2.params->append(Dict::g()); + req2.params->append(Integer::g(0)); + m.execute(req2, e_.get()); + + std::string uri = + e_->getRequestGroupMan()->getReservedGroups()[0]-> + getDownloadContext()->getFirstFileEntry()->getRemainingUris()[0]; + + CPPUNIT_ASSERT_EQUAL(std::string("http://uri2"), uri); +} + +void RpcMethodTest::testAddUri_withBadPosition() +{ + AddUriRpcMethod m; + RpcRequest req(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam = List::g(); + urisParam->append("http://localhost/"); + req.params->append(urisParam); + req.params->append(Dict::g()); + req.params->append(Integer::g(-1)); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +#ifdef ENABLE_BITTORRENT +void RpcMethodTest::testAddTorrent() +{ + File(e_->getOption()->get(PREF_DIR)+ + "/0a3893293e27ac0490424c06de4d09242215f0a6.torrent").remove(); + AddTorrentRpcMethod m; + RpcRequest req(AddTorrentRpcMethod::getMethodName(), List::g()); + req.params->append(readFile(A2_TEST_DIR"/single.torrent")); + SharedHandle<List> uris = List::g(); + uris->append("http://localhost/aria2-0.8.2.tar.bz2"); + req.params->append(uris); + { + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT + (File(e_->getOption()->get(PREF_DIR)+ + "/0a3893293e27ac0490424c06de4d09242215f0a6.torrent").exists()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL(std::string("1"), asString(res.param)->s()); + + SharedHandle<RequestGroup> group = + e_->getRequestGroupMan()->findReservedGroup(1); + CPPUNIT_ASSERT(group); + CPPUNIT_ASSERT_EQUAL(e_->getOption()->get(PREF_DIR)+"/aria2-0.8.2.tar.bz2", + group->getFirstFilePath()); + CPPUNIT_ASSERT_EQUAL((size_t)1, + group->getDownloadContext()->getFirstFileEntry()-> + getRemainingUris().size()); + CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/aria2-0.8.2.tar.bz2"), + group->getDownloadContext()->getFirstFileEntry()-> + getRemainingUris()[0]); + } + // with options + std::string dir = A2_TEST_OUT_DIR"/aria2_RpcMethodTest_testAddTorrent"; + File(dir).mkdirs(); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_DIR, dir); + File(dir+"/0a3893293e27ac0490424c06de4d09242215f0a6.torrent").remove(); + req.params->append(opt); + { + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL + (dir+"/aria2-0.8.2.tar.bz2", + e_->getRequestGroupMan()->findReservedGroup(2)->getFirstFilePath()); + CPPUNIT_ASSERT + (File(dir+"/0a3893293e27ac0490424c06de4d09242215f0a6.torrent").exists()); + } +} + +void RpcMethodTest::testAddTorrent_withoutTorrent() +{ + AddTorrentRpcMethod m; + RpcRequest req(AddTorrentRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testAddTorrent_notBase64Torrent() +{ + AddTorrentRpcMethod m; + RpcRequest req(AddTorrentRpcMethod::getMethodName(), List::g()); + req.params->append("not torrent"); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testAddTorrent_withPosition() +{ + AddTorrentRpcMethod m; + RpcRequest req1(AddTorrentRpcMethod::getMethodName(), List::g()); + req1.params->append(readFile(A2_TEST_DIR"/test.torrent")); + req1.params->append(List::g()); + req1.params->append(Dict::g()); + RpcResponse res1 = m.execute(req1, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res1.code); + + RpcRequest req2(AddTorrentRpcMethod::getMethodName(), List::g()); + req2.params->append(readFile(A2_TEST_DIR"/single.torrent")); + req2.params->append(List::g()); + req2.params->append(Dict::g()); + req2.params->append(Integer::g(0)); + m.execute(req2, e_.get()); + + CPPUNIT_ASSERT_EQUAL((size_t)1, + e_->getRequestGroupMan()->getReservedGroups()[0]-> + getDownloadContext()->getFileEntries().size()); +} + +#endif // ENABLE_BITTORRENT + +#ifdef ENABLE_METALINK +void RpcMethodTest::testAddMetalink() +{ + File(e_->getOption()->get(PREF_DIR)+ + "/c908634fbc257fd56f0114912c2772aeeb4064f4.metalink").remove(); + AddMetalinkRpcMethod m; + RpcRequest req(AddMetalinkRpcMethod::getMethodName(), List::g()); + req.params->append(readFile(A2_TEST_DIR"/2files.metalink")); + { + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + const List* resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)2, resParams->size()); + CPPUNIT_ASSERT_EQUAL(std::string("1"), asString(resParams->get(0))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("2"), asString(resParams->get(1))->s()); + CPPUNIT_ASSERT + (File(e_->getOption()->get(PREF_DIR)+ + "/c908634fbc257fd56f0114912c2772aeeb4064f4.metalink").exists()); + + SharedHandle<RequestGroup> tar = + e_->getRequestGroupMan()->findReservedGroup(1); + CPPUNIT_ASSERT(tar); + CPPUNIT_ASSERT_EQUAL(e_->getOption()->get(PREF_DIR)+"/aria2-5.0.0.tar.bz2", + tar->getFirstFilePath()); + SharedHandle<RequestGroup> deb = + e_->getRequestGroupMan()->findReservedGroup(2); + CPPUNIT_ASSERT(deb); + CPPUNIT_ASSERT_EQUAL(e_->getOption()->get(PREF_DIR)+"/aria2-5.0.0.deb", + deb->getFirstFilePath()); + } + // with options + std::string dir = A2_TEST_OUT_DIR"/aria2_RpcMethodTest_testAddMetalink"; + File(dir).mkdirs(); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_DIR, dir); + File(dir+"/c908634fbc257fd56f0114912c2772aeeb4064f4.metalink").remove(); + req.params->append(opt); + { + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL(dir+"/aria2-5.0.0.tar.bz2", + e_->getRequestGroupMan()->findReservedGroup(3)-> + getFirstFilePath()); + CPPUNIT_ASSERT + (File(dir+"/c908634fbc257fd56f0114912c2772aeeb4064f4.metalink").exists()); + } +} + +void RpcMethodTest::testAddMetalink_withoutMetalink() +{ + AddMetalinkRpcMethod m; + RpcRequest req(AddMetalinkRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testAddMetalink_notBase64Metalink() +{ + AddMetalinkRpcMethod m; + RpcRequest req(AddMetalinkRpcMethod::getMethodName(), List::g()); + req.params->append("not metalink"); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testAddMetalink_withPosition() +{ + AddUriRpcMethod m1; + RpcRequest req1(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam1 = List::g(); + urisParam1->append("http://uri"); + req1.params->append(urisParam1); + RpcResponse res1 = m1.execute(req1, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res1.code); + + AddMetalinkRpcMethod m2; + RpcRequest req2("ari2.addMetalink", List::g()); + req2.params->append(readFile(A2_TEST_DIR"/2files.metalink")); + req2.params->append(Dict::g()); + req2.params->append(Integer::g(0)); + RpcResponse res2 = m2.execute(req2, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res2.code); + + CPPUNIT_ASSERT_EQUAL(e_->getOption()->get(PREF_DIR)+"/aria2-5.0.0.tar.bz2", + e_->getRequestGroupMan()->getReservedGroups()[0]-> + getFirstFilePath()); +} + +#endif // ENABLE_METALINK + +void RpcMethodTest::testChangeOption() +{ + SharedHandle<RequestGroup> group(new RequestGroup(option_)); + e_->getRequestGroupMan()->addReservedGroup(group); + + ChangeOptionRpcMethod m; + RpcRequest req(ChangeOptionRpcMethod::getMethodName(), List::g()); + req.params->append("1"); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_MAX_DOWNLOAD_LIMIT, "100K"); +#ifdef ENABLE_BITTORRENT + opt->put(PREF_BT_MAX_PEERS, "100"); + opt->put(PREF_BT_REQUEST_PEER_SPEED_LIMIT, "300K"); + opt->put(PREF_MAX_UPLOAD_LIMIT, "50K"); + + BtObject btObject; + btObject.btRuntime_ = SharedHandle<BtRuntime>(new BtRuntime()); + e_->getBtRegistry()->put(group->getGID(), btObject); +#endif // ENABLE_BITTORRENT + req.params->append(opt); + RpcResponse res = m.execute(req, e_.get()); + + SharedHandle<Option> option = group->getOption(); + + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL((unsigned int)100*1024, + group->getMaxDownloadSpeedLimit()); + CPPUNIT_ASSERT_EQUAL(std::string("102400"), + option->get(PREF_MAX_DOWNLOAD_LIMIT)); +#ifdef ENABLE_BITTORRENT + CPPUNIT_ASSERT_EQUAL(std::string("307200"), + option->get(PREF_BT_REQUEST_PEER_SPEED_LIMIT)); + + CPPUNIT_ASSERT_EQUAL(std::string("100"), option->get(PREF_BT_MAX_PEERS)); + CPPUNIT_ASSERT_EQUAL((unsigned int)100, btObject.btRuntime_->getMaxPeers()); + + CPPUNIT_ASSERT_EQUAL((unsigned int)50*1024, + group->getMaxUploadSpeedLimit()); + CPPUNIT_ASSERT_EQUAL(std::string("51200"), + option->get(PREF_MAX_UPLOAD_LIMIT)); +#endif // ENABLE_BITTORRENT +} + +void RpcMethodTest::testChangeOption_withBadOption() +{ + SharedHandle<RequestGroup> group(new RequestGroup(option_)); + e_->getRequestGroupMan()->addReservedGroup(group); + + ChangeOptionRpcMethod m; + RpcRequest req(ChangeOptionRpcMethod::getMethodName(), List::g()); + req.params->append("1"); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_MAX_DOWNLOAD_LIMIT, "badvalue"); + req.params->append(opt); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testChangeOption_withNotAllowedOption() +{ + SharedHandle<RequestGroup> group(new RequestGroup(option_)); + e_->getRequestGroupMan()->addReservedGroup(group); + + ChangeOptionRpcMethod m; + RpcRequest req(ChangeOptionRpcMethod::getMethodName(), List::g()); + req.params->append("1"); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_MAX_OVERALL_DOWNLOAD_LIMIT, "100K"); + req.params->append(opt); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testChangeOption_withoutGid() +{ + ChangeOptionRpcMethod m; + RpcRequest req(ChangeOptionRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testChangeGlobalOption() +{ + ChangeGlobalOptionRpcMethod m; + RpcRequest req + (ChangeGlobalOptionRpcMethod::getMethodName(), List::g()); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_MAX_OVERALL_DOWNLOAD_LIMIT, "100K"); +#ifdef ENABLE_BITTORRENT + opt->put(PREF_MAX_OVERALL_UPLOAD_LIMIT, "50K"); +#endif // ENABLE_BITTORRENT + req.params->append(opt); + RpcResponse res = m.execute(req, e_.get()); + + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL + ((unsigned int)100*1024, + e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit()); + CPPUNIT_ASSERT_EQUAL(std::string("102400"), + e_->getOption()->get(PREF_MAX_OVERALL_DOWNLOAD_LIMIT)); +#ifdef ENABLE_BITTORRENT + CPPUNIT_ASSERT_EQUAL + ((unsigned int)50*1024, + e_->getRequestGroupMan()->getMaxOverallUploadSpeedLimit()); + CPPUNIT_ASSERT_EQUAL(std::string("51200"), + e_->getOption()->get(PREF_MAX_OVERALL_UPLOAD_LIMIT)); +#endif // ENABLE_BITTORRENT +} + +void RpcMethodTest::testChangeGlobalOption_withBadOption() +{ + ChangeGlobalOptionRpcMethod m; + RpcRequest req + (ChangeGlobalOptionRpcMethod::getMethodName(), List::g()); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_MAX_OVERALL_DOWNLOAD_LIMIT, "badvalue"); + req.params->append(opt); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testChangeGlobalOption_withNotAllowedOption() +{ + ChangeGlobalOptionRpcMethod m; + RpcRequest req + (ChangeGlobalOptionRpcMethod::getMethodName(), List::g()); + SharedHandle<Dict> opt = Dict::g(); + opt->put(PREF_MAX_DOWNLOAD_LIMIT, "100K"); + req.params->append(opt); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testNoSuchMethod() +{ + NoSuchMethodRpcMethod m; + RpcRequest req("make.hamburger", List::g()); + RpcResponse res = m.execute(req, 0); + CPPUNIT_ASSERT_EQUAL(1, res.code); + CPPUNIT_ASSERT_EQUAL(std::string("No such method: make.hamburger"), + getString(asDict(res.param), "faultString")); +} + +void RpcMethodTest::testTellStatus_withoutGid() +{ + TellStatusRpcMethod m; + RpcRequest req(TellStatusRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +namespace { +void addUri(const std::string& uri, const SharedHandle<DownloadEngine>& e) +{ + AddUriRpcMethod m; + RpcRequest req(AddUriRpcMethod::getMethodName(), List::g()); + SharedHandle<List> urisParam = List::g(); + urisParam->append(uri); + req.params->append(urisParam); + CPPUNIT_ASSERT_EQUAL(0, m.execute(req, e.get()).code); +} +} // namespace + +#ifdef ENABLE_BITTORRENT +namespace { +void addTorrent +(const std::string& torrentFile, const SharedHandle<DownloadEngine>& e) +{ + AddTorrentRpcMethod m; + RpcRequest req(AddTorrentRpcMethod::getMethodName(), List::g()); + req.params->append(readFile(torrentFile)); + RpcResponse res = m.execute(req, e.get()); +} +} // namespace +#endif // ENABLE_BITTORRENT + +void RpcMethodTest::testTellWaiting() +{ + addUri("http://1/", e_); + addUri("http://2/", e_); + addUri("http://3/", e_); +#ifdef ENABLE_BITTORRENT + addTorrent(A2_TEST_DIR"/single.torrent", e_); +#else // !ENABLE_BITTORRENT + addUri("http://4/", e_); +#endif // !ENABLE_BITTORRENT + + TellWaitingRpcMethod m; + RpcRequest req(TellWaitingRpcMethod::getMethodName(), List::g()); + req.params->append(Integer::g(1)); + req.params->append(Integer::g(2)); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + const List* resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)2, resParams->size()); + CPPUNIT_ASSERT_EQUAL(std::string("2"), + getString(asDict(resParams->get(0)), "gid")); + CPPUNIT_ASSERT_EQUAL(std::string("3"), + getString(asDict(resParams->get(1)), "gid")); + // waiting.size() == offset+num + req = RpcRequest(TellWaitingRpcMethod::getMethodName(), List::g()); + req.params->append(Integer::g(1)); + req.params->append(Integer::g(3)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)3, resParams->size()); + // waiting.size() < offset+num + req = RpcRequest(TellWaitingRpcMethod::getMethodName(), List::g()); + req.params->append(Integer::g(1)); + req.params->append(Integer::g(4)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)3, resParams->size()); + // negative offset + req = RpcRequest(TellWaitingRpcMethod::getMethodName(), List::g()); + req.params->append(Integer::g(-1)); + req.params->append(Integer::g(2)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)2, resParams->size()); + CPPUNIT_ASSERT_EQUAL(std::string("4"), + getString(asDict(resParams->get(0)), "gid")); + CPPUNIT_ASSERT_EQUAL(std::string("3"), + getString(asDict(resParams->get(1)), "gid")); + // negative offset and size < num + req.params->set(1, Integer::g(100)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)4, resParams->size()); + // nagative offset and normalized offset < 0 + req.params->set(0, Integer::g(-5)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)0, resParams->size()); + // nagative offset and normalized offset == 0 + req.params->set(0, Integer::g(-4)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)1, resParams->size()); +} + +void RpcMethodTest::testTellWaiting_fail() +{ + TellWaitingRpcMethod m; + RpcRequest req(TellWaitingRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testGetVersion() +{ + GetVersionRpcMethod m; + RpcRequest req(GetVersionRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + const Dict* resParams = asDict(res.param); + CPPUNIT_ASSERT_EQUAL(std::string(PACKAGE_VERSION), + getString(resParams, "version")); + const List* featureList = asList(resParams->get("enabledFeatures")); + std::string features; + for(List::ValueType::const_iterator i = featureList->begin(); + i != featureList->end(); ++i) { + const String* s = asString(*i); + features += s->s(); + features += ", "; + } + + CPPUNIT_ASSERT_EQUAL(FeatureConfig::getInstance()->featureSummary()+", ", + features); +} + +void RpcMethodTest::testGatherStoppedDownload() +{ + std::vector<SharedHandle<FileEntry> > fileEntries; + std::vector<gid_t> followedBy; + followedBy.push_back(3); + followedBy.push_back(4); + SharedHandle<DownloadResult> d(new DownloadResult()); + d->gid = 1; + d->fileEntries = fileEntries; + d->inMemoryDownload = false; + d->sessionDownloadLength = UINT64_MAX; + d->sessionTime = 1000; + d->result = error_code::FINISHED; + d->followedBy = followedBy; + d->belongsTo = 2; + SharedHandle<Dict> entry = Dict::g(); + std::vector<std::string> keys; + gatherStoppedDownload(entry, d, keys); + + const List* followedByRes = asList(entry->get("followedBy")); + CPPUNIT_ASSERT_EQUAL(std::string("3"), asString(followedByRes->get(0))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("4"), asString(followedByRes->get(1))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("2"), + asString(entry->get("belongsTo"))->s()); + + keys.push_back("gid"); + + entry = Dict::g(); + gatherStoppedDownload(entry, d, keys); + CPPUNIT_ASSERT_EQUAL((size_t)1, entry->size()); + CPPUNIT_ASSERT(entry->containsKey("gid")); +} + +void RpcMethodTest::testGatherProgressCommon() +{ + SharedHandle<DownloadContext> dctx(new DownloadContext(0, 0,"aria2.tar.bz2")); + std::string uris[] = { "http://localhost/aria2.tar.bz2" }; + dctx->getFirstFileEntry()->addUris(vbegin(uris), vend(uris)); + SharedHandle<RequestGroup> group(new RequestGroup(option_)); + group->setDownloadContext(dctx); + std::vector<SharedHandle<RequestGroup> > followedBy; + for(int i = 0; i < 2; ++i) { + followedBy.push_back(SharedHandle<RequestGroup>(new RequestGroup(option_))); + } + + group->followedBy(followedBy.begin(), followedBy.end()); + group->belongsTo(2); + + SharedHandle<Dict> entry = Dict::g(); + std::vector<std::string> keys; + gatherProgressCommon(entry, group, keys); + + const List* followedByRes = asList(entry->get("followedBy")); + CPPUNIT_ASSERT_EQUAL(util::itos(followedBy[0]->getGID()), + asString(followedByRes->get(0))->s()); + CPPUNIT_ASSERT_EQUAL(util::itos(followedBy[1]->getGID()), + asString(followedByRes->get(1))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("2"), + asString(entry->get("belongsTo"))->s()); + const List* files = asList(entry->get("files")); + CPPUNIT_ASSERT_EQUAL((size_t)1, files->size()); + const Dict* file = asDict(files->get(0)); + CPPUNIT_ASSERT_EQUAL(std::string("aria2.tar.bz2"), + asString(file->get("path"))->s()); + CPPUNIT_ASSERT_EQUAL(uris[0], + asString + (asDict + (asList(file->get("uris"))->get(0)) + ->get("uri")) + ->s()); + CPPUNIT_ASSERT_EQUAL(e_->getOption()->get(PREF_DIR), + asString(entry->get("dir"))->s()); + + keys.push_back("gid"); + entry = Dict::g(); + gatherProgressCommon(entry, group, keys); + + CPPUNIT_ASSERT_EQUAL((size_t)1, entry->size()); + CPPUNIT_ASSERT(entry->containsKey("gid")); + +} + +#ifdef ENABLE_BITTORRENT +void RpcMethodTest::testGatherBitTorrentMetadata() +{ + SharedHandle<Option> option(new Option()); + option->put(PREF_DIR, "."); + SharedHandle<DownloadContext> dctx(new DownloadContext()); + bittorrent::load(A2_TEST_DIR"/test.torrent", dctx, option); + SharedHandle<Dict> btDict = Dict::g(); + gatherBitTorrentMetadata(btDict, bittorrent::getTorrentAttrs(dctx)); + CPPUNIT_ASSERT_EQUAL(std::string("REDNOAH.COM RULES"), + asString(btDict->get("comment"))->s()); + CPPUNIT_ASSERT_EQUAL((int64_t)1123456789, + asInteger(btDict->get("creationDate"))->i()); + CPPUNIT_ASSERT_EQUAL(std::string("multi"), + asString(btDict->get("mode"))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("aria2-test"), + asString + (asDict + (btDict->get("info")) + ->get("name")) + ->s()); + const List* announceList = asList(btDict->get("announceList")); + CPPUNIT_ASSERT_EQUAL((size_t)3, announceList->size()); + CPPUNIT_ASSERT_EQUAL(std::string("http://tracker1"), + asString(asList(announceList->get(0))->get(0))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("http://tracker2"), + asString(asList(announceList->get(1))->get(0))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("http://tracker3"), + asString(asList(announceList->get(2))->get(0))->s()); + // Remove some keys + SharedHandle<TorrentAttribute> modBtAttrs = bittorrent::getTorrentAttrs(dctx); + modBtAttrs->comment.clear(); + modBtAttrs->creationDate = 0; + modBtAttrs->mode.clear(); + modBtAttrs->metadata.clear(); + btDict = Dict::g(); + gatherBitTorrentMetadata(btDict, modBtAttrs); + CPPUNIT_ASSERT(!btDict->containsKey("comment")); + CPPUNIT_ASSERT(!btDict->containsKey("creationDate")); + CPPUNIT_ASSERT(!btDict->containsKey("mode")); + CPPUNIT_ASSERT(!btDict->containsKey("info")); + CPPUNIT_ASSERT(btDict->containsKey("announceList")); +} +#endif // ENABLE_BITTORRENT + +void RpcMethodTest::testChangePosition() +{ + e_->getRequestGroupMan()->addReservedGroup + (SharedHandle<RequestGroup>(new RequestGroup(option_))); + e_->getRequestGroupMan()->addReservedGroup + (SharedHandle<RequestGroup>(new RequestGroup(option_))); + + ChangePositionRpcMethod m; + RpcRequest req(ChangePositionRpcMethod::getMethodName(), List::g()); + req.params->append("1"); + req.params->append(Integer::g(1)); + req.params->append("POS_SET"); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL((int64_t)1, asInteger(res.param)->i()); + CPPUNIT_ASSERT_EQUAL + ((gid_t)1, e_->getRequestGroupMan()->getReservedGroups()[1]->getGID()); +} + +void RpcMethodTest::testChangePosition_fail() +{ + ChangePositionRpcMethod m; + RpcRequest req(ChangePositionRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); + + req.params->append("1"); + req.params->append(Integer::g(2)); + req.params->append("bad keyword"); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testChangeUri() +{ + SharedHandle<FileEntry> files[3]; + for(int i = 0; i < 3; ++i) { + files[i].reset(new FileEntry()); + } + files[1]->addUri("http://example.org/aria2.tar.bz2"); + files[1]->addUri("http://example.org/mustremove1"); + files[1]->addUri("http://example.org/mustremove2"); + SharedHandle<DownloadContext> dctx(new DownloadContext()); + dctx->setFileEntries(&files[0], &files[3]); + SharedHandle<RequestGroup> group(new RequestGroup(option_)); + group->setDownloadContext(dctx); + e_->getRequestGroupMan()->addReservedGroup(group); + + ChangeUriRpcMethod m; + RpcRequest req(ChangeUriRpcMethod::getMethodName(), List::g()); + req.params->append("1"); // GID + req.params->append(Integer::g(2)); // index of FileEntry + SharedHandle<List> removeuris = List::g(); + removeuris->append("http://example.org/mustremove1"); + removeuris->append("http://example.org/mustremove2"); + removeuris->append("http://example.org/notexist"); + req.params->append(removeuris); + SharedHandle<List> adduris = List::g(); + adduris->append("http://example.org/added1"); + adduris->append("http://example.org/added2"); + adduris->append("baduri"); + adduris->append("http://example.org/added3"); + req.params->append(adduris); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL((int64_t)2, asInteger(asList(res.param)->get(0))->i()); + CPPUNIT_ASSERT_EQUAL((int64_t)3, asInteger(asList(res.param)->get(1))->i()); + CPPUNIT_ASSERT_EQUAL((size_t)0, files[0]->getRemainingUris().size()); + CPPUNIT_ASSERT_EQUAL((size_t)0, files[2]->getRemainingUris().size()); + std::deque<std::string> uris = files[1]->getRemainingUris(); + CPPUNIT_ASSERT_EQUAL((size_t)4, uris.size()); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/aria2.tar.bz2"),uris[0]); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1"), uris[1]); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added2"), uris[2]); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added3"), uris[3]); + + // Change adduris + adduris = List::g(); + adduris->append("http://example.org/added1-1"); + adduris->append("http://example.org/added1-2"); + req.params->set(3, adduris); + // Set position parameter + req.params->append(Integer::g(2)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL((int64_t)0, asInteger(asList(res.param)->get(0))->i()); + CPPUNIT_ASSERT_EQUAL((int64_t)2, asInteger(asList(res.param)->get(1))->i()); + uris = files[1]->getRemainingUris(); + CPPUNIT_ASSERT_EQUAL((size_t)6, uris.size()); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-1"), uris[2]); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-2"), uris[3]); + + // Change index of FileEntry + req.params->set(1, Integer::g(1)); + // Set position far beyond the size of uris in FileEntry. + req.params->set(4, Integer::g(1000)); + res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL((int64_t)0, asInteger(asList(res.param)->get(0))->i()); + CPPUNIT_ASSERT_EQUAL((int64_t)2, asInteger(asList(res.param)->get(1))->i()); + uris = files[0]->getRemainingUris(); + CPPUNIT_ASSERT_EQUAL((size_t)2, uris.size()); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-1"), uris[0]); + CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/added1-2"), uris[1]); +} + +void RpcMethodTest::testChangeUri_fail() +{ + SharedHandle<FileEntry> files[3]; + for(int i = 0; i < 3; ++i) { + files[i].reset(new FileEntry()); + } + SharedHandle<DownloadContext> dctx(new DownloadContext()); + dctx->setFileEntries(&files[0], &files[3]); + SharedHandle<RequestGroup> group(new RequestGroup(option_)); + group->setDownloadContext(dctx); + e_->getRequestGroupMan()->addReservedGroup(group); + + ChangeUriRpcMethod m; + RpcRequest req(ChangeUriRpcMethod::getMethodName(), List::g()); + req.params->append("1"); // GID + req.params->append(Integer::g(1)); // index of FileEntry + SharedHandle<List> removeuris = List::g(); + req.params->append(removeuris); + SharedHandle<List> adduris = List::g(); + req.params->append(adduris); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + + req.params->set(0, String::g("2")); + res = m.execute(req, e_.get()); + // RPC request fails because GID#2 does not exist. + CPPUNIT_ASSERT_EQUAL(1, res.code); + + req.params->set(0, String::g("1")); + req.params->set(1, Integer::g(4)); + res = m.execute(req, e_.get()); + // RPC request fails because FileEntry#3 does not exist. + CPPUNIT_ASSERT_EQUAL(1, res.code); + + req.params->set(1, String::g("0")); + res = m.execute(req, e_.get()); + // RPC request fails because index of FileEntry is string. + CPPUNIT_ASSERT_EQUAL(1, res.code); + + req.params->set(1, Integer::g(1)); + req.params->set(2, String::g("http://url")); + res = m.execute(req, e_.get()); + // RPC request fails because 3rd param is not list. + CPPUNIT_ASSERT_EQUAL(1, res.code); + + req.params->set(2, List::g()); + req.params->set(3, String::g("http://url")); + res = m.execute(req, e_.get()); + // RPC request fails because 4th param is not list. + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +void RpcMethodTest::testGetSessionInfo() +{ + GetSessionInfoRpcMethod m; + RpcRequest req(GetSessionInfoRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + CPPUNIT_ASSERT_EQUAL(util::toHex(e_->getSessionId()), + getString(asDict(res.param), "sessionId")); +} + +void RpcMethodTest::testPause() +{ + const std::string URIS[] = { + "http://url1", + "http://url2", + "http://url3", + }; + std::vector<std::string> uris(vbegin(URIS), vend(URIS)); + option_->put(PREF_FORCE_SEQUENTIAL, A2_V_TRUE); + std::vector<SharedHandle<RequestGroup> > groups; + createRequestGroupForUri(groups, option_, uris); + CPPUNIT_ASSERT_EQUAL((size_t)3, groups.size()); + e_->getRequestGroupMan()->addReservedGroup(groups); + { + PauseRpcMethod m; + RpcRequest req(PauseRpcMethod::getMethodName(), List::g()); + req.params->append("1"); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + } + CPPUNIT_ASSERT(groups[0]->isPauseRequested()); + { + UnpauseRpcMethod m; + RpcRequest req(UnpauseRpcMethod::getMethodName(), List::g()); + req.params->append("1"); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + } + CPPUNIT_ASSERT(!groups[0]->isPauseRequested()); + { + PauseAllRpcMethod m; + RpcRequest req(PauseAllRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + } + for(size_t i = 0; i < groups.size(); ++i) { + CPPUNIT_ASSERT(groups[i]->isPauseRequested()); + } + { + UnpauseAllRpcMethod m; + RpcRequest req(UnpauseAllRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + } + for(size_t i = 0; i < groups.size(); ++i) { + CPPUNIT_ASSERT(!groups[i]->isPauseRequested()); + } + { + ForcePauseAllRpcMethod m; + RpcRequest req(ForcePauseAllRpcMethod::getMethodName(), List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + } + for(size_t i = 0; i < groups.size(); ++i) { + CPPUNIT_ASSERT(groups[i]->isPauseRequested()); + } +} + +void RpcMethodTest::testSystemMulticall() +{ + SystemMulticallRpcMethod m; + RpcRequest req("system.multicall", List::g()); + SharedHandle<List> reqparams = List::g(); + req.params->append(reqparams); + for(int i = 0; i < 2; ++i) { + SharedHandle<Dict> dict = Dict::g(); + dict->put("methodName", AddUriRpcMethod::getMethodName()); + SharedHandle<List> params = List::g(); + SharedHandle<List> urisParam = List::g(); + urisParam->append("http://localhost/"+util::itos(i)); + params->append(urisParam); + dict->put("params", params); + reqparams->append(dict); + } + { + SharedHandle<Dict> dict = Dict::g(); + dict->put("methodName", "not exists"); + dict->put("params", List::g()); + reqparams->append(dict); + } + { + reqparams->append("not struct"); + } + { + SharedHandle<Dict> dict = Dict::g(); + dict->put("methodName", "system.multicall"); + dict->put("params", List::g()); + reqparams->append(dict); + } + { + // missing params + SharedHandle<Dict> dict = Dict::g(); + dict->put("methodName", GetVersionRpcMethod::getMethodName()); + reqparams->append(dict); + } + { + SharedHandle<Dict> dict = Dict::g(); + dict->put("methodName", GetVersionRpcMethod::getMethodName()); + dict->put("params", List::g()); + reqparams->append(dict); + } + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(0, res.code); + const List* resParams = asList(res.param); + CPPUNIT_ASSERT_EQUAL((size_t)7, resParams->size()); + CPPUNIT_ASSERT_EQUAL(std::string("1"), + asString(asList(resParams->get(0))->get(0))->s()); + CPPUNIT_ASSERT_EQUAL(std::string("2"), + asString(asList(resParams->get(1))->get(0))->s()); + CPPUNIT_ASSERT_EQUAL((int64_t)1, + asInteger + (asDict(resParams->get(2))->get("faultCode")) + ->i()); + CPPUNIT_ASSERT_EQUAL((int64_t)1, + asInteger + (asDict(resParams->get(3))->get("faultCode")) + ->i()); + CPPUNIT_ASSERT_EQUAL((int64_t)1, + asInteger + (asDict(resParams->get(4))->get("faultCode")) + ->i()); + CPPUNIT_ASSERT_EQUAL((int64_t)1, + asInteger + (asDict(resParams->get(5))->get("faultCode")) + ->i()); + CPPUNIT_ASSERT(asList(resParams->get(6))); +} + +void RpcMethodTest::testSystemMulticall_fail() +{ + SystemMulticallRpcMethod m; + RpcRequest req("system.multicall", List::g()); + RpcResponse res = m.execute(req, e_.get()); + CPPUNIT_ASSERT_EQUAL(1, res.code); +} + +} // namespace rpc + +} // namespace aria2 |
