OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/drive/file_cache.h" | 5 #include "chrome/browser/chromeos/drive/file_cache.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 cache_files_dir_, | 53 cache_files_dir_, |
54 base::MessageLoopProxy::current().get(), | 54 base::MessageLoopProxy::current().get(), |
55 fake_free_disk_space_getter_.get())); | 55 fake_free_disk_space_getter_.get())); |
56 ASSERT_TRUE(cache_->Initialize()); | 56 ASSERT_TRUE(cache_->Initialize()); |
57 } | 57 } |
58 | 58 |
59 static bool RenameCacheFilesToNewFormat(FileCache* cache) { | 59 static bool RenameCacheFilesToNewFormat(FileCache* cache) { |
60 return cache->RenameCacheFilesToNewFormat(); | 60 return cache->RenameCacheFilesToNewFormat(); |
61 } | 61 } |
62 | 62 |
63 FileError GetCacheEntry(FileCache* cache, | |
64 const std::string& id, | |
65 FileCacheEntry* cache_entry) { | |
66 return cache->storage_->GetCacheEntry(id, cache_entry); | |
67 } | |
68 | |
69 content::TestBrowserThreadBundle thread_bundle_; | 63 content::TestBrowserThreadBundle thread_bundle_; |
70 base::ScopedTempDir temp_dir_; | 64 base::ScopedTempDir temp_dir_; |
71 base::FilePath cache_files_dir_; | 65 base::FilePath cache_files_dir_; |
72 | 66 |
73 scoped_ptr<ResourceMetadataStorage, test_util::DestroyHelperForTests> | 67 scoped_ptr<ResourceMetadataStorage, test_util::DestroyHelperForTests> |
74 metadata_storage_; | 68 metadata_storage_; |
75 scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_; | 69 scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_; |
76 scoped_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_; | 70 scoped_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_; |
77 }; | 71 }; |
78 | 72 |
79 TEST_F(FileCacheTest, RecoverFilesFromCacheDirectory) { | 73 TEST_F(FileCacheTest, RecoverFilesFromCacheDirectory) { |
80 base::FilePath dir_source_root; | 74 base::FilePath dir_source_root; |
81 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &dir_source_root)); | 75 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &dir_source_root)); |
82 const base::FilePath src_path = | 76 const base::FilePath src_path = |
83 dir_source_root.AppendASCII("chrome/test/data/chromeos/drive/image.png"); | 77 dir_source_root.AppendASCII("chrome/test/data/chromeos/drive/image.png"); |
84 | 78 |
85 // Store files. This file should not be moved. | 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)); |
86 EXPECT_EQ(FILE_ERROR_OK, cache_->Store("id_foo", "md5", src_path, | 83 EXPECT_EQ(FILE_ERROR_OK, cache_->Store("id_foo", "md5", src_path, |
87 FileCache::FILE_OPERATION_COPY)); | 84 FileCache::FILE_OPERATION_COPY)); |
88 | 85 |
89 // Set up files in the cache directory. These files should be moved. | 86 // Set up files in the cache directory. These files should be moved. |
90 const base::FilePath file_directory = | 87 const base::FilePath file_directory = |
91 temp_dir_.path().AppendASCII(kCacheFileDirectory); | 88 temp_dir_.path().AppendASCII(kCacheFileDirectory); |
92 ASSERT_TRUE(base::CopyFile(src_path, file_directory.AppendASCII("id_bar"))); | 89 ASSERT_TRUE(base::CopyFile(src_path, file_directory.AppendASCII("id_bar"))); |
93 ASSERT_TRUE(base::CopyFile(src_path, file_directory.AppendASCII("id_baz"))); | 90 ASSERT_TRUE(base::CopyFile(src_path, file_directory.AppendASCII("id_baz"))); |
94 | 91 |
95 // Insert a dirty entry with "id_baz" to |recovered_cache_info|. | 92 // Insert a dirty entry with "id_baz" to |recovered_cache_info|. |
(...skipping 28 matching lines...) Expand all Loading... |
124 EXPECT_FALSE(base::PathExists( | 121 EXPECT_FALSE(base::PathExists( |
125 dest_directory.AppendASCII("image00000003.png"))); | 122 dest_directory.AppendASCII("image00000003.png"))); |
126 } | 123 } |
127 | 124 |
128 TEST_F(FileCacheTest, FreeDiskSpaceIfNeededFor) { | 125 TEST_F(FileCacheTest, FreeDiskSpaceIfNeededFor) { |
129 base::FilePath src_file; | 126 base::FilePath src_file; |
130 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); | 127 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); |
131 | 128 |
132 // Store a file as a 'temporary' file and remember the path. | 129 // Store a file as a 'temporary' file and remember the path. |
133 const std::string id_tmp = "id_tmp", md5_tmp = "md5_tmp"; | 130 const std::string id_tmp = "id_tmp", md5_tmp = "md5_tmp"; |
| 131 |
| 132 ResourceEntry entry; |
| 133 entry.set_local_id(id_tmp); |
| 134 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
134 ASSERT_EQ(FILE_ERROR_OK, | 135 ASSERT_EQ(FILE_ERROR_OK, |
135 cache_->Store(id_tmp, md5_tmp, src_file, | 136 cache_->Store(id_tmp, md5_tmp, src_file, |
136 FileCache::FILE_OPERATION_COPY)); | 137 FileCache::FILE_OPERATION_COPY)); |
137 base::FilePath tmp_path; | 138 base::FilePath tmp_path; |
138 ASSERT_EQ(FILE_ERROR_OK, cache_->GetFile(id_tmp, &tmp_path)); | 139 ASSERT_EQ(FILE_ERROR_OK, cache_->GetFile(id_tmp, &tmp_path)); |
139 | 140 |
140 // Store a file as a pinned file and remember the path. | 141 // Store a file as a pinned file and remember the path. |
141 const std::string id_pinned = "id_pinned", md5_pinned = "md5_pinned"; | 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)); |
142 ASSERT_EQ(FILE_ERROR_OK, | 146 ASSERT_EQ(FILE_ERROR_OK, |
143 cache_->Store(id_pinned, md5_pinned, src_file, | 147 cache_->Store(id_pinned, md5_pinned, src_file, |
144 FileCache::FILE_OPERATION_COPY)); | 148 FileCache::FILE_OPERATION_COPY)); |
145 ASSERT_EQ(FILE_ERROR_OK, cache_->Pin(id_pinned)); | 149 ASSERT_EQ(FILE_ERROR_OK, cache_->Pin(id_pinned)); |
146 base::FilePath pinned_path; | 150 base::FilePath pinned_path; |
147 ASSERT_EQ(FILE_ERROR_OK, cache_->GetFile(id_pinned, &pinned_path)); | 151 ASSERT_EQ(FILE_ERROR_OK, cache_->GetFile(id_pinned, &pinned_path)); |
148 | 152 |
149 // Call FreeDiskSpaceIfNeededFor(). | 153 // Call FreeDiskSpaceIfNeededFor(). |
150 fake_free_disk_space_getter_->set_default_value(test_util::kLotsOfSpace); | 154 fake_free_disk_space_getter_->set_default_value(test_util::kLotsOfSpace); |
151 fake_free_disk_space_getter_->PushFakeValue(0); | 155 fake_free_disk_space_getter_->PushFakeValue(0); |
152 const int64 kNeededBytes = 1; | 156 const int64 kNeededBytes = 1; |
153 EXPECT_TRUE(cache_->FreeDiskSpaceIfNeededFor(kNeededBytes)); | 157 EXPECT_TRUE(cache_->FreeDiskSpaceIfNeededFor(kNeededBytes)); |
154 | 158 |
155 // Only 'temporary' file gets removed. | 159 // Only 'temporary' file gets removed. |
156 FileCacheEntry entry; | 160 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id_tmp, &entry)); |
157 EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetCacheEntry(cache_.get(), id_tmp, &entry)); | 161 EXPECT_FALSE(entry.file_specific_info().cache_state().is_present()); |
158 EXPECT_FALSE(base::PathExists(tmp_path)); | 162 EXPECT_FALSE(base::PathExists(tmp_path)); |
159 | 163 |
160 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id_pinned, &entry)); | 164 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id_pinned, &entry)); |
| 165 EXPECT_TRUE(entry.file_specific_info().cache_state().is_present()); |
161 EXPECT_TRUE(base::PathExists(pinned_path)); | 166 EXPECT_TRUE(base::PathExists(pinned_path)); |
162 | 167 |
163 // Returns false when disk space cannot be freed. | 168 // Returns false when disk space cannot be freed. |
164 fake_free_disk_space_getter_->set_default_value(0); | 169 fake_free_disk_space_getter_->set_default_value(0); |
165 EXPECT_FALSE(cache_->FreeDiskSpaceIfNeededFor(kNeededBytes)); | 170 EXPECT_FALSE(cache_->FreeDiskSpaceIfNeededFor(kNeededBytes)); |
166 } | 171 } |
167 | 172 |
168 TEST_F(FileCacheTest, GetFile) { | 173 TEST_F(FileCacheTest, GetFile) { |
169 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 174 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); |
170 const std::string src_contents = "test"; | 175 const std::string src_contents = "test"; |
171 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 176 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, |
172 src_contents)); | 177 src_contents)); |
173 std::string id("id1"); | 178 std::string id("id1"); |
174 std::string md5(base::MD5String(src_contents)); | 179 std::string md5(base::MD5String(src_contents)); |
175 | 180 |
176 const base::FilePath cache_file_directory = | 181 const base::FilePath cache_file_directory = |
177 temp_dir_.path().AppendASCII(kCacheFileDirectory); | 182 temp_dir_.path().AppendASCII(kCacheFileDirectory); |
178 | 183 |
179 // Try to get an existing file from cache. | 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)); |
180 EXPECT_EQ(FILE_ERROR_OK, cache_->Store(id, md5, src_file_path, | 188 EXPECT_EQ(FILE_ERROR_OK, cache_->Store(id, md5, src_file_path, |
181 FileCache::FILE_OPERATION_COPY)); | 189 FileCache::FILE_OPERATION_COPY)); |
182 base::FilePath cache_file_path; | 190 base::FilePath cache_file_path; |
183 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); | 191 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); |
184 EXPECT_EQ( | 192 EXPECT_EQ( |
185 cache_file_directory.AppendASCII(util::EscapeCacheFileName(id)).value(), | 193 cache_file_directory.AppendASCII(util::EscapeCacheFileName(id)).value(), |
186 cache_file_path.value()); | 194 cache_file_path.value()); |
187 | 195 |
188 std::string contents; | 196 std::string contents; |
189 EXPECT_TRUE(base::ReadFileToString(cache_file_path, &contents)); | 197 EXPECT_TRUE(base::ReadFileToString(cache_file_path, &contents)); |
190 EXPECT_EQ(src_contents, contents); | 198 EXPECT_EQ(src_contents, contents); |
191 | 199 |
192 // Get file from cache with different id. | 200 // Get file from cache with different id. |
193 id = "id2"; | 201 id = "id2"; |
| 202 entry.Clear(); |
| 203 entry.set_local_id(id); |
| 204 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
194 EXPECT_EQ(FILE_ERROR_NOT_FOUND, cache_->GetFile(id, &cache_file_path)); | 205 EXPECT_EQ(FILE_ERROR_NOT_FOUND, cache_->GetFile(id, &cache_file_path)); |
195 | 206 |
196 // Pin a non-existent file. | 207 // Pin a non-existent file. |
197 EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id)); | 208 EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id)); |
198 | 209 |
199 // Get the non-existent pinned file from cache. | 210 // Get the non-existent pinned file from cache. |
200 EXPECT_EQ(FILE_ERROR_NOT_FOUND, cache_->GetFile(id, &cache_file_path)); | 211 EXPECT_EQ(FILE_ERROR_NOT_FOUND, cache_->GetFile(id, &cache_file_path)); |
201 | 212 |
202 // Get a previously pinned and stored file from cache. | 213 // Get a previously pinned and stored file from cache. |
203 EXPECT_EQ(FILE_ERROR_OK, cache_->Store(id, md5, src_file_path, | 214 EXPECT_EQ(FILE_ERROR_OK, cache_->Store(id, md5, src_file_path, |
(...skipping 11 matching lines...) Expand all Loading... |
215 | 226 |
216 TEST_F(FileCacheTest, Store) { | 227 TEST_F(FileCacheTest, Store) { |
217 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 228 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); |
218 const std::string src_contents = "test"; | 229 const std::string src_contents = "test"; |
219 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 230 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, |
220 src_contents)); | 231 src_contents)); |
221 std::string id("id"); | 232 std::string id("id"); |
222 std::string md5(base::MD5String(src_contents)); | 233 std::string md5(base::MD5String(src_contents)); |
223 | 234 |
224 // Store a file. | 235 // Store a file. |
| 236 ResourceEntry entry; |
| 237 entry.set_local_id(id); |
| 238 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
225 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 239 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( |
226 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 240 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); |
227 | 241 |
228 FileCacheEntry cache_entry; | 242 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
229 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &cache_entry)); | 243 EXPECT_TRUE(entry.file_specific_info().cache_state().is_present()); |
230 EXPECT_TRUE(cache_entry.is_present()); | 244 EXPECT_EQ(md5, entry.file_specific_info().cache_state().md5()); |
231 EXPECT_EQ(md5, cache_entry.md5()); | |
232 | 245 |
233 base::FilePath cache_file_path; | 246 base::FilePath cache_file_path; |
234 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); | 247 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); |
235 EXPECT_TRUE(base::ContentsEqual(src_file_path, cache_file_path)); | 248 EXPECT_TRUE(base::ContentsEqual(src_file_path, cache_file_path)); |
236 | 249 |
237 // Store a non-existent file. | 250 // Store a non-existent file. |
238 EXPECT_EQ(FILE_ERROR_FAILED, cache_->Store( | 251 EXPECT_EQ(FILE_ERROR_FAILED, cache_->Store( |
239 id, md5, base::FilePath::FromUTF8Unsafe("non_existent_file"), | 252 id, md5, base::FilePath::FromUTF8Unsafe("non_existent_file"), |
240 FileCache::FILE_OPERATION_COPY)); | 253 FileCache::FILE_OPERATION_COPY)); |
241 | 254 |
242 // Passing empty MD5 marks the entry as dirty. | 255 // Passing empty MD5 marks the entry as dirty. |
243 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 256 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( |
244 id, std::string(), src_file_path, FileCache::FILE_OPERATION_COPY)); | 257 id, std::string(), src_file_path, FileCache::FILE_OPERATION_COPY)); |
245 | 258 |
246 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &cache_entry)); | 259 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
247 EXPECT_TRUE(cache_entry.is_present()); | 260 EXPECT_TRUE(entry.file_specific_info().cache_state().is_present()); |
248 EXPECT_TRUE(cache_entry.md5().empty()); | 261 EXPECT_TRUE(entry.file_specific_info().cache_state().md5().empty()); |
249 EXPECT_TRUE(cache_entry.is_dirty()); | 262 EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); |
250 | 263 |
251 // No free space available. | 264 // No free space available. |
252 fake_free_disk_space_getter_->set_default_value(0); | 265 fake_free_disk_space_getter_->set_default_value(0); |
253 | 266 |
254 EXPECT_EQ(FILE_ERROR_NO_LOCAL_SPACE, cache_->Store( | 267 EXPECT_EQ(FILE_ERROR_NO_LOCAL_SPACE, cache_->Store( |
255 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 268 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); |
256 } | 269 } |
257 | 270 |
258 TEST_F(FileCacheTest, PinAndUnpin) { | 271 TEST_F(FileCacheTest, PinAndUnpin) { |
259 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 272 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); |
260 const std::string src_contents = "test"; | 273 const std::string src_contents = "test"; |
261 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 274 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, |
262 src_contents)); | 275 src_contents)); |
263 std::string id("id_present"); | 276 std::string id("id_present"); |
264 std::string md5(base::MD5String(src_contents)); | 277 std::string md5(base::MD5String(src_contents)); |
265 | 278 |
266 // Store a file. | 279 // Store a file. |
| 280 ResourceEntry entry; |
| 281 entry.set_local_id(id); |
| 282 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
267 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 283 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( |
268 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 284 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); |
269 | 285 |
270 FileCacheEntry cache_entry; | 286 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
271 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &cache_entry)); | 287 EXPECT_FALSE(entry.file_specific_info().cache_state().is_pinned()); |
272 EXPECT_FALSE(cache_entry.is_pinned()); | |
273 | 288 |
274 // Pin the existing file. | 289 // Pin the existing file. |
275 EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id)); | 290 EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id)); |
276 | 291 |
277 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &cache_entry)); | 292 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
278 EXPECT_TRUE(cache_entry.is_pinned()); | 293 EXPECT_TRUE(entry.file_specific_info().cache_state().is_pinned()); |
279 | 294 |
280 // Unpin the file. | 295 // Unpin the file. |
281 EXPECT_EQ(FILE_ERROR_OK, cache_->Unpin(id)); | 296 EXPECT_EQ(FILE_ERROR_OK, cache_->Unpin(id)); |
282 | 297 |
283 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &cache_entry)); | 298 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
284 EXPECT_FALSE(cache_entry.is_pinned()); | 299 EXPECT_FALSE(entry.file_specific_info().cache_state().is_pinned()); |
285 | 300 |
286 // Pin a non-present file. | 301 // Pin a non-present file. |
287 std::string id_non_present = "id_non_present"; | 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)); |
288 EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id_non_present)); | 306 EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id_non_present)); |
289 | 307 |
290 EXPECT_EQ(FILE_ERROR_OK, | 308 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id_non_present, &entry)); |
291 GetCacheEntry(cache_.get(), id_non_present, &cache_entry)); | 309 EXPECT_TRUE(entry.file_specific_info().cache_state().is_pinned()); |
292 EXPECT_TRUE(cache_entry.is_pinned()); | |
293 | 310 |
294 // Unpin the previously pinned non-existent file. | 311 // Unpin the previously pinned non-existent file. |
295 EXPECT_EQ(FILE_ERROR_OK, cache_->Unpin(id_non_present)); | 312 EXPECT_EQ(FILE_ERROR_OK, cache_->Unpin(id_non_present)); |
296 | 313 |
297 EXPECT_EQ(FILE_ERROR_NOT_FOUND, | 314 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id_non_present, &entry)); |
298 GetCacheEntry(cache_.get(), id_non_present, &cache_entry)); | 315 EXPECT_FALSE(entry.file_specific_info().has_cache_state()); |
299 | 316 |
300 // Unpin a file that doesn't exist in cache and is not pinned. | 317 // Unpin a file that doesn't exist in cache and is not pinned. |
301 EXPECT_EQ(FILE_ERROR_NOT_FOUND, cache_->Unpin("id_non_existent")); | 318 EXPECT_EQ(FILE_ERROR_NOT_FOUND, cache_->Unpin("id_non_existent")); |
302 } | 319 } |
303 | 320 |
304 TEST_F(FileCacheTest, MountUnmount) { | 321 TEST_F(FileCacheTest, MountUnmount) { |
305 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 322 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); |
306 const std::string src_contents = "test"; | 323 const std::string src_contents = "test"; |
307 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 324 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, |
308 src_contents)); | 325 src_contents)); |
309 std::string id("id_present"); | 326 std::string id("id_present"); |
310 std::string md5(base::MD5String(src_contents)); | 327 std::string md5(base::MD5String(src_contents)); |
311 | 328 |
312 // Store a file. | 329 // Store a file. |
| 330 ResourceEntry entry; |
| 331 entry.set_local_id(id); |
| 332 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
313 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 333 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( |
314 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 334 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); |
315 | 335 |
316 // Mark the file mounted. | 336 // Mark the file mounted. |
317 base::FilePath cache_file_path; | 337 base::FilePath cache_file_path; |
318 EXPECT_EQ(FILE_ERROR_OK, cache_->MarkAsMounted(id, &cache_file_path)); | 338 EXPECT_EQ(FILE_ERROR_OK, cache_->MarkAsMounted(id, &cache_file_path)); |
319 | 339 |
320 // Try to remove it. | 340 // Try to remove it. |
321 EXPECT_EQ(FILE_ERROR_IN_USE, cache_->Remove(id)); | 341 EXPECT_EQ(FILE_ERROR_IN_USE, cache_->Remove(id)); |
322 | 342 |
323 // Clear mounted state of the file. | 343 // Clear mounted state of the file. |
324 EXPECT_EQ(FILE_ERROR_OK, cache_->MarkAsUnmounted(cache_file_path)); | 344 EXPECT_EQ(FILE_ERROR_OK, cache_->MarkAsUnmounted(cache_file_path)); |
325 | 345 |
326 // Try to remove again. | 346 // Try to remove again. |
327 EXPECT_EQ(FILE_ERROR_OK, cache_->Remove(id)); | 347 EXPECT_EQ(FILE_ERROR_OK, cache_->Remove(id)); |
328 } | 348 } |
329 | 349 |
330 TEST_F(FileCacheTest, OpenForWrite) { | 350 TEST_F(FileCacheTest, OpenForWrite) { |
331 // Prepare a file. | 351 // Prepare a file. |
332 base::FilePath src_file; | 352 base::FilePath src_file; |
333 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); | 353 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); |
334 | 354 |
335 const std::string id = "id"; | 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)); |
336 ASSERT_EQ(FILE_ERROR_OK, cache_->Store(id, "md5", src_file, | 359 ASSERT_EQ(FILE_ERROR_OK, cache_->Store(id, "md5", src_file, |
337 FileCache::FILE_OPERATION_COPY)); | 360 FileCache::FILE_OPERATION_COPY)); |
338 | 361 |
339 // Entry is not dirty nor opened. | 362 // Entry is not dirty nor opened. |
340 EXPECT_FALSE(cache_->IsOpenedForWrite(id)); | 363 EXPECT_FALSE(cache_->IsOpenedForWrite(id)); |
341 FileCacheEntry entry; | 364 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
342 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &entry)); | 365 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
343 EXPECT_FALSE(entry.is_dirty()); | |
344 | 366 |
345 // Open (1). | 367 // Open (1). |
346 scoped_ptr<base::ScopedClosureRunner> file_closer1; | 368 scoped_ptr<base::ScopedClosureRunner> file_closer1; |
347 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer1)); | 369 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer1)); |
348 EXPECT_TRUE(cache_->IsOpenedForWrite(id)); | 370 EXPECT_TRUE(cache_->IsOpenedForWrite(id)); |
349 | 371 |
350 // Entry is dirty. | 372 // Entry is dirty. |
351 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &entry)); | 373 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
352 EXPECT_TRUE(entry.is_dirty()); | 374 EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); |
353 | 375 |
354 // Open (2). | 376 // Open (2). |
355 scoped_ptr<base::ScopedClosureRunner> file_closer2; | 377 scoped_ptr<base::ScopedClosureRunner> file_closer2; |
356 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer2)); | 378 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer2)); |
357 EXPECT_TRUE(cache_->IsOpenedForWrite(id)); | 379 EXPECT_TRUE(cache_->IsOpenedForWrite(id)); |
358 | 380 |
359 // Close (1). | 381 // Close (1). |
360 file_closer1.reset(); | 382 file_closer1.reset(); |
361 EXPECT_TRUE(cache_->IsOpenedForWrite(id)); | 383 EXPECT_TRUE(cache_->IsOpenedForWrite(id)); |
362 | 384 |
363 // Close (2). | 385 // Close (2). |
364 file_closer2.reset(); | 386 file_closer2.reset(); |
365 EXPECT_FALSE(cache_->IsOpenedForWrite(id)); | 387 EXPECT_FALSE(cache_->IsOpenedForWrite(id)); |
366 | 388 |
367 // Try to open non-existent file. | 389 // Try to open non-existent file. |
368 EXPECT_EQ(FILE_ERROR_NOT_FOUND, | 390 EXPECT_EQ(FILE_ERROR_NOT_FOUND, |
369 cache_->OpenForWrite("nonexistent_id", &file_closer1)); | 391 cache_->OpenForWrite("nonexistent_id", &file_closer1)); |
370 } | 392 } |
371 | 393 |
372 TEST_F(FileCacheTest, UpdateMd5) { | 394 TEST_F(FileCacheTest, UpdateMd5) { |
373 // Store test data. | 395 // Store test data. |
374 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 396 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); |
375 const std::string contents_before = "before"; | 397 const std::string contents_before = "before"; |
376 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 398 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, |
377 contents_before)); | 399 contents_before)); |
378 std::string id("id1"); | 400 std::string id("id1"); |
| 401 ResourceEntry entry; |
| 402 entry.set_local_id(id); |
| 403 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
379 EXPECT_EQ(FILE_ERROR_OK, cache_->Store(id, base::MD5String(contents_before), | 404 EXPECT_EQ(FILE_ERROR_OK, cache_->Store(id, base::MD5String(contents_before), |
380 src_file_path, | 405 src_file_path, |
381 FileCache::FILE_OPERATION_COPY)); | 406 FileCache::FILE_OPERATION_COPY)); |
382 | 407 |
383 // Modify the cache file. | 408 // Modify the cache file. |
384 scoped_ptr<base::ScopedClosureRunner> file_closer; | 409 scoped_ptr<base::ScopedClosureRunner> file_closer; |
385 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer)); | 410 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer)); |
386 base::FilePath cache_file_path; | 411 base::FilePath cache_file_path; |
387 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); | 412 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); |
388 const std::string contents_after = "after"; | 413 const std::string contents_after = "after"; |
389 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(cache_file_path, | 414 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(cache_file_path, |
390 contents_after)); | 415 contents_after)); |
391 | 416 |
392 // Cannot update MD5 of an opend file. | 417 // Cannot update MD5 of an opend file. |
393 EXPECT_EQ(FILE_ERROR_IN_USE, cache_->UpdateMd5(id)); | 418 EXPECT_EQ(FILE_ERROR_IN_USE, cache_->UpdateMd5(id)); |
394 | 419 |
395 // Close file. | 420 // Close file. |
396 file_closer.reset(); | 421 file_closer.reset(); |
397 | 422 |
398 // MD5 was cleared by OpenForWrite(). | 423 // MD5 was cleared by OpenForWrite(). |
399 FileCacheEntry entry; | 424 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
400 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &entry)); | 425 EXPECT_TRUE(entry.file_specific_info().cache_state().md5().empty()); |
401 EXPECT_TRUE(entry.md5().empty()); | |
402 | 426 |
403 // Update MD5. | 427 // Update MD5. |
404 EXPECT_EQ(FILE_ERROR_OK, cache_->UpdateMd5(id)); | 428 EXPECT_EQ(FILE_ERROR_OK, cache_->UpdateMd5(id)); |
405 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &entry)); | 429 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
406 EXPECT_EQ(base::MD5String(contents_after), entry.md5()); | 430 EXPECT_EQ(base::MD5String(contents_after), |
| 431 entry.file_specific_info().cache_state().md5()); |
407 } | 432 } |
408 | 433 |
409 TEST_F(FileCacheTest, ClearDirty) { | 434 TEST_F(FileCacheTest, ClearDirty) { |
410 // Prepare a file. | 435 // Prepare a file. |
411 base::FilePath src_file; | 436 base::FilePath src_file; |
412 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); | 437 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); |
413 | 438 |
414 const std::string id = "id"; | 439 const std::string id = "id"; |
| 440 ResourceEntry entry; |
| 441 entry.set_local_id(id); |
| 442 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
415 ASSERT_EQ(FILE_ERROR_OK, cache_->Store(id, "md5", src_file, | 443 ASSERT_EQ(FILE_ERROR_OK, cache_->Store(id, "md5", src_file, |
416 FileCache::FILE_OPERATION_COPY)); | 444 FileCache::FILE_OPERATION_COPY)); |
417 | 445 |
418 // Open the file. | 446 // Open the file. |
419 scoped_ptr<base::ScopedClosureRunner> file_closer; | 447 scoped_ptr<base::ScopedClosureRunner> file_closer; |
420 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer)); | 448 EXPECT_EQ(FILE_ERROR_OK, cache_->OpenForWrite(id, &file_closer)); |
421 | 449 |
422 // Entry is dirty. | 450 // Entry is dirty. |
423 FileCacheEntry entry; | 451 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
424 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &entry)); | 452 EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); |
425 EXPECT_TRUE(entry.is_dirty()); | |
426 | 453 |
427 // Cannot clear the dirty bit of an opened entry. | 454 // Cannot clear the dirty bit of an opened entry. |
428 EXPECT_EQ(FILE_ERROR_IN_USE, cache_->ClearDirty(id)); | 455 EXPECT_EQ(FILE_ERROR_IN_USE, cache_->ClearDirty(id)); |
429 | 456 |
430 // Close the file and clear the dirty bit. | 457 // Close the file and clear the dirty bit. |
431 file_closer.reset(); | 458 file_closer.reset(); |
432 EXPECT_EQ(FILE_ERROR_OK, cache_->ClearDirty(id)); | 459 EXPECT_EQ(FILE_ERROR_OK, cache_->ClearDirty(id)); |
433 | 460 |
434 // Entry is not dirty. | 461 // Entry is not dirty. |
435 EXPECT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &entry)); | 462 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->GetEntry(id, &entry)); |
436 EXPECT_FALSE(entry.is_dirty()); | 463 EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
437 } | 464 } |
438 | 465 |
439 TEST_F(FileCacheTest, Remove) { | 466 TEST_F(FileCacheTest, Remove) { |
440 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 467 const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); |
441 const std::string src_contents = "test"; | 468 const std::string src_contents = "test"; |
442 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 469 EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, |
443 src_contents)); | 470 src_contents)); |
444 std::string id("id"); | 471 std::string id("id"); |
445 std::string md5(base::MD5String(src_contents)); | 472 std::string md5(base::MD5String(src_contents)); |
446 | 473 |
447 // First store a file to cache. | 474 // First store a file to cache. |
| 475 ResourceEntry entry; |
| 476 entry.set_local_id(id); |
| 477 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
448 base::FilePath src_file; | 478 base::FilePath src_file; |
449 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); | 479 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); |
450 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 480 EXPECT_EQ(FILE_ERROR_OK, cache_->Store( |
451 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 481 id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); |
452 | 482 |
453 base::FilePath cache_file_path; | 483 base::FilePath cache_file_path; |
454 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); | 484 EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); |
455 | 485 |
456 // Then try to remove existing file from cache. | 486 // Then try to remove existing file from cache. |
457 EXPECT_EQ(FILE_ERROR_OK, cache_->Remove(id)); | 487 EXPECT_EQ(FILE_ERROR_OK, cache_->Remove(id)); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 EXPECT_TRUE(base::ReadFileToString(file_directory.AppendASCII("id_kyu"), | 525 EXPECT_TRUE(base::ReadFileToString(file_directory.AppendASCII("id_kyu"), |
496 &contents)); | 526 &contents)); |
497 EXPECT_EQ("kyu", contents); | 527 EXPECT_EQ("kyu", contents); |
498 } | 528 } |
499 | 529 |
500 TEST_F(FileCacheTest, ClearAll) { | 530 TEST_F(FileCacheTest, ClearAll) { |
501 const std::string id("pdf:1a2b"); | 531 const std::string id("pdf:1a2b"); |
502 const std::string md5("abcdef0123456789"); | 532 const std::string md5("abcdef0123456789"); |
503 | 533 |
504 // Store an existing file. | 534 // Store an existing file. |
| 535 ResourceEntry entry; |
| 536 entry.set_local_id(id); |
| 537 EXPECT_EQ(FILE_ERROR_OK, metadata_storage_->PutEntry(entry)); |
505 base::FilePath src_file; | 538 base::FilePath src_file; |
506 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); | 539 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); |
507 ASSERT_EQ(FILE_ERROR_OK, | 540 ASSERT_EQ(FILE_ERROR_OK, |
508 cache_->Store(id, md5, src_file, FileCache::FILE_OPERATION_COPY)); | 541 cache_->Store(id, md5, src_file, FileCache::FILE_OPERATION_COPY)); |
509 | 542 |
510 // Verify that the cache entry is created. | |
511 FileCacheEntry cache_entry; | |
512 ASSERT_EQ(FILE_ERROR_OK, GetCacheEntry(cache_.get(), id, &cache_entry)); | |
513 | |
514 // Clear cache. | 543 // Clear cache. |
515 EXPECT_TRUE(cache_->ClearAll()); | 544 EXPECT_TRUE(cache_->ClearAll()); |
516 | 545 |
517 // Verify that the cache is removed. | 546 // Verify that the cache is removed. |
518 EXPECT_EQ(FILE_ERROR_NOT_FOUND, | |
519 GetCacheEntry(cache_.get(), id, &cache_entry)); | |
520 EXPECT_TRUE(base::IsDirectoryEmpty(cache_files_dir_)); | 547 EXPECT_TRUE(base::IsDirectoryEmpty(cache_files_dir_)); |
521 } | 548 } |
522 | 549 |
523 } // namespace internal | 550 } // namespace internal |
524 } // namespace drive | 551 } // namespace drive |
OLD | NEW |