FileEntryTest.cc 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include "FileEntry.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "InOrderURISelector.h"
  4. namespace aria2 {
  5. class FileEntryTest : public CppUnit::TestFixture {
  6. CPPUNIT_TEST_SUITE(FileEntryTest);
  7. CPPUNIT_TEST(testSetupDir);
  8. CPPUNIT_TEST(testRemoveURIWhoseHostnameIs);
  9. CPPUNIT_TEST(testExtractURIResult);
  10. CPPUNIT_TEST(testGetRequest);
  11. CPPUNIT_TEST(testGetRequest_disableSingleHostMultiConnection);
  12. CPPUNIT_TEST(testReuseUri);
  13. CPPUNIT_TEST(testAddUri);
  14. CPPUNIT_TEST(testAddUris);
  15. CPPUNIT_TEST(testInsertUri);
  16. CPPUNIT_TEST(testRemoveUri);
  17. CPPUNIT_TEST_SUITE_END();
  18. public:
  19. void setUp() {}
  20. void testSetupDir();
  21. void testRemoveURIWhoseHostnameIs();
  22. void testExtractURIResult();
  23. void testGetRequest();
  24. void testGetRequest_disableSingleHostMultiConnection();
  25. void testReuseUri();
  26. void testAddUri();
  27. void testAddUris();
  28. void testInsertUri();
  29. void testRemoveUri();
  30. };
  31. CPPUNIT_TEST_SUITE_REGISTRATION( FileEntryTest );
  32. static SharedHandle<FileEntry> createFileEntry()
  33. {
  34. const char* uris[] = { "http://localhost/aria2.zip",
  35. "ftp://localhost/aria2.zip",
  36. "http://mirror/aria2.zip" };
  37. SharedHandle<FileEntry> fileEntry(new FileEntry());
  38. fileEntry->setUris(std::vector<std::string>(&uris[0], &uris[3]));
  39. return fileEntry;
  40. }
  41. void FileEntryTest::testSetupDir()
  42. {
  43. std::string dir = "./aria2-FileEntryTest-testSetupDir";
  44. std::string filename = "filename";
  45. std::string path = dir+"/"+filename;
  46. File d(dir);
  47. if(d.exists()) {
  48. CPPUNIT_ASSERT(d.remove());
  49. }
  50. CPPUNIT_ASSERT(!d.exists());
  51. FileEntry fileEntry(path, 0, 0);
  52. fileEntry.setupDir();
  53. CPPUNIT_ASSERT(d.isDir());
  54. File f(path);
  55. CPPUNIT_ASSERT(!f.exists());
  56. }
  57. void FileEntryTest::testRemoveURIWhoseHostnameIs()
  58. {
  59. SharedHandle<FileEntry> fileEntry = createFileEntry();
  60. fileEntry->removeURIWhoseHostnameIs("localhost");
  61. CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size());
  62. CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"),
  63. fileEntry->getRemainingUris()[0]);
  64. }
  65. void FileEntryTest::testExtractURIResult()
  66. {
  67. FileEntry fileEntry;
  68. fileEntry.addURIResult("http://timeout/file", downloadresultcode::TIME_OUT);
  69. fileEntry.addURIResult("http://finished/file", downloadresultcode::FINISHED);
  70. fileEntry.addURIResult("http://timeout/file2", downloadresultcode::TIME_OUT);
  71. fileEntry.addURIResult("http://unknownerror/file", downloadresultcode::UNKNOWN_ERROR);
  72. std::deque<URIResult> res;
  73. fileEntry.extractURIResult(res, downloadresultcode::TIME_OUT);
  74. CPPUNIT_ASSERT_EQUAL((size_t)2, res.size());
  75. CPPUNIT_ASSERT_EQUAL(std::string("http://timeout/file"), res[0].getURI());
  76. CPPUNIT_ASSERT_EQUAL(std::string("http://timeout/file2"), res[1].getURI());
  77. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry.getURIResults().size());
  78. CPPUNIT_ASSERT_EQUAL(std::string("http://finished/file"),
  79. fileEntry.getURIResults()[0].getURI());
  80. CPPUNIT_ASSERT_EQUAL(std::string("http://unknownerror/file"),
  81. fileEntry.getURIResults()[1].getURI());
  82. res.clear();
  83. fileEntry.extractURIResult(res, downloadresultcode::TIME_OUT);
  84. CPPUNIT_ASSERT(res.empty());
  85. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry.getURIResults().size());
  86. }
  87. void FileEntryTest::testGetRequest()
  88. {
  89. SharedHandle<FileEntry> fileEntry = createFileEntry();
  90. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  91. SharedHandle<Request> req = fileEntry->getRequest(selector);
  92. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost());
  93. CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol());
  94. fileEntry->poolRequest(req);
  95. SharedHandle<Request> req2nd = fileEntry->getRequest(selector);
  96. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req2nd->getHost());
  97. CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol());
  98. SharedHandle<Request> req3rd = fileEntry->getRequest(selector);
  99. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req3rd->getHost());
  100. CPPUNIT_ASSERT_EQUAL(std::string("ftp"), req3rd->getProtocol());
  101. }
  102. void FileEntryTest::testGetRequest_disableSingleHostMultiConnection()
  103. {
  104. SharedHandle<FileEntry> fileEntry = createFileEntry();
  105. fileEntry->disableSingleHostMultiConnection();
  106. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  107. SharedHandle<Request> req = fileEntry->getRequest(selector);
  108. CPPUNIT_ASSERT_EQUAL(std::string("localhost"), req->getHost());
  109. CPPUNIT_ASSERT_EQUAL(std::string("http"), req->getProtocol());
  110. SharedHandle<Request> req2nd = fileEntry->getRequest(selector);
  111. CPPUNIT_ASSERT_EQUAL(std::string("mirror"), req2nd->getHost());
  112. CPPUNIT_ASSERT_EQUAL(std::string("http"), req2nd->getProtocol());
  113. SharedHandle<Request> req3rd = fileEntry->getRequest(selector);
  114. CPPUNIT_ASSERT(req3rd.isNull());
  115. }
  116. void FileEntryTest::testReuseUri()
  117. {
  118. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  119. SharedHandle<FileEntry> fileEntry = createFileEntry();
  120. size_t numUris = fileEntry->getRemainingUris().size();
  121. for(size_t i = 0; i < numUris; ++i) {
  122. fileEntry->getRequest(selector);
  123. }
  124. CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry->getRemainingUris().size());
  125. fileEntry->addURIResult("http://localhost/aria2.zip",
  126. downloadresultcode::UNKNOWN_ERROR);
  127. fileEntry->reuseUri(3);
  128. CPPUNIT_ASSERT_EQUAL((size_t)3, fileEntry->getRemainingUris().size());
  129. const std::deque<std::string>& uris = fileEntry->getRemainingUris();
  130. CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[0]);
  131. CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]);
  132. CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[2]);
  133. }
  134. void FileEntryTest::testAddUri()
  135. {
  136. FileEntry file;
  137. CPPUNIT_ASSERT(file.addUri("http://good"));
  138. CPPUNIT_ASSERT(!file.addUri("bad"));
  139. }
  140. void FileEntryTest::testAddUris()
  141. {
  142. FileEntry file;
  143. std::string uris[] = {"bad", "http://good"};
  144. CPPUNIT_ASSERT_EQUAL((size_t)1, file.addUris(&uris[0], &uris[2]));
  145. }
  146. void FileEntryTest::testInsertUri()
  147. {
  148. FileEntry file;
  149. CPPUNIT_ASSERT(file.insertUri("http://example.org/1", 0));
  150. CPPUNIT_ASSERT(file.insertUri("http://example.org/2", 0));
  151. CPPUNIT_ASSERT(file.insertUri("http://example.org/3", 1));
  152. CPPUNIT_ASSERT(file.insertUri("http://example.org/4", 5));
  153. std::deque<std::string> uris = file.getRemainingUris();
  154. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/2"), uris[0]);
  155. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/3"), uris[1]);
  156. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/1"), uris[2]);
  157. CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/4"), uris[3]);
  158. }
  159. void FileEntryTest::testRemoveUri()
  160. {
  161. SharedHandle<InOrderURISelector> selector(new InOrderURISelector());
  162. FileEntry file;
  163. file.addUri("http://example.org/");
  164. CPPUNIT_ASSERT(file.removeUri("http://example.org/"));
  165. CPPUNIT_ASSERT(file.getRemainingUris().empty());
  166. CPPUNIT_ASSERT(!file.removeUri("http://example.org/"));
  167. file.addUri("http://example.org/");
  168. SharedHandle<Request> exampleOrgReq = file.getRequest(selector);
  169. CPPUNIT_ASSERT(!exampleOrgReq->removalRequested());
  170. CPPUNIT_ASSERT_EQUAL((size_t)1, file.getSpentUris().size());
  171. CPPUNIT_ASSERT(file.removeUri("http://example.org/"));
  172. CPPUNIT_ASSERT(file.getSpentUris().empty());
  173. CPPUNIT_ASSERT(exampleOrgReq->removalRequested());
  174. file.poolRequest(exampleOrgReq);
  175. CPPUNIT_ASSERT_EQUAL((size_t)0, file.countPooledRequest());
  176. file.addUri("http://example.org/");
  177. exampleOrgReq = file.getRequest(selector);
  178. file.poolRequest(exampleOrgReq);
  179. CPPUNIT_ASSERT_EQUAL((size_t)1, file.countPooledRequest());
  180. CPPUNIT_ASSERT(file.removeUri("http://example.org/"));
  181. CPPUNIT_ASSERT_EQUAL((size_t)0, file.countPooledRequest());
  182. CPPUNIT_ASSERT(file.getSpentUris().empty());
  183. file.addUri("http://example.org/");
  184. CPPUNIT_ASSERT(!file.removeUri("http://example.net"));
  185. }
  186. } // namespace aria2