Index: components/sync/model_impl/model_type_store_backend_unittest.cc |
diff --git a/components/sync/model_impl/model_type_store_backend_unittest.cc b/components/sync/model_impl/model_type_store_backend_unittest.cc |
index bbc8e121d18a7280064683d61ed8b506516ec2fd..29628e0087fe010df1fda2d40a98c463e52cdf6f 100644 |
--- a/components/sync/model_impl/model_type_store_backend_unittest.cc |
+++ b/components/sync/model_impl/model_type_store_backend_unittest.cc |
@@ -6,10 +6,13 @@ |
#include <utility> |
+#include "components/sync/protocol/model_type_store_schema_descriptor.pb.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/leveldatabase/src/include/leveldb/env.h" |
#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
+using sync_pb::ModelTypeStoreSchemaDescriptor; |
+ |
namespace syncer { |
class ModelTypeStoreBackendTest : public testing::Test { |
@@ -48,6 +51,21 @@ class ModelTypeStoreBackendTest : public testing::Test { |
std::string GetBackendPath(scoped_refptr<ModelTypeStoreBackend> backend) { |
return backend->path_; |
} |
+ |
+ bool Migrate(scoped_refptr<ModelTypeStoreBackend> backend, |
+ const ModelTypeStoreSchemaDescriptor& current_metadata, |
+ const ModelTypeStoreSchemaDescriptor& desired_metadata) { |
+ return backend->Migrate(current_metadata, desired_metadata); |
+ } |
+ |
+ bool Migrate0To1(scoped_refptr<ModelTypeStoreBackend> backend) { |
+ return backend->Migrate0To1(); |
+ } |
+ |
+ bool GetStoreDescriptor(scoped_refptr<ModelTypeStoreBackend> backend, |
+ ModelTypeStoreSchemaDescriptor* schema_descriptor) { |
+ return backend->GetStoreDescriptor(schema_descriptor); |
+ } |
}; |
// Test that after record is written to backend it can be read back even after |
@@ -189,4 +207,47 @@ TEST_F(ModelTypeStoreBackendTest, TwoDifferentBackendTest) { |
ASSERT_FALSE(BackendExistsForPath("/test_db2")); |
} |
+// Test that initializing the database migrates it to the latest schema version. |
+TEST_F(ModelTypeStoreBackendTest, MigrateNoSchemaVersionToLatestVersionTest) { |
+ scoped_refptr<ModelTypeStoreBackend> backend = GetOrCreateBackend(); |
+ |
+ ModelTypeStoreSchemaDescriptor schema_descriptor; |
+ ASSERT_TRUE(GetStoreDescriptor(backend, &schema_descriptor)); |
+ ASSERT_EQ(schema_descriptor.version_number(), kLatestSchemaVersion); |
+} |
+ |
+// Test that the 0 to 1 migration succeeds and sets the schema version to 1. |
+TEST_F(ModelTypeStoreBackendTest, Migrate0To1Test) { |
+ scoped_refptr<ModelTypeStoreBackend> backend = GetOrCreateBackend(); |
+ |
+ std::unique_ptr<leveldb::WriteBatch> write_batch(new leveldb::WriteBatch()); |
+ write_batch->Delete(kDBSchemaDescriptorRecordId); |
+ ModelTypeStore::Result result = |
+ backend->WriteModifications(std::move(write_batch)); |
+ ASSERT_EQ(ModelTypeStore::Result::SUCCESS, result); |
+ |
+ ASSERT_TRUE(Migrate0To1(backend)); |
+ |
+ ModelTypeStoreSchemaDescriptor schema_descriptor; |
+ ASSERT_TRUE(GetStoreDescriptor(backend, &schema_descriptor)); |
+ ASSERT_EQ(schema_descriptor.version_number(), 1); |
+} |
+ |
+// Test that migration to an unknown version fails |
+TEST_F(ModelTypeStoreBackendTest, MigrateToBogusVersionFails) { |
+ scoped_refptr<ModelTypeStoreBackend> backend = GetOrCreateBackend(); |
+ |
+ std::unique_ptr<leveldb::WriteBatch> write_batch(new leveldb::WriteBatch()); |
+ write_batch->Delete(kDBSchemaDescriptorRecordId); |
+ ModelTypeStore::Result result = |
+ backend->WriteModifications(std::move(write_batch)); |
+ ASSERT_EQ(ModelTypeStore::Result::SUCCESS, result); |
+ |
+ ModelTypeStoreSchemaDescriptor current_metadata; |
+ current_metadata.set_version_number(0); |
+ ModelTypeStoreSchemaDescriptor bogus_desired_metadata; |
+ bogus_desired_metadata.set_version_number(999); |
+ ASSERT_FALSE(Migrate(backend, current_metadata, bogus_desired_metadata)); |
+} |
+ |
} // namespace syncer |