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/sync_file_system/drive_metadata_store.h" | 5 #include "chrome/browser/sync_file_system/drive_metadata_store.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 14 #include "base/string_util.h" |
14 #include "base/threading/thread.h" | 15 #include "base/threading/thread.h" |
15 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" | 16 #include "chrome/browser/sync_file_system/drive_file_sync_service.h" |
16 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" | 17 #include "chrome/browser/sync_file_system/sync_file_system.pb.h" |
17 #include "content/public/browser/browser_thread.h" | 18 #include "content/public/browser/browser_thread.h" |
18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
19 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 20 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
20 #include "webkit/browser/fileapi/isolated_context.h" | 21 #include "webkit/browser/fileapi/isolated_context.h" |
21 #include "webkit/fileapi/syncable/syncable_file_system_util.h" | 22 #include "webkit/fileapi/syncable/syncable_file_system_util.h" |
22 | 23 |
23 #define FPL FILE_PATH_LITERAL | 24 #define FPL FILE_PATH_LITERAL |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 void RestoreSyncRootDirectoryFromDB() { | 126 void RestoreSyncRootDirectoryFromDB() { |
126 EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread()); | 127 EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread()); |
127 drive_metadata_store_->RestoreSyncRootDirectory( | 128 drive_metadata_store_->RestoreSyncRootDirectory( |
128 base::Bind(&DriveMetadataStoreTest::DidRestoreSyncRootDirectory, | 129 base::Bind(&DriveMetadataStoreTest::DidRestoreSyncRootDirectory, |
129 base::Unretained(this))); | 130 base::Unretained(this))); |
130 message_loop_.Run(); | 131 message_loop_.Run(); |
131 } | 132 } |
132 | 133 |
133 void DropSyncOriginsInStore() { | 134 void DropSyncOriginsInStore() { |
134 EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread()); | 135 EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread()); |
135 drive_metadata_store_->batch_sync_origins_.clear(); | |
136 drive_metadata_store_->incremental_sync_origins_.clear(); | 136 drive_metadata_store_->incremental_sync_origins_.clear(); |
137 drive_metadata_store_->disabled_origins_.clear(); | 137 drive_metadata_store_->disabled_origins_.clear(); |
138 EXPECT_TRUE(drive_metadata_store_->batch_sync_origins().empty()); | |
139 EXPECT_TRUE(drive_metadata_store_->incremental_sync_origins().empty()); | 138 EXPECT_TRUE(drive_metadata_store_->incremental_sync_origins().empty()); |
140 EXPECT_TRUE(drive_metadata_store_->disabled_origins().empty()); | 139 EXPECT_TRUE(drive_metadata_store_->disabled_origins().empty()); |
141 } | 140 } |
142 | 141 |
143 void RestoreOriginsFromDB() { | 142 void RestoreOriginsFromDB() { |
144 EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread()); | 143 EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread()); |
145 drive_metadata_store_->RestoreOrigins( | 144 drive_metadata_store_->RestoreOrigins( |
146 base::Bind(&DriveMetadataStoreTest::DidRestoreOrigins, | 145 base::Bind(&DriveMetadataStoreTest::DidRestoreOrigins, |
147 base::Unretained(this))); | 146 base::Unretained(this))); |
148 message_loop_.Run(); | 147 message_loop_.Run(); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 SyncStatusCode status) { | 208 SyncStatusCode status) { |
210 *status_out = status; | 209 *status_out = status; |
211 message_loop_.Quit(); | 210 message_loop_.Quit(); |
212 } | 211 } |
213 | 212 |
214 void MarkAsCreated() { | 213 void MarkAsCreated() { |
215 created_ = true; | 214 created_ = true; |
216 } | 215 } |
217 | 216 |
218 void VerifyUntrackedOrigin(const GURL& origin) { | 217 void VerifyUntrackedOrigin(const GURL& origin) { |
219 EXPECT_FALSE(metadata_store()->IsBatchSyncOrigin(origin)); | |
220 EXPECT_FALSE(metadata_store()->IsIncrementalSyncOrigin(origin)); | 218 EXPECT_FALSE(metadata_store()->IsIncrementalSyncOrigin(origin)); |
221 EXPECT_FALSE(metadata_store()->IsOriginDisabled(origin)); | 219 EXPECT_FALSE(metadata_store()->IsOriginDisabled(origin)); |
222 } | 220 } |
223 | 221 |
224 void VerifyIncrementalSyncOrigin(const GURL& origin, | 222 void VerifyIncrementalSyncOrigin(const GURL& origin, |
225 const std::string& resource_id) { | 223 const std::string& resource_id) { |
226 EXPECT_FALSE(metadata_store()->IsBatchSyncOrigin(origin)); | |
227 EXPECT_TRUE(metadata_store()->IsIncrementalSyncOrigin(origin)); | 224 EXPECT_TRUE(metadata_store()->IsIncrementalSyncOrigin(origin)); |
228 EXPECT_FALSE(metadata_store()->IsOriginDisabled(origin)); | 225 EXPECT_FALSE(metadata_store()->IsOriginDisabled(origin)); |
229 EXPECT_EQ(resource_id, | 226 EXPECT_EQ(resource_id, |
230 GetResourceID(metadata_store()->incremental_sync_origins(), | 227 GetResourceID(metadata_store()->incremental_sync_origins(), |
231 origin)); | 228 origin)); |
232 } | 229 } |
233 | 230 |
234 void VerifyDisabledOrigin(const GURL& origin, | 231 void VerifyDisabledOrigin(const GURL& origin, |
235 const std::string& resource_id) { | 232 const std::string& resource_id) { |
236 EXPECT_FALSE(metadata_store()->IsBatchSyncOrigin(origin)); | |
237 EXPECT_FALSE(metadata_store()->IsIncrementalSyncOrigin(origin)); | 233 EXPECT_FALSE(metadata_store()->IsIncrementalSyncOrigin(origin)); |
238 EXPECT_TRUE(metadata_store()->IsOriginDisabled(origin)); | 234 EXPECT_TRUE(metadata_store()->IsOriginDisabled(origin)); |
239 EXPECT_EQ(resource_id, | 235 EXPECT_EQ(resource_id, |
240 GetResourceID(metadata_store()->disabled_origins(), origin)); | 236 GetResourceID(metadata_store()->disabled_origins(), origin)); |
241 } | 237 } |
242 | 238 |
243 base::FilePath base_dir() { | 239 base::FilePath base_dir() { |
244 return base_dir_.path(); | 240 return base_dir_.path(); |
245 } | 241 } |
246 | 242 |
247 DriveMetadataStore* metadata_store() { | 243 DriveMetadataStore* metadata_store() { |
248 return drive_metadata_store_.get(); | 244 return drive_metadata_store_.get(); |
249 } | 245 } |
250 | 246 |
| 247 leveldb::DB* metadata_db() { |
| 248 return drive_metadata_store_->GetDBInstanceForTesting(); |
| 249 } |
| 250 |
251 const DriveMetadataStore::MetadataMap& metadata_map() { | 251 const DriveMetadataStore::MetadataMap& metadata_map() { |
252 return drive_metadata_store_->metadata_map_; | 252 return drive_metadata_store_->metadata_map_; |
253 } | 253 } |
254 | 254 |
255 void VerifyReverseMap() { | 255 void VerifyReverseMap() { |
256 const ResourceIdByOrigin& batch_sync_origins = | |
257 drive_metadata_store_->batch_sync_origins_; | |
258 const ResourceIdByOrigin& incremental_sync_origins = | 256 const ResourceIdByOrigin& incremental_sync_origins = |
259 drive_metadata_store_->incremental_sync_origins_; | 257 drive_metadata_store_->incremental_sync_origins_; |
260 const ResourceIdByOrigin& disabled_origins = | 258 const ResourceIdByOrigin& disabled_origins = |
261 drive_metadata_store_->disabled_origins_; | 259 drive_metadata_store_->disabled_origins_; |
262 const OriginByResourceId& origin_by_resource_id = | 260 const OriginByResourceId& origin_by_resource_id = |
263 drive_metadata_store_->origin_by_resource_id_; | 261 drive_metadata_store_->origin_by_resource_id_; |
264 | 262 |
265 size_t expected_size = | 263 size_t expected_size = incremental_sync_origins.size() + |
266 batch_sync_origins.size() + incremental_sync_origins.size() + | 264 disabled_origins.size(); |
267 disabled_origins.size(); | |
268 size_t actual_size = origin_by_resource_id.size(); | 265 size_t actual_size = origin_by_resource_id.size(); |
269 EXPECT_EQ(expected_size, actual_size); | 266 EXPECT_EQ(expected_size, actual_size); |
270 EXPECT_TRUE(VerifyReverseMapInclusion(batch_sync_origins, | |
271 origin_by_resource_id)); | |
272 EXPECT_TRUE(VerifyReverseMapInclusion(incremental_sync_origins, | 267 EXPECT_TRUE(VerifyReverseMapInclusion(incremental_sync_origins, |
273 origin_by_resource_id)); | 268 origin_by_resource_id)); |
274 EXPECT_TRUE(VerifyReverseMapInclusion(disabled_origins, | 269 EXPECT_TRUE(VerifyReverseMapInclusion(disabled_origins, |
275 origin_by_resource_id)); | 270 origin_by_resource_id)); |
276 } | 271 } |
277 | 272 |
278 private: | 273 private: |
279 void DidInitializeDatabase(bool* done_out, | 274 void DidInitializeDatabase(bool* done_out, |
280 SyncStatusCode* status_out, | 275 SyncStatusCode* status_out, |
281 bool* created_out, | 276 bool* created_out, |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 kOrigin3, kServiceName, base::FilePath(FPL("waf"))), | 522 kOrigin3, kServiceName, base::FilePath(FPL("waf"))), |
528 CreateMetadata("baz", "egg", false, false))); | 523 CreateMetadata("baz", "egg", false, false))); |
529 | 524 |
530 EXPECT_EQ(SYNC_STATUS_OK, RemoveOrigin(kOrigin2)); | 525 EXPECT_EQ(SYNC_STATUS_OK, RemoveOrigin(kOrigin2)); |
531 EXPECT_EQ(SYNC_STATUS_OK, RemoveOrigin(kOrigin3)); | 526 EXPECT_EQ(SYNC_STATUS_OK, RemoveOrigin(kOrigin3)); |
532 | 527 |
533 DropDatabase(); | 528 DropDatabase(); |
534 InitializeDatabase(); | 529 InitializeDatabase(); |
535 | 530 |
536 // kOrigin1 should be the only one left. | 531 // kOrigin1 should be the only one left. |
537 EXPECT_EQ(0u, metadata_store()->batch_sync_origins().size()); | |
538 EXPECT_EQ(1u, metadata_store()->incremental_sync_origins().size()); | 532 EXPECT_EQ(1u, metadata_store()->incremental_sync_origins().size()); |
539 EXPECT_EQ(0u, metadata_store()->disabled_origins().size()); | 533 EXPECT_EQ(0u, metadata_store()->disabled_origins().size()); |
540 EXPECT_TRUE(metadata_store()->IsIncrementalSyncOrigin(kOrigin1)); | 534 EXPECT_TRUE(metadata_store()->IsIncrementalSyncOrigin(kOrigin1)); |
541 EXPECT_EQ(1u, metadata_map().size()); | 535 EXPECT_EQ(1u, metadata_map().size()); |
542 | 536 |
543 DriveMetadataStore::MetadataMap::const_iterator found = | 537 DriveMetadataStore::MetadataMap::const_iterator found = |
544 metadata_map().find(kOrigin1); | 538 metadata_map().find(kOrigin1); |
545 EXPECT_TRUE(found != metadata_map().end() && found->second.size() == 1u); | 539 EXPECT_TRUE(found != metadata_map().end() && found->second.size() == 1u); |
546 | 540 |
547 VerifyReverseMap(); | 541 VerifyReverseMap(); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 kDriveIncrementalSyncOriginKeyPrefix + kOrigin2.spec(), | 639 kDriveIncrementalSyncOriginKeyPrefix + kOrigin2.spec(), |
646 kResourceId2); | 640 kResourceId2); |
647 EXPECT_TRUE(RevokeSyncableFileSystem(kV0ServiceName)); | 641 EXPECT_TRUE(RevokeSyncableFileSystem(kV0ServiceName)); |
648 MarkAsCreated(); | 642 MarkAsCreated(); |
649 } | 643 } |
650 | 644 |
651 InitializeDatabase(); | 645 InitializeDatabase(); |
652 | 646 |
653 EXPECT_EQ(1, metadata_store()->GetLargestChangeStamp()); | 647 EXPECT_EQ(1, metadata_store()->GetLargestChangeStamp()); |
654 EXPECT_EQ(kSyncRootResourceId, metadata_store()->sync_root_directory()); | 648 EXPECT_EQ(kSyncRootResourceId, metadata_store()->sync_root_directory()); |
655 EXPECT_EQ(kResourceId1, metadata_store()->GetResourceIdForOrigin(kOrigin1)); | |
656 EXPECT_EQ(kResourceId2, metadata_store()->GetResourceIdForOrigin(kOrigin2)); | 649 EXPECT_EQ(kResourceId2, metadata_store()->GetResourceIdForOrigin(kOrigin2)); |
657 | 650 |
658 DriveMetadata metadata; | 651 DriveMetadata metadata; |
659 EXPECT_EQ(SYNC_STATUS_OK, | 652 EXPECT_EQ(SYNC_STATUS_OK, |
660 metadata_store()->ReadEntry( | 653 metadata_store()->ReadEntry( |
661 CreateSyncableFileSystemURL(kOrigin1, kServiceName, kFile), | 654 CreateSyncableFileSystemURL(kOrigin1, kServiceName, kFile), |
662 &metadata)); | 655 &metadata)); |
663 EXPECT_EQ(kFileResourceId, metadata.resource_id()); | 656 EXPECT_EQ(kFileResourceId, metadata.resource_id()); |
664 EXPECT_EQ(kFileMD5, metadata.md5_checksum()); | 657 EXPECT_EQ(kFileMD5, metadata.md5_checksum()); |
665 EXPECT_FALSE(metadata.conflicted()); | 658 EXPECT_FALSE(metadata.conflicted()); |
666 EXPECT_FALSE(metadata.to_be_fetched()); | 659 EXPECT_FALSE(metadata.to_be_fetched()); |
667 | 660 |
668 VerifyReverseMap(); | 661 VerifyReverseMap(); |
669 } | 662 } |
670 | 663 |
| 664 TEST_F(DriveMetadataStoreTest, DeprecateBatchSyncOrigins) { |
| 665 // Make sure that previously saved batch sync origins were deleted from the DB |
| 666 // as they are no longer used. |
| 667 const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: "; |
| 668 const GURL kOrigin1("chrome-extension://example1"); |
| 669 const std::string kResourceId1("hoge"); |
| 670 |
| 671 // Purposely add in an old batch sync origin (from previous DB version). |
| 672 { |
| 673 leveldb::Options options; |
| 674 options.create_if_missing = true; |
| 675 leveldb::DB* db_ptr = NULL; |
| 676 std::string db_dir = fileapi::FilePathToString( |
| 677 base_dir().Append(DriveMetadataStore::kDatabaseName)); |
| 678 leveldb::DB::Open(options, db_dir, &db_ptr); |
| 679 scoped_ptr<leveldb::DB> db(db_ptr); |
| 680 leveldb::WriteOptions write_options; |
| 681 db->Put(write_options, |
| 682 kDriveBatchSyncOriginKeyPrefix + kOrigin1.spec(), kResourceId1); |
| 683 } |
| 684 |
| 685 InitializeDatabase(); |
| 686 |
| 687 // Confirm no batch sync origins remain after InitializeDatabase. |
| 688 scoped_ptr<leveldb::Iterator> itr(metadata_db()->NewIterator( |
| 689 leveldb::ReadOptions())); |
| 690 int batch_origins_found = 0; |
| 691 for (itr->Seek(kDriveBatchSyncOriginKeyPrefix); itr->Valid(); itr->Next()) { |
| 692 std::string key = itr->key().ToString(); |
| 693 if (!StartsWithASCII(key, kDriveBatchSyncOriginKeyPrefix, true)) |
| 694 break; |
| 695 batch_origins_found++; |
| 696 } |
| 697 EXPECT_EQ(0, batch_origins_found); |
| 698 } |
| 699 |
671 TEST_F(DriveMetadataStoreTest, ResetOriginRootDirectory) { | 700 TEST_F(DriveMetadataStoreTest, ResetOriginRootDirectory) { |
672 const GURL kOrigin1("chrome-extension://example1"); | 701 const GURL kOrigin1("chrome-extension://example1"); |
673 const std::string kResourceId1("hoge"); | 702 const std::string kResourceId1("hoge"); |
674 const std::string kResourceId2("fuga"); | 703 const std::string kResourceId2("fuga"); |
675 | 704 |
676 InitializeDatabase(); | 705 InitializeDatabase(); |
677 EXPECT_EQ(SYNC_STATUS_OK, SetLargestChangeStamp(1)); | 706 EXPECT_EQ(SYNC_STATUS_OK, SetLargestChangeStamp(1)); |
678 | 707 |
679 metadata_store()->AddIncrementalSyncOrigin(kOrigin1, kResourceId1); | 708 metadata_store()->AddIncrementalSyncOrigin(kOrigin1, kResourceId1); |
680 VerifyIncrementalSyncOrigin(kOrigin1, kResourceId1); | 709 VerifyIncrementalSyncOrigin(kOrigin1, kResourceId1); |
681 VerifyReverseMap(); | 710 VerifyReverseMap(); |
682 | 711 |
683 metadata_store()->SetOriginRootDirectory(kOrigin1, kResourceId2); | 712 metadata_store()->SetOriginRootDirectory(kOrigin1, kResourceId2); |
684 VerifyIncrementalSyncOrigin(kOrigin1, kResourceId2); | 713 VerifyIncrementalSyncOrigin(kOrigin1, kResourceId2); |
685 VerifyReverseMap(); | 714 VerifyReverseMap(); |
686 } | 715 } |
687 | 716 |
688 } // namespace sync_file_system | 717 } // namespace sync_file_system |
OLD | NEW |