| 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 |