1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/chromeos/drive/file_cache.h"
10 #include "base/callback_helpers.h"
11 #include "base/files/file_enumerator.h"
12 #include "base/files/file_util.h"
13 #include "base/files/scoped_temp_dir.h"
15 #include "base/path_service.h"
16 #include "chrome/browser/chromeos/drive/drive.pb.h"
17 #include "chrome/browser/chromeos/drive/fake_free_disk_space_getter.h"
18 #include "chrome/browser/chromeos/drive/file_system_util.h"
19 #include "chrome/browser/chromeos/drive/resource_metadata_storage.h"
20 #include "chrome/browser/chromeos/drive/test_util.h"
21 #include "content/public/test/test_browser_thread_bundle.h"
22 #include "google_apis/drive/test_util.h"
23 #include "testing/gtest/include/gtest/gtest.h"
29 const char kCacheFileDirectory
[] = "files";
33 // Tests FileCache methods working with the blocking task runner.
34 class FileCacheTest
: public testing::Test
{
36 void SetUp() override
{
37 ASSERT_TRUE(temp_dir_
.CreateUniqueTempDir());
38 const base::FilePath metadata_dir
= temp_dir_
.path().AppendASCII("meta");
39 cache_files_dir_
= temp_dir_
.path().AppendASCII(kCacheFileDirectory
);
41 ASSERT_TRUE(base::CreateDirectory(metadata_dir
));
42 ASSERT_TRUE(base::CreateDirectory(cache_files_dir_
));
44 fake_free_disk_space_getter_
.reset(new FakeFreeDiskSpaceGetter
);
46 metadata_storage_
.reset(new ResourceMetadataStorage(
48 base::MessageLoopProxy::current().get()));
49 ASSERT_TRUE(metadata_storage_
->Initialize());
51 cache_
.reset(new FileCache(
52 metadata_storage_
.get(),
54 base::MessageLoopProxy::current().get(),
55 fake_free_disk_space_getter_
.get()));
56 ASSERT_TRUE(cache_
->Initialize());
59 static bool RenameCacheFilesToNewFormat(FileCache
* cache
) {
60 return cache
->RenameCacheFilesToNewFormat();
63 content::TestBrowserThreadBundle thread_bundle_
;
64 base::ScopedTempDir temp_dir_
;
65 base::FilePath cache_files_dir_
;
67 scoped_ptr
<ResourceMetadataStorage
, test_util::DestroyHelperForTests
>
69 scoped_ptr
<FileCache
, test_util::DestroyHelperForTests
> cache_
;
70 scoped_ptr
<FakeFreeDiskSpaceGetter
> fake_free_disk_space_getter_
;
73 TEST_F(FileCacheTest
, RecoverFilesFromCacheDirectory
) {
74 base::FilePath dir_source_root
;
75 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT
, &dir_source_root
));
76 const base::FilePath src_path
=
77 dir_source_root
.AppendASCII("chrome/test/data/chromeos/drive/image.png");
79 // Store files. This file should not be moved.
81 entry
.set_local_id("id_foo");
82 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
83 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store("id_foo", "md5", src_path
,
84 FileCache::FILE_OPERATION_COPY
));
86 // Set up files in the cache directory. These files should be moved.
87 const base::FilePath file_directory
=
88 temp_dir_
.path().AppendASCII(kCacheFileDirectory
);
89 ASSERT_TRUE(base::CopyFile(src_path
, file_directory
.AppendASCII("id_bar")));
90 ASSERT_TRUE(base::CopyFile(src_path
, file_directory
.AppendASCII("id_baz")));
92 // Insert a dirty entry with "id_baz" to |recovered_cache_info|.
93 // This should not prevent the file from being recovered.
94 ResourceMetadataStorage::RecoveredCacheInfoMap recovered_cache_info
;
95 recovered_cache_info
["id_baz"].is_dirty
= true;
96 recovered_cache_info
["id_baz"].title
= "baz.png";
99 const base::FilePath dest_directory
= temp_dir_
.path().AppendASCII("dest");
100 EXPECT_TRUE(cache_
->RecoverFilesFromCacheDirectory(dest_directory
,
101 recovered_cache_info
));
103 // Only two files should be recovered.
104 EXPECT_TRUE(base::PathExists(dest_directory
));
105 // base::FileEnumerator does not guarantee the order.
106 if (base::PathExists(dest_directory
.AppendASCII("baz00000001.png"))) {
107 EXPECT_TRUE(base::ContentsEqual(
109 dest_directory
.AppendASCII("baz00000001.png")));
110 EXPECT_TRUE(base::ContentsEqual(
112 dest_directory
.AppendASCII("image00000002.png")));
114 EXPECT_TRUE(base::ContentsEqual(
116 dest_directory
.AppendASCII("image00000001.png")));
117 EXPECT_TRUE(base::ContentsEqual(
119 dest_directory
.AppendASCII("baz00000002.png")));
121 EXPECT_FALSE(base::PathExists(
122 dest_directory
.AppendASCII("image00000003.png")));
125 TEST_F(FileCacheTest
, FreeDiskSpaceIfNeededFor
) {
126 base::FilePath src_file
;
127 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_
.path(), &src_file
));
129 // Store a file as a 'temporary' file and remember the path.
130 const std::string id_tmp
= "id_tmp", md5_tmp
= "md5_tmp";
133 entry
.set_local_id(id_tmp
);
134 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
135 ASSERT_EQ(FILE_ERROR_OK
,
136 cache_
->Store(id_tmp
, md5_tmp
, src_file
,
137 FileCache::FILE_OPERATION_COPY
));
138 base::FilePath tmp_path
;
139 ASSERT_EQ(FILE_ERROR_OK
, cache_
->GetFile(id_tmp
, &tmp_path
));
141 // Store a file as a pinned file and remember the path.
142 const std::string id_pinned
= "id_pinned", md5_pinned
= "md5_pinned";
144 entry
.set_local_id(id_pinned
);
145 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
146 ASSERT_EQ(FILE_ERROR_OK
,
147 cache_
->Store(id_pinned
, md5_pinned
, src_file
,
148 FileCache::FILE_OPERATION_COPY
));
149 ASSERT_EQ(FILE_ERROR_OK
, cache_
->Pin(id_pinned
));
150 base::FilePath pinned_path
;
151 ASSERT_EQ(FILE_ERROR_OK
, cache_
->GetFile(id_pinned
, &pinned_path
));
153 // Call FreeDiskSpaceIfNeededFor().
154 fake_free_disk_space_getter_
->set_default_value(test_util::kLotsOfSpace
);
155 fake_free_disk_space_getter_
->PushFakeValue(0);
156 const int64 kNeededBytes
= 1;
157 EXPECT_TRUE(cache_
->FreeDiskSpaceIfNeededFor(kNeededBytes
));
159 // Only 'temporary' file gets removed.
160 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id_tmp
, &entry
));
161 EXPECT_FALSE(entry
.file_specific_info().cache_state().is_present());
162 EXPECT_FALSE(base::PathExists(tmp_path
));
164 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id_pinned
, &entry
));
165 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_present());
166 EXPECT_TRUE(base::PathExists(pinned_path
));
168 // Returns false when disk space cannot be freed.
169 fake_free_disk_space_getter_
->set_default_value(0);
170 EXPECT_FALSE(cache_
->FreeDiskSpaceIfNeededFor(kNeededBytes
));
173 TEST_F(FileCacheTest
, GetFile
) {
174 const base::FilePath src_file_path
= temp_dir_
.path().Append("test.dat");
175 const std::string src_contents
= "test";
176 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path
,
178 std::string
id("id1");
179 std::string
md5(base::MD5String(src_contents
));
181 const base::FilePath cache_file_directory
=
182 temp_dir_
.path().AppendASCII(kCacheFileDirectory
);
184 // Try to get an existing file from cache.
186 entry
.set_local_id(id
);
187 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
188 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(id
, md5
, src_file_path
,
189 FileCache::FILE_OPERATION_COPY
));
190 base::FilePath cache_file_path
;
191 EXPECT_EQ(FILE_ERROR_OK
, cache_
->GetFile(id
, &cache_file_path
));
193 cache_file_directory
.AppendASCII(util::EscapeCacheFileName(id
)).value(),
194 cache_file_path
.value());
196 std::string contents
;
197 EXPECT_TRUE(base::ReadFileToString(cache_file_path
, &contents
));
198 EXPECT_EQ(src_contents
, contents
);
200 // Get file from cache with different id.
203 entry
.set_local_id(id
);
204 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
205 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, cache_
->GetFile(id
, &cache_file_path
));
207 // Pin a non-existent file.
208 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Pin(id
));
210 // Get the non-existent pinned file from cache.
211 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, cache_
->GetFile(id
, &cache_file_path
));
213 // Get a previously pinned and stored file from cache.
214 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(id
, md5
, src_file_path
,
215 FileCache::FILE_OPERATION_COPY
));
217 EXPECT_EQ(FILE_ERROR_OK
, cache_
->GetFile(id
, &cache_file_path
));
219 cache_file_directory
.AppendASCII(util::EscapeCacheFileName(id
)).value(),
220 cache_file_path
.value());
223 EXPECT_TRUE(base::ReadFileToString(cache_file_path
, &contents
));
224 EXPECT_EQ(src_contents
, contents
);
227 TEST_F(FileCacheTest
, Store
) {
228 const base::FilePath src_file_path
= temp_dir_
.path().Append("test.dat");
229 const std::string src_contents
= "test";
230 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path
,
232 std::string
id("id");
233 std::string
md5(base::MD5String(src_contents
));
237 entry
.set_local_id(id
);
238 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
239 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(
240 id
, md5
, src_file_path
, FileCache::FILE_OPERATION_COPY
));
242 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
243 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_present());
244 EXPECT_EQ(md5
, entry
.file_specific_info().cache_state().md5());
246 base::FilePath cache_file_path
;
247 EXPECT_EQ(FILE_ERROR_OK
, cache_
->GetFile(id
, &cache_file_path
));
248 EXPECT_TRUE(base::ContentsEqual(src_file_path
, cache_file_path
));
250 // Store a non-existent file.
251 EXPECT_EQ(FILE_ERROR_FAILED
, cache_
->Store(
252 id
, md5
, base::FilePath::FromUTF8Unsafe("non_existent_file"),
253 FileCache::FILE_OPERATION_COPY
));
255 // Passing empty MD5 marks the entry as dirty.
256 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(
257 id
, std::string(), src_file_path
, FileCache::FILE_OPERATION_COPY
));
259 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
260 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_present());
261 EXPECT_TRUE(entry
.file_specific_info().cache_state().md5().empty());
262 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_dirty());
264 // No free space available.
265 fake_free_disk_space_getter_
->set_default_value(0);
267 EXPECT_EQ(FILE_ERROR_NO_LOCAL_SPACE
, cache_
->Store(
268 id
, md5
, src_file_path
, FileCache::FILE_OPERATION_COPY
));
271 TEST_F(FileCacheTest
, PinAndUnpin
) {
272 const base::FilePath src_file_path
= temp_dir_
.path().Append("test.dat");
273 const std::string src_contents
= "test";
274 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path
,
276 std::string
id("id_present");
277 std::string
md5(base::MD5String(src_contents
));
281 entry
.set_local_id(id
);
282 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
283 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(
284 id
, md5
, src_file_path
, FileCache::FILE_OPERATION_COPY
));
286 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
287 EXPECT_FALSE(entry
.file_specific_info().cache_state().is_pinned());
289 // Pin the existing file.
290 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Pin(id
));
292 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
293 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_pinned());
296 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Unpin(id
));
298 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
299 EXPECT_FALSE(entry
.file_specific_info().cache_state().is_pinned());
301 // Pin a non-present file.
302 std::string id_non_present
= "id_non_present";
304 entry
.set_local_id(id_non_present
);
305 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
306 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Pin(id_non_present
));
308 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id_non_present
, &entry
));
309 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_pinned());
311 // Unpin the previously pinned non-existent file.
312 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Unpin(id_non_present
));
314 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id_non_present
, &entry
));
315 EXPECT_FALSE(entry
.file_specific_info().has_cache_state());
317 // Unpin a file that doesn't exist in cache and is not pinned.
318 EXPECT_EQ(FILE_ERROR_NOT_FOUND
, cache_
->Unpin("id_non_existent"));
321 TEST_F(FileCacheTest
, MountUnmount
) {
322 const base::FilePath src_file_path
= temp_dir_
.path().Append("test.dat");
323 const std::string src_contents
= "test";
324 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path
,
326 std::string
id("id_present");
327 std::string
md5(base::MD5String(src_contents
));
331 entry
.set_local_id(id
);
332 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
333 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(
334 id
, md5
, src_file_path
, FileCache::FILE_OPERATION_COPY
));
336 // Mark the file mounted.
337 base::FilePath cache_file_path
;
338 EXPECT_EQ(FILE_ERROR_OK
, cache_
->MarkAsMounted(id
, &cache_file_path
));
341 EXPECT_EQ(FILE_ERROR_IN_USE
, cache_
->Remove(id
));
343 // Clear mounted state of the file.
344 EXPECT_EQ(FILE_ERROR_OK
, cache_
->MarkAsUnmounted(cache_file_path
));
346 // Try to remove again.
347 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Remove(id
));
350 TEST_F(FileCacheTest
, OpenForWrite
) {
352 base::FilePath src_file
;
353 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_
.path(), &src_file
));
355 const std::string id
= "id";
357 entry
.set_local_id(id
);
358 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
359 ASSERT_EQ(FILE_ERROR_OK
, cache_
->Store(id
, "md5", src_file
,
360 FileCache::FILE_OPERATION_COPY
));
361 EXPECT_EQ(0, entry
.file_info().last_modified());
363 // Entry is not dirty nor opened.
364 EXPECT_FALSE(cache_
->IsOpenedForWrite(id
));
365 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
366 EXPECT_FALSE(entry
.file_specific_info().cache_state().is_dirty());
369 scoped_ptr
<base::ScopedClosureRunner
> file_closer1
;
370 EXPECT_EQ(FILE_ERROR_OK
, cache_
->OpenForWrite(id
, &file_closer1
));
371 EXPECT_TRUE(cache_
->IsOpenedForWrite(id
));
374 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
375 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_dirty());
378 scoped_ptr
<base::ScopedClosureRunner
> file_closer2
;
379 EXPECT_EQ(FILE_ERROR_OK
, cache_
->OpenForWrite(id
, &file_closer2
));
380 EXPECT_TRUE(cache_
->IsOpenedForWrite(id
));
383 file_closer1
.reset();
384 base::RunLoop().RunUntilIdle();
385 EXPECT_TRUE(cache_
->IsOpenedForWrite(id
));
387 // last_modified is updated.
388 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
389 EXPECT_NE(0, entry
.file_info().last_modified());
392 file_closer2
.reset();
393 base::RunLoop().RunUntilIdle();
394 EXPECT_FALSE(cache_
->IsOpenedForWrite(id
));
396 // Try to open non-existent file.
397 EXPECT_EQ(FILE_ERROR_NOT_FOUND
,
398 cache_
->OpenForWrite("nonexistent_id", &file_closer1
));
401 TEST_F(FileCacheTest
, UpdateMd5
) {
403 const base::FilePath src_file_path
= temp_dir_
.path().Append("test.dat");
404 const std::string contents_before
= "before";
405 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path
,
407 std::string
id("id1");
409 entry
.set_local_id(id
);
410 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
411 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(id
, base::MD5String(contents_before
),
413 FileCache::FILE_OPERATION_COPY
));
415 // Modify the cache file.
416 scoped_ptr
<base::ScopedClosureRunner
> file_closer
;
417 EXPECT_EQ(FILE_ERROR_OK
, cache_
->OpenForWrite(id
, &file_closer
));
418 base::FilePath cache_file_path
;
419 EXPECT_EQ(FILE_ERROR_OK
, cache_
->GetFile(id
, &cache_file_path
));
420 const std::string contents_after
= "after";
421 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(cache_file_path
,
424 // Cannot update MD5 of an opend file.
425 EXPECT_EQ(FILE_ERROR_IN_USE
, cache_
->UpdateMd5(id
));
429 base::RunLoop().RunUntilIdle();
431 // MD5 was cleared by OpenForWrite().
432 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
433 EXPECT_TRUE(entry
.file_specific_info().cache_state().md5().empty());
436 EXPECT_EQ(FILE_ERROR_OK
, cache_
->UpdateMd5(id
));
437 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
438 EXPECT_EQ(base::MD5String(contents_after
),
439 entry
.file_specific_info().cache_state().md5());
442 TEST_F(FileCacheTest
, ClearDirty
) {
444 base::FilePath src_file
;
445 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_
.path(), &src_file
));
447 const std::string id
= "id";
449 entry
.set_local_id(id
);
450 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
451 ASSERT_EQ(FILE_ERROR_OK
, cache_
->Store(id
, "md5", src_file
,
452 FileCache::FILE_OPERATION_COPY
));
455 scoped_ptr
<base::ScopedClosureRunner
> file_closer
;
456 EXPECT_EQ(FILE_ERROR_OK
, cache_
->OpenForWrite(id
, &file_closer
));
459 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
460 EXPECT_TRUE(entry
.file_specific_info().cache_state().is_dirty());
462 // Cannot clear the dirty bit of an opened entry.
463 EXPECT_EQ(FILE_ERROR_IN_USE
, cache_
->ClearDirty(id
));
465 // Close the file and clear the dirty bit.
467 base::RunLoop().RunUntilIdle();
468 EXPECT_EQ(FILE_ERROR_OK
, cache_
->ClearDirty(id
));
470 // Entry is not dirty.
471 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->GetEntry(id
, &entry
));
472 EXPECT_FALSE(entry
.file_specific_info().cache_state().is_dirty());
475 TEST_F(FileCacheTest
, Remove
) {
476 const base::FilePath src_file_path
= temp_dir_
.path().Append("test.dat");
477 const std::string src_contents
= "test";
478 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path
,
480 std::string
id("id");
481 std::string
md5(base::MD5String(src_contents
));
483 // First store a file to cache.
485 entry
.set_local_id(id
);
486 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
487 base::FilePath src_file
;
488 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_
.path(), &src_file
));
489 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Store(
490 id
, md5
, src_file_path
, FileCache::FILE_OPERATION_COPY
));
492 base::FilePath cache_file_path
;
493 EXPECT_EQ(FILE_ERROR_OK
, cache_
->GetFile(id
, &cache_file_path
));
495 // Then try to remove existing file from cache.
496 EXPECT_EQ(FILE_ERROR_OK
, cache_
->Remove(id
));
497 EXPECT_FALSE(base::PathExists(cache_file_path
));
500 TEST_F(FileCacheTest
, RenameCacheFilesToNewFormat
) {
501 const base::FilePath file_directory
=
502 temp_dir_
.path().AppendASCII(kCacheFileDirectory
);
504 // File with an old style "<prefix>:<ID>.<MD5>" name.
505 ASSERT_TRUE(google_apis::test_util::WriteStringToFile(
506 file_directory
.AppendASCII("file:id_koo.md5"), "koo"));
508 // File with multiple extensions should be removed.
509 ASSERT_TRUE(google_apis::test_util::WriteStringToFile(
510 file_directory
.AppendASCII("id_kyu.md5.mounted"), "kyu (mounted)"));
511 ASSERT_TRUE(google_apis::test_util::WriteStringToFile(
512 file_directory
.AppendASCII("id_kyu.md5"), "kyu"));
514 // Rename and verify the result.
515 EXPECT_TRUE(RenameCacheFilesToNewFormat(cache_
.get()));
516 std::string contents
;
517 EXPECT_TRUE(base::ReadFileToString(file_directory
.AppendASCII("id_koo"),
519 EXPECT_EQ("koo", contents
);
521 EXPECT_TRUE(base::ReadFileToString(file_directory
.AppendASCII("id_kyu"),
523 EXPECT_EQ("kyu", contents
);
526 EXPECT_TRUE(RenameCacheFilesToNewFormat(cache_
.get()));
528 // Files with new style names are not affected.
530 EXPECT_TRUE(base::ReadFileToString(file_directory
.AppendASCII("id_koo"),
532 EXPECT_EQ("koo", contents
);
534 EXPECT_TRUE(base::ReadFileToString(file_directory
.AppendASCII("id_kyu"),
536 EXPECT_EQ("kyu", contents
);
539 TEST_F(FileCacheTest
, ClearAll
) {
540 const std::string
id("1a2b");
541 const std::string
md5("abcdef0123456789");
543 // Store an existing file.
545 entry
.set_local_id(id
);
546 EXPECT_EQ(FILE_ERROR_OK
, metadata_storage_
->PutEntry(entry
));
547 base::FilePath src_file
;
548 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_
.path(), &src_file
));
549 ASSERT_EQ(FILE_ERROR_OK
,
550 cache_
->Store(id
, md5
, src_file
, FileCache::FILE_OPERATION_COPY
));
553 EXPECT_TRUE(cache_
->ClearAll());
555 // Verify that the cache is removed.
556 EXPECT_TRUE(base::IsDirectoryEmpty(cache_files_dir_
));
559 } // namespace internal