| 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/sync_file_system/drive/metadata_db_migration_util.h" | 5 #include "chrome/browser/sync_file_system/drive/metadata_db_migration_util.h" |
| 6 | 6 |
| 7 #include "base/files/scoped_temp_dir.h" | 7 #include "base/files/scoped_temp_dir.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
| 10 #include "chrome/browser/sync_file_system/drive_metadata_store.h" | 10 #include "chrome/browser/sync_file_system/drive_metadata_store.h" |
| 11 #include "googleurl/src/gurl.h" | 11 #include "googleurl/src/gurl.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "third_party/leveldatabase/src/include/leveldb/db.h" | 13 #include "third_party/leveldatabase/src/include/leveldb/db.h" |
| 14 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" | 14 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
| 15 #include "webkit/browser/fileapi/external_mount_points.h" |
| 15 #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h" | 16 #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h" |
| 16 #include "webkit/common/fileapi/file_system_util.h" | 17 #include "webkit/common/fileapi/file_system_util.h" |
| 17 | 18 |
| 18 #define FPL FILE_PATH_LITERAL | 19 #define FPL FILE_PATH_LITERAL |
| 19 | 20 |
| 20 namespace sync_file_system { | 21 namespace sync_file_system { |
| 21 namespace drive { | 22 namespace drive { |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| 25 |
| 24 const char kV0ServiceName[] = "drive"; | 26 const char kV0ServiceName[] = "drive"; |
| 27 |
| 28 bool CreateV0SerializedSyncableFileSystemURL( |
| 29 const GURL& origin, |
| 30 const base::FilePath& path, |
| 31 std::string* serialized_url) { |
| 32 fileapi::ScopedExternalFileSystem scoped_fs( |
| 33 kV0ServiceName, fileapi::kFileSystemTypeSyncable, base::FilePath()); |
| 34 |
| 35 fileapi::FileSystemURL url = |
| 36 fileapi::ExternalMountPoints::GetSystemInstance()-> |
| 37 CreateExternalFileSystemURL(origin, kV0ServiceName, path); |
| 38 if (!url.is_valid()) |
| 39 return false; |
| 40 *serialized_url = fileapi::GetExternalFileSystemRootURIString( |
| 41 origin, kV0ServiceName) + url.path().AsUTF8Unsafe(); |
| 42 return true; |
| 25 } | 43 } |
| 26 | 44 |
| 45 } // namespace |
| 46 |
| 27 TEST(DriveMetadataDBMigrationUtilTest, ParseV0FormatFileSystemURL) { | 47 TEST(DriveMetadataDBMigrationUtilTest, ParseV0FormatFileSystemURL) { |
| 28 const GURL kOrigin("chrome-extension://example"); | 48 const GURL kOrigin("chrome-extension://example"); |
| 29 const base::FilePath kFile(FPL("foo bar")); | 49 const base::FilePath kFile(FPL("foo bar")); |
| 30 | 50 |
| 31 ASSERT_TRUE(RegisterSyncableFileSystem(kV0ServiceName)); | |
| 32 | |
| 33 fileapi::FileSystemURL url = | |
| 34 CreateSyncableFileSystemURL(kOrigin, kV0ServiceName, kFile); | |
| 35 | |
| 36 std::string serialized_url; | 51 std::string serialized_url; |
| 37 SerializeSyncableFileSystemURL(url, &serialized_url); | 52 ASSERT_TRUE(CreateV0SerializedSyncableFileSystemURL( |
| 53 kOrigin, kFile, &serialized_url)); |
| 38 | 54 |
| 39 GURL origin; | 55 GURL origin; |
| 40 base::FilePath path; | 56 base::FilePath path; |
| 41 EXPECT_TRUE(ParseV0FormatFileSystemURL(GURL(serialized_url), &origin, &path)); | 57 EXPECT_TRUE(ParseV0FormatFileSystemURL(GURL(serialized_url), &origin, &path)); |
| 42 EXPECT_EQ(kOrigin, origin); | 58 EXPECT_EQ(kOrigin, origin); |
| 43 EXPECT_EQ(kFile, path); | 59 EXPECT_EQ(kFile, path); |
| 44 | |
| 45 EXPECT_TRUE(RevokeSyncableFileSystem(kV0ServiceName)); | |
| 46 } | 60 } |
| 47 | 61 |
| 48 TEST(DriveMetadataDBMigrationUtilTest, AddWapiIdPrefix) { | 62 TEST(DriveMetadataDBMigrationUtilTest, AddWapiIdPrefix) { |
| 49 DriveMetadata_ResourceType type_file = | 63 DriveMetadata_ResourceType type_file = |
| 50 DriveMetadata_ResourceType_RESOURCE_TYPE_FILE; | 64 DriveMetadata_ResourceType_RESOURCE_TYPE_FILE; |
| 51 DriveMetadata_ResourceType type_folder = | 65 DriveMetadata_ResourceType type_folder = |
| 52 DriveMetadata_ResourceType_RESOURCE_TYPE_FOLDER; | 66 DriveMetadata_ResourceType_RESOURCE_TYPE_FOLDER; |
| 53 | 67 |
| 54 EXPECT_EQ("file:xxx", AddWapiFilePrefix("xxx")); | 68 EXPECT_EQ("file:xxx", AddWapiFilePrefix("xxx")); |
| 55 EXPECT_EQ("folder:yyy", AddWapiFolderPrefix("yyy")); | 69 EXPECT_EQ("folder:yyy", AddWapiFolderPrefix("yyy")); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 81 | 95 |
| 82 const GURL kOrigin1("chrome-extension://example1"); | 96 const GURL kOrigin1("chrome-extension://example1"); |
| 83 const GURL kOrigin2("chrome-extension://example2"); | 97 const GURL kOrigin2("chrome-extension://example2"); |
| 84 const std::string kSyncRootResourceId("folder:sync_root_resource_id"); | 98 const std::string kSyncRootResourceId("folder:sync_root_resource_id"); |
| 85 const std::string kResourceId1("folder:hoge"); | 99 const std::string kResourceId1("folder:hoge"); |
| 86 const std::string kResourceId2("folder:fuga"); | 100 const std::string kResourceId2("folder:fuga"); |
| 87 const std::string kFileResourceId("file:piyo"); | 101 const std::string kFileResourceId("file:piyo"); |
| 88 const base::FilePath kFile(FPL("foo bar")); | 102 const base::FilePath kFile(FPL("foo bar")); |
| 89 const std::string kFileMD5("file_md5"); | 103 const std::string kFileMD5("file_md5"); |
| 90 | 104 |
| 91 ASSERT_TRUE(RegisterSyncableFileSystem(kV0ServiceName)); | |
| 92 | |
| 93 base::ScopedTempDir base_dir; | 105 base::ScopedTempDir base_dir; |
| 94 ASSERT_TRUE(base_dir.CreateUniqueTempDir()); | 106 ASSERT_TRUE(base_dir.CreateUniqueTempDir()); |
| 95 | 107 |
| 96 leveldb::Options options; | 108 leveldb::Options options; |
| 97 options.create_if_missing = true; | 109 options.create_if_missing = true; |
| 98 leveldb::DB* db_ptr = NULL; | 110 leveldb::DB* db_ptr = NULL; |
| 99 std::string db_dir = fileapi::FilePathToString( | 111 std::string db_dir = fileapi::FilePathToString( |
| 100 base_dir.path().Append(DriveMetadataStore::kDatabaseName)); | 112 base_dir.path().Append(DriveMetadataStore::kDatabaseName)); |
| 101 leveldb::Status status = leveldb::DB::Open(options, db_dir, &db_ptr); | 113 leveldb::Status status = leveldb::DB::Open(options, db_dir, &db_ptr); |
| 102 | 114 |
| 103 scoped_ptr<leveldb::DB> db(db_ptr); | 115 scoped_ptr<leveldb::DB> db(db_ptr); |
| 104 ASSERT_TRUE(status.ok()); | 116 ASSERT_TRUE(status.ok()); |
| 105 | 117 |
| 106 // Setup the database with the schema version 0. | 118 // Setup the database with the schema version 0. |
| 107 leveldb::WriteBatch batch; | 119 leveldb::WriteBatch batch; |
| 108 batch.Put(kChangeStampKey, "1"); | 120 batch.Put(kChangeStampKey, "1"); |
| 109 batch.Put(kSyncRootDirectoryKey, kSyncRootResourceId); | 121 batch.Put(kSyncRootDirectoryKey, kSyncRootResourceId); |
| 110 | 122 |
| 111 fileapi::FileSystemURL url = | |
| 112 CreateSyncableFileSystemURL(kOrigin1, kV0ServiceName, kFile); | |
| 113 | |
| 114 // Setup drive metadata. | 123 // Setup drive metadata. |
| 115 DriveMetadata drive_metadata; | 124 DriveMetadata drive_metadata; |
| 116 drive_metadata.set_resource_id(kFileResourceId); | 125 drive_metadata.set_resource_id(kFileResourceId); |
| 117 drive_metadata.set_md5_checksum(kFileMD5); | 126 drive_metadata.set_md5_checksum(kFileMD5); |
| 118 drive_metadata.set_conflicted(false); | 127 drive_metadata.set_conflicted(false); |
| 119 drive_metadata.set_to_be_fetched(false); | 128 drive_metadata.set_to_be_fetched(false); |
| 120 | 129 |
| 121 std::string serialized_url; | 130 std::string serialized_url; |
| 122 SerializeSyncableFileSystemURL(url, &serialized_url); | 131 ASSERT_TRUE(CreateV0SerializedSyncableFileSystemURL( |
| 132 kOrigin1, kFile, &serialized_url)); |
| 123 std::string metadata_string; | 133 std::string metadata_string; |
| 124 drive_metadata.SerializeToString(&metadata_string); | 134 drive_metadata.SerializeToString(&metadata_string); |
| 125 batch.Put(kDriveMetadataKeyPrefix + serialized_url, metadata_string); | 135 batch.Put(kDriveMetadataKeyPrefix + serialized_url, metadata_string); |
| 126 | 136 |
| 127 // Setup batch sync origin and incremental sync origin. | 137 // Setup batch sync origin and incremental sync origin. |
| 128 batch.Put(kDriveBatchSyncOriginKeyPrefix + kOrigin1.spec(), kResourceId1); | 138 batch.Put(kDriveBatchSyncOriginKeyPrefix + kOrigin1.spec(), kResourceId1); |
| 129 batch.Put(kDriveIncrementalSyncOriginKeyPrefix + kOrigin2.spec(), | 139 batch.Put(kDriveIncrementalSyncOriginKeyPrefix + kOrigin2.spec(), |
| 130 kResourceId2); | 140 kResourceId2); |
| 131 | 141 |
| 132 status = db->Write(leveldb::WriteOptions(), &batch); | 142 status = db->Write(leveldb::WriteOptions(), &batch); |
| 133 EXPECT_EQ(SYNC_STATUS_OK, LevelDBStatusToSyncStatusCode(status)); | 143 EXPECT_EQ(SYNC_STATUS_OK, LevelDBStatusToSyncStatusCode(status)); |
| 134 EXPECT_TRUE(RevokeSyncableFileSystem(kV0ServiceName)); | |
| 135 | 144 |
| 136 // Migrate the database. | 145 // Migrate the database. |
| 137 drive::MigrateDatabaseFromV0ToV1(db.get()); | 146 drive::MigrateDatabaseFromV0ToV1(db.get()); |
| 138 | 147 |
| 139 scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions())); | 148 scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions())); |
| 140 | 149 |
| 141 // Verify DB schema version. | 150 // Verify DB schema version. |
| 142 int64 database_version = 0; | 151 int64 database_version = 0; |
| 143 itr->Seek(kDatabaseVersionKey); | 152 itr->Seek(kDatabaseVersionKey); |
| 144 EXPECT_TRUE(itr->Valid()); | 153 EXPECT_TRUE(itr->Valid()); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 const GURL kOrigin3("chrome-extension://example3"); | 202 const GURL kOrigin3("chrome-extension://example3"); |
| 194 | 203 |
| 195 const std::string kSyncRootResourceId("folder:sync_root_resource_id"); | 204 const std::string kSyncRootResourceId("folder:sync_root_resource_id"); |
| 196 const std::string kResourceId1("folder:hoge"); | 205 const std::string kResourceId1("folder:hoge"); |
| 197 const std::string kResourceId2("folder:fuga"); | 206 const std::string kResourceId2("folder:fuga"); |
| 198 const std::string kResourceId3("folder:hogera"); | 207 const std::string kResourceId3("folder:hogera"); |
| 199 const std::string kFileResourceId("file:piyo"); | 208 const std::string kFileResourceId("file:piyo"); |
| 200 const base::FilePath kFile(FPL("foo bar")); | 209 const base::FilePath kFile(FPL("foo bar")); |
| 201 const std::string kFileMD5("file_md5"); | 210 const std::string kFileMD5("file_md5"); |
| 202 | 211 |
| 203 const char kV1ServiceName[] = "syncfs"; | 212 RegisterSyncableFileSystem(); |
| 204 ASSERT_TRUE(RegisterSyncableFileSystem(kV1ServiceName)); | |
| 205 | 213 |
| 206 base::ScopedTempDir base_dir; | 214 base::ScopedTempDir base_dir; |
| 207 ASSERT_TRUE(base_dir.CreateUniqueTempDir()); | 215 ASSERT_TRUE(base_dir.CreateUniqueTempDir()); |
| 208 | 216 |
| 209 leveldb::Options options; | 217 leveldb::Options options; |
| 210 options.create_if_missing = true; | 218 options.create_if_missing = true; |
| 211 leveldb::DB* db_ptr = NULL; | 219 leveldb::DB* db_ptr = NULL; |
| 212 std::string db_dir = fileapi::FilePathToString( | 220 std::string db_dir = fileapi::FilePathToString( |
| 213 base_dir.path().Append(DriveMetadataStore::kDatabaseName)); | 221 base_dir.path().Append(DriveMetadataStore::kDatabaseName)); |
| 214 leveldb::Status status = leveldb::DB::Open(options, db_dir, &db_ptr); | 222 leveldb::Status status = leveldb::DB::Open(options, db_dir, &db_ptr); |
| 215 | 223 |
| 216 scoped_ptr<leveldb::DB> db(db_ptr); | 224 scoped_ptr<leveldb::DB> db(db_ptr); |
| 217 ASSERT_TRUE(status.ok()); | 225 ASSERT_TRUE(status.ok()); |
| 218 | 226 |
| 219 // Setup the database with the schema version 1. | 227 // Setup the database with the schema version 1. |
| 220 leveldb::WriteBatch batch; | 228 leveldb::WriteBatch batch; |
| 221 batch.Put(kDatabaseVersionKey, "1"); | 229 batch.Put(kDatabaseVersionKey, "1"); |
| 222 batch.Put(kChangeStampKey, "1"); | 230 batch.Put(kChangeStampKey, "1"); |
| 223 batch.Put(kSyncRootDirectoryKey, kSyncRootResourceId); | 231 batch.Put(kSyncRootDirectoryKey, kSyncRootResourceId); |
| 224 | 232 |
| 225 fileapi::FileSystemURL url = | 233 fileapi::FileSystemURL url = CreateSyncableFileSystemURL(kOrigin1, kFile); |
| 226 CreateSyncableFileSystemURL(kOrigin1, kV1ServiceName, kFile); | |
| 227 | 234 |
| 228 // Setup drive metadata. | 235 // Setup drive metadata. |
| 229 DriveMetadata drive_metadata; | 236 DriveMetadata drive_metadata; |
| 230 drive_metadata.set_resource_id(kFileResourceId); | 237 drive_metadata.set_resource_id(kFileResourceId); |
| 231 drive_metadata.set_md5_checksum(kFileMD5); | 238 drive_metadata.set_md5_checksum(kFileMD5); |
| 232 drive_metadata.set_conflicted(false); | 239 drive_metadata.set_conflicted(false); |
| 233 drive_metadata.set_to_be_fetched(false); | 240 drive_metadata.set_to_be_fetched(false); |
| 234 std::string metadata_string; | 241 std::string metadata_string; |
| 235 drive_metadata.SerializeToString(&metadata_string); | 242 drive_metadata.SerializeToString(&metadata_string); |
| 236 std::string metadata_key = kDriveMetadataKeyPrefix + kOrigin1.spec() + | 243 std::string metadata_key = kDriveMetadataKeyPrefix + kOrigin1.spec() + |
| 237 kMetadataKeySeparator + url.path().AsUTF8Unsafe(); | 244 kMetadataKeySeparator + url.path().AsUTF8Unsafe(); |
| 238 batch.Put(metadata_key, metadata_string); | 245 batch.Put(metadata_key, metadata_string); |
| 239 | 246 |
| 240 // Setup origins. | 247 // Setup origins. |
| 241 batch.Put(kDriveBatchSyncOriginKeyPrefix + kOrigin1.spec(), kResourceId1); | 248 batch.Put(kDriveBatchSyncOriginKeyPrefix + kOrigin1.spec(), kResourceId1); |
| 242 batch.Put(kDriveIncrementalSyncOriginKeyPrefix + kOrigin2.spec(), | 249 batch.Put(kDriveIncrementalSyncOriginKeyPrefix + kOrigin2.spec(), |
| 243 kResourceId2); | 250 kResourceId2); |
| 244 batch.Put(kDriveDisabledOriginKeyPrefix + kOrigin3.spec(), kResourceId3); | 251 batch.Put(kDriveDisabledOriginKeyPrefix + kOrigin3.spec(), kResourceId3); |
| 245 | 252 |
| 246 status = db->Write(leveldb::WriteOptions(), &batch); | 253 status = db->Write(leveldb::WriteOptions(), &batch); |
| 247 EXPECT_EQ(SYNC_STATUS_OK, LevelDBStatusToSyncStatusCode(status)); | 254 EXPECT_EQ(SYNC_STATUS_OK, LevelDBStatusToSyncStatusCode(status)); |
| 248 EXPECT_TRUE(RevokeSyncableFileSystem(kV1ServiceName)); | 255 |
| 256 RevokeSyncableFileSystem(); |
| 249 | 257 |
| 250 // Migrate the database. | 258 // Migrate the database. |
| 251 drive::MigrateDatabaseFromV1ToV2(db.get()); | 259 drive::MigrateDatabaseFromV1ToV2(db.get()); |
| 252 | 260 |
| 253 scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions())); | 261 scoped_ptr<leveldb::Iterator> itr(db->NewIterator(leveldb::ReadOptions())); |
| 254 | 262 |
| 255 // Verify DB schema version. | 263 // Verify DB schema version. |
| 256 int64 database_version = 0; | 264 int64 database_version = 0; |
| 257 itr->Seek(kDatabaseVersionKey); | 265 itr->Seek(kDatabaseVersionKey); |
| 258 EXPECT_TRUE(itr->Valid()); | 266 EXPECT_TRUE(itr->Valid()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 EXPECT_EQ(RemoveWapiIdPrefix(kResourceId2), itr->value().ToString()); | 300 EXPECT_EQ(RemoveWapiIdPrefix(kResourceId2), itr->value().ToString()); |
| 293 | 301 |
| 294 // Verify the disabled origin. | 302 // Verify the disabled origin. |
| 295 itr->Seek(kDriveDisabledOriginKeyPrefix); | 303 itr->Seek(kDriveDisabledOriginKeyPrefix); |
| 296 EXPECT_TRUE(itr->Valid()); | 304 EXPECT_TRUE(itr->Valid()); |
| 297 EXPECT_EQ(RemoveWapiIdPrefix(kResourceId3), itr->value().ToString()); | 305 EXPECT_EQ(RemoveWapiIdPrefix(kResourceId3), itr->value().ToString()); |
| 298 } | 306 } |
| 299 | 307 |
| 300 } // namespace drive | 308 } // namespace drive |
| 301 } // namespace sync_file_system | 309 } // namespace sync_file_system |
| OLD | NEW |