OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/drive/resource_metadata_storage.h" | 5 #include "components/drive/resource_metadata_storage.h" |
6 | 6 |
| 7 #include <stddef.h> |
| 8 #include <stdint.h> |
| 9 |
7 #include <algorithm> | 10 #include <algorithm> |
8 | 11 |
9 #include "base/files/file_util.h" | 12 #include "base/files/file_util.h" |
10 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
| 14 #include "base/macros.h" |
11 #include "base/single_thread_task_runner.h" | 15 #include "base/single_thread_task_runner.h" |
12 #include "base/strings/string_split.h" | 16 #include "base/strings/string_split.h" |
13 #include "base/thread_task_runner_handle.h" | 17 #include "base/thread_task_runner_handle.h" |
14 #include "components/drive/drive.pb.h" | 18 #include "components/drive/drive.pb.h" |
15 #include "components/drive/drive_test_util.h" | 19 #include "components/drive/drive_test_util.h" |
16 #include "content/public/test/test_browser_thread_bundle.h" | 20 #include "content/public/test/test_browser_thread_bundle.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 21 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 22 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
19 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" | 23 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
20 | 24 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 ResourceMetadataStorage::GetChildEntryKey(parent_id, child_base_name)); | 67 ResourceMetadataStorage::GetChildEntryKey(parent_id, child_base_name)); |
64 } | 68 } |
65 | 69 |
66 content::TestBrowserThreadBundle thread_bundle_; | 70 content::TestBrowserThreadBundle thread_bundle_; |
67 base::ScopedTempDir temp_dir_; | 71 base::ScopedTempDir temp_dir_; |
68 scoped_ptr<ResourceMetadataStorage, | 72 scoped_ptr<ResourceMetadataStorage, |
69 test_util::DestroyHelperForTests> storage_; | 73 test_util::DestroyHelperForTests> storage_; |
70 }; | 74 }; |
71 | 75 |
72 TEST_F(ResourceMetadataStorageTest, LargestChangestamp) { | 76 TEST_F(ResourceMetadataStorageTest, LargestChangestamp) { |
73 const int64 kLargestChangestamp = 1234567890; | 77 const int64_t kLargestChangestamp = 1234567890; |
74 EXPECT_EQ(FILE_ERROR_OK, | 78 EXPECT_EQ(FILE_ERROR_OK, |
75 storage_->SetLargestChangestamp(kLargestChangestamp)); | 79 storage_->SetLargestChangestamp(kLargestChangestamp)); |
76 int64 value = 0; | 80 int64_t value = 0; |
77 EXPECT_EQ(FILE_ERROR_OK, storage_->GetLargestChangestamp(&value)); | 81 EXPECT_EQ(FILE_ERROR_OK, storage_->GetLargestChangestamp(&value)); |
78 EXPECT_EQ(kLargestChangestamp, value); | 82 EXPECT_EQ(kLargestChangestamp, value); |
79 } | 83 } |
80 | 84 |
81 TEST_F(ResourceMetadataStorageTest, PutEntry) { | 85 TEST_F(ResourceMetadataStorageTest, PutEntry) { |
82 const std::string key1 = "abcdefg"; | 86 const std::string key1 = "abcdefg"; |
83 const std::string key2 = "abcd"; | 87 const std::string key2 = "abcd"; |
84 const std::string key3 = "efgh"; | 88 const std::string key3 = "efgh"; |
85 const std::string name2 = "ABCD"; | 89 const std::string name2 = "ABCD"; |
86 const std::string name3 = "EFGH"; | 90 const std::string name3 = "EFGH"; |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
277 EXPECT_EQ(parent_id1, result.parent_local_id()); | 281 EXPECT_EQ(parent_id1, result.parent_local_id()); |
278 EXPECT_EQ(child_name1, result.base_name()); | 282 EXPECT_EQ(child_name1, result.base_name()); |
279 | 283 |
280 std::string child_id; | 284 std::string child_id; |
281 EXPECT_EQ(FILE_ERROR_OK, | 285 EXPECT_EQ(FILE_ERROR_OK, |
282 storage_->GetChild(parent_id1, child_name1, &child_id)); | 286 storage_->GetChild(parent_id1, child_name1, &child_id)); |
283 EXPECT_EQ(child_id1, child_id); | 287 EXPECT_EQ(child_id1, child_id); |
284 } | 288 } |
285 | 289 |
286 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M29) { | 290 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M29) { |
287 const int64 kLargestChangestamp = 1234567890; | 291 const int64_t kLargestChangestamp = 1234567890; |
288 const std::string title = "title"; | 292 const std::string title = "title"; |
289 | 293 |
290 // Construct M29 version DB. | 294 // Construct M29 version DB. |
291 SetDBVersion(6); | 295 SetDBVersion(6); |
292 EXPECT_EQ(FILE_ERROR_OK, | 296 EXPECT_EQ(FILE_ERROR_OK, |
293 storage_->SetLargestChangestamp(kLargestChangestamp)); | 297 storage_->SetLargestChangestamp(kLargestChangestamp)); |
294 | 298 |
295 leveldb::WriteBatch batch; | 299 leveldb::WriteBatch batch; |
296 | 300 |
297 // Put a file entry and its cache entry. | 301 // Put a file entry and its cache entry. |
(...skipping 16 matching lines...) Expand all Loading... |
314 storage_.reset(new ResourceMetadataStorage( | 318 storage_.reset(new ResourceMetadataStorage( |
315 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); | 319 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
316 ASSERT_TRUE(storage_->Initialize()); | 320 ASSERT_TRUE(storage_->Initialize()); |
317 | 321 |
318 // Resource-ID-to-local-ID mapping is added. | 322 // Resource-ID-to-local-ID mapping is added. |
319 std::string id; | 323 std::string id; |
320 EXPECT_EQ(FILE_ERROR_OK, | 324 EXPECT_EQ(FILE_ERROR_OK, |
321 storage_->GetIdByResourceId("abcd", &id)); // "file:" is dropped. | 325 storage_->GetIdByResourceId("abcd", &id)); // "file:" is dropped. |
322 | 326 |
323 // Data is erased, except cache entries. | 327 // Data is erased, except cache entries. |
324 int64 largest_changestamp = 0; | 328 int64_t largest_changestamp = 0; |
325 EXPECT_EQ(FILE_ERROR_OK, | 329 EXPECT_EQ(FILE_ERROR_OK, |
326 storage_->GetLargestChangestamp(&largest_changestamp)); | 330 storage_->GetLargestChangestamp(&largest_changestamp)); |
327 EXPECT_EQ(0, largest_changestamp); | 331 EXPECT_EQ(0, largest_changestamp); |
328 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); | 332 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
329 EXPECT_TRUE(entry.title().empty()); | 333 EXPECT_TRUE(entry.title().empty()); |
330 EXPECT_TRUE(entry.file_specific_info().has_cache_state()); | 334 EXPECT_TRUE(entry.file_specific_info().has_cache_state()); |
331 } | 335 } |
332 | 336 |
333 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M32) { | 337 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M32) { |
334 const int64 kLargestChangestamp = 1234567890; | 338 const int64_t kLargestChangestamp = 1234567890; |
335 const std::string title = "title"; | 339 const std::string title = "title"; |
336 const std::string resource_id = "abcd"; | 340 const std::string resource_id = "abcd"; |
337 const std::string local_id = "local-abcd"; | 341 const std::string local_id = "local-abcd"; |
338 | 342 |
339 // Construct M32 version DB. | 343 // Construct M32 version DB. |
340 SetDBVersion(11); | 344 SetDBVersion(11); |
341 EXPECT_EQ(FILE_ERROR_OK, | 345 EXPECT_EQ(FILE_ERROR_OK, |
342 storage_->SetLargestChangestamp(kLargestChangestamp)); | 346 storage_->SetLargestChangestamp(kLargestChangestamp)); |
343 | 347 |
344 leveldb::WriteBatch batch; | 348 leveldb::WriteBatch batch; |
(...skipping 19 matching lines...) Expand all Loading... |
364 storage_.reset(); | 368 storage_.reset(); |
365 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); | 369 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
366 storage_.reset(new ResourceMetadataStorage( | 370 storage_.reset(new ResourceMetadataStorage( |
367 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); | 371 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
368 ASSERT_TRUE(storage_->Initialize()); | 372 ASSERT_TRUE(storage_->Initialize()); |
369 | 373 |
370 // Data is erased, except cache and id mapping entries. | 374 // Data is erased, except cache and id mapping entries. |
371 std::string id; | 375 std::string id; |
372 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); | 376 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); |
373 EXPECT_EQ(local_id, id); | 377 EXPECT_EQ(local_id, id); |
374 int64 largest_changestamp = 0; | 378 int64_t largest_changestamp = 0; |
375 EXPECT_EQ(FILE_ERROR_OK, | 379 EXPECT_EQ(FILE_ERROR_OK, |
376 storage_->GetLargestChangestamp(&largest_changestamp)); | 380 storage_->GetLargestChangestamp(&largest_changestamp)); |
377 EXPECT_EQ(0, largest_changestamp); | 381 EXPECT_EQ(0, largest_changestamp); |
378 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); | 382 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
379 EXPECT_TRUE(entry.title().empty()); | 383 EXPECT_TRUE(entry.title().empty()); |
380 EXPECT_TRUE(entry.file_specific_info().has_cache_state()); | 384 EXPECT_TRUE(entry.file_specific_info().has_cache_state()); |
381 } | 385 } |
382 | 386 |
383 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M33) { | 387 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M33) { |
384 const int64 kLargestChangestamp = 1234567890; | 388 const int64_t kLargestChangestamp = 1234567890; |
385 const std::string title = "title"; | 389 const std::string title = "title"; |
386 const std::string resource_id = "abcd"; | 390 const std::string resource_id = "abcd"; |
387 const std::string local_id = "local-abcd"; | 391 const std::string local_id = "local-abcd"; |
388 const std::string md5 = "md5"; | 392 const std::string md5 = "md5"; |
389 const std::string resource_id2 = "efgh"; | 393 const std::string resource_id2 = "efgh"; |
390 const std::string local_id2 = "local-efgh"; | 394 const std::string local_id2 = "local-efgh"; |
391 const std::string md5_2 = "md5_2"; | 395 const std::string md5_2 = "md5_2"; |
392 | 396 |
393 // Construct M33 version DB. | 397 // Construct M33 version DB. |
394 SetDBVersion(12); | 398 SetDBVersion(12); |
(...skipping 27 matching lines...) Expand all Loading... |
422 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); | 426 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
423 | 427 |
424 // Upgrade and reopen. | 428 // Upgrade and reopen. |
425 storage_.reset(); | 429 storage_.reset(); |
426 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); | 430 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
427 storage_.reset(new ResourceMetadataStorage( | 431 storage_.reset(new ResourceMetadataStorage( |
428 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); | 432 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
429 ASSERT_TRUE(storage_->Initialize()); | 433 ASSERT_TRUE(storage_->Initialize()); |
430 | 434 |
431 // No data is lost. | 435 // No data is lost. |
432 int64 largest_changestamp = 0; | 436 int64_t largest_changestamp = 0; |
433 EXPECT_EQ(FILE_ERROR_OK, | 437 EXPECT_EQ(FILE_ERROR_OK, |
434 storage_->GetLargestChangestamp(&largest_changestamp)); | 438 storage_->GetLargestChangestamp(&largest_changestamp)); |
435 EXPECT_EQ(kLargestChangestamp, largest_changestamp); | 439 EXPECT_EQ(kLargestChangestamp, largest_changestamp); |
436 | 440 |
437 std::string id; | 441 std::string id; |
438 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); | 442 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); |
439 EXPECT_EQ(local_id, id); | 443 EXPECT_EQ(local_id, id); |
440 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); | 444 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
441 EXPECT_EQ(title, entry.title()); | 445 EXPECT_EQ(title, entry.title()); |
442 EXPECT_EQ(md5, entry.file_specific_info().cache_state().md5()); | 446 EXPECT_EQ(md5, entry.file_specific_info().cache_state().md5()); |
443 | 447 |
444 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id2, &id)); | 448 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id2, &id)); |
445 EXPECT_EQ(local_id2, id); | 449 EXPECT_EQ(local_id2, id); |
446 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); | 450 EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
447 EXPECT_EQ(md5_2, entry.file_specific_info().cache_state().md5()); | 451 EXPECT_EQ(md5_2, entry.file_specific_info().cache_state().md5()); |
448 } | 452 } |
449 | 453 |
450 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_Unknown) { | 454 TEST_F(ResourceMetadataStorageTest, IncompatibleDB_Unknown) { |
451 const int64 kLargestChangestamp = 1234567890; | 455 const int64_t kLargestChangestamp = 1234567890; |
452 const std::string key1 = "abcd"; | 456 const std::string key1 = "abcd"; |
453 | 457 |
454 // Put some data. | 458 // Put some data. |
455 EXPECT_EQ(FILE_ERROR_OK, | 459 EXPECT_EQ(FILE_ERROR_OK, |
456 storage_->SetLargestChangestamp(kLargestChangestamp)); | 460 storage_->SetLargestChangestamp(kLargestChangestamp)); |
457 ResourceEntry entry; | 461 ResourceEntry entry; |
458 entry.set_local_id(key1); | 462 entry.set_local_id(key1); |
459 EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); | 463 EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
460 | 464 |
461 // Set newer version, upgrade and reopen DB. | 465 // Set newer version, upgrade and reopen DB. |
462 SetDBVersion(ResourceMetadataStorage::kDBVersion + 1); | 466 SetDBVersion(ResourceMetadataStorage::kDBVersion + 1); |
463 storage_.reset(); | 467 storage_.reset(); |
464 EXPECT_FALSE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); | 468 EXPECT_FALSE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
465 storage_.reset(new ResourceMetadataStorage( | 469 storage_.reset(new ResourceMetadataStorage( |
466 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); | 470 temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
467 ASSERT_TRUE(storage_->Initialize()); | 471 ASSERT_TRUE(storage_->Initialize()); |
468 | 472 |
469 // Data is erased because of the incompatible version. | 473 // Data is erased because of the incompatible version. |
470 int64 largest_changestamp = 0; | 474 int64_t largest_changestamp = 0; |
471 EXPECT_EQ(FILE_ERROR_OK, | 475 EXPECT_EQ(FILE_ERROR_OK, |
472 storage_->GetLargestChangestamp(&largest_changestamp)); | 476 storage_->GetLargestChangestamp(&largest_changestamp)); |
473 EXPECT_EQ(0, largest_changestamp); | 477 EXPECT_EQ(0, largest_changestamp); |
474 EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key1, &entry)); | 478 EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key1, &entry)); |
475 } | 479 } |
476 | 480 |
477 TEST_F(ResourceMetadataStorageTest, DeleteUnusedIDEntries) { | 481 TEST_F(ResourceMetadataStorageTest, DeleteUnusedIDEntries) { |
478 leveldb::WriteBatch batch; | 482 leveldb::WriteBatch batch; |
479 | 483 |
480 // Put an ID entry with a corresponding ResourceEntry. | 484 // Put an ID entry with a corresponding ResourceEntry. |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key3)); | 628 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key3)); |
625 EXPECT_TRUE(CheckValidity()); | 629 EXPECT_TRUE(CheckValidity()); |
626 | 630 |
627 // Remove key1. | 631 // Remove key1. |
628 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key1)); | 632 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key1)); |
629 EXPECT_TRUE(CheckValidity()); | 633 EXPECT_TRUE(CheckValidity()); |
630 } | 634 } |
631 | 635 |
632 } // namespace internal | 636 } // namespace internal |
633 } // namespace drive | 637 } // namespace drive |
OLD | NEW |