#include "FileEntry.h" #include #include "InorderURISelector.h" #include "util.h" namespace aria2 { class FileEntryTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(FileEntryTest); CPPUNIT_TEST(testRemoveURIWhoseHostnameIs); CPPUNIT_TEST(testExtractURIResult); CPPUNIT_TEST(testGetRequest); CPPUNIT_TEST(testGetRequest_withoutUriReuse); CPPUNIT_TEST(testGetRequest_withUniqueProtocol); CPPUNIT_TEST(testGetRequest_withReferer); CPPUNIT_TEST(testReuseUri); CPPUNIT_TEST(testAddUri); CPPUNIT_TEST(testAddUris); CPPUNIT_TEST(testInsertUri); CPPUNIT_TEST(testRemoveUri); CPPUNIT_TEST(testPutBackRequest); CPPUNIT_TEST_SUITE_END(); public: void setUp() {} void testRemoveURIWhoseHostnameIs(); void testExtractURIResult(); void testGetRequest(); void testGetRequest_withoutUriReuse(); void testGetRequest_withUniqueProtocol(); void testGetRequest_withReferer(); void testReuseUri(); void testAddUri(); void testAddUris(); void testInsertUri(); void testRemoveUri(); void testPutBackRequest(); }; CPPUNIT_TEST_SUITE_REGISTRATION( FileEntryTest ); namespace { std::shared_ptr createFileEntry() { auto fileEntry = std::make_shared(); fileEntry->setUris(std::vector{ "http://localhost/aria2.zip", "ftp://localhost/aria2.zip", "http://mirror/aria2.zip" }); return fileEntry; } } // namespace void FileEntryTest::testRemoveURIWhoseHostnameIs() { auto fileEntry = createFileEntry(); fileEntry->removeURIWhoseHostnameIs("localhost"); CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size()); CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), fileEntry->getRemainingUris()[0]); } void FileEntryTest::testExtractURIResult() { FileEntry fileEntry; fileEntry.addURIResult("http://timeout/file", error_code::TIME_OUT); fileEntry.addURIResult("http://finished/file", error_code::FINISHED); fileEntry.addURIResult("http://timeout/file2", error_code::TIME_OUT); fileEntry.addURIResult("http://unknownerror/file", error_code::UNKNOWN_ERROR); std::deque res; fileEntry.extractURIResult(res, error_code::TIME_OUT); CPPUNIT_ASSERT_EQUAL((size_t)2, res.size()); CPPUNIT_ASSERT_EQUAL(std::string("http://timeout/file"), res[0].getURI()); CPPUNIT_ASSERT_EQUAL(std::string("http://timeout/file2"), res[1].getURI()); CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry.getURIResults().size()); CPPUNIT_ASSERT_EQUAL(std::string("http://finished/file"), fileEntry.getURIResults()[0].getURI()); CPPUNIT_ASSERT_EQUAL(std::string("http://unknownerror/file"), fileEntry.getURIResults()[1].getURI()); res.clear(); fileEntry.extractURIResult(res, error_code::TIME_OUT); CPPUNIT_ASSERT(res.empty()); CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry.getURIResults().size()); } void FileEntryTest::testGetRequest() { auto fileEntry = createFileEntry(); InorderURISelector selector{}; std::vector> usedHosts; auto req = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol()); fileEntry->poolRequest(req); auto req2nd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req2nd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol()); auto req3rd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req3rd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req3rd->getProtocol()); auto req4th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!req4th); fileEntry->setMaxConnectionPerServer(2); auto req5th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req5th->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req5th->getProtocol()); auto req6th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req6th->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req6th->getProtocol()); auto req7th = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!req7th); } void FileEntryTest::testGetRequest_withoutUriReuse() { std::vector> usedHosts; auto fileEntry = createFileEntry(); fileEntry->setMaxConnectionPerServer(2); InorderURISelector selector{}; auto req = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol()); auto req2nd = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req2nd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req2nd->getProtocol()); auto req3rd = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req3rd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req3rd->getProtocol()); auto req4th = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT(!req4th); } void FileEntryTest::testGetRequest_withUniqueProtocol() { std::vector> usedHosts; auto fileEntry = createFileEntry(); fileEntry->setUniqueProtocol(true); InorderURISelector selector{}; auto req = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol()); auto req2nd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req2nd->getHost()); CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol()); auto req3rd = fileEntry->getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!req3rd); CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry->getRemainingUris().size()); CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), fileEntry->getRemainingUris()[0]); CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), fileEntry->getRemainingUris()[1]); } void FileEntryTest::testGetRequest_withReferer() { auto fileEntry = createFileEntry(); InorderURISelector selector{}; std::vector> usedHosts; auto req = fileEntry->getRequest(&selector, true, usedHosts, "http://referer"); CPPUNIT_ASSERT_EQUAL(std::string("http://referer"), req->getReferer()); // URI is used as referer if "*" is given. req = fileEntry->getRequest(&selector, true, usedHosts, "*"); CPPUNIT_ASSERT_EQUAL(req->getUri(), req->getReferer()); } void FileEntryTest::testReuseUri() { InorderURISelector selector{}; auto fileEntry = createFileEntry(); fileEntry->setMaxConnectionPerServer(3); size_t numUris = fileEntry->getRemainingUris().size(); std::vector> usedHosts; for(size_t i = 0; i < numUris; ++i) { fileEntry->getRequest(&selector, false, usedHosts); } CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size()); fileEntry->addURIResult("http://localhost/aria2.zip", error_code::UNKNOWN_ERROR); std::vector ignore; fileEntry->reuseUri(ignore); CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry->getRemainingUris().size()); auto uris = fileEntry->getRemainingUris(); CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[0]); CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]); for(size_t i = 0; i < 2; ++i) { fileEntry->getRequest(&selector, false, usedHosts); } CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size()); ignore.clear(); ignore.push_back("mirror"); fileEntry->reuseUri(ignore); CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size()); uris = fileEntry->getRemainingUris(); CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[0]); } void FileEntryTest::testAddUri() { FileEntry file; CPPUNIT_ASSERT(file.addUri("http://good")); CPPUNIT_ASSERT(!file.addUri("bad")); // Test for percent-encode CPPUNIT_ASSERT(file.addUri("http://host:80/file> usedHosts; InorderURISelector selector{}; FileEntry file; file.addUri("http://example.org/"); CPPUNIT_ASSERT(file.removeUri("http://example.org/")); CPPUNIT_ASSERT(file.getRemainingUris().empty()); CPPUNIT_ASSERT(!file.removeUri("http://example.org/")); file.addUri("http://example.org/"); auto exampleOrgReq = file.getRequest(&selector, true, usedHosts); CPPUNIT_ASSERT(!exampleOrgReq->removalRequested()); CPPUNIT_ASSERT_EQUAL((size_t)1, file.getSpentUris().size()); CPPUNIT_ASSERT(file.removeUri("http://example.org/")); CPPUNIT_ASSERT(file.getSpentUris().empty()); CPPUNIT_ASSERT(exampleOrgReq->removalRequested()); file.poolRequest(exampleOrgReq); CPPUNIT_ASSERT_EQUAL((size_t)0, file.countPooledRequest()); file.addUri("http://example.org/"); exampleOrgReq = file.getRequest(&selector, true, usedHosts); file.poolRequest(exampleOrgReq); CPPUNIT_ASSERT_EQUAL((size_t)1, file.countPooledRequest()); CPPUNIT_ASSERT(file.removeUri("http://example.org/")); CPPUNIT_ASSERT_EQUAL((size_t)0, file.countPooledRequest()); CPPUNIT_ASSERT(file.getSpentUris().empty()); file.addUri("http://example.org/"); CPPUNIT_ASSERT(!file.removeUri("http://example.net")); } void FileEntryTest::testPutBackRequest() { auto fileEntry = createFileEntry(); InorderURISelector selector{}; std::vector> usedHosts; auto req1 = fileEntry->getRequest(&selector, false, usedHosts); auto req2 = fileEntry->getRequest(&selector, false, usedHosts); CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size()); fileEntry->poolRequest(req2); fileEntry->putBackRequest(); auto& uris = fileEntry->getRemainingUris(); CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size()); CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/aria2.zip"), uris[0]); CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]); CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[2]); } } // namespace aria2