FileEntryTest.cc 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. #include "FileEntry.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "InOrderURISelector.h"
  4. #include "util.h"
  5. namespace aria2 {
  6. class FileEntryTest : public CppUnit::TestFixture {
  7. CPPUNIT_TEST_SUITE(FileEntryTest);
  8. CPPUNIT_TEST(testRemoveURIWhoseHostnameIs);
  9. CPPUNIT_TEST(testExtractURIResult);
  10. CPPUNIT_TEST(testGetRequest);
  11. CPPUNIT_TEST(testGetRequest_withoutUriReuse);
  12. CPPUNIT_TEST(testGetRequest_withUniqueProtocol);
  13. CPPUNIT_TEST(testReuseUri);
  14. CPPUNIT_TEST(testAddUri);
  15. CPPUNIT_TEST(testAddUris);
  16. CPPUNIT_TEST(testInsertUri);
  17. CPPUNIT_TEST(testRemoveUri);
  18. CPPUNIT_TEST_SUITE_END();
  19. public:
  20. void setUp() {}
  21. void testRemoveURIWhoseHostnameIs();
  22. void testExtractURIResult();
  23. void testGetRequest();
  24. void testGetRequest_withoutUriReuse();
  25. void testGetRequest_withUniqueProtocol();
  26. void testReuseUri();
  27. void testAddUri();
  28. void testAddUris();
  29. void testInsertUri();
  30. void testRemoveUri();
  31. };
  32. CPPUNIT_TEST_SUITE_REGISTRATION( FileEntryTest );
  33. namespace {
  34. SharedHandle<FileEntry> createFileEntry()
  35. {
  36. const char* uris[] = { "http://localhost/aria2.zip",
  37. "ftp://localhost/aria2.zip",
  38. "http://mirror/aria2.zip" };
  39. SharedHandle<FileEntry> fileEntry(new FileEntry());
  40. fileEntry->setUris(std::vector<std::string>(&uris[0], &uris[3]));
  41. return fileEntry;
  42. }
  43. } // namespace
  44. void FileEntryTest::testRemoveURIWhoseHostnameIs()
  45. {
  46. SharedHandle<FileEntry> fileEntry = createFileEntry();
  47. fileEntry->removeURIWhoseHostnameIs("localhost");
  48. CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size());
  49. CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"),
  50. fileEntry->getRemainingUris()[0]);
  51. }
  52. void FileEntryTest::testExtractURIResult()
  53. {
  54. FileEntry fileEntry;
  55. fileEntry.addURIResult("http://timeout/file", error_code::TIME_OUT);
  56. fileEntry.addURIResult("http://finished/file", error_code::FINISHED);
  57. fileEntry.addURIResult("http://timeout/file2", error_code::TIME_OUT);
  58. fileEntry.addURIResult("http://unknownerror/file", error_code::UNKNOWN_ERROR);
  59. std::deque<URIResult> res;
  60. fileEntry.extractURIResult(res, error_code::TIME_OUT);
  61. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  62. CPPUNIT_ASSERT_EQUAL(std::string("http://timeout/file"), res[0].getURI());
  63. CPPUNIT_ASSERT_EQUAL(std::string("http://timeout/file2"), res[1].getURI());
  64. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry.getURIResults().size());
  65. CPPUNIT_ASSERT_EQUAL(std::string("http://finished/file"),
  66. fileEntry.getURIResults()[0].getURI());
  67. CPPUNIT_ASSERT_EQUAL(std::string("http://unknownerror/file"),
  68. fileEntry.getURIResults()[1].getURI());
  69. res.clear();
  70. fileEntry.extractURIResult(res, error_code::TIME_OUT);
  71. CPPUNIT_ASSERT(res.empty());
  72. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry.getURIResults().size());
  73. }
  74. void FileEntryTest::testGetRequest()
  75. {
  76. SharedHandle<FileEntry> fileEntry = createFileEntry();
  77. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  78. std::vector<std::pair<size_t, std::string> > usedHosts;
  79. SharedHandle<Request> req =
  80. fileEntry->getRequest(selector, true, usedHosts);
  81. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost());
  82. CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol());
  83. fileEntry->poolRequest(req);
  84. SharedHandle<Request> req2nd =
  85. fileEntry->getRequest(selector, true, usedHosts);
  86. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req2nd->getHost());
  87. CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol());
  88. SharedHandle<Request> req3rd =
  89. fileEntry->getRequest(selector, true, usedHosts);
  90. CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req3rd->getHost());
  91. CPPUNIT_ASSERT_EQUAL(std::string("http"), req3rd->getProtocol());
  92. SharedHandle<Request> req4th =
  93. fileEntry->getRequest(selector, true, usedHosts);
  94. CPPUNIT_ASSERT(!req4th);
  95. fileEntry->setMaxConnectionPerServer(2);
  96. SharedHandle<Request> req5th =
  97. fileEntry->getRequest(selector, true, usedHosts);
  98. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req5th->getHost());
  99. CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req5th->getProtocol());
  100. SharedHandle<Request> req6th =
  101. fileEntry->getRequest(selector, true, usedHosts);
  102. CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req6th->getHost());
  103. CPPUNIT_ASSERT_EQUAL(std::string("http"), req6th->getProtocol());
  104. SharedHandle<Request> req7th =
  105. fileEntry->getRequest(selector, true, usedHosts);
  106. CPPUNIT_ASSERT(!req7th);
  107. }
  108. void FileEntryTest::testGetRequest_withoutUriReuse()
  109. {
  110. std::vector<std::pair<size_t, std::string> > usedHosts;
  111. SharedHandle<FileEntry> fileEntry = createFileEntry();
  112. fileEntry->setMaxConnectionPerServer(2);
  113. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  114. SharedHandle<Request> req = fileEntry->getRequest(selector, false, usedHosts);
  115. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost());
  116. CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol());
  117. SharedHandle<Request> req2nd =
  118. fileEntry->getRequest(selector, false, usedHosts);
  119. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req2nd->getHost());
  120. CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req2nd->getProtocol());
  121. SharedHandle<Request> req3rd =
  122. fileEntry->getRequest(selector, false, usedHosts);
  123. CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req3rd->getHost());
  124. CPPUNIT_ASSERT_EQUAL(std::string("http"), req3rd->getProtocol());
  125. SharedHandle<Request> req4th =
  126. fileEntry->getRequest(selector, false, usedHosts);
  127. CPPUNIT_ASSERT(!req4th);
  128. }
  129. void FileEntryTest::testGetRequest_withUniqueProtocol()
  130. {
  131. std::vector<std::pair<size_t, std::string> > usedHosts;
  132. SharedHandle<FileEntry> fileEntry = createFileEntry();
  133. fileEntry->setUniqueProtocol(true);
  134. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  135. SharedHandle<Request> req =
  136. fileEntry->getRequest(selector, true, usedHosts);
  137. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost());
  138. CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol());
  139. SharedHandle<Request> req2nd =
  140. fileEntry->getRequest(selector, true, usedHosts);
  141. CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req2nd->getHost());
  142. CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol());
  143. SharedHandle<Request> req3rd =
  144. fileEntry->getRequest(selector, true, usedHosts);
  145. CPPUNIT_ASSERT(!req3rd);
  146. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry->getRemainingUris().size());
  147. CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"),
  148. fileEntry->getRemainingUris()[0]);
  149. CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"),
  150. fileEntry->getRemainingUris()[1]);
  151. }
  152. void FileEntryTest::testReuseUri()
  153. {
  154. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  155. SharedHandle<FileEntry> fileEntry = createFileEntry();
  156. fileEntry->setMaxConnectionPerServer(3);
  157. size_t numUris = fileEntry->getRemainingUris().size();
  158. std::vector<std::pair<size_t, std::string> > usedHosts;
  159. for(size_t i = 0; i < numUris; ++i) {
  160. fileEntry->getRequest(selector, false, usedHosts);
  161. }
  162. CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size());
  163. fileEntry->addURIResult("http://localhost/aria2.zip",
  164. error_code::UNKNOWN_ERROR);
  165. std::vector<std::string> ignore;
  166. fileEntry->reuseUri(ignore);
  167. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry->getRemainingUris().size());
  168. std::deque<std::string> uris = fileEntry->getRemainingUris();
  169. CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[0]);
  170. CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]);
  171. for(size_t i = 0; i < 2; ++i) {
  172. fileEntry->getRequest(selector, false, usedHosts);
  173. }
  174. CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size());
  175. ignore.clear();
  176. ignore.push_back("mirror");
  177. fileEntry->reuseUri(ignore);
  178. CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size());
  179. uris = fileEntry->getRemainingUris();
  180. CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[0]);
  181. }
  182. void FileEntryTest::testAddUri()
  183. {
  184. FileEntry file;
  185. CPPUNIT_ASSERT(file.addUri("http://good"));
  186. CPPUNIT_ASSERT(!file.addUri("bad"));
  187. }
  188. void FileEntryTest::testAddUris()
  189. {
  190. FileEntry file;
  191. std::string uris[] = {"bad", "http://good"};
  192. CPPUNIT_ASSERT_EQUAL((size_t)1, file.addUris(&uris[0], &uris[2]));
  193. }
  194. void FileEntryTest::testInsertUri()
  195. {
  196. FileEntry file;
  197. CPPUNIT_ASSERT(file.insertUri("http://example.org/1", 0));
  198. CPPUNIT_ASSERT(file.insertUri("http://example.org/2", 0));
  199. CPPUNIT_ASSERT(file.insertUri("http://example.org/3", 1));
  200. CPPUNIT_ASSERT(file.insertUri("http://example.org/4", 5));
  201. std::deque<std::string> uris = file.getRemainingUris();
  202. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/2"), uris[0]);
  203. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/3"), uris[1]);
  204. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/1"), uris[2]);
  205. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/4"), uris[3]);
  206. }
  207. void FileEntryTest::testRemoveUri()
  208. {
  209. std::vector<std::pair<size_t, std::string> > usedHosts;
  210. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  211. FileEntry file;
  212. file.addUri("http://example.org/");
  213. CPPUNIT_ASSERT(file.removeUri("http://example.org/"));
  214. CPPUNIT_ASSERT(file.getRemainingUris().empty());
  215. CPPUNIT_ASSERT(!file.removeUri("http://example.org/"));
  216. file.addUri("http://example.org/");
  217. SharedHandle<Request> exampleOrgReq =
  218. file.getRequest(selector, true, usedHosts);
  219. CPPUNIT_ASSERT(!exampleOrgReq->removalRequested());
  220. CPPUNIT_ASSERT_EQUAL((size_t)1, file.getSpentUris().size());
  221. CPPUNIT_ASSERT(file.removeUri("http://example.org/"));
  222. CPPUNIT_ASSERT(file.getSpentUris().empty());
  223. CPPUNIT_ASSERT(exampleOrgReq->removalRequested());
  224. file.poolRequest(exampleOrgReq);
  225. CPPUNIT_ASSERT_EQUAL((size_t)0, file.countPooledRequest());
  226. file.addUri("http://example.org/");
  227. exampleOrgReq = file.getRequest(selector, true, usedHosts);
  228. file.poolRequest(exampleOrgReq);
  229. CPPUNIT_ASSERT_EQUAL((size_t)1, file.countPooledRequest());
  230. CPPUNIT_ASSERT(file.removeUri("http://example.org/"));
  231. CPPUNIT_ASSERT_EQUAL((size_t)0, file.countPooledRequest());
  232. CPPUNIT_ASSERT(file.getSpentUris().empty());
  233. file.addUri("http://example.org/");
  234. CPPUNIT_ASSERT(!file.removeUri("http://example.net"));
  235. }
  236. } // namespace aria2