MultiDiskAdaptorTest.cc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. #include "MultiDiskAdaptor.h"
  2. #include <string>
  3. #include <cerrno>
  4. #include <cstring>
  5. #include <cppunit/extensions/HelperMacros.h>
  6. #include "FileEntry.h"
  7. #include "Exception.h"
  8. #include "a2io.h"
  9. #include "array_fun.h"
  10. #include "TestUtil.h"
  11. #include "DiskWriter.h"
  12. #include "WrDiskCacheEntry.h"
  13. namespace aria2 {
  14. class MultiDiskAdaptorTest:public CppUnit::TestFixture {
  15. CPPUNIT_TEST_SUITE(MultiDiskAdaptorTest);
  16. CPPUNIT_TEST(testWriteData);
  17. CPPUNIT_TEST(testReadData);
  18. CPPUNIT_TEST(testCutTrailingGarbage);
  19. CPPUNIT_TEST(testSize);
  20. CPPUNIT_TEST(testUtime);
  21. CPPUNIT_TEST(testResetDiskWriterEntries);
  22. CPPUNIT_TEST(testWriteCache);
  23. CPPUNIT_TEST_SUITE_END();
  24. private:
  25. std::shared_ptr<MultiDiskAdaptor> adaptor;
  26. public:
  27. void setUp() {
  28. adaptor.reset(new MultiDiskAdaptor());
  29. adaptor->setPieceLength(2);
  30. }
  31. void testWriteData();
  32. void testReadData();
  33. void testCutTrailingGarbage();
  34. void testSize();
  35. void testUtime();
  36. void testResetDiskWriterEntries();
  37. void testWriteCache();
  38. };
  39. CPPUNIT_TEST_SUITE_REGISTRATION( MultiDiskAdaptorTest );
  40. std::vector<std::shared_ptr<FileEntry> > createEntries()
  41. {
  42. std::vector<std::shared_ptr<FileEntry>> entries {
  43. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file0.txt", 0, 0),
  44. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file1.txt", 15, 0),
  45. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file2.txt", 7, 15),
  46. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file3.txt", 0, 22),
  47. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file4.txt", 2, 22),
  48. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file5.txt", 0, 24),
  49. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file6.txt", 3, 24),
  50. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file7.txt", 0, 27),
  51. std::make_shared<FileEntry>(A2_TEST_OUT_DIR "/file8.txt", 2, 27),
  52. };
  53. // 1 1 2 2 3
  54. // 0....5....0....5....0....5....0
  55. // ++--++--++--++--++--++--++--++--
  56. // | file0
  57. // *************** file1
  58. // ******* file2
  59. // | file3
  60. // ** flie4
  61. // | file5
  62. // *** file6
  63. // |file7
  64. // ** file8
  65. for(const auto& i : entries) {
  66. File(i->getPath()).remove();
  67. }
  68. return entries;
  69. }
  70. void MultiDiskAdaptorTest::testResetDiskWriterEntries()
  71. {
  72. {
  73. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  74. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  75. // In openFile(), resetDiskWriterEntries() are called.
  76. adaptor->openFile();
  77. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  78. adaptor->getDiskWriterEntries();
  79. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  80. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  81. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  82. CPPUNIT_ASSERT(entries[3]->getDiskWriter());
  83. CPPUNIT_ASSERT(entries[4]->getDiskWriter());
  84. CPPUNIT_ASSERT(entries[5]->getDiskWriter());
  85. adaptor->closeFile();
  86. }
  87. {
  88. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  89. fileEntries[0]->setRequested(false);
  90. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  91. // In openFile(), resetDiskWriterEntries() are called.
  92. adaptor->openFile();
  93. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  94. adaptor->getDiskWriterEntries();
  95. // Because entries[1] spans entries[0]
  96. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  97. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  98. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  99. CPPUNIT_ASSERT(entries[3]->getDiskWriter());
  100. CPPUNIT_ASSERT(entries[4]->getDiskWriter());
  101. CPPUNIT_ASSERT(entries[5]->getDiskWriter());
  102. adaptor->closeFile();
  103. }
  104. {
  105. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  106. fileEntries[0]->setRequested(false);
  107. fileEntries[1]->setRequested(false);
  108. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  109. // In openFile(), resetDiskWriterEntries() are called.
  110. adaptor->openFile();
  111. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  112. adaptor->getDiskWriterEntries();
  113. CPPUNIT_ASSERT(!entries[0]->getDiskWriter());
  114. // Because entries[2] spans entries[1]
  115. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  116. CPPUNIT_ASSERT(entries[1]->needsFileAllocation());
  117. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  118. CPPUNIT_ASSERT(entries[3]->getDiskWriter());
  119. CPPUNIT_ASSERT(entries[4]->getDiskWriter());
  120. CPPUNIT_ASSERT(entries[5]->getDiskWriter());
  121. adaptor->closeFile();
  122. }
  123. {
  124. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  125. fileEntries[3]->setRequested(false);
  126. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  127. // In openFile(), resetDiskWriterEntries() are called.
  128. adaptor->openFile();
  129. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  130. adaptor->getDiskWriterEntries();
  131. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  132. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  133. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  134. // Because entries[4] spans entries[3]
  135. CPPUNIT_ASSERT(entries[3]->getDiskWriter());
  136. CPPUNIT_ASSERT(entries[3]->needsFileAllocation());
  137. CPPUNIT_ASSERT(entries[4]->getDiskWriter());
  138. CPPUNIT_ASSERT(entries[5]->getDiskWriter());
  139. adaptor->closeFile();
  140. }
  141. {
  142. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  143. fileEntries[4]->setRequested(false);
  144. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  145. // In openFile(), resetDiskWriterEntries() are called.
  146. adaptor->openFile();
  147. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  148. adaptor->getDiskWriterEntries();
  149. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  150. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  151. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  152. CPPUNIT_ASSERT(entries[3]->getDiskWriter());
  153. // entries[3] is 0 length. No overrap with entries[4]
  154. CPPUNIT_ASSERT(!entries[4]->getDiskWriter());
  155. CPPUNIT_ASSERT(entries[5]->getDiskWriter());
  156. adaptor->closeFile();
  157. }
  158. {
  159. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  160. fileEntries[3]->setRequested(false);
  161. fileEntries[4]->setRequested(false);
  162. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  163. // In openFile(), resetDiskWriterEntries() are called.
  164. adaptor->openFile();
  165. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  166. adaptor->getDiskWriterEntries();
  167. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  168. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  169. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  170. CPPUNIT_ASSERT(!entries[3]->getDiskWriter());
  171. CPPUNIT_ASSERT(!entries[4]->getDiskWriter());
  172. CPPUNIT_ASSERT(entries[5]->getDiskWriter());
  173. adaptor->closeFile();
  174. }
  175. {
  176. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  177. for(size_t i = 5; i < 9; ++i) {
  178. fileEntries[i]->setRequested(false);
  179. }
  180. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  181. // In openFile(), resetDiskWriterEntries() are called.
  182. adaptor->openFile();
  183. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  184. adaptor->getDiskWriterEntries();
  185. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  186. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  187. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  188. CPPUNIT_ASSERT(entries[3]->getDiskWriter());
  189. CPPUNIT_ASSERT(entries[4]->getDiskWriter());
  190. CPPUNIT_ASSERT(!entries[5]->getDiskWriter());
  191. adaptor->closeFile();
  192. }
  193. {
  194. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  195. for(size_t i = 1; i < 9; ++i) {
  196. fileEntries[i]->setRequested(false);
  197. }
  198. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  199. adaptor->openFile();
  200. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  201. adaptor->getDiskWriterEntries();
  202. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  203. CPPUNIT_ASSERT(!entries[1]->getDiskWriter());
  204. CPPUNIT_ASSERT(!entries[2]->getDiskWriter());
  205. CPPUNIT_ASSERT(!entries[3]->getDiskWriter());
  206. CPPUNIT_ASSERT(!entries[4]->getDiskWriter());
  207. CPPUNIT_ASSERT(!entries[5]->getDiskWriter());
  208. adaptor->closeFile();
  209. }
  210. {
  211. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  212. for(size_t i = 2; i < 9; ++i) {
  213. fileEntries[i]->setRequested(false);
  214. }
  215. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  216. adaptor->openFile();
  217. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  218. adaptor->getDiskWriterEntries();
  219. CPPUNIT_ASSERT(entries[0]->getDiskWriter());
  220. CPPUNIT_ASSERT(entries[1]->getDiskWriter());
  221. // entries[1] spans entries[2]
  222. CPPUNIT_ASSERT(entries[2]->getDiskWriter());
  223. CPPUNIT_ASSERT(!entries[2]->needsFileAllocation());
  224. CPPUNIT_ASSERT(!entries[3]->getDiskWriter());
  225. CPPUNIT_ASSERT(!entries[4]->getDiskWriter());
  226. CPPUNIT_ASSERT(!entries[5]->getDiskWriter());
  227. adaptor->closeFile();
  228. }
  229. {
  230. std::vector<std::shared_ptr<FileEntry> > fileEntries = createEntries();
  231. for(size_t i = 0; i < 6; ++i) {
  232. fileEntries[i]->setRequested(false);
  233. }
  234. fileEntries[8]->setRequested(false);
  235. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  236. adaptor->openFile();
  237. std::vector<std::shared_ptr<DiskWriterEntry> > entries =
  238. adaptor->getDiskWriterEntries();
  239. CPPUNIT_ASSERT(!entries[0]->getDiskWriter());
  240. CPPUNIT_ASSERT(!entries[1]->getDiskWriter());
  241. CPPUNIT_ASSERT(!entries[2]->getDiskWriter());
  242. CPPUNIT_ASSERT(!entries[3]->getDiskWriter());
  243. CPPUNIT_ASSERT(!entries[4]->getDiskWriter());
  244. // entries[6] spans entries[5] in the current implementation.
  245. CPPUNIT_ASSERT(entries[5]->getDiskWriter());
  246. CPPUNIT_ASSERT(entries[6]->getDiskWriter());
  247. CPPUNIT_ASSERT(entries[7]->getDiskWriter());
  248. // entries[6] spans entries[8]
  249. CPPUNIT_ASSERT(entries[8]->getDiskWriter());
  250. adaptor->closeFile();
  251. }
  252. }
  253. void readFile(const std::string& filename, char* buf, int bufLength) {
  254. FILE* f = fopen(filename.c_str(), "r");
  255. if(f == NULL) {
  256. CPPUNIT_FAIL(strerror(errno));
  257. }
  258. int retval = fread(buf, bufLength, 1, f);
  259. fclose(f);
  260. if(retval != 1) {
  261. CPPUNIT_FAIL("return value is not 1");
  262. }
  263. }
  264. void MultiDiskAdaptorTest::testWriteData() {
  265. std::vector<std::shared_ptr<FileEntry> > fileEntries(createEntries());
  266. adaptor->setFileEntries(fileEntries.begin(), fileEntries.end());
  267. adaptor->openFile();
  268. std::string msg = "12345";
  269. adaptor->writeData((const unsigned char*)msg.c_str(), msg.size(), 0);
  270. adaptor->closeFile();
  271. CPPUNIT_ASSERT(File(A2_TEST_OUT_DIR"/file0.txt").isFile());
  272. char buf[128];
  273. readFile(A2_TEST_OUT_DIR"/file1.txt", buf, 5);
  274. buf[5] = '\0';
  275. CPPUNIT_ASSERT_EQUAL(msg, std::string(buf));
  276. adaptor->openFile();
  277. std::string msg2 = "67890ABCDEF";
  278. adaptor->writeData((const unsigned char*)msg2.c_str(), msg2.size(), 5);
  279. adaptor->closeFile();
  280. readFile(A2_TEST_OUT_DIR"/file1.txt", buf, 15);
  281. buf[15] = '\0';
  282. CPPUNIT_ASSERT_EQUAL(std::string("1234567890ABCDE"), std::string(buf));
  283. readFile(A2_TEST_OUT_DIR"/file2.txt", buf, 1);
  284. buf[1] = '\0';
  285. CPPUNIT_ASSERT_EQUAL(std::string("F"), std::string(buf));
  286. adaptor->openFile();
  287. std::string msg3 = "12345123456712";
  288. adaptor->writeData((const unsigned char*)msg3.c_str(), msg3.size(), 10);
  289. adaptor->closeFile();
  290. readFile(A2_TEST_OUT_DIR"/file1.txt", buf, 15);
  291. buf[15] = '\0';
  292. CPPUNIT_ASSERT_EQUAL(std::string("123456789012345"), std::string(buf));
  293. readFile(A2_TEST_OUT_DIR"/file2.txt", buf, 7);
  294. buf[7] = '\0';
  295. CPPUNIT_ASSERT_EQUAL(std::string("1234567"), std::string(buf));
  296. CPPUNIT_ASSERT(File(A2_TEST_OUT_DIR"/file3.txt").isFile());
  297. readFile(A2_TEST_OUT_DIR"/file4.txt", buf, 2);
  298. buf[2] = '\0';
  299. CPPUNIT_ASSERT_EQUAL(std::string("12"), std::string(buf));
  300. CPPUNIT_ASSERT(File(A2_TEST_OUT_DIR"/file5.txt").isFile());
  301. }
  302. void MultiDiskAdaptorTest::testReadData()
  303. {
  304. std::vector<std::shared_ptr<FileEntry>> entries {
  305. std::make_shared<FileEntry>(A2_TEST_DIR "/file1r.txt", 15, 0),
  306. std::make_shared<FileEntry>(A2_TEST_DIR "/file2r.txt", 7, 15),
  307. std::make_shared<FileEntry>(A2_TEST_DIR "/file3r.txt", 3, 22)
  308. };
  309. adaptor->setFileEntries(entries.begin(), entries.end());
  310. adaptor->enableReadOnly();
  311. adaptor->openFile();
  312. unsigned char buf[128];
  313. adaptor->readData(buf, 15, 0);
  314. buf[15] = '\0';
  315. CPPUNIT_ASSERT_EQUAL(std::string("1234567890ABCDE"), std::string((char*)buf));
  316. adaptor->readData(buf, 10, 6);
  317. buf[10] = '\0';
  318. CPPUNIT_ASSERT_EQUAL(std::string("7890ABCDEF"), std::string((char*)buf));
  319. adaptor->readData(buf, 4, 20);
  320. buf[4] = '\0';
  321. CPPUNIT_ASSERT_EQUAL(std::string("KLMN"), std::string((char*)buf));
  322. adaptor->readData(buf, 25, 0);
  323. buf[25] = '\0';
  324. CPPUNIT_ASSERT_EQUAL(std::string("1234567890ABCDEFGHIJKLMNO"),
  325. std::string((char*)buf));
  326. }
  327. void MultiDiskAdaptorTest::testCutTrailingGarbage()
  328. {
  329. std::string dir = A2_TEST_OUT_DIR;
  330. std::string prefix = "aria2_MultiDiskAdaptorTest_testCutTrailingGarbage_";
  331. std::vector<std::shared_ptr<FileEntry> > fileEntries {
  332. std::make_shared<FileEntry>(dir+"/"+prefix+"1", 256, 0),
  333. std::make_shared<FileEntry>(dir+"/"+prefix+"2", 512, 256)
  334. };
  335. for(const auto& i : fileEntries) {
  336. createFile(i->getPath(), i->getLength()+100);
  337. }
  338. MultiDiskAdaptor adaptor;
  339. adaptor.setFileEntries(fileEntries.begin(), fileEntries.end());
  340. adaptor.setMaxOpenFiles(1);
  341. adaptor.setPieceLength(1);
  342. adaptor.openFile();
  343. adaptor.cutTrailingGarbage();
  344. CPPUNIT_ASSERT_EQUAL((int64_t)256,
  345. File(fileEntries[0]->getPath()).size());
  346. CPPUNIT_ASSERT_EQUAL((int64_t)512,
  347. File(fileEntries[1]->getPath()).size());
  348. }
  349. void MultiDiskAdaptorTest::testSize()
  350. {
  351. std::string dir = A2_TEST_OUT_DIR;
  352. std::string prefix = "aria2_MultiDiskAdaptorTest_testSize_";
  353. std::vector<std::shared_ptr<FileEntry>> fileEntries {
  354. std::make_shared<FileEntry>(dir+"/"+prefix+"1", 1, 0),
  355. std::make_shared<FileEntry>(dir+"/"+prefix+"2", 1, 1)
  356. };
  357. for(const auto& i : fileEntries) {
  358. createFile(i->getPath(), i->getLength());
  359. }
  360. MultiDiskAdaptor adaptor;
  361. adaptor.setFileEntries(fileEntries.begin(), fileEntries.end());
  362. adaptor.setMaxOpenFiles(1);
  363. adaptor.setPieceLength(1);
  364. adaptor.openFile();
  365. CPPUNIT_ASSERT_EQUAL((int64_t)2, adaptor.size());
  366. }
  367. void MultiDiskAdaptorTest::testUtime()
  368. {
  369. std::string storeDir = A2_TEST_OUT_DIR"/aria2_MultiDiskAdaptorTest_testUtime";
  370. std::vector<std::shared_ptr<FileEntry> > entries {
  371. std::make_shared<FileEntry>(storeDir+"/requested", 0, 0),
  372. std::make_shared<FileEntry>(storeDir+"/notFound", 0, 0),
  373. std::make_shared<FileEntry>(storeDir+"/notRequested", 0, 0),
  374. std::make_shared<FileEntry>(storeDir+"/anotherRequested", 0, 0),
  375. };
  376. createFile(entries[0]->getPath(), entries[0]->getLength());
  377. File(entries[1]->getPath()).remove();
  378. createFile(entries[2]->getPath(), entries[2]->getLength());
  379. createFile(entries[3]->getPath(), entries[3]->getLength());
  380. entries[2]->setRequested(false);
  381. MultiDiskAdaptor adaptor;
  382. adaptor.setFileEntries(entries.begin(), entries.end());
  383. time_t atime = (time_t) 100000;
  384. time_t mtime = (time_t) 200000;
  385. CPPUNIT_ASSERT_EQUAL((size_t)2, adaptor.utime(Time(atime), Time(mtime)));
  386. CPPUNIT_ASSERT_EQUAL((time_t)mtime,
  387. File(entries[0]->getPath()).getModifiedTime().getTime());
  388. CPPUNIT_ASSERT_EQUAL((time_t)mtime,
  389. File(entries[3]->getPath()).getModifiedTime().getTime());
  390. CPPUNIT_ASSERT((time_t)mtime !=
  391. File(entries[2]->getPath()).getModifiedTime().getTime());
  392. }
  393. void MultiDiskAdaptorTest::testWriteCache()
  394. {
  395. std::string storeDir =
  396. A2_TEST_OUT_DIR"/aria2_MultiDiskAdaptorTest_testWriteCache";
  397. std::vector<std::shared_ptr<FileEntry>> entries {
  398. std::make_shared<FileEntry>(storeDir+"/file1", 16385, 0),
  399. std::make_shared<FileEntry>(storeDir+"/file2", 4098, 16385)
  400. };
  401. for(const auto& i : entries) {
  402. File(i->getPath()).remove();
  403. }
  404. std::shared_ptr<MultiDiskAdaptor> adaptor(new MultiDiskAdaptor());
  405. adaptor->setFileEntries(std::begin(entries), std::end(entries));
  406. WrDiskCacheEntry cache(adaptor);
  407. std::string data1(16383, '1'), data2(100, '2'), data3(4000, '3');
  408. cache.cacheData(createDataCell(0, data1.c_str()));
  409. cache.cacheData(createDataCell(data1.size(), data2.c_str()));
  410. cache.cacheData(createDataCell(data1.size()+data2.size(), data3.c_str()));
  411. adaptor->openFile();
  412. adaptor->writeCache(&cache);
  413. for(int i = 0; i < 2; ++i) {
  414. CPPUNIT_ASSERT_EQUAL(entries[i]->getLength(),
  415. File(entries[i]->getPath()).size());
  416. }
  417. CPPUNIT_ASSERT_EQUAL(data1+data2.substr(0, 2),
  418. readFile(entries[0]->getPath()));
  419. CPPUNIT_ASSERT_EQUAL(data2.substr(2)+data3,
  420. readFile(entries[1]->getPath()));
  421. adaptor->closeFile();
  422. for(int i = 0; i < 2; ++i) {
  423. File(entries[i]->getPath()).remove();
  424. }
  425. cache.clear();
  426. cache.cacheData(createDataCell(123, data2.c_str()));
  427. adaptor->openFile();
  428. adaptor->writeCache(&cache);
  429. CPPUNIT_ASSERT_EQUAL((int64_t)(123+data2.size()),
  430. File(entries[0]->getPath()).size());
  431. CPPUNIT_ASSERT_EQUAL(data2, readFile(entries[0]->getPath()).substr(123));
  432. }
  433. } // namespace aria2