FileEntryTest.cc 11 KB

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