Revert of Add button to add new FSP services to Files app. (patchset #8 id:140001...
[chromium-blink-merge.git] / chrome / browser / chromeos / drive / file_cache_unittest.cc
blob4d0299965f6878e372226dba6a00e03097c6c076
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"
7 #include <string>
8 #include <vector>
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"
14 #include "base/md5.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"
25 namespace drive {
26 namespace internal {
27 namespace {
29 const char kCacheFileDirectory[] = "files";
31 } // namespace
33 // Tests FileCache methods working with the blocking task runner.
34 class FileCacheTest : public testing::Test {
35 protected:
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(
47 metadata_dir,
48 base::MessageLoopProxy::current().get()));
49 ASSERT_TRUE(metadata_storage_->Initialize());
51 cache_.reset(new FileCache(
52 metadata_storage_.get(),
53 cache_files_dir_,
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>
68 metadata_storage_;
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.
80 ResourceEntry entry;
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";
98 // Recover files.
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(
108 src_path,
109 dest_directory.AppendASCII("baz00000001.png")));
110 EXPECT_TRUE(base::ContentsEqual(
111 src_path,
112 dest_directory.AppendASCII("image00000002.png")));
113 } else {
114 EXPECT_TRUE(base::ContentsEqual(
115 src_path,
116 dest_directory.AppendASCII("image00000001.png")));
117 EXPECT_TRUE(base::ContentsEqual(
118 src_path,
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";
132 ResourceEntry entry;
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";
143 entry.Clear();
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,
177 src_contents));
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.
185 ResourceEntry entry;
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));
192 EXPECT_EQ(
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.
201 id = "id2";
202 entry.Clear();
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));
218 EXPECT_EQ(
219 cache_file_directory.AppendASCII(util::EscapeCacheFileName(id)).value(),
220 cache_file_path.value());
222 contents.clear();
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,
231 src_contents));
232 std::string id("id");
233 std::string md5(base::MD5String(src_contents));
235 // Store a file.
236 ResourceEntry entry;
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,
275 src_contents));
276 std::string id("id_present");
277 std::string md5(base::MD5String(src_contents));
279 // Store a file.
280 ResourceEntry entry;
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());
295 // Unpin the file.
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";
303 entry.Clear();
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,
325 src_contents));
326 std::string id("id_present");
327 std::string md5(base::MD5String(src_contents));
329 // Store a file.
330 ResourceEntry entry;
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));
340 // Try to remove it.
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) {
351 // Prepare a file.
352 base::FilePath src_file;
353 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file));
355 const std::string id = "id";
356 ResourceEntry entry;
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());
368 // Open (1).
369 scoped_ptr<base::ScopedClosureRunner> file_closer1;
370 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer1));
371 EXPECT_TRUE(cache_->IsOpenedForWrite(id));
373 // Entry is dirty.
374 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry));
375 EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty());
377 // Open (2).
378 scoped_ptr<base::ScopedClosureRunner> file_closer2;
379 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer2));
380 EXPECT_TRUE(cache_->IsOpenedForWrite(id));
382 // Close (1).
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());
391 // Close (2).
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) {
402 // Store test data.
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,
406 contents_before));
407 std::string id("id1");
408 ResourceEntry entry;
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),
412 src_file_path,
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,
422 contents_after));
424 // Cannot update MD5 of an opend file.
425 EXPECT_EQ(FILE_ERROR_IN_USE, cache_->UpdateMd5(id));
427 // Close file.
428 file_closer.reset();
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());
435 // Update MD5.
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) {
443 // Prepare a file.
444 base::FilePath src_file;
445 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file));
447 const std::string id = "id";
448 ResourceEntry entry;
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));
454 // Open the file.
455 scoped_ptr<base::ScopedClosureRunner> file_closer;
456 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer));
458 // Entry is dirty.
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.
466 file_closer.reset();
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,
479 src_contents));
480 std::string id("id");
481 std::string md5(base::MD5String(src_contents));
483 // First store a file to cache.
484 ResourceEntry entry;
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"),
518 &contents));
519 EXPECT_EQ("koo", contents);
520 contents.clear();
521 EXPECT_TRUE(base::ReadFileToString(file_directory.AppendASCII("id_kyu"),
522 &contents));
523 EXPECT_EQ("kyu", contents);
525 // Rename again.
526 EXPECT_TRUE(RenameCacheFilesToNewFormat(cache_.get()));
528 // Files with new style names are not affected.
529 contents.clear();
530 EXPECT_TRUE(base::ReadFileToString(file_directory.AppendASCII("id_koo"),
531 &contents));
532 EXPECT_EQ("koo", contents);
533 contents.clear();
534 EXPECT_TRUE(base::ReadFileToString(file_directory.AppendASCII("id_kyu"),
535 &contents));
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.
544 ResourceEntry entry;
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));
552 // Clear cache.
553 EXPECT_TRUE(cache_->ClearAll());
555 // Verify that the cache is removed.
556 EXPECT_TRUE(base::IsDirectoryEmpty(cache_files_dir_));
559 } // namespace internal
560 } // namespace drive