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 "chrome/browser/chromeos/drive/resource_metadata_storage.h" | 5 #include "chrome/browser/chromeos/drive/resource_metadata_storage.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
11 #include "chrome/browser/chromeos/drive/drive.pb.h" | 11 #include "chrome/browser/chromeos/drive/drive.pb.h" |
12 #include "chrome/browser/chromeos/drive/test_util.h" | 12 #include "chrome/browser/chromeos/drive/test_util.h" |
13 #include "chrome/browser/drive/drive_api_util.h" | |
14 #include "content/public/test/test_browser_thread_bundle.h" | 13 #include "content/public/test/test_browser_thread_bundle.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 15 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
17 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" | 16 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
18 | 17 |
19 namespace drive { | 18 namespace drive { |
20 namespace internal { | 19 namespace internal { |
21 | 20 |
22 class ResourceMetadataStorageTest : public testing::Test { | 21 class ResourceMetadataStorageTest : public testing::Test { |
23 protected: | 22 protected: |
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 batch.Put("file:abcd", serialized_entry); | 301 batch.Put("file:abcd", serialized_entry); |
303 | 302 |
304 FileCacheEntry cache_entry; | 303 FileCacheEntry cache_entry; |
305 EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); | 304 EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); |
306 batch.Put(std::string("file:abcd") + '\0' + "CACHE", serialized_entry); | 305 batch.Put(std::string("file:abcd") + '\0' + "CACHE", serialized_entry); |
307 | 306 |
308 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); | 307 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
309 | 308 |
310 // Upgrade and reopen. | 309 // Upgrade and reopen. |
311 storage_.reset(); | 310 storage_.reset(); |
312 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB( | 311 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
313 temp_dir_.path(), base::Bind(&util::CanonicalizeResourceId))); | |
314 storage_.reset(new ResourceMetadataStorage( | 312 storage_.reset(new ResourceMetadataStorage( |
315 temp_dir_.path(), base::MessageLoopProxy::current().get())); | 313 temp_dir_.path(), base::MessageLoopProxy::current().get())); |
316 ASSERT_TRUE(storage_->Initialize()); | 314 ASSERT_TRUE(storage_->Initialize()); |
317 | 315 |
318 // Resource-ID-to-local-ID mapping is added. | 316 // Resource-ID-to-local-ID mapping is added. |
319 std::string id; | 317 std::string id; |
320 EXPECT_EQ(FILE_ERROR_OK, | 318 EXPECT_EQ(FILE_ERROR_OK, |
321 storage_->GetIdByResourceId("abcd", &id)); // "file:" is dropped. | 319 storage_->GetIdByResourceId("abcd", &id)); // "file:" is dropped. |
322 | 320 |
323 // Data is erased, except cache entries. | 321 // Data is erased, except cache entries. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
355 FileCacheEntry cache_entry; | 353 FileCacheEntry cache_entry; |
356 EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); | 354 EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); |
357 batch.Put(local_id + '\0' + "CACHE", serialized_entry); | 355 batch.Put(local_id + '\0' + "CACHE", serialized_entry); |
358 | 356 |
359 batch.Put('\0' + std::string("ID") + '\0' + resource_id, local_id); | 357 batch.Put('\0' + std::string("ID") + '\0' + resource_id, local_id); |
360 | 358 |
361 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); | 359 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
362 | 360 |
363 // Upgrade and reopen. | 361 // Upgrade and reopen. |
364 storage_.reset(); | 362 storage_.reset(); |
365 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB( | 363 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
366 temp_dir_.path(), base::Bind(&util::CanonicalizeResourceId))); | |
367 storage_.reset(new ResourceMetadataStorage( | 364 storage_.reset(new ResourceMetadataStorage( |
368 temp_dir_.path(), base::MessageLoopProxy::current().get())); | 365 temp_dir_.path(), base::MessageLoopProxy::current().get())); |
369 ASSERT_TRUE(storage_->Initialize()); | 366 ASSERT_TRUE(storage_->Initialize()); |
370 | 367 |
371 // Data is erased, except cache and id mapping entries. | 368 // Data is erased, except cache and id mapping entries. |
372 std::string id; | 369 std::string id; |
373 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); | 370 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); |
374 EXPECT_EQ(local_id, id); | 371 EXPECT_EQ(local_id, id); |
375 int64 largest_changestamp = 0; | 372 int64 largest_changestamp = 0; |
376 EXPECT_EQ(FILE_ERROR_OK, | 373 EXPECT_EQ(FILE_ERROR_OK, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
417 // Put another cache entry which is not accompanied by a ResourceEntry. | 414 // Put another cache entry which is not accompanied by a ResourceEntry. |
418 cache_entry.set_md5(md5_2); | 415 cache_entry.set_md5(md5_2); |
419 EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); | 416 EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); |
420 batch.Put(local_id2 + '\0' + "CACHE", serialized_entry); | 417 batch.Put(local_id2 + '\0' + "CACHE", serialized_entry); |
421 batch.Put('\0' + std::string("ID") + '\0' + resource_id2, local_id2); | 418 batch.Put('\0' + std::string("ID") + '\0' + resource_id2, local_id2); |
422 | 419 |
423 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); | 420 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
424 | 421 |
425 // Upgrade and reopen. | 422 // Upgrade and reopen. |
426 storage_.reset(); | 423 storage_.reset(); |
427 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB( | 424 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
428 temp_dir_.path(), base::Bind(&util::CanonicalizeResourceId))); | |
429 storage_.reset(new ResourceMetadataStorage( | 425 storage_.reset(new ResourceMetadataStorage( |
430 temp_dir_.path(), base::MessageLoopProxy::current().get())); | 426 temp_dir_.path(), base::MessageLoopProxy::current().get())); |
431 ASSERT_TRUE(storage_->Initialize()); | 427 ASSERT_TRUE(storage_->Initialize()); |
432 | 428 |
433 // No data is lost. | 429 // No data is lost. |
434 int64 largest_changestamp = 0; | 430 int64 largest_changestamp = 0; |
435 EXPECT_EQ(FILE_ERROR_OK, | 431 EXPECT_EQ(FILE_ERROR_OK, |
436 storage_->GetLargestChangestamp(&largest_changestamp)); | 432 storage_->GetLargestChangestamp(&largest_changestamp)); |
437 EXPECT_EQ(kLargestChangestamp, largest_changestamp); | 433 EXPECT_EQ(kLargestChangestamp, largest_changestamp); |
438 | 434 |
(...skipping 17 matching lines...) Expand all Loading... |
456 // Put some data. | 452 // Put some data. |
457 EXPECT_EQ(FILE_ERROR_OK, | 453 EXPECT_EQ(FILE_ERROR_OK, |
458 storage_->SetLargestChangestamp(kLargestChangestamp)); | 454 storage_->SetLargestChangestamp(kLargestChangestamp)); |
459 ResourceEntry entry; | 455 ResourceEntry entry; |
460 entry.set_local_id(key1); | 456 entry.set_local_id(key1); |
461 EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); | 457 EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
462 | 458 |
463 // Set newer version, upgrade and reopen DB. | 459 // Set newer version, upgrade and reopen DB. |
464 SetDBVersion(ResourceMetadataStorage::kDBVersion + 1); | 460 SetDBVersion(ResourceMetadataStorage::kDBVersion + 1); |
465 storage_.reset(); | 461 storage_.reset(); |
466 EXPECT_FALSE(ResourceMetadataStorage::UpgradeOldDB( | 462 EXPECT_FALSE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
467 temp_dir_.path(), base::Bind(&util::CanonicalizeResourceId))); | |
468 storage_.reset(new ResourceMetadataStorage( | 463 storage_.reset(new ResourceMetadataStorage( |
469 temp_dir_.path(), base::MessageLoopProxy::current().get())); | 464 temp_dir_.path(), base::MessageLoopProxy::current().get())); |
470 ASSERT_TRUE(storage_->Initialize()); | 465 ASSERT_TRUE(storage_->Initialize()); |
471 | 466 |
472 // Data is erased because of the incompatible version. | 467 // Data is erased because of the incompatible version. |
473 int64 largest_changestamp = 0; | 468 int64 largest_changestamp = 0; |
474 EXPECT_EQ(FILE_ERROR_OK, | 469 EXPECT_EQ(FILE_ERROR_OK, |
475 storage_->GetLargestChangestamp(&largest_changestamp)); | 470 storage_->GetLargestChangestamp(&largest_changestamp)); |
476 EXPECT_EQ(0, largest_changestamp); | 471 EXPECT_EQ(0, largest_changestamp); |
477 EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key1, &entry)); | 472 EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key1, &entry)); |
(...skipping 12 matching lines...) Expand all Loading... |
490 batch.Put("id1", serialized_entry); | 485 batch.Put("id1", serialized_entry); |
491 batch.Put('\0' + std::string("ID") + '\0' + "resource_id1", "id1"); | 486 batch.Put('\0' + std::string("ID") + '\0' + "resource_id1", "id1"); |
492 | 487 |
493 // Put an ID entry without any corresponding entries. | 488 // Put an ID entry without any corresponding entries. |
494 batch.Put('\0' + std::string("ID") + '\0' + "resource_id2", "id3"); | 489 batch.Put('\0' + std::string("ID") + '\0' + "resource_id2", "id3"); |
495 | 490 |
496 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); | 491 EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
497 | 492 |
498 // Upgrade and reopen. | 493 // Upgrade and reopen. |
499 storage_.reset(); | 494 storage_.reset(); |
500 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB( | 495 EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
501 temp_dir_.path(), base::Bind(&util::CanonicalizeResourceId))); | |
502 storage_.reset(new ResourceMetadataStorage( | 496 storage_.reset(new ResourceMetadataStorage( |
503 temp_dir_.path(), base::MessageLoopProxy::current().get())); | 497 temp_dir_.path(), base::MessageLoopProxy::current().get())); |
504 ASSERT_TRUE(storage_->Initialize()); | 498 ASSERT_TRUE(storage_->Initialize()); |
505 | 499 |
506 // Only the unused entry is deleted. | 500 // Only the unused entry is deleted. |
507 std::string id; | 501 std::string id; |
508 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId("resource_id1", &id)); | 502 EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId("resource_id1", &id)); |
509 EXPECT_EQ("id1", id); | 503 EXPECT_EQ("id1", id); |
510 EXPECT_EQ(FILE_ERROR_NOT_FOUND, | 504 EXPECT_EQ(FILE_ERROR_NOT_FOUND, |
511 storage_->GetIdByResourceId("resource_id2", &id)); | 505 storage_->GetIdByResourceId("resource_id2", &id)); |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
628 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key3)); | 622 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key3)); |
629 EXPECT_TRUE(CheckValidity()); | 623 EXPECT_TRUE(CheckValidity()); |
630 | 624 |
631 // Remove key1. | 625 // Remove key1. |
632 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key1)); | 626 EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key1)); |
633 EXPECT_TRUE(CheckValidity()); | 627 EXPECT_TRUE(CheckValidity()); |
634 } | 628 } |
635 | 629 |
636 } // namespace internal | 630 } // namespace internal |
637 } // namespace drive | 631 } // namespace drive |
OLD | NEW |