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 |