OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "sync/syncable/directory_backing_store.h" | 5 #include "sync/syncable/directory_backing_store.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
| 11 #include <memory> |
11 #include <string> | 12 #include <string> |
12 | 13 |
13 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
14 #include "base/files/scoped_temp_dir.h" | 15 #include "base/files/scoped_temp_dir.h" |
15 #include "base/memory/scoped_ptr.h" | |
16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
17 #include "base/run_loop.h" | 17 #include "base/run_loop.h" |
18 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
19 #include "base/strings/string_number_conversions.h" | 19 #include "base/strings/string_number_conversions.h" |
20 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
21 #include "build/build_config.h" | 21 #include "build/build_config.h" |
22 #include "sql/connection.h" | 22 #include "sql/connection.h" |
23 #include "sql/statement.h" | 23 #include "sql/statement.h" |
24 #include "sql/test/scoped_error_ignorer.h" | 24 #include "sql/test/scoped_error_ignorer.h" |
25 #include "sql/test/test_helpers.h" | 25 #include "sql/test/test_helpers.h" |
(...skipping 13 matching lines...) Expand all Loading... |
39 namespace syncer { | 39 namespace syncer { |
40 namespace syncable { | 40 namespace syncable { |
41 namespace { | 41 namespace { |
42 | 42 |
43 // A handler that simply sets |catastrophic_error_handler_was_called| to true. | 43 // A handler that simply sets |catastrophic_error_handler_was_called| to true. |
44 void CatastrophicErrorHandler(bool* catastrophic_error_handler_was_called) { | 44 void CatastrophicErrorHandler(bool* catastrophic_error_handler_was_called) { |
45 *catastrophic_error_handler_was_called = true; | 45 *catastrophic_error_handler_was_called = true; |
46 } | 46 } |
47 | 47 |
48 // Create a dirty EntryKernel with an ID derived from |id| + |id_suffix|. | 48 // Create a dirty EntryKernel with an ID derived from |id| + |id_suffix|. |
49 scoped_ptr<EntryKernel> CreateEntry(int id, const std::string &id_suffix) { | 49 std::unique_ptr<EntryKernel> CreateEntry(int id, const std::string& id_suffix) { |
50 scoped_ptr<EntryKernel> entry(new EntryKernel()); | 50 std::unique_ptr<EntryKernel> entry(new EntryKernel()); |
51 std::string id_string = base::Int64ToString(id) + id_suffix; | 51 std::string id_string = base::Int64ToString(id) + id_suffix; |
52 entry->put(ID, Id::CreateFromClientString(id_string)); | 52 entry->put(ID, Id::CreateFromClientString(id_string)); |
53 entry->put(META_HANDLE, id); | 53 entry->put(META_HANDLE, id); |
54 entry->mark_dirty(NULL); | 54 entry->mark_dirty(NULL); |
55 return entry; | 55 return entry; |
56 } | 56 } |
57 | 57 |
58 } // namespace | 58 } // namespace |
59 | 59 |
60 SYNC_EXPORT extern const int32_t kCurrentPageSizeKB; | 60 SYNC_EXPORT extern const int32_t kCurrentPageSizeKB; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 void SetUpVersion84Database(sql::Connection* connection); | 103 void SetUpVersion84Database(sql::Connection* connection); |
104 void SetUpVersion85Database(sql::Connection* connection); | 104 void SetUpVersion85Database(sql::Connection* connection); |
105 void SetUpVersion86Database(sql::Connection* connection); | 105 void SetUpVersion86Database(sql::Connection* connection); |
106 void SetUpVersion87Database(sql::Connection* connection); | 106 void SetUpVersion87Database(sql::Connection* connection); |
107 void SetUpVersion88Database(sql::Connection* connection); | 107 void SetUpVersion88Database(sql::Connection* connection); |
108 void SetUpVersion89Database(sql::Connection* connection); | 108 void SetUpVersion89Database(sql::Connection* connection); |
109 void SetUpVersion90Database(sql::Connection* connection); | 109 void SetUpVersion90Database(sql::Connection* connection); |
110 | 110 |
111 void SetUpCurrentDatabaseAndCheckVersion(sql::Connection* connection) { | 111 void SetUpCurrentDatabaseAndCheckVersion(sql::Connection* connection) { |
112 SetUpVersion90Database(connection); // Prepopulates data. | 112 SetUpVersion90Database(connection); // Prepopulates data. |
113 scoped_ptr<TestDirectoryBackingStore> dbs( | 113 std::unique_ptr<TestDirectoryBackingStore> dbs( |
114 new TestDirectoryBackingStore(GetUsername(), connection)); | 114 new TestDirectoryBackingStore(GetUsername(), connection)); |
115 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); | 115 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); |
116 | 116 |
117 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 117 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
118 ASSERT_FALSE(dbs->needs_column_refresh()); | 118 ASSERT_FALSE(dbs->needs_column_refresh()); |
119 } | 119 } |
120 | 120 |
121 private: | 121 private: |
122 base::MessageLoop message_loop_; | 122 base::MessageLoop message_loop_; |
123 base::ScopedTempDir temp_dir_; | 123 base::ScopedTempDir temp_dir_; |
(...skipping 2882 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3006 sql::Connection connection; | 3006 sql::Connection connection; |
3007 ASSERT_TRUE(connection.OpenInMemory()); | 3007 ASSERT_TRUE(connection.OpenInMemory()); |
3008 | 3008 |
3009 SetUpVersion67Database(&connection); | 3009 SetUpVersion67Database(&connection); |
3010 | 3010 |
3011 // Columns existing before version 67. | 3011 // Columns existing before version 67. |
3012 ASSERT_TRUE(connection.DoesColumnExist("metas", "name")); | 3012 ASSERT_TRUE(connection.DoesColumnExist("metas", "name")); |
3013 ASSERT_TRUE(connection.DoesColumnExist("metas", "unsanitized_name")); | 3013 ASSERT_TRUE(connection.DoesColumnExist("metas", "unsanitized_name")); |
3014 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_name")); | 3014 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_name")); |
3015 | 3015 |
3016 scoped_ptr<TestDirectoryBackingStore> dbs( | 3016 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3017 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3017 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3018 | 3018 |
3019 ASSERT_FALSE(dbs->needs_column_refresh()); | 3019 ASSERT_FALSE(dbs->needs_column_refresh()); |
3020 ASSERT_TRUE(dbs->MigrateVersion67To68()); | 3020 ASSERT_TRUE(dbs->MigrateVersion67To68()); |
3021 ASSERT_EQ(68, dbs->GetVersion()); | 3021 ASSERT_EQ(68, dbs->GetVersion()); |
3022 ASSERT_TRUE(dbs->needs_column_refresh()); | 3022 ASSERT_TRUE(dbs->needs_column_refresh()); |
3023 } | 3023 } |
3024 | 3024 |
3025 TEST_F(DirectoryBackingStoreTest, MigrateVersion68To69) { | 3025 TEST_F(DirectoryBackingStoreTest, MigrateVersion68To69) { |
3026 sql::Connection connection; | 3026 sql::Connection connection; |
3027 ASSERT_TRUE(connection.OpenInMemory()); | 3027 ASSERT_TRUE(connection.OpenInMemory()); |
3028 SetUpVersion68Database(&connection); | 3028 SetUpVersion68Database(&connection); |
3029 | 3029 |
3030 { | 3030 { |
3031 scoped_ptr<TestDirectoryBackingStore> dbs( | 3031 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3032 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3032 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3033 | 3033 |
3034 ASSERT_FALSE(dbs->needs_column_refresh()); | 3034 ASSERT_FALSE(dbs->needs_column_refresh()); |
3035 ASSERT_TRUE(dbs->MigrateVersion68To69()); | 3035 ASSERT_TRUE(dbs->MigrateVersion68To69()); |
3036 ASSERT_EQ(69, dbs->GetVersion()); | 3036 ASSERT_EQ(69, dbs->GetVersion()); |
3037 ASSERT_TRUE(dbs->needs_column_refresh()); | 3037 ASSERT_TRUE(dbs->needs_column_refresh()); |
3038 } | 3038 } |
3039 | 3039 |
3040 ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics")); | 3040 ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics")); |
3041 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics")); | 3041 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics")); |
(...skipping 20 matching lines...) Expand all Loading... |
3062 TEST_F(DirectoryBackingStoreTest, MigrateVersion69To70) { | 3062 TEST_F(DirectoryBackingStoreTest, MigrateVersion69To70) { |
3063 sql::Connection connection; | 3063 sql::Connection connection; |
3064 ASSERT_TRUE(connection.OpenInMemory()); | 3064 ASSERT_TRUE(connection.OpenInMemory()); |
3065 SetUpVersion69Database(&connection); | 3065 SetUpVersion69Database(&connection); |
3066 | 3066 |
3067 ASSERT_TRUE(connection.DoesColumnExist("metas", "singleton_tag")); | 3067 ASSERT_TRUE(connection.DoesColumnExist("metas", "singleton_tag")); |
3068 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_server_tag")); | 3068 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_server_tag")); |
3069 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_client_tag")); | 3069 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_client_tag")); |
3070 | 3070 |
3071 { | 3071 { |
3072 scoped_ptr<TestDirectoryBackingStore> dbs( | 3072 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3073 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3073 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3074 | 3074 |
3075 ASSERT_FALSE(dbs->needs_column_refresh()); | 3075 ASSERT_FALSE(dbs->needs_column_refresh()); |
3076 ASSERT_TRUE(dbs->MigrateVersion69To70()); | 3076 ASSERT_TRUE(dbs->MigrateVersion69To70()); |
3077 ASSERT_EQ(70, dbs->GetVersion()); | 3077 ASSERT_EQ(70, dbs->GetVersion()); |
3078 ASSERT_TRUE(dbs->needs_column_refresh()); | 3078 ASSERT_TRUE(dbs->needs_column_refresh()); |
3079 } | 3079 } |
3080 | 3080 |
3081 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); | 3081 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); |
3082 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); | 3082 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); |
3083 sql::Statement s(connection.GetUniqueStatement("SELECT id" | 3083 sql::Statement s(connection.GetUniqueStatement("SELECT id" |
3084 " FROM metas WHERE unique_server_tag = 'google_chrome'")); | 3084 " FROM metas WHERE unique_server_tag = 'google_chrome'")); |
3085 ASSERT_TRUE(s.Step()); | 3085 ASSERT_TRUE(s.Step()); |
3086 EXPECT_EQ("s_ID_7", s.ColumnString(0)); | 3086 EXPECT_EQ("s_ID_7", s.ColumnString(0)); |
3087 } | 3087 } |
3088 | 3088 |
3089 TEST_F(DirectoryBackingStoreTest, MigrateVersion70To71) { | 3089 TEST_F(DirectoryBackingStoreTest, MigrateVersion70To71) { |
3090 sql::Connection connection; | 3090 sql::Connection connection; |
3091 ASSERT_TRUE(connection.OpenInMemory()); | 3091 ASSERT_TRUE(connection.OpenInMemory()); |
3092 SetUpVersion70Database(&connection); | 3092 SetUpVersion70Database(&connection); |
3093 | 3093 |
3094 ASSERT_TRUE(connection.DoesColumnExist("share_info", "last_sync_timestamp")); | 3094 ASSERT_TRUE(connection.DoesColumnExist("share_info", "last_sync_timestamp")); |
3095 ASSERT_TRUE(connection.DoesColumnExist("share_info", "initial_sync_ended")); | 3095 ASSERT_TRUE(connection.DoesColumnExist("share_info", "initial_sync_ended")); |
3096 ASSERT_FALSE(connection.DoesTableExist("models")); | 3096 ASSERT_FALSE(connection.DoesTableExist("models")); |
3097 | 3097 |
3098 { | 3098 { |
3099 scoped_ptr<TestDirectoryBackingStore> dbs( | 3099 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3100 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3100 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3101 | 3101 |
3102 ASSERT_FALSE(dbs->needs_column_refresh()); | 3102 ASSERT_FALSE(dbs->needs_column_refresh()); |
3103 ASSERT_TRUE(dbs->MigrateVersion70To71()); | 3103 ASSERT_TRUE(dbs->MigrateVersion70To71()); |
3104 ASSERT_EQ(71, dbs->GetVersion()); | 3104 ASSERT_EQ(71, dbs->GetVersion()); |
3105 ASSERT_FALSE(dbs->needs_column_refresh()); | 3105 ASSERT_FALSE(dbs->needs_column_refresh()); |
3106 } | 3106 } |
3107 | 3107 |
3108 ASSERT_FALSE(connection.DoesColumnExist("share_info", "last_sync_timestamp")); | 3108 ASSERT_FALSE(connection.DoesColumnExist("share_info", "last_sync_timestamp")); |
3109 ASSERT_FALSE(connection.DoesColumnExist("share_info", "initial_sync_ended")); | 3109 ASSERT_FALSE(connection.DoesColumnExist("share_info", "initial_sync_ended")); |
(...skipping 15 matching lines...) Expand all Loading... |
3125 | 3125 |
3126 | 3126 |
3127 TEST_F(DirectoryBackingStoreTest, MigrateVersion71To72) { | 3127 TEST_F(DirectoryBackingStoreTest, MigrateVersion71To72) { |
3128 sql::Connection connection; | 3128 sql::Connection connection; |
3129 ASSERT_TRUE(connection.OpenInMemory()); | 3129 ASSERT_TRUE(connection.OpenInMemory()); |
3130 SetUpVersion71Database(&connection); | 3130 SetUpVersion71Database(&connection); |
3131 | 3131 |
3132 ASSERT_TRUE(connection.DoesTableExist("extended_attributes")); | 3132 ASSERT_TRUE(connection.DoesTableExist("extended_attributes")); |
3133 | 3133 |
3134 { | 3134 { |
3135 scoped_ptr<TestDirectoryBackingStore> dbs( | 3135 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3136 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3136 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3137 | 3137 |
3138 ASSERT_FALSE(dbs->needs_column_refresh()); | 3138 ASSERT_FALSE(dbs->needs_column_refresh()); |
3139 ASSERT_TRUE(dbs->MigrateVersion71To72()); | 3139 ASSERT_TRUE(dbs->MigrateVersion71To72()); |
3140 ASSERT_EQ(72, dbs->GetVersion()); | 3140 ASSERT_EQ(72, dbs->GetVersion()); |
3141 ASSERT_FALSE(dbs->needs_column_refresh()); | 3141 ASSERT_FALSE(dbs->needs_column_refresh()); |
3142 } | 3142 } |
3143 | 3143 |
3144 ASSERT_FALSE(connection.DoesTableExist("extended_attributes")); | 3144 ASSERT_FALSE(connection.DoesTableExist("extended_attributes")); |
3145 } | 3145 } |
3146 | 3146 |
3147 TEST_F(DirectoryBackingStoreTest, MigrateVersion72To73) { | 3147 TEST_F(DirectoryBackingStoreTest, MigrateVersion72To73) { |
3148 sql::Connection connection; | 3148 sql::Connection connection; |
3149 ASSERT_TRUE(connection.OpenInMemory()); | 3149 ASSERT_TRUE(connection.OpenInMemory()); |
3150 SetUpVersion72Database(&connection); | 3150 SetUpVersion72Database(&connection); |
3151 | 3151 |
3152 ASSERT_FALSE(connection.DoesColumnExist("share_info", "notification_state")); | 3152 ASSERT_FALSE(connection.DoesColumnExist("share_info", "notification_state")); |
3153 | 3153 |
3154 { | 3154 { |
3155 scoped_ptr<TestDirectoryBackingStore> dbs( | 3155 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3156 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3156 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3157 | 3157 |
3158 ASSERT_FALSE(dbs->needs_column_refresh()); | 3158 ASSERT_FALSE(dbs->needs_column_refresh()); |
3159 ASSERT_TRUE(dbs->MigrateVersion72To73()); | 3159 ASSERT_TRUE(dbs->MigrateVersion72To73()); |
3160 ASSERT_EQ(73, dbs->GetVersion()); | 3160 ASSERT_EQ(73, dbs->GetVersion()); |
3161 ASSERT_FALSE(dbs->needs_column_refresh()); | 3161 ASSERT_FALSE(dbs->needs_column_refresh()); |
3162 } | 3162 } |
3163 | 3163 |
3164 ASSERT_TRUE(connection.DoesColumnExist("share_info", "notification_state")); | 3164 ASSERT_TRUE(connection.DoesColumnExist("share_info", "notification_state")); |
3165 } | 3165 } |
(...skipping 12 matching lines...) Expand all Loading... |
3178 connection.DoesColumnExist("share_info", "autofill_migration_time")); | 3178 connection.DoesColumnExist("share_info", "autofill_migration_time")); |
3179 ASSERT_FALSE( | 3179 ASSERT_FALSE( |
3180 connection.DoesColumnExist("share_info", | 3180 connection.DoesColumnExist("share_info", |
3181 "autofill_entries_added_during_migration")); | 3181 "autofill_entries_added_during_migration")); |
3182 | 3182 |
3183 ASSERT_FALSE( | 3183 ASSERT_FALSE( |
3184 connection.DoesColumnExist("share_info", | 3184 connection.DoesColumnExist("share_info", |
3185 "autofill_profiles_added_during_migration")); | 3185 "autofill_profiles_added_during_migration")); |
3186 | 3186 |
3187 { | 3187 { |
3188 scoped_ptr<TestDirectoryBackingStore> dbs( | 3188 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3189 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3189 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3190 | 3190 |
3191 ASSERT_FALSE(dbs->needs_column_refresh()); | 3191 ASSERT_FALSE(dbs->needs_column_refresh()); |
3192 ASSERT_TRUE(dbs->MigrateVersion73To74()); | 3192 ASSERT_TRUE(dbs->MigrateVersion73To74()); |
3193 ASSERT_EQ(74, dbs->GetVersion()); | 3193 ASSERT_EQ(74, dbs->GetVersion()); |
3194 ASSERT_FALSE(dbs->needs_column_refresh()); | 3194 ASSERT_FALSE(dbs->needs_column_refresh()); |
3195 } | 3195 } |
3196 | 3196 |
3197 ASSERT_TRUE( | 3197 ASSERT_TRUE( |
3198 connection.DoesColumnExist("share_info", "autofill_migration_state")); | 3198 connection.DoesColumnExist("share_info", "autofill_migration_state")); |
(...skipping 13 matching lines...) Expand all Loading... |
3212 | 3212 |
3213 TEST_F(DirectoryBackingStoreTest, MigrateVersion74To75) { | 3213 TEST_F(DirectoryBackingStoreTest, MigrateVersion74To75) { |
3214 sql::Connection connection; | 3214 sql::Connection connection; |
3215 ASSERT_TRUE(connection.OpenInMemory()); | 3215 ASSERT_TRUE(connection.OpenInMemory()); |
3216 SetUpVersion74Database(&connection); | 3216 SetUpVersion74Database(&connection); |
3217 | 3217 |
3218 ASSERT_FALSE(connection.DoesColumnExist("models", "progress_marker")); | 3218 ASSERT_FALSE(connection.DoesColumnExist("models", "progress_marker")); |
3219 ASSERT_TRUE(connection.DoesColumnExist("models", "last_download_timestamp")); | 3219 ASSERT_TRUE(connection.DoesColumnExist("models", "last_download_timestamp")); |
3220 | 3220 |
3221 { | 3221 { |
3222 scoped_ptr<TestDirectoryBackingStore> dbs( | 3222 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3223 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3223 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3224 | 3224 |
3225 ASSERT_FALSE(dbs->needs_column_refresh()); | 3225 ASSERT_FALSE(dbs->needs_column_refresh()); |
3226 ASSERT_TRUE(dbs->MigrateVersion74To75()); | 3226 ASSERT_TRUE(dbs->MigrateVersion74To75()); |
3227 ASSERT_EQ(75, dbs->GetVersion()); | 3227 ASSERT_EQ(75, dbs->GetVersion()); |
3228 ASSERT_FALSE(dbs->needs_column_refresh()); | 3228 ASSERT_FALSE(dbs->needs_column_refresh()); |
3229 } | 3229 } |
3230 | 3230 |
3231 ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker")); | 3231 ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker")); |
3232 ASSERT_FALSE(connection.DoesColumnExist("models", "last_download_timestamp")); | 3232 ASSERT_FALSE(connection.DoesColumnExist("models", "last_download_timestamp")); |
3233 } | 3233 } |
3234 | 3234 |
3235 TEST_F(DirectoryBackingStoreTest, MigrateVersion75To76) { | 3235 TEST_F(DirectoryBackingStoreTest, MigrateVersion75To76) { |
3236 sql::Connection connection; | 3236 sql::Connection connection; |
3237 ASSERT_TRUE(connection.OpenInMemory()); | 3237 ASSERT_TRUE(connection.OpenInMemory()); |
3238 SetUpVersion75Database(&connection); | 3238 SetUpVersion75Database(&connection); |
3239 | 3239 |
3240 ASSERT_TRUE( | 3240 ASSERT_TRUE( |
3241 connection.DoesColumnExist("share_info", "autofill_migration_state")); | 3241 connection.DoesColumnExist("share_info", "autofill_migration_state")); |
3242 ASSERT_TRUE(connection.DoesColumnExist("share_info", | 3242 ASSERT_TRUE(connection.DoesColumnExist("share_info", |
3243 "bookmarks_added_during_autofill_migration")); | 3243 "bookmarks_added_during_autofill_migration")); |
3244 ASSERT_TRUE( | 3244 ASSERT_TRUE( |
3245 connection.DoesColumnExist("share_info", "autofill_migration_time")); | 3245 connection.DoesColumnExist("share_info", "autofill_migration_time")); |
3246 ASSERT_TRUE(connection.DoesColumnExist("share_info", | 3246 ASSERT_TRUE(connection.DoesColumnExist("share_info", |
3247 "autofill_entries_added_during_migration")); | 3247 "autofill_entries_added_during_migration")); |
3248 ASSERT_TRUE(connection.DoesColumnExist("share_info", | 3248 ASSERT_TRUE(connection.DoesColumnExist("share_info", |
3249 "autofill_profiles_added_during_migration")); | 3249 "autofill_profiles_added_during_migration")); |
3250 | 3250 |
3251 scoped_ptr<TestDirectoryBackingStore> dbs( | 3251 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3252 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3252 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3253 ASSERT_FALSE(dbs->needs_column_refresh()); | 3253 ASSERT_FALSE(dbs->needs_column_refresh()); |
3254 ASSERT_TRUE(dbs->MigrateVersion75To76()); | 3254 ASSERT_TRUE(dbs->MigrateVersion75To76()); |
3255 ASSERT_EQ(76, dbs->GetVersion()); | 3255 ASSERT_EQ(76, dbs->GetVersion()); |
3256 ASSERT_TRUE(dbs->needs_column_refresh()); | 3256 ASSERT_TRUE(dbs->needs_column_refresh()); |
3257 // Cannot actual refresh columns due to version 76 not containing all | 3257 // Cannot actual refresh columns due to version 76 not containing all |
3258 // necessary columns. | 3258 // necessary columns. |
3259 } | 3259 } |
3260 | 3260 |
3261 TEST_F(DirectoryBackingStoreTest, MigrateVersion76To77) { | 3261 TEST_F(DirectoryBackingStoreTest, MigrateVersion76To77) { |
3262 sql::Connection connection; | 3262 sql::Connection connection; |
3263 ASSERT_TRUE(connection.OpenInMemory()); | 3263 ASSERT_TRUE(connection.OpenInMemory()); |
3264 SetUpVersion76Database(&connection); | 3264 SetUpVersion76Database(&connection); |
3265 | 3265 |
3266 scoped_ptr<TestDirectoryBackingStore> dbs( | 3266 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3267 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3267 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3268 ASSERT_FALSE(dbs->needs_column_refresh()); | 3268 ASSERT_FALSE(dbs->needs_column_refresh()); |
3269 | 3269 |
3270 EXPECT_EQ(GetExpectedLegacyMetaProtoTimes(INCLUDE_DELETED_ITEMS), | 3270 EXPECT_EQ(GetExpectedLegacyMetaProtoTimes(INCLUDE_DELETED_ITEMS), |
3271 GetMetaProtoTimes(&connection)); | 3271 GetMetaProtoTimes(&connection)); |
3272 // Since the proto times are expected to be in a legacy format, they may not | 3272 // Since the proto times are expected to be in a legacy format, they may not |
3273 // be compatible with ProtoTimeToTime, so we don't call ExpectTimes(). | 3273 // be compatible with ProtoTimeToTime, so we don't call ExpectTimes(). |
3274 | 3274 |
3275 ASSERT_TRUE(dbs->MigrateVersion76To77()); | 3275 ASSERT_TRUE(dbs->MigrateVersion76To77()); |
3276 ASSERT_EQ(77, dbs->GetVersion()); | 3276 ASSERT_EQ(77, dbs->GetVersion()); |
3277 | 3277 |
3278 EXPECT_EQ(GetExpectedMetaProtoTimes(INCLUDE_DELETED_ITEMS), | 3278 EXPECT_EQ(GetExpectedMetaProtoTimes(INCLUDE_DELETED_ITEMS), |
3279 GetMetaProtoTimes(&connection)); | 3279 GetMetaProtoTimes(&connection)); |
3280 // Cannot actually load entries due to version 77 not having all required | 3280 // Cannot actually load entries due to version 77 not having all required |
3281 // columns. | 3281 // columns. |
3282 ASSERT_FALSE(dbs->needs_column_refresh()); | 3282 ASSERT_FALSE(dbs->needs_column_refresh()); |
3283 } | 3283 } |
3284 | 3284 |
3285 TEST_F(DirectoryBackingStoreTest, MigrateVersion77To78) { | 3285 TEST_F(DirectoryBackingStoreTest, MigrateVersion77To78) { |
3286 sql::Connection connection; | 3286 sql::Connection connection; |
3287 ASSERT_TRUE(connection.OpenInMemory()); | 3287 ASSERT_TRUE(connection.OpenInMemory()); |
3288 SetUpVersion77Database(&connection); | 3288 SetUpVersion77Database(&connection); |
3289 | 3289 |
3290 ASSERT_FALSE(connection.DoesColumnExist("metas", "BASE_SERVER_SPECIFICS")); | 3290 ASSERT_FALSE(connection.DoesColumnExist("metas", "BASE_SERVER_SPECIFICS")); |
3291 | 3291 |
3292 { | 3292 { |
3293 scoped_ptr<TestDirectoryBackingStore> dbs( | 3293 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3294 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3294 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3295 ASSERT_FALSE(dbs->needs_column_refresh()); | 3295 ASSERT_FALSE(dbs->needs_column_refresh()); |
3296 ASSERT_TRUE(dbs->MigrateVersion77To78()); | 3296 ASSERT_TRUE(dbs->MigrateVersion77To78()); |
3297 ASSERT_EQ(78, dbs->GetVersion()); | 3297 ASSERT_EQ(78, dbs->GetVersion()); |
3298 | 3298 |
3299 ASSERT_FALSE(dbs->needs_column_refresh()); | 3299 ASSERT_FALSE(dbs->needs_column_refresh()); |
3300 } | 3300 } |
3301 | 3301 |
3302 ASSERT_TRUE(connection.DoesColumnExist("metas", "base_server_specifics")); | 3302 ASSERT_TRUE(connection.DoesColumnExist("metas", "base_server_specifics")); |
3303 } | 3303 } |
3304 | 3304 |
3305 TEST_F(DirectoryBackingStoreTest, MigrateVersion78To79) { | 3305 TEST_F(DirectoryBackingStoreTest, MigrateVersion78To79) { |
3306 sql::Connection connection; | 3306 sql::Connection connection; |
3307 ASSERT_TRUE(connection.OpenInMemory()); | 3307 ASSERT_TRUE(connection.OpenInMemory()); |
3308 SetUpVersion78Database(&connection); | 3308 SetUpVersion78Database(&connection); |
3309 | 3309 |
3310 scoped_ptr<TestDirectoryBackingStore> dbs( | 3310 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3311 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3311 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3312 ASSERT_FALSE(dbs->needs_column_refresh()); | 3312 ASSERT_FALSE(dbs->needs_column_refresh()); |
3313 ASSERT_TRUE(dbs->MigrateVersion78To79()); | 3313 ASSERT_TRUE(dbs->MigrateVersion78To79()); |
3314 ASSERT_EQ(79, dbs->GetVersion()); | 3314 ASSERT_EQ(79, dbs->GetVersion()); |
3315 ASSERT_FALSE(dbs->needs_column_refresh()); | 3315 ASSERT_FALSE(dbs->needs_column_refresh()); |
3316 } | 3316 } |
3317 | 3317 |
3318 TEST_F(DirectoryBackingStoreTest, MigrateVersion79To80) { | 3318 TEST_F(DirectoryBackingStoreTest, MigrateVersion79To80) { |
3319 sql::Connection connection; | 3319 sql::Connection connection; |
3320 ASSERT_TRUE(connection.OpenInMemory()); | 3320 ASSERT_TRUE(connection.OpenInMemory()); |
3321 SetUpVersion79Database(&connection); | 3321 SetUpVersion79Database(&connection); |
3322 | 3322 |
3323 scoped_ptr<TestDirectoryBackingStore> dbs( | 3323 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3324 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3324 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3325 ASSERT_FALSE(dbs->needs_column_refresh()); | 3325 ASSERT_FALSE(dbs->needs_column_refresh()); |
3326 ASSERT_TRUE(dbs->MigrateVersion79To80()); | 3326 ASSERT_TRUE(dbs->MigrateVersion79To80()); |
3327 ASSERT_EQ(80, dbs->GetVersion()); | 3327 ASSERT_EQ(80, dbs->GetVersion()); |
3328 ASSERT_FALSE(dbs->needs_column_refresh()); | 3328 ASSERT_FALSE(dbs->needs_column_refresh()); |
3329 | 3329 |
3330 // Ensure the bag_of_chips has been set. | 3330 // Ensure the bag_of_chips has been set. |
3331 Directory::MetahandlesMap handles_map; | 3331 Directory::MetahandlesMap handles_map; |
3332 JournalIndex delete_journals; | 3332 JournalIndex delete_journals; |
3333 MetahandleSet metahandles_to_purge; | 3333 MetahandleSet metahandles_to_purge; |
(...skipping 13 matching lines...) Expand all Loading... |
3347 sql::Connection connection; | 3347 sql::Connection connection; |
3348 ASSERT_TRUE(connection.OpenInMemory()); | 3348 ASSERT_TRUE(connection.OpenInMemory()); |
3349 SetUpVersion80Database(&connection); | 3349 SetUpVersion80Database(&connection); |
3350 | 3350 |
3351 sql::Statement s(connection.GetUniqueStatement( | 3351 sql::Statement s(connection.GetUniqueStatement( |
3352 "SELECT metahandle, server_position_in_parent " | 3352 "SELECT metahandle, server_position_in_parent " |
3353 "FROM metas WHERE unique_server_tag = 'google_chrome'")); | 3353 "FROM metas WHERE unique_server_tag = 'google_chrome'")); |
3354 ASSERT_TRUE(s.Step()); | 3354 ASSERT_TRUE(s.Step()); |
3355 ASSERT_EQ(sql::COLUMN_TYPE_INTEGER, s.ColumnType(1)); | 3355 ASSERT_EQ(sql::COLUMN_TYPE_INTEGER, s.ColumnType(1)); |
3356 | 3356 |
3357 scoped_ptr<TestDirectoryBackingStore> dbs( | 3357 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3358 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3358 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3359 ASSERT_TRUE(dbs->MigrateVersion80To81()); | 3359 ASSERT_TRUE(dbs->MigrateVersion80To81()); |
3360 ASSERT_EQ(81, dbs->GetVersion()); | 3360 ASSERT_EQ(81, dbs->GetVersion()); |
3361 | 3361 |
3362 // Test that ordinal values are preserved correctly. | 3362 // Test that ordinal values are preserved correctly. |
3363 sql::Statement new_s(connection.GetUniqueStatement( | 3363 sql::Statement new_s(connection.GetUniqueStatement( |
3364 "SELECT metahandle, server_ordinal_in_parent " | 3364 "SELECT metahandle, server_ordinal_in_parent " |
3365 "FROM metas WHERE unique_server_tag = 'google_chrome'")); | 3365 "FROM metas WHERE unique_server_tag = 'google_chrome'")); |
3366 ASSERT_TRUE(new_s.Step()); | 3366 ASSERT_TRUE(new_s.Step()); |
3367 ASSERT_EQ(sql::COLUMN_TYPE_BLOB, new_s.ColumnType(1)); | 3367 ASSERT_EQ(sql::COLUMN_TYPE_BLOB, new_s.ColumnType(1)); |
3368 | 3368 |
3369 std::string expected_ordinal = Int64ToNodeOrdinal(1048576).ToInternalValue(); | 3369 std::string expected_ordinal = Int64ToNodeOrdinal(1048576).ToInternalValue(); |
3370 std::string actual_ordinal; | 3370 std::string actual_ordinal; |
3371 new_s.ColumnBlobAsString(1, &actual_ordinal); | 3371 new_s.ColumnBlobAsString(1, &actual_ordinal); |
3372 ASSERT_EQ(expected_ordinal, actual_ordinal); | 3372 ASSERT_EQ(expected_ordinal, actual_ordinal); |
3373 } | 3373 } |
3374 | 3374 |
3375 TEST_F(DirectoryBackingStoreTest, MigrateVersion81To82) { | 3375 TEST_F(DirectoryBackingStoreTest, MigrateVersion81To82) { |
3376 sql::Connection connection; | 3376 sql::Connection connection; |
3377 ASSERT_TRUE(connection.OpenInMemory()); | 3377 ASSERT_TRUE(connection.OpenInMemory()); |
3378 SetUpVersion81Database(&connection); | 3378 SetUpVersion81Database(&connection); |
3379 ASSERT_FALSE(connection.DoesColumnExist("models", "transaction_version")); | 3379 ASSERT_FALSE(connection.DoesColumnExist("models", "transaction_version")); |
3380 | 3380 |
3381 scoped_ptr<TestDirectoryBackingStore> dbs( | 3381 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3382 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3382 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3383 ASSERT_FALSE(dbs->needs_column_refresh()); | 3383 ASSERT_FALSE(dbs->needs_column_refresh()); |
3384 ASSERT_TRUE(dbs->MigrateVersion81To82()); | 3384 ASSERT_TRUE(dbs->MigrateVersion81To82()); |
3385 ASSERT_EQ(82, dbs->GetVersion()); | 3385 ASSERT_EQ(82, dbs->GetVersion()); |
3386 ASSERT_FALSE(dbs->needs_column_refresh()); | 3386 ASSERT_FALSE(dbs->needs_column_refresh()); |
3387 | 3387 |
3388 ASSERT_TRUE(connection.DoesColumnExist("models", "transaction_version")); | 3388 ASSERT_TRUE(connection.DoesColumnExist("models", "transaction_version")); |
3389 } | 3389 } |
3390 | 3390 |
3391 TEST_F(DirectoryBackingStoreTest, MigrateVersion82To83) { | 3391 TEST_F(DirectoryBackingStoreTest, MigrateVersion82To83) { |
3392 sql::Connection connection; | 3392 sql::Connection connection; |
3393 ASSERT_TRUE(connection.OpenInMemory()); | 3393 ASSERT_TRUE(connection.OpenInMemory()); |
3394 SetUpVersion82Database(&connection); | 3394 SetUpVersion82Database(&connection); |
3395 ASSERT_FALSE(connection.DoesColumnExist("metas", "transaction_version")); | 3395 ASSERT_FALSE(connection.DoesColumnExist("metas", "transaction_version")); |
3396 | 3396 |
3397 scoped_ptr<TestDirectoryBackingStore> dbs( | 3397 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3398 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3398 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3399 ASSERT_TRUE(dbs->MigrateVersion82To83()); | 3399 ASSERT_TRUE(dbs->MigrateVersion82To83()); |
3400 ASSERT_EQ(83, dbs->GetVersion()); | 3400 ASSERT_EQ(83, dbs->GetVersion()); |
3401 | 3401 |
3402 ASSERT_TRUE(connection.DoesColumnExist("metas", "transaction_version")); | 3402 ASSERT_TRUE(connection.DoesColumnExist("metas", "transaction_version")); |
3403 } | 3403 } |
3404 | 3404 |
3405 TEST_F(DirectoryBackingStoreTest, MigrateVersion83To84) { | 3405 TEST_F(DirectoryBackingStoreTest, MigrateVersion83To84) { |
3406 sql::Connection connection; | 3406 sql::Connection connection; |
3407 ASSERT_TRUE(connection.OpenInMemory()); | 3407 ASSERT_TRUE(connection.OpenInMemory()); |
3408 SetUpVersion83Database(&connection); | 3408 SetUpVersion83Database(&connection); |
3409 ASSERT_FALSE(connection.DoesTableExist("deleted_metas")); | 3409 ASSERT_FALSE(connection.DoesTableExist("deleted_metas")); |
3410 | 3410 |
3411 scoped_ptr<TestDirectoryBackingStore> dbs( | 3411 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3412 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3412 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3413 ASSERT_TRUE(dbs->MigrateVersion83To84()); | 3413 ASSERT_TRUE(dbs->MigrateVersion83To84()); |
3414 ASSERT_EQ(84, dbs->GetVersion()); | 3414 ASSERT_EQ(84, dbs->GetVersion()); |
3415 | 3415 |
3416 ASSERT_TRUE(connection.DoesTableExist("deleted_metas")); | 3416 ASSERT_TRUE(connection.DoesTableExist("deleted_metas")); |
3417 } | 3417 } |
3418 | 3418 |
3419 TEST_F(DirectoryBackingStoreTest, MigrateVersion84To85) { | 3419 TEST_F(DirectoryBackingStoreTest, MigrateVersion84To85) { |
3420 sql::Connection connection; | 3420 sql::Connection connection; |
3421 ASSERT_TRUE(connection.OpenInMemory()); | 3421 ASSERT_TRUE(connection.OpenInMemory()); |
3422 SetUpVersion84Database(&connection); | 3422 SetUpVersion84Database(&connection); |
3423 ASSERT_TRUE(connection.DoesColumnExist("models", "initial_sync_ended")); | 3423 ASSERT_TRUE(connection.DoesColumnExist("models", "initial_sync_ended")); |
3424 | 3424 |
3425 scoped_ptr<TestDirectoryBackingStore> dbs( | 3425 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3426 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3426 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3427 ASSERT_TRUE(dbs->MigrateVersion84To85()); | 3427 ASSERT_TRUE(dbs->MigrateVersion84To85()); |
3428 ASSERT_EQ(85, dbs->GetVersion()); | 3428 ASSERT_EQ(85, dbs->GetVersion()); |
3429 ASSERT_FALSE(connection.DoesColumnExist("models", "initial_sync_ended")); | 3429 ASSERT_FALSE(connection.DoesColumnExist("models", "initial_sync_ended")); |
3430 } | 3430 } |
3431 | 3431 |
3432 TEST_F(DirectoryBackingStoreTest, MigrateVersion85To86) { | 3432 TEST_F(DirectoryBackingStoreTest, MigrateVersion85To86) { |
3433 sql::Connection connection; | 3433 sql::Connection connection; |
3434 ASSERT_TRUE(connection.OpenInMemory()); | 3434 ASSERT_TRUE(connection.OpenInMemory()); |
3435 SetUpVersion85Database(&connection); | 3435 SetUpVersion85Database(&connection); |
3436 EXPECT_TRUE(connection.DoesColumnExist("metas", "next_id")); | 3436 EXPECT_TRUE(connection.DoesColumnExist("metas", "next_id")); |
3437 EXPECT_TRUE(connection.DoesColumnExist("metas", "prev_id")); | 3437 EXPECT_TRUE(connection.DoesColumnExist("metas", "prev_id")); |
3438 EXPECT_TRUE(connection.DoesColumnExist("metas", "server_ordinal_in_parent")); | 3438 EXPECT_TRUE(connection.DoesColumnExist("metas", "server_ordinal_in_parent")); |
3439 EXPECT_FALSE(connection.DoesColumnExist("metas", "unique_position")); | 3439 EXPECT_FALSE(connection.DoesColumnExist("metas", "unique_position")); |
3440 EXPECT_FALSE(connection.DoesColumnExist("metas", "server_unique_position")); | 3440 EXPECT_FALSE(connection.DoesColumnExist("metas", "server_unique_position")); |
3441 EXPECT_FALSE(connection.DoesColumnExist("metas", "unique_bookmark_tag")); | 3441 EXPECT_FALSE(connection.DoesColumnExist("metas", "unique_bookmark_tag")); |
3442 | 3442 |
3443 scoped_ptr<TestDirectoryBackingStore> dbs( | 3443 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3444 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3444 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3445 ASSERT_TRUE(dbs->MigrateVersion85To86()); | 3445 ASSERT_TRUE(dbs->MigrateVersion85To86()); |
3446 EXPECT_EQ(86, dbs->GetVersion()); | 3446 EXPECT_EQ(86, dbs->GetVersion()); |
3447 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_position")); | 3447 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_position")); |
3448 EXPECT_TRUE(connection.DoesColumnExist("metas", "server_unique_position")); | 3448 EXPECT_TRUE(connection.DoesColumnExist("metas", "server_unique_position")); |
3449 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_bookmark_tag")); | 3449 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_bookmark_tag")); |
3450 ASSERT_TRUE(dbs->needs_column_refresh()); | 3450 ASSERT_TRUE(dbs->needs_column_refresh()); |
3451 } | 3451 } |
3452 | 3452 |
3453 TEST_F(DirectoryBackingStoreTest, MigrateVersion86To87) { | 3453 TEST_F(DirectoryBackingStoreTest, MigrateVersion86To87) { |
3454 sql::Connection connection; | 3454 sql::Connection connection; |
3455 EXPECT_TRUE(connection.OpenInMemory()); | 3455 EXPECT_TRUE(connection.OpenInMemory()); |
3456 SetUpVersion86Database(&connection); | 3456 SetUpVersion86Database(&connection); |
3457 EXPECT_FALSE(connection.DoesColumnExist("metas", "attachment_metadata")); | 3457 EXPECT_FALSE(connection.DoesColumnExist("metas", "attachment_metadata")); |
3458 | 3458 |
3459 scoped_ptr<TestDirectoryBackingStore> dbs( | 3459 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3460 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3460 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3461 EXPECT_TRUE(dbs->MigrateVersion86To87()); | 3461 EXPECT_TRUE(dbs->MigrateVersion86To87()); |
3462 EXPECT_EQ(87, dbs->GetVersion()); | 3462 EXPECT_EQ(87, dbs->GetVersion()); |
3463 EXPECT_TRUE(connection.DoesColumnExist("metas", "attachment_metadata")); | 3463 EXPECT_TRUE(connection.DoesColumnExist("metas", "attachment_metadata")); |
3464 EXPECT_TRUE(dbs->needs_column_refresh()); | 3464 EXPECT_TRUE(dbs->needs_column_refresh()); |
3465 } | 3465 } |
3466 | 3466 |
3467 TEST_F(DirectoryBackingStoreTest, MigrateVersion87To88) { | 3467 TEST_F(DirectoryBackingStoreTest, MigrateVersion87To88) { |
3468 sql::Connection connection; | 3468 sql::Connection connection; |
3469 ASSERT_TRUE(connection.OpenInMemory()); | 3469 ASSERT_TRUE(connection.OpenInMemory()); |
3470 SetUpVersion87Database(&connection); | 3470 SetUpVersion87Database(&connection); |
3471 | 3471 |
3472 scoped_ptr<TestDirectoryBackingStore> dbs( | 3472 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3473 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3473 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3474 ASSERT_TRUE(dbs->MigrateVersion87To88()); | 3474 ASSERT_TRUE(dbs->MigrateVersion87To88()); |
3475 ASSERT_EQ(88, dbs->GetVersion()); | 3475 ASSERT_EQ(88, dbs->GetVersion()); |
3476 ASSERT_TRUE(connection.DoesColumnExist("models", "context")); | 3476 ASSERT_TRUE(connection.DoesColumnExist("models", "context")); |
3477 } | 3477 } |
3478 | 3478 |
3479 TEST_F(DirectoryBackingStoreTest, MigrateVersion88To89) { | 3479 TEST_F(DirectoryBackingStoreTest, MigrateVersion88To89) { |
3480 sql::Connection connection; | 3480 sql::Connection connection; |
3481 ASSERT_TRUE(connection.OpenInMemory()); | 3481 ASSERT_TRUE(connection.OpenInMemory()); |
3482 SetUpVersion88Database(&connection); | 3482 SetUpVersion88Database(&connection); |
3483 ASSERT_FALSE( | 3483 ASSERT_FALSE( |
3484 connection.DoesColumnExist("metas", "server_attachment_metadata")); | 3484 connection.DoesColumnExist("metas", "server_attachment_metadata")); |
3485 | 3485 |
3486 scoped_ptr<TestDirectoryBackingStore> dbs( | 3486 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3487 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3487 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3488 ASSERT_TRUE(dbs->MigrateVersion88To89()); | 3488 ASSERT_TRUE(dbs->MigrateVersion88To89()); |
3489 ASSERT_EQ(89, dbs->GetVersion()); | 3489 ASSERT_EQ(89, dbs->GetVersion()); |
3490 EXPECT_TRUE( | 3490 EXPECT_TRUE( |
3491 connection.DoesColumnExist("metas", "server_attachment_metadata")); | 3491 connection.DoesColumnExist("metas", "server_attachment_metadata")); |
3492 EXPECT_TRUE(dbs->needs_column_refresh()); | 3492 EXPECT_TRUE(dbs->needs_column_refresh()); |
3493 } | 3493 } |
3494 | 3494 |
3495 TEST_F(DirectoryBackingStoreTest, MigrateVersion89To90) { | 3495 TEST_F(DirectoryBackingStoreTest, MigrateVersion89To90) { |
3496 sql::Connection connection; | 3496 sql::Connection connection; |
3497 ASSERT_TRUE(connection.OpenInMemory()); | 3497 ASSERT_TRUE(connection.OpenInMemory()); |
3498 SetUpVersion89Database(&connection); | 3498 SetUpVersion89Database(&connection); |
3499 ASSERT_TRUE(connection.DoesColumnExist("share_info", "db_create_version")); | 3499 ASSERT_TRUE(connection.DoesColumnExist("share_info", "db_create_version")); |
3500 ASSERT_TRUE(connection.DoesColumnExist("share_info", "db_create_time")); | 3500 ASSERT_TRUE(connection.DoesColumnExist("share_info", "db_create_time")); |
3501 ASSERT_TRUE(connection.DoesColumnExist("share_info", "next_id")); | 3501 ASSERT_TRUE(connection.DoesColumnExist("share_info", "next_id")); |
3502 ASSERT_TRUE(connection.DoesColumnExist("share_info", "notification_state")); | 3502 ASSERT_TRUE(connection.DoesColumnExist("share_info", "notification_state")); |
3503 | 3503 |
3504 scoped_ptr<TestDirectoryBackingStore> dbs( | 3504 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3505 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3505 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3506 ASSERT_TRUE(dbs->MigrateVersion89To90()); | 3506 ASSERT_TRUE(dbs->MigrateVersion89To90()); |
3507 ASSERT_EQ(90, dbs->GetVersion()); | 3507 ASSERT_EQ(90, dbs->GetVersion()); |
3508 EXPECT_TRUE(dbs->needs_column_refresh()); | 3508 EXPECT_TRUE(dbs->needs_column_refresh()); |
3509 | 3509 |
3510 ASSERT_TRUE(dbs->RefreshColumns()); | 3510 ASSERT_TRUE(dbs->RefreshColumns()); |
3511 EXPECT_FALSE(dbs->needs_column_refresh()); | 3511 EXPECT_FALSE(dbs->needs_column_refresh()); |
3512 | 3512 |
3513 ASSERT_FALSE(connection.DoesColumnExist("share_info", "db_create_version")); | 3513 ASSERT_FALSE(connection.DoesColumnExist("share_info", "db_create_version")); |
3514 ASSERT_FALSE(connection.DoesColumnExist("share_info", "db_create_time")); | 3514 ASSERT_FALSE(connection.DoesColumnExist("share_info", "db_create_time")); |
(...skipping 17 matching lines...) Expand all Loading... |
3532 // > .dump | 3532 // > .dump |
3533 // 5. Replace the timestamp columns with META_PROTO_TIMES(x) (or | 3533 // 5. Replace the timestamp columns with META_PROTO_TIMES(x) (or |
3534 // LEGACY_META_PROTO_TIMES(x) if before Version 77). Use this dump to write | 3534 // LEGACY_META_PROTO_TIMES(x) if before Version 77). Use this dump to write |
3535 // a SetupVersionYDatabase method. | 3535 // a SetupVersionYDatabase method. |
3536 TEST_F(DirectoryBackingStoreTest, MigrateToLatestAndDump) { | 3536 TEST_F(DirectoryBackingStoreTest, MigrateToLatestAndDump) { |
3537 { | 3537 { |
3538 sql::Connection connection; | 3538 sql::Connection connection; |
3539 ASSERT_TRUE(connection.Open(GetDatabasePath())); | 3539 ASSERT_TRUE(connection.Open(GetDatabasePath())); |
3540 SetUpVersion89Database(&connection); // Update this. | 3540 SetUpVersion89Database(&connection); // Update this. |
3541 | 3541 |
3542 scoped_ptr<TestDirectoryBackingStore> dbs( | 3542 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3543 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3543 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3544 ASSERT_TRUE(dbs->MigrateVersion89To90()); // Update this. | 3544 ASSERT_TRUE(dbs->MigrateVersion89To90()); // Update this. |
3545 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 3545 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
3546 EXPECT_EQ(90, dbs->GetVersion()); // Update this. | 3546 EXPECT_EQ(90, dbs->GetVersion()); // Update this. |
3547 ASSERT_FALSE(dbs->needs_column_refresh()); | 3547 ASSERT_FALSE(dbs->needs_column_refresh()); |
3548 } | 3548 } |
3549 // Set breakpoint here. | 3549 // Set breakpoint here. |
3550 } | 3550 } |
3551 | 3551 |
3552 TEST_F(DirectoryBackingStoreTest, DetectInvalidPosition) { | 3552 TEST_F(DirectoryBackingStoreTest, DetectInvalidPosition) { |
3553 sql::Connection connection; | 3553 sql::Connection connection; |
3554 ASSERT_TRUE(connection.OpenInMemory()); | 3554 ASSERT_TRUE(connection.OpenInMemory()); |
3555 SetUpVersion86Database(&connection); | 3555 SetUpVersion86Database(&connection); |
3556 | 3556 |
3557 scoped_ptr<TestDirectoryBackingStore> dbs( | 3557 std::unique_ptr<TestDirectoryBackingStore> dbs( |
3558 new TestDirectoryBackingStore(GetUsername(), &connection)); | 3558 new TestDirectoryBackingStore(GetUsername(), &connection)); |
3559 ASSERT_EQ(86, dbs->GetVersion()); | 3559 ASSERT_EQ(86, dbs->GetVersion()); |
3560 | 3560 |
3561 // Insert row with bad position. | 3561 // Insert row with bad position. |
3562 sql::Statement s(connection.GetUniqueStatement( | 3562 sql::Statement s(connection.GetUniqueStatement( |
3563 "INSERT INTO metas " | 3563 "INSERT INTO metas " |
3564 "( id, metahandle, is_dir, ctime, mtime," | 3564 "( id, metahandle, is_dir, ctime, mtime," |
3565 " unique_position, server_unique_position) " | 3565 " unique_position, server_unique_position) " |
3566 "VALUES('c-invalid', 9999, 1, 0, 0, 'BAD_POS', 'BAD_POS')")); | 3566 "VALUES('c-invalid', 9999, 1, 0, 0, 'BAD_POS', 'BAD_POS')")); |
3567 ASSERT_TRUE(s.Run()); | 3567 ASSERT_TRUE(s.Run()); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3665 } | 3665 } |
3666 connection.Close(); | 3666 connection.Close(); |
3667 | 3667 |
3668 syncable::Directory::KernelLoadInfo dir_info; | 3668 syncable::Directory::KernelLoadInfo dir_info; |
3669 Directory::MetahandlesMap handles_map; | 3669 Directory::MetahandlesMap handles_map; |
3670 JournalIndex delete_journals; | 3670 JournalIndex delete_journals; |
3671 MetahandleSet metahandles_to_purge; | 3671 MetahandleSet metahandles_to_purge; |
3672 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); | 3672 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); |
3673 | 3673 |
3674 { | 3674 { |
3675 scoped_ptr<OnDiskDirectoryBackingStore> dbs( | 3675 std::unique_ptr<OnDiskDirectoryBackingStore> dbs( |
3676 new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath())); | 3676 new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath())); |
3677 ASSERT_EQ(OPENED, dbs->Load(&handles_map, &delete_journals, | 3677 ASSERT_EQ(OPENED, dbs->Load(&handles_map, &delete_journals, |
3678 &metahandles_to_purge, &dir_info)); | 3678 &metahandles_to_purge, &dir_info)); |
3679 if (!metahandles_to_purge.empty()) | 3679 if (!metahandles_to_purge.empty()) |
3680 dbs->DeleteEntries(DirectoryBackingStore::METAS_TABLE, | 3680 dbs->DeleteEntries(DirectoryBackingStore::METAS_TABLE, |
3681 metahandles_to_purge); | 3681 metahandles_to_purge); |
3682 ASSERT_FALSE(dbs->needs_column_refresh()); | 3682 ASSERT_FALSE(dbs->needs_column_refresh()); |
3683 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); | 3683 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); |
3684 int pageSize = 0; | 3684 int pageSize = 0; |
3685 ASSERT_TRUE(dbs->GetDatabasePageSize(&pageSize)); | 3685 ASSERT_TRUE(dbs->GetDatabasePageSize(&pageSize)); |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4015 } // namespace | 4015 } // namespace |
4016 | 4016 |
4017 // This is a whitebox test intended to exercise the code path where the on-disk | 4017 // This is a whitebox test intended to exercise the code path where the on-disk |
4018 // directory load code decides to delete the current directory and start fresh. | 4018 // directory load code decides to delete the current directory and start fresh. |
4019 // | 4019 // |
4020 // This is considered "minor" corruption because the database recreation is | 4020 // This is considered "minor" corruption because the database recreation is |
4021 // expected to succeed. The alternative, where recreation does not succeed (ie. | 4021 // expected to succeed. The alternative, where recreation does not succeed (ie. |
4022 // due to read-only file system), is not tested here. | 4022 // due to read-only file system), is not tested here. |
4023 TEST_F(DirectoryBackingStoreTest, MinorCorruption) { | 4023 TEST_F(DirectoryBackingStoreTest, MinorCorruption) { |
4024 { | 4024 { |
4025 scoped_ptr<OnDiskDirectoryBackingStore> dbs( | 4025 std::unique_ptr<OnDiskDirectoryBackingStore> dbs( |
4026 new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath())); | 4026 new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath())); |
4027 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 4027 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
4028 } | 4028 } |
4029 | 4029 |
4030 // Corrupt the root node. | 4030 // Corrupt the root node. |
4031 { | 4031 { |
4032 sql::Connection connection; | 4032 sql::Connection connection; |
4033 ASSERT_TRUE(connection.Open(GetDatabasePath())); | 4033 ASSERT_TRUE(connection.Open(GetDatabasePath())); |
4034 ASSERT_TRUE(connection.Execute( | 4034 ASSERT_TRUE(connection.Execute( |
4035 "UPDATE metas SET parent_id='bogus' WHERE id = 'r';")); | 4035 "UPDATE metas SET parent_id='bogus' WHERE id = 'r';")); |
4036 } | 4036 } |
4037 | 4037 |
4038 { | 4038 { |
4039 scoped_ptr<OnDiskDirectoryBackingStoreForTest> dbs( | 4039 std::unique_ptr<OnDiskDirectoryBackingStoreForTest> dbs( |
4040 new OnDiskDirectoryBackingStoreForTest(GetUsername(), | 4040 new OnDiskDirectoryBackingStoreForTest(GetUsername(), |
4041 GetDatabasePath())); | 4041 GetDatabasePath())); |
4042 | 4042 |
4043 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 4043 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
4044 EXPECT_TRUE(dbs->DidFailFirstOpenAttempt()); | 4044 EXPECT_TRUE(dbs->DidFailFirstOpenAttempt()); |
4045 } | 4045 } |
4046 } | 4046 } |
4047 | 4047 |
4048 TEST_F(DirectoryBackingStoreTest, MinorCorruptionAndUpgrade) { | 4048 TEST_F(DirectoryBackingStoreTest, MinorCorruptionAndUpgrade) { |
4049 { | 4049 { |
4050 scoped_ptr<OnDiskDirectoryBackingStore> dbs( | 4050 std::unique_ptr<OnDiskDirectoryBackingStore> dbs( |
4051 new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath())); | 4051 new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath())); |
4052 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 4052 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
4053 } | 4053 } |
4054 | 4054 |
4055 // Make the node look outdated with an invalid version. | 4055 // Make the node look outdated with an invalid version. |
4056 { | 4056 { |
4057 sql::Connection connection; | 4057 sql::Connection connection; |
4058 ASSERT_TRUE(connection.Open(GetDatabasePath())); | 4058 ASSERT_TRUE(connection.Open(GetDatabasePath())); |
4059 ASSERT_TRUE(connection.Execute("UPDATE share_version SET data = 0;")); | 4059 ASSERT_TRUE(connection.Execute("UPDATE share_version SET data = 0;")); |
4060 ASSERT_TRUE(connection.Execute("PRAGMA page_size=4096;")); | 4060 ASSERT_TRUE(connection.Execute("PRAGMA page_size=4096;")); |
4061 ASSERT_TRUE(connection.Execute("VACUUM;")); | 4061 ASSERT_TRUE(connection.Execute("VACUUM;")); |
4062 } | 4062 } |
4063 | 4063 |
4064 { | 4064 { |
4065 scoped_ptr<OnDiskDirectoryBackingStoreForTest> dbs( | 4065 std::unique_ptr<OnDiskDirectoryBackingStoreForTest> dbs( |
4066 new OnDiskDirectoryBackingStoreForTest(GetUsername(), | 4066 new OnDiskDirectoryBackingStoreForTest(GetUsername(), |
4067 GetDatabasePath())); | 4067 GetDatabasePath())); |
4068 dbs->SetCatastrophicErrorHandler(base::Bind(&base::DoNothing)); | 4068 dbs->SetCatastrophicErrorHandler(base::Bind(&base::DoNothing)); |
4069 | 4069 |
4070 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 4070 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
4071 EXPECT_TRUE(dbs->DidFailFirstOpenAttempt()); | 4071 EXPECT_TRUE(dbs->DidFailFirstOpenAttempt()); |
4072 | 4072 |
4073 int page_size = 0; | 4073 int page_size = 0; |
4074 ASSERT_TRUE(dbs->GetDatabasePageSize(&page_size)); | 4074 ASSERT_TRUE(dbs->GetDatabasePageSize(&page_size)); |
4075 EXPECT_EQ(kCurrentPageSizeKB, page_size); | 4075 EXPECT_EQ(kCurrentPageSizeKB, page_size); |
4076 } | 4076 } |
4077 } | 4077 } |
4078 | 4078 |
4079 TEST_F(DirectoryBackingStoreTest, DeleteEntries) { | 4079 TEST_F(DirectoryBackingStoreTest, DeleteEntries) { |
4080 sql::Connection connection; | 4080 sql::Connection connection; |
4081 ASSERT_TRUE(connection.OpenInMemory()); | 4081 ASSERT_TRUE(connection.OpenInMemory()); |
4082 | 4082 |
4083 SetUpCurrentDatabaseAndCheckVersion(&connection); | 4083 SetUpCurrentDatabaseAndCheckVersion(&connection); |
4084 scoped_ptr<TestDirectoryBackingStore> dbs( | 4084 std::unique_ptr<TestDirectoryBackingStore> dbs( |
4085 new TestDirectoryBackingStore(GetUsername(), &connection)); | 4085 new TestDirectoryBackingStore(GetUsername(), &connection)); |
4086 Directory::MetahandlesMap handles_map; | 4086 Directory::MetahandlesMap handles_map; |
4087 JournalIndex delete_journals; | 4087 JournalIndex delete_journals; |
4088 MetahandleSet metahandles_to_purge; | 4088 MetahandleSet metahandles_to_purge; |
4089 Directory::KernelLoadInfo kernel_load_info; | 4089 Directory::KernelLoadInfo kernel_load_info; |
4090 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); | 4090 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); |
4091 | 4091 |
4092 dbs->Load(&handles_map, &delete_journals, &metahandles_to_purge, | 4092 dbs->Load(&handles_map, &delete_journals, &metahandles_to_purge, |
4093 &kernel_load_info); | 4093 &kernel_load_info); |
4094 size_t initial_size = handles_map.size(); | 4094 size_t initial_size = handles_map.size(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4135 // In theory this test can fail, but it won't before the universe | 4135 // In theory this test can fail, but it won't before the universe |
4136 // dies of heat death. | 4136 // dies of heat death. |
4137 EXPECT_NE(guid1, guid2); | 4137 EXPECT_NE(guid1, guid2); |
4138 } | 4138 } |
4139 | 4139 |
4140 TEST_F(DirectoryBackingStoreTest, IncreaseDatabasePageSizeFrom4KTo32K) { | 4140 TEST_F(DirectoryBackingStoreTest, IncreaseDatabasePageSizeFrom4KTo32K) { |
4141 sql::Connection connection; | 4141 sql::Connection connection; |
4142 ASSERT_TRUE(connection.Open(GetDatabasePath())); | 4142 ASSERT_TRUE(connection.Open(GetDatabasePath())); |
4143 | 4143 |
4144 SetUpCurrentDatabaseAndCheckVersion(&connection); | 4144 SetUpCurrentDatabaseAndCheckVersion(&connection); |
4145 scoped_ptr<TestDirectoryBackingStore> dbs( | 4145 std::unique_ptr<TestDirectoryBackingStore> dbs( |
4146 new TestDirectoryBackingStore(GetUsername(), &connection)); | 4146 new TestDirectoryBackingStore(GetUsername(), &connection)); |
4147 Directory::MetahandlesMap handles_map; | 4147 Directory::MetahandlesMap handles_map; |
4148 JournalIndex delete_journals; | 4148 JournalIndex delete_journals; |
4149 MetahandleSet metahandles_to_purge; | 4149 MetahandleSet metahandles_to_purge; |
4150 Directory::KernelLoadInfo kernel_load_info; | 4150 Directory::KernelLoadInfo kernel_load_info; |
4151 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); | 4151 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); |
4152 | 4152 |
4153 DirOpenResult open_result = dbs->Load( | 4153 DirOpenResult open_result = dbs->Load( |
4154 &handles_map, &delete_journals, &metahandles_to_purge, &kernel_load_info); | 4154 &handles_map, &delete_journals, &metahandles_to_purge, &kernel_load_info); |
4155 EXPECT_EQ(open_result, OPENED); | 4155 EXPECT_EQ(open_result, OPENED); |
4156 | 4156 |
4157 // Set up database's page size to 4096 | 4157 // Set up database's page size to 4096 |
4158 EXPECT_TRUE(dbs->db_->Execute("PRAGMA page_size=4096;")); | 4158 EXPECT_TRUE(dbs->db_->Execute("PRAGMA page_size=4096;")); |
4159 EXPECT_TRUE(dbs->Vacuum()); | 4159 EXPECT_TRUE(dbs->Vacuum()); |
4160 | 4160 |
4161 // Check if update is successful. | 4161 // Check if update is successful. |
4162 int pageSize = 0; | 4162 int pageSize = 0; |
4163 EXPECT_TRUE(dbs->GetDatabasePageSize(&pageSize)); | 4163 EXPECT_TRUE(dbs->GetDatabasePageSize(&pageSize)); |
4164 EXPECT_NE(kCurrentPageSizeKB, pageSize); | 4164 EXPECT_NE(kCurrentPageSizeKB, pageSize); |
4165 EXPECT_TRUE(dbs->UpdatePageSizeIfNecessary()); | 4165 EXPECT_TRUE(dbs->UpdatePageSizeIfNecessary()); |
4166 pageSize = 0; | 4166 pageSize = 0; |
4167 EXPECT_TRUE(dbs->GetDatabasePageSize(&pageSize)); | 4167 EXPECT_TRUE(dbs->GetDatabasePageSize(&pageSize)); |
4168 EXPECT_EQ(kCurrentPageSizeKB, pageSize); | 4168 EXPECT_EQ(kCurrentPageSizeKB, pageSize); |
4169 } | 4169 } |
4170 | 4170 |
4171 // See that a catastrophic error handler remains set across instances of the | 4171 // See that a catastrophic error handler remains set across instances of the |
4172 // underlying sql:Connection. | 4172 // underlying sql:Connection. |
4173 TEST_F(DirectoryBackingStoreTest, CatastrophicErrorHandler_KeptAcrossReset) { | 4173 TEST_F(DirectoryBackingStoreTest, CatastrophicErrorHandler_KeptAcrossReset) { |
4174 scoped_ptr<OnDiskDirectoryBackingStoreForTest> dbs( | 4174 std::unique_ptr<OnDiskDirectoryBackingStoreForTest> dbs( |
4175 new OnDiskDirectoryBackingStoreForTest(GetUsername(), GetDatabasePath())); | 4175 new OnDiskDirectoryBackingStoreForTest(GetUsername(), GetDatabasePath())); |
4176 // See that by default there is no catastrophic error handler. | 4176 // See that by default there is no catastrophic error handler. |
4177 ASSERT_FALSE(dbs->db_->has_error_callback()); | 4177 ASSERT_FALSE(dbs->db_->has_error_callback()); |
4178 // Set one and see that it was set. | 4178 // Set one and see that it was set. |
4179 dbs->SetCatastrophicErrorHandler( | 4179 dbs->SetCatastrophicErrorHandler( |
4180 base::Bind(&CatastrophicErrorHandler, nullptr)); | 4180 base::Bind(&CatastrophicErrorHandler, nullptr)); |
4181 ASSERT_TRUE(dbs->db_->has_error_callback()); | 4181 ASSERT_TRUE(dbs->db_->has_error_callback()); |
4182 // Recreate the Connection and see that the handler remains set. | 4182 // Recreate the Connection and see that the handler remains set. |
4183 dbs->ResetAndCreateConnection(); | 4183 dbs->ResetAndCreateConnection(); |
4184 ASSERT_TRUE(dbs->db_->has_error_callback()); | 4184 ASSERT_TRUE(dbs->db_->has_error_callback()); |
4185 } | 4185 } |
4186 | 4186 |
4187 // Verify that database corruption encountered during Load will trigger the | 4187 // Verify that database corruption encountered during Load will trigger the |
4188 // catastrohpic error handler. | 4188 // catastrohpic error handler. |
4189 TEST_F(DirectoryBackingStoreTest, | 4189 TEST_F(DirectoryBackingStoreTest, |
4190 CatastrophicErrorHandler_InvocationDuringLoad) { | 4190 CatastrophicErrorHandler_InvocationDuringLoad) { |
4191 bool was_called = false; | 4191 bool was_called = false; |
4192 const base::Closure handler = | 4192 const base::Closure handler = |
4193 base::Bind(&CatastrophicErrorHandler, &was_called); | 4193 base::Bind(&CatastrophicErrorHandler, &was_called); |
4194 { | 4194 { |
4195 scoped_ptr<OnDiskDirectoryBackingStoreForTest> dbs( | 4195 std::unique_ptr<OnDiskDirectoryBackingStoreForTest> dbs( |
4196 new OnDiskDirectoryBackingStoreForTest(GetUsername(), | 4196 new OnDiskDirectoryBackingStoreForTest(GetUsername(), |
4197 GetDatabasePath())); | 4197 GetDatabasePath())); |
4198 dbs->SetCatastrophicErrorHandler(handler); | 4198 dbs->SetCatastrophicErrorHandler(handler); |
4199 ASSERT_TRUE(dbs->db_->has_error_callback()); | 4199 ASSERT_TRUE(dbs->db_->has_error_callback()); |
4200 // Load the DB, and save one entry. | 4200 // Load the DB, and save one entry. |
4201 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 4201 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
4202 ASSERT_FALSE(dbs->DidFailFirstOpenAttempt()); | 4202 ASSERT_FALSE(dbs->DidFailFirstOpenAttempt()); |
4203 Directory::SaveChangesSnapshot snapshot; | 4203 Directory::SaveChangesSnapshot snapshot; |
4204 snapshot.dirty_metas.insert(CreateEntry(2, "").release()); | 4204 snapshot.dirty_metas.insert(CreateEntry(2, "").release()); |
4205 ASSERT_TRUE(dbs->SaveChanges(snapshot)); | 4205 ASSERT_TRUE(dbs->SaveChanges(snapshot)); |
4206 } | 4206 } |
4207 | 4207 |
4208 base::RunLoop().RunUntilIdle(); | 4208 base::RunLoop().RunUntilIdle(); |
4209 // No catastrophic errors have happened. See that it hasn't be called yet. | 4209 // No catastrophic errors have happened. See that it hasn't be called yet. |
4210 ASSERT_FALSE(was_called); | 4210 ASSERT_FALSE(was_called); |
4211 | 4211 |
4212 // Corrupt the DB. Some forms of corruption (like this one) will be detected | 4212 // Corrupt the DB. Some forms of corruption (like this one) will be detected |
4213 // upon loading the Sync DB. | 4213 // upon loading the Sync DB. |
4214 ASSERT_TRUE(sql::test::CorruptSizeInHeader(GetDatabasePath())); | 4214 ASSERT_TRUE(sql::test::CorruptSizeInHeader(GetDatabasePath())); |
4215 | 4215 |
4216 { | 4216 { |
4217 scoped_ptr<OnDiskDirectoryBackingStoreForTest> dbs( | 4217 std::unique_ptr<OnDiskDirectoryBackingStoreForTest> dbs( |
4218 new OnDiskDirectoryBackingStoreForTest(GetUsername(), | 4218 new OnDiskDirectoryBackingStoreForTest(GetUsername(), |
4219 GetDatabasePath())); | 4219 GetDatabasePath())); |
4220 dbs->SetCatastrophicErrorHandler(handler); | 4220 dbs->SetCatastrophicErrorHandler(handler); |
4221 ASSERT_TRUE(dbs->db_->has_error_callback()); | 4221 ASSERT_TRUE(dbs->db_->has_error_callback()); |
4222 { | 4222 { |
4223 // The corruption will be detected when we attempt to load the data. Use a | 4223 // The corruption will be detected when we attempt to load the data. Use a |
4224 // ScopedErrorIgnorer to ensure we don't crash in debug builds. | 4224 // ScopedErrorIgnorer to ensure we don't crash in debug builds. |
4225 sql::ScopedErrorIgnorer error_ignorer; | 4225 sql::ScopedErrorIgnorer error_ignorer; |
4226 error_ignorer.IgnoreError(SQLITE_CORRUPT); | 4226 error_ignorer.IgnoreError(SQLITE_CORRUPT); |
4227 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 4227 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
(...skipping 11 matching lines...) Expand all Loading... |
4239 } | 4239 } |
4240 | 4240 |
4241 // Verify that database corruption encountered during SaveChanges will trigger | 4241 // Verify that database corruption encountered during SaveChanges will trigger |
4242 // the catastrohpic error handler. | 4242 // the catastrohpic error handler. |
4243 TEST_F(DirectoryBackingStoreTest, | 4243 TEST_F(DirectoryBackingStoreTest, |
4244 CatastrophicErrorHandler_InvocationDuringSaveChanges) { | 4244 CatastrophicErrorHandler_InvocationDuringSaveChanges) { |
4245 bool was_called = false; | 4245 bool was_called = false; |
4246 const base::Closure handler = | 4246 const base::Closure handler = |
4247 base::Bind(&CatastrophicErrorHandler, &was_called); | 4247 base::Bind(&CatastrophicErrorHandler, &was_called); |
4248 // Create a DB with many entries. | 4248 // Create a DB with many entries. |
4249 scoped_ptr<OnDiskDirectoryBackingStoreForTest> dbs( | 4249 std::unique_ptr<OnDiskDirectoryBackingStoreForTest> dbs( |
4250 new OnDiskDirectoryBackingStoreForTest(GetUsername(), GetDatabasePath())); | 4250 new OnDiskDirectoryBackingStoreForTest(GetUsername(), GetDatabasePath())); |
4251 dbs->SetCatastrophicErrorHandler(handler); | 4251 dbs->SetCatastrophicErrorHandler(handler); |
4252 ASSERT_TRUE(dbs->db_->has_error_callback()); | 4252 ASSERT_TRUE(dbs->db_->has_error_callback()); |
4253 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); | 4253 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); |
4254 ASSERT_FALSE(dbs->DidFailFirstOpenAttempt()); | 4254 ASSERT_FALSE(dbs->DidFailFirstOpenAttempt()); |
4255 Directory::SaveChangesSnapshot snapshot; | 4255 Directory::SaveChangesSnapshot snapshot; |
4256 const std::string suffix(400, 'o'); | 4256 const std::string suffix(400, 'o'); |
4257 for (int i = 0; i < corruption_testing::kNumEntriesRequiredForCorruption; | 4257 for (int i = 0; i < corruption_testing::kNumEntriesRequiredForCorruption; |
4258 ++i) { | 4258 ++i) { |
4259 scoped_ptr<EntryKernel> large_entry = CreateEntry(i, suffix); | 4259 std::unique_ptr<EntryKernel> large_entry = CreateEntry(i, suffix); |
4260 snapshot.dirty_metas.insert(large_entry.release()); | 4260 snapshot.dirty_metas.insert(large_entry.release()); |
4261 } | 4261 } |
4262 ASSERT_TRUE(dbs->SaveChanges(snapshot)); | 4262 ASSERT_TRUE(dbs->SaveChanges(snapshot)); |
4263 // Corrupt it. | 4263 // Corrupt it. |
4264 ASSERT_TRUE(corruption_testing::CorruptDatabase(GetDatabasePath())); | 4264 ASSERT_TRUE(corruption_testing::CorruptDatabase(GetDatabasePath())); |
4265 // Attempt to save all those entries again. See that it fails (because of the | 4265 // Attempt to save all those entries again. See that it fails (because of the |
4266 // corruption). | 4266 // corruption). |
4267 // | 4267 // |
4268 // If this test fails because SaveChanges returned true, it may mean you need | 4268 // If this test fails because SaveChanges returned true, it may mean you need |
4269 // to increase the number of entries written to the DB. See also | 4269 // to increase the number of entries written to the DB. See also |
4270 // |kNumEntriesRequiredForCorruption|. | 4270 // |kNumEntriesRequiredForCorruption|. |
4271 ASSERT_FALSE(dbs->SaveChanges(snapshot)); | 4271 ASSERT_FALSE(dbs->SaveChanges(snapshot)); |
4272 // At this point the handler has been posted but not executed. | 4272 // At this point the handler has been posted but not executed. |
4273 ASSERT_FALSE(was_called); | 4273 ASSERT_FALSE(was_called); |
4274 // Pump the message loop and see that it is executed. | 4274 // Pump the message loop and see that it is executed. |
4275 base::RunLoop().RunUntilIdle(); | 4275 base::RunLoop().RunUntilIdle(); |
4276 ASSERT_TRUE(was_called); | 4276 ASSERT_TRUE(was_called); |
4277 } | 4277 } |
4278 | 4278 |
4279 } // namespace syncable | 4279 } // namespace syncable |
4280 } // namespace syncer | 4280 } // namespace syncer |
OLD | NEW |