1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "testing/gtest/include/gtest/gtest.h" 6 7 #include <string> 8 9 #include "app/sql/connection.h" 10 #include "app/sql/statement.h" 11 #include "base/file_path.h" 12 #include "base/file_util.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/memory/scoped_temp_dir.h" 15 #include "base/stl_util-inl.h" 16 #include "base/string_number_conversions.h" 17 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" 18 #include "chrome/browser/sync/protocol/sync.pb.h" 19 #include "chrome/browser/sync/syncable/directory_backing_store.h" 20 #include "chrome/browser/sync/syncable/directory_manager.h" 21 #include "chrome/browser/sync/syncable/syncable-inl.h" 22 #include "chrome/browser/sync/syncable/syncable.h" 23 #include "testing/gtest/include/gtest/gtest-param-test.h" 24 25 namespace syncable { 26 27 extern const int32 kCurrentDBVersion; 28 29 class MigrationTest : public testing::TestWithParam<int> { 30 public: 31 virtual void SetUp() { 32 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 33 } 34 35 protected: 36 std::string GetUsername() { 37 return "nick (at) chromium.org"; 38 } 39 40 FilePath GetDatabasePath() { 41 return temp_dir_.path().Append( 42 DirectoryManager::GetSyncDataDatabaseFilename()); 43 } 44 void SetUpVersion67Database(); 45 void SetUpVersion68Database(); 46 void SetUpVersion69Database(); 47 void SetUpVersion70Database(); 48 void SetUpVersion71Database(); 49 void SetUpVersion72Database(); 50 void SetUpVersion73Database(); 51 void SetUpVersion74Database(); 52 53 void SetUpCurrentDatabaseAndCheckVersion() { 54 SetUpVersion70Database(); // Prepopulates data. 55 scoped_ptr<DirectoryBackingStore> dbs( 56 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 57 58 dbs->BeginLoad(); 59 ASSERT_EQ(OPENED, dbs->InitializeTables()); 60 ASSERT_FALSE(dbs->needs_column_refresh_); 61 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); 62 dbs->EndLoad(); 63 } 64 65 private: 66 ScopedTempDir temp_dir_; 67 }; 68 69 class DirectoryBackingStoreTest : public MigrationTest {}; 70 71 void MigrationTest::SetUpVersion67Database() { 72 // This is a version 67 database dump whose contents were backformed from 73 // the contents of the version 68 database dump (the v68 migration was 74 // actually written first). 75 sql::Connection connection; 76 ASSERT_TRUE(connection.Open(GetDatabasePath())); 77 ASSERT_TRUE(connection.BeginTransaction()); 78 ASSERT_TRUE(connection.Execute( 79 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 80 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 81 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," 82 "base_version bigint default -1,server_version bigint default 0," 83 "mtime bigint default 0,server_mtime bigint default 0," 84 "ctime bigint default 0,server_ctime bigint default 0," 85 "server_position_in_parent bigint default 0," 86 "local_external_id bigint default 0,id varchar(255) default 'r'," 87 "parent_id varchar(255) default 'r'," 88 "server_parent_id varchar(255) default 'r'," 89 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 90 "is_unsynced bit default 0,is_unapplied_update bit default 0," 91 "is_del bit default 0,is_dir bit default 0," 92 "is_bookmark_object bit default 0,server_is_dir bit default 0," 93 "server_is_del bit default 0,server_is_bookmark_object bit default 0," 94 "name varchar(255), " /* COLLATE PATHNAME, */ 95 "unsanitized_name varchar(255)," /* COLLATE PATHNAME, */ 96 "non_unique_name varchar," 97 "server_name varchar(255)," /* COLLATE PATHNAME */ 98 "server_non_unique_name varchar," 99 "bookmark_url varchar,server_bookmark_url varchar," 100 "singleton_tag varchar,bookmark_favicon blob," 101 "server_bookmark_favicon blob);" 102 "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0," 103 "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," 104 "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);" 105 "INSERT INTO metas VALUES(2,669,669,128976886618480000," 106 "128976886618480000,128976886618480000,128976886618480000,-2097152," 107 "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," 108 "'Deleted Item',NULL,'Deleted Item','Deleted Item','Deleted Item'," 109 "'http://www.google.com/','http://www.google.com/2',NULL,'AASGASGA'," 110 "'ASADGADGADG');" 111 "INSERT INTO metas VALUES(4,681,681,129002163642690000," 112 "129002163642690000,129002163642690000,129002163642690000,-3145728," 113 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," 114 "'Welcome to Chromium',NULL,'Welcome to Chromium'," 115 "'Welcome to Chromium','Welcome to Chromium'," 116 "'http://www.google.com/chrome/intl/en/welcome.html'," 117 "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL," 118 "NULL);" 119 "INSERT INTO metas VALUES(5,677,677,129001555500000000," 120 "129001555500000000,129001555500000000,129001555500000000,1048576," 121 "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," 122 "'Google',NULL,'Google','Google','Google','http://www.google.com/'," 123 "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');" 124 "INSERT INTO metas VALUES(6,694,694,129053976170000000," 125 "129053976170000000,129053976170000000,129053976170000000,-4194304," 126 "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1," 127 "'The Internet',NULL,'The Internet','The Internet'," 128 "'The Internet',NULL,NULL,NULL,NULL,NULL);" 129 "INSERT INTO metas VALUES(7,663,663,128976864758480000," 130 "128976864758480000,128976864758480000,128976864758480000," 131 "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1," 132 "'Google Chrome',NULL,'Google Chrome','Google Chrome'," 133 "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL);" 134 "INSERT INTO metas VALUES(8,664,664,128976864758480000," 135 "128976864758480000,128976864758480000,128976864758480000,1048576," 136 "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," 137 "NULL,'Bookmarks','Bookmarks','Bookmarks',NULL,NULL," 138 "'google_chrome_bookmarks',NULL,NULL);" 139 "INSERT INTO metas VALUES(9,665,665,128976864758480000," 140 "128976864758480000,128976864758480000,128976864758480000," 141 "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0," 142 "1,'Bookmark Bar',NULL,'Bookmark Bar','Bookmark Bar','Bookmark Bar'," 143 "NULL,NULL,'bookmark_bar',NULL,NULL);" 144 "INSERT INTO metas VALUES(10,666,666,128976864758480000," 145 "128976864758480000,128976864758480000,128976864758480000,2097152," 146 "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," 147 "'Other Bookmarks',NULL,'Other Bookmarks','Other Bookmarks'," 148 "'Other Bookmarks',NULL,NULL,'other_bookmarks'," 149 "NULL,NULL);" 150 "INSERT INTO metas VALUES(11,683,683,129079956948440000," 151 "129079956948440000,129079956948440000,129079956948440000,-1048576," 152 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," 153 "'Home (The Chromium Projects)',NULL,'Home (The Chromium Projects)'," 154 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 155 "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," 156 "'AGATWA','AFAGVASF');" 157 "INSERT INTO metas VALUES(12,685,685,129079957513650000," 158 "129079957513650000,129079957513650000,129079957513650000,0,9," 159 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," 160 "'Extra Bookmarks',NULL,'Extra Bookmarks','Extra Bookmarks'," 161 "'Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);" 162 "INSERT INTO metas VALUES(13,687,687,129079957985300000," 163 "129079957985300000,129079957985300000,129079957985300000,-917504," 164 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," 165 "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," 166 "'ICANN Internet Corporation for Assigned Names and Numbers'," 167 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 168 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 169 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 170 "'http://www.icann.com/','http://www.icann.com/',NULL," 171 "'PNGAXF0AAFF','DAAFASF');" 172 "INSERT INTO metas VALUES(14,692,692,129079958383000000," 173 "129079958383000000,129079958383000000,129079958383000000,1048576," 174 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," 175 "'The WebKit Open Source Project',NULL," 176 "'The WebKit Open Source Project','The WebKit Open Source Project'," 177 "'The WebKit Open Source Project','http://webkit.org/'," 178 "'http://webkit.org/x',NULL,'PNGX','PNG2Y');" 179 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 180 "last_sync_timestamp INT, name VARCHAR(128), " 181 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 182 "db_create_version VARCHAR(128), db_create_time int, " 183 "next_id bigint default -2, cache_guid VARCHAR(32));" 184 "INSERT INTO share_info VALUES('nick (at) chromium.org',694," 185 "'nick (at) chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 186 "'Unknown',1263522064,-65542," 187 "'9010788312004066376x-6609234393368420856x');" 188 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 189 "INSERT INTO share_version VALUES('nick (at) chromium.org',68);")); 190 ASSERT_TRUE(connection.CommitTransaction()); 191 } 192 193 void MigrationTest::SetUpVersion68Database() { 194 // This sets up an actual version 68 database dump. The IDs were 195 // canonicalized to be less huge, and the favicons were overwritten 196 // with random junk so that they didn't contain any unprintable 197 // characters. A few server URLs were tweaked so that they'd be 198 // different from the local URLs. Lastly, the custom collation on 199 // the server_non_unique_name column was removed. 200 sql::Connection connection; 201 ASSERT_TRUE(connection.Open(GetDatabasePath())); 202 ASSERT_TRUE(connection.BeginTransaction()); 203 ASSERT_TRUE(connection.Execute( 204 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 205 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 206 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," 207 "base_version bigint default -1,server_version bigint default 0," 208 "mtime bigint default 0,server_mtime bigint default 0," 209 "ctime bigint default 0,server_ctime bigint default 0," 210 "server_position_in_parent bigint default 0," 211 "local_external_id bigint default 0,id varchar(255) default 'r'," 212 "parent_id varchar(255) default 'r'," 213 "server_parent_id varchar(255) default 'r'," 214 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 215 "is_unsynced bit default 0,is_unapplied_update bit default 0," 216 "is_del bit default 0,is_dir bit default 0," 217 "is_bookmark_object bit default 0,server_is_dir bit default 0," 218 "server_is_del bit default 0," 219 "server_is_bookmark_object bit default 0," 220 "non_unique_name varchar,server_non_unique_name varchar(255)," 221 "bookmark_url varchar,server_bookmark_url varchar," 222 "singleton_tag varchar,bookmark_favicon blob," 223 "server_bookmark_favicon blob);" 224 "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0," 225 "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," 226 "NULL,NULL,NULL,NULL,NULL,NULL);" 227 "INSERT INTO metas VALUES(2,669,669,128976886618480000," 228 "128976886618480000,128976886618480000,128976886618480000,-2097152," 229 "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," 230 "'Deleted Item','Deleted Item','http://www.google.com/'," 231 "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG');" 232 "INSERT INTO metas VALUES(4,681,681,129002163642690000," 233 "129002163642690000,129002163642690000,129002163642690000,-3145728," 234 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," 235 "'Welcome to Chromium','Welcome to Chromium'," 236 "'http://www.google.com/chrome/intl/en/welcome.html'," 237 "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL," 238 "NULL);" 239 "INSERT INTO metas VALUES(5,677,677,129001555500000000," 240 "129001555500000000,129001555500000000,129001555500000000,1048576," 241 "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," 242 "'Google','Google','http://www.google.com/'," 243 "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');" 244 "INSERT INTO metas VALUES(6,694,694,129053976170000000," 245 "129053976170000000,129053976170000000,129053976170000000,-4194304," 246 "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1," 247 "'The Internet','The Internet',NULL,NULL,NULL,NULL,NULL);" 248 "INSERT INTO metas VALUES(7,663,663,128976864758480000," 249 "128976864758480000,128976864758480000,128976864758480000," 250 "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1," 251 "'Google Chrome','Google Chrome',NULL,NULL,'google_chrome',NULL," 252 "NULL);" 253 "INSERT INTO metas VALUES(8,664,664,128976864758480000," 254 "128976864758480000,128976864758480000,128976864758480000,1048576," 255 "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," 256 "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL);" 257 "INSERT INTO metas VALUES(9,665,665,128976864758480000," 258 "128976864758480000,128976864758480000,128976864758480000," 259 "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0," 260 "1,'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL," 261 "NULL);" 262 "INSERT INTO metas VALUES(10,666,666,128976864758480000," 263 "128976864758480000,128976864758480000,128976864758480000,2097152," 264 "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," 265 "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks'," 266 "NULL,NULL);" 267 "INSERT INTO metas VALUES(11,683,683,129079956948440000," 268 "129079956948440000,129079956948440000,129079956948440000,-1048576," 269 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," 270 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 271 "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," 272 "'AGATWA','AFAGVASF');" 273 "INSERT INTO metas VALUES(12,685,685,129079957513650000," 274 "129079957513650000,129079957513650000,129079957513650000,0,9," 275 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," 276 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);" 277 "INSERT INTO metas VALUES(13,687,687,129079957985300000," 278 "129079957985300000,129079957985300000,129079957985300000,-917504," 279 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," 280 "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," 281 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 282 "'http://www.icann.com/','http://www.icann.com/',NULL," 283 "'PNGAXF0AAFF','DAAFASF');" 284 "INSERT INTO metas VALUES(14,692,692,129079958383000000," 285 "129079958383000000,129079958383000000,129079958383000000,1048576," 286 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," 287 "'The WebKit Open Source Project','The WebKit Open Source Project'," 288 "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y');" 289 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 290 "last_sync_timestamp INT, name VARCHAR(128), " 291 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 292 "db_create_version VARCHAR(128), db_create_time int, " 293 "next_id bigint default -2, cache_guid VARCHAR(32));" 294 "INSERT INTO share_info VALUES('nick (at) chromium.org',694," 295 "'nick (at) chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 296 "'Unknown',1263522064,-65542," 297 "'9010788312004066376x-6609234393368420856x');" 298 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 299 "INSERT INTO share_version VALUES('nick (at) chromium.org',68);")); 300 ASSERT_TRUE(connection.CommitTransaction()); 301 } 302 303 void MigrationTest::SetUpVersion69Database() { 304 sql::Connection connection; 305 ASSERT_TRUE(connection.Open(GetDatabasePath())); 306 ASSERT_TRUE(connection.BeginTransaction()); 307 ASSERT_TRUE(connection.Execute( 308 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 309 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 310 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," 311 "base_version bigint default -1,server_version bigint default 0," 312 "mtime bigint default 0,server_mtime bigint default 0," 313 "ctime bigint default 0,server_ctime bigint default 0," 314 "server_position_in_parent bigint default 0," 315 "local_external_id bigint default 0,id varchar(255) default 'r'," 316 "parent_id varchar(255) default 'r'," 317 "server_parent_id varchar(255) default 'r'," 318 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 319 "is_unsynced bit default 0,is_unapplied_update bit default 0," 320 "is_del bit default 0,is_dir bit default 0," 321 "is_bookmark_object bit default 0,server_is_dir bit default 0," 322 "server_is_del bit default 0," 323 "server_is_bookmark_object bit default 0," 324 "non_unique_name varchar,server_non_unique_name varchar(255)," 325 "bookmark_url varchar,server_bookmark_url varchar," 326 "singleton_tag varchar,bookmark_favicon blob," 327 "server_bookmark_favicon blob, specifics blob, " 328 "server_specifics blob);" 329 "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,129079956640320000," 330 "0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL,NULL,NULL,NULL,NULL," 331 "NULL,NULL,X'',X'');" 332 "INSERT INTO metas VALUES(2,669,669,128976886618480000," 333 "128976886618480000,128976886618480000,128976886618480000,-2097152," 334 "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," 335 "'Deleted Item','Deleted Item','http://www.google.com/'," 336 "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG'," 337 "X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841415" 338 "34741534741',X'C28810260A17687474703A2F2F7777772E676F6F676C652E636F" 339 "6D2F32120B4153414447414447414447');" 340 "INSERT INTO metas VALUES(4,681,681,129002163642690000," 341 "129002163642690000,129002163642690000,129002163642690000,-3145728," 342 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," 343 "'Welcome to Chromium','Welcome to Chromium'," 344 "'http://www.google.com/chrome/intl/en/welcome.html'," 345 "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL,NULL," 346 "X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 347 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A3168" 348 "7474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F6" 349 "56E2F77656C636F6D652E68746D6C1200');" 350 "INSERT INTO metas VALUES(5,677,677,129001555500000000," 351 "129001555500000000,129001555500000000,129001555500000000,1048576,7," 352 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," 353 "'Google','Google','http://www.google.com/'," 354 "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG',X'C28810220A166" 355 "87474703A2F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'" 356 "C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464" 357 "447415347');" 358 "INSERT INTO metas VALUES(6,694,694,129053976170000000," 359 "129053976170000000,129053976170000000,129053976170000000,-4194304,6" 360 ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1,'The Internet'," 361 "'The Internet',NULL,NULL,NULL,NULL,NULL,X'C2881000',X'C2881000');" 362 "INSERT INTO metas VALUES(7,663,663,128976864758480000," 363 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 364 "'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1,'Google Chrome'," 365 "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL,NULL,NULL);" 366 "INSERT INTO metas VALUES(8,664,664,128976864758480000," 367 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 368 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," 369 "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL," 370 "X'C2881000',X'C2881000');" 371 "INSERT INTO metas VALUES(9,665,665,128976864758480000," 372 "128976864758480000,128976864758480000,128976864758480000,1048576,1," 373 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0,1," 374 "'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL,NULL," 375 "X'C2881000',X'C2881000');" 376 "INSERT INTO metas VALUES(10,666,666,128976864758480000," 377 "128976864758480000,128976864758480000,128976864758480000,2097152,2," 378 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," 379 "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks'," 380 "NULL,NULL,X'C2881000',X'C2881000');" 381 "INSERT INTO metas VALUES(11,683,683,129079956948440000," 382 "129079956948440000,129079956948440000,129079956948440000,-1048576," 383 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," 384 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 385 "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," 386 "'AGATWA','AFAGVASF',X'C28810220A18687474703A2F2F6465762E6368726F6D6" 387 "9756D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F646576" 388 "2E6368726F6D69756D2E6F72672F6F7468657212084146414756415346');" 389 "INSERT INTO metas VALUES(12,685,685,129079957513650000," 390 "129079957513650000,129079957513650000,129079957513650000,0,9," 391 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," 392 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL," 393 "X'C2881000',X'C2881000');" 394 "INSERT INTO metas VALUES(13,687,687,129079957985300000," 395 "129079957985300000,129079957985300000,129079957985300000,-917504," 396 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," 397 "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," 398 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 399 "'http://www.icann.com/','http://www.icann.com/',NULL,'PNGAXF0AAFF'," 400 "'DAAFASF',X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F1" 401 "20B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963" 402 "616E6E2E636F6D2F120744414146415346');" 403 "INSERT INTO metas VALUES(14,692,692,129079958383000000," 404 "129079958383000000,129079958383000000,129079958383000000,1048576,11," 405 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," 406 "'The WebKit Open Source Project','The WebKit Open Source Project'," 407 "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y'," 408 "X'C288101A0A12687474703A2F2F7765626B69742E6F72672F1204504E4758',X'C2" 409 "88101C0A13687474703A2F2F7765626B69742E6F72672F781205504E473259');" 410 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 411 "last_sync_timestamp INT, name VARCHAR(128), " 412 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 413 "db_create_version VARCHAR(128), db_create_time int, " 414 "next_id bigint default -2, cache_guid VARCHAR(32));" 415 "INSERT INTO share_info VALUES('nick (at) chromium.org',694," 416 "'nick (at) chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 417 "'Unknown',1263522064,-65542," 418 "'9010788312004066376x-6609234393368420856x');" 419 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 420 "INSERT INTO share_version VALUES('nick (at) chromium.org',69);" 421 )); 422 ASSERT_TRUE(connection.CommitTransaction()); 423 } 424 425 void MigrationTest::SetUpVersion70Database() { 426 sql::Connection connection; 427 ASSERT_TRUE(connection.Open(GetDatabasePath())); 428 ASSERT_TRUE(connection.BeginTransaction()); 429 ASSERT_TRUE(connection.Execute( 430 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 431 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 432 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 433 "last_sync_timestamp INT, name VARCHAR(128), " 434 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 435 "db_create_version VARCHAR(128), db_create_time int, " 436 "next_id bigint default -2, cache_guid VARCHAR(32));" 437 "INSERT INTO share_info VALUES('nick (at) chromium.org',694," 438 "'nick (at) chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 439 "'Unknown',1263522064,-65542," 440 "'9010788312004066376x-6609234393368420856x');" 441 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 442 "INSERT INTO share_version VALUES('nick (at) chromium.org',70);" 443 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 444 "base_version bigint default -1,server_version bigint default 0," 445 "mtime bigint default 0,server_mtime bigint default 0," 446 "ctime bigint default 0,server_ctime bigint default 0," 447 "server_position_in_parent bigint default 0," 448 "local_external_id bigint default 0,id varchar(255) default 'r'," 449 "parent_id varchar(255) default 'r'," 450 "server_parent_id varchar(255) default 'r'," 451 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 452 "is_unsynced bit default 0,is_unapplied_update bit default 0," 453 "is_del bit default 0,is_dir bit default 0," 454 "server_is_dir bit default 0,server_is_del bit default 0," 455 "non_unique_name varchar,server_non_unique_name varchar(255)," 456 "unique_server_tag varchar,unique_client_tag varchar," 457 "specifics blob,server_specifics blob);" 458 "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,129079956640320000," 459 "0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'');" 460 "INSERT INTO metas VALUES(2,669,669,128976886618480000," 461 "128976886618480000,128976886618480000,128976886618480000," 462 "-2097152,4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0," 463 "1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A" 464 "2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X'C2881026" 465 "0A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B415341444741" 466 "4447414447');" 467 "INSERT INTO metas VALUES(4,681,681,129002163642690000," 468 "129002163642690000,129002163642690000,129002163642690000,-3145728," 469 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 470 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A" 471 "31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E74" 472 "6C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F" 473 "2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F7765" 474 "6C636F6D652E68746D6C1200');" 475 "INSERT INTO metas VALUES(5,677,677,129001555500000000," 476 "129001555500000000,129001555500000000,129001555500000000,1048576,7," 477 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 478 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C6" 479 "52E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F77777" 480 "72E676F6F676C652E636F6D2F12084147464447415347');" 481 "INSERT INTO metas VALUES(6,694,694,129053976170000000," 482 "129053976170000000,129053976170000000,129053976170000000,-4194304," 483 "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 484 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 485 "INSERT INTO metas VALUES(7,663,663,128976864758480000," 486 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 487 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome'," 488 "'Google Chrome','google_chrome',NULL,NULL,NULL);" 489 "INSERT INTO metas VALUES(8,664,664,128976864758480000," 490 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 491 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 492 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000'," 493 "X'C2881000');" 494 "INSERT INTO metas VALUES(9,665,665,128976864758480000," 495 "128976864758480000,128976864758480000,128976864758480000,1048576," 496 "1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0," 497 "'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881000'," 498 "X'C2881000');" 499 "INSERT INTO metas VALUES(10,666,666,128976864758480000," 500 "128976864758480000,128976864758480000,128976864758480000," 501 "2097152,2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 502 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 503 "X'C2881000',X'C2881000');" 504 "INSERT INTO metas VALUES(11,683,683,129079956948440000," 505 "129079956948440000,129079956948440000,129079956948440000,-1048576," 506 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 507 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 508 "NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F" 509 "72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636872" 510 "6F6D69756D2E6F72672F6F7468657212084146414756415346');" 511 "INSERT INTO metas VALUES(12,685,685,129079957513650000," 512 "129079957513650000,129079957513650000,129079957513650000,0,9," 513 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 514 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 515 "X'C2881000');" 516 "INSERT INTO metas VALUES(13,687,687,129079957985300000," 517 "129079957985300000,129079957985300000,129079957985300000,-917504," 518 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 519 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 520 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 521 "NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F" 522 "120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E69" 523 "63616E6E2E636F6D2F120744414146415346');" 524 "INSERT INTO metas VALUES(14,692,692,129079958383000000," 525 "129079958383000000,129079958383000000,129079958383000000,1048576," 526 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 527 "'The WebKit Open Source Project','The WebKit Open Source Project'," 528 "NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 529 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F78120550" 530 "4E473259');" 531 )); 532 ASSERT_TRUE(connection.CommitTransaction()); 533 } 534 535 void MigrationTest::SetUpVersion71Database() { 536 sql::Connection connection; 537 ASSERT_TRUE(connection.Open(GetDatabasePath())); 538 ASSERT_TRUE(connection.BeginTransaction()); 539 ASSERT_TRUE(connection.Execute( 540 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 541 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 542 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 543 "INSERT INTO 'share_version' VALUES('nick (at) chromium.org',71);" 544 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 545 "base_version bigint default -1,server_version bigint default 0," 546 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint " 547 "default 0,server_ctime bigint default 0,server_position_in_parent " 548 "bigint default 0,local_external_id bigint default 0,id varchar(255) " 549 "default 'r',parent_id varchar(255) default 'r',server_parent_id " 550 "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id " 551 "varchar(255) default 'r',is_unsynced bit default 0," 552 "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit " 553 "default 0,server_is_dir bit default 0,server_is_del bit default 0," 554 "non_unique_name varchar,server_non_unique_name varchar(255)," 555 "unique_server_tag varchar,unique_client_tag varchar,specifics blob," 556 "server_specifics blob);" 557 "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0," 558 "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," 559 "NULL,NULL,X'',X'');" 560 "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000," 561 "128976886618480000,128976886618480000,128976886618480000,-2097152,4," 562 "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," 563 "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" 564 "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" 565 "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" 566 "47');" 567 "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000," 568 "129002163642690000,129002163642690000,129002163642690000,-3145728,3," 569 "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 570 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" 571 "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" 572 "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" 573 "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" 574 "652E68746D6C1200');" 575 "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000," 576 "129001555500000000,129001555500000000,129001555500000000,1048576,7," 577 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 578 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" 579 "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" 580 "76F6F676C652E636F6D2F12084147464447415347');" 581 "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000," 582 "129053976170000000,129053976170000000,129053976170000000,-4194304,6," 583 "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 584 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 585 "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000," 586 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 587 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" 588 ",'google_chrome',NULL,NULL,NULL);" 589 "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000," 590 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 591 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 592 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 593 "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000," 594 "128976864758480000,128976864758480000,128976864758480000,1048576,1," 595 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," 596 "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 597 "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000," 598 "128976864758480000,128976864758480000,128976864758480000,2097152,2," 599 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 600 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 601 "X'C2881000',X'C2881000');" 602 "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000," 603 "129079956948440000,129079956948440000,129079956948440000,-1048576,8," 604 "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 605 "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," 606 "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" 607 "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" 608 "D2E6F72672F6F7468657212084146414756415346');" 609 "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000," 610 "129079957513650000,129079957513650000,129079957513650000,0,9," 611 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 612 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 613 "X'C2881000');" 614 "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000," 615 "129079957985300000,129079957985300000,129079957985300000,-917504,10," 616 "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 617 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 618 "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," 619 "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" 620 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" 621 "E636F6D2F120744414146415346');" 622 "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000," 623 "129079958383000000,129079958383000000,129079958383000000,1048576,11," 624 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 625 "'The WebKit Open Source Project','The WebKit Open Source Project'," 626 "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 627 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E" 628 "473259');" 629 "CREATE TABLE models (model_id BLOB primary key, " 630 "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);" 631 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 632 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, " 633 "store_birthday TEXT, db_create_version TEXT, db_create_time INT, " 634 "next_id INT default -2, cache_guid TEXT);" 635 "INSERT INTO 'share_info' VALUES('nick (at) chromium.org','nick (at) chromium.org'," 636 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542," 637 "'9010788312004066376x-6609234393368420856x');")); 638 ASSERT_TRUE(connection.CommitTransaction()); 639 } 640 641 void MigrationTest::SetUpVersion72Database() { 642 sql::Connection connection; 643 ASSERT_TRUE(connection.Open(GetDatabasePath())); 644 ASSERT_TRUE(connection.BeginTransaction()); 645 ASSERT_TRUE(connection.Execute( 646 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 647 "INSERT INTO 'share_version' VALUES('nick (at) chromium.org',72);" 648 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 649 "base_version bigint default -1,server_version bigint default 0," 650 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint " 651 "default 0,server_ctime bigint default 0,server_position_in_parent " 652 "bigint default 0,local_external_id bigint default 0,id varchar(255) " 653 "default 'r',parent_id varchar(255) default 'r',server_parent_id " 654 "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id " 655 "varchar(255) default 'r',is_unsynced bit default 0," 656 "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit " 657 "default 0,server_is_dir bit default 0,server_is_del bit default 0," 658 "non_unique_name varchar,server_non_unique_name varchar(255)," 659 "unique_server_tag varchar,unique_client_tag varchar,specifics blob," 660 "server_specifics blob);" 661 "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0," 662 "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," 663 "NULL,NULL,X'',X'');" 664 "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000," 665 "128976886618480000,128976886618480000,128976886618480000,-2097152,4," 666 "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," 667 "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" 668 "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" 669 "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" 670 "47');" 671 "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000," 672 "129002163642690000,129002163642690000,129002163642690000,-3145728,3," 673 "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 674 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" 675 "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" 676 "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" 677 "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" 678 "652E68746D6C1200');" 679 "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000," 680 "129001555500000000,129001555500000000,129001555500000000,1048576,7," 681 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 682 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" 683 "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" 684 "76F6F676C652E636F6D2F12084147464447415347');" 685 "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000," 686 "129053976170000000,129053976170000000,129053976170000000,-4194304,6," 687 "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 688 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 689 "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000," 690 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 691 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" 692 ",'google_chrome',NULL,NULL,NULL);" 693 "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000," 694 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 695 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 696 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 697 "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000," 698 "128976864758480000,128976864758480000,128976864758480000,1048576,1," 699 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," 700 "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 701 "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000," 702 "128976864758480000,128976864758480000,128976864758480000,2097152,2," 703 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 704 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 705 "X'C2881000',X'C2881000');" 706 "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000," 707 "129079956948440000,129079956948440000,129079956948440000,-1048576,8," 708 "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 709 "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," 710 "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" 711 "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" 712 "D2E6F72672F6F7468657212084146414756415346');" 713 "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000," 714 "129079957513650000,129079957513650000,129079957513650000,0,9," 715 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 716 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 717 "X'C2881000');" 718 "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000," 719 "129079957985300000,129079957985300000,129079957985300000,-917504,10," 720 "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 721 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 722 "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," 723 "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" 724 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" 725 "E636F6D2F120744414146415346');" 726 "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000," 727 "129079958383000000,129079958383000000,129079958383000000,1048576,11," 728 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 729 "'The WebKit Open Source Project','The WebKit Open Source Project'," 730 "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 731 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E" 732 "473259');" 733 "CREATE TABLE models (model_id BLOB primary key, " 734 "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);" 735 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 736 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, " 737 "store_birthday TEXT, db_create_version TEXT, db_create_time INT, " 738 "next_id INT default -2, cache_guid TEXT);" 739 "INSERT INTO 'share_info' VALUES('nick (at) chromium.org','nick (at) chromium.org'," 740 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542," 741 "'9010788312004066376x-6609234393368420856x');")); 742 ASSERT_TRUE(connection.CommitTransaction()); 743 } 744 745 void MigrationTest::SetUpVersion73Database() { 746 sql::Connection connection; 747 ASSERT_TRUE(connection.Open(GetDatabasePath())); 748 ASSERT_TRUE(connection.BeginTransaction()); 749 ASSERT_TRUE(connection.Execute( 750 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 751 "INSERT INTO 'share_version' VALUES('nick (at) chromium.org',73);" 752 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 753 "base_version bigint default -1,server_version bigint default 0," 754 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint " 755 "default 0,server_ctime bigint default 0,server_position_in_parent " 756 "bigint default 0,local_external_id bigint default 0,id varchar(255) " 757 "default 'r',parent_id varchar(255) default 'r',server_parent_id " 758 "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id " 759 "varchar(255) default 'r',is_unsynced bit default 0," 760 "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit " 761 "default 0,server_is_dir bit default 0,server_is_del bit default 0," 762 "non_unique_name varchar,server_non_unique_name varchar(255)," 763 "unique_server_tag varchar,unique_client_tag varchar,specifics blob," 764 "server_specifics blob);" 765 "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0," 766 "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," 767 "NULL,NULL,X'',X'');" 768 "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000," 769 "128976886618480000,128976886618480000,128976886618480000,-2097152,4," 770 "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," 771 "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" 772 "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" 773 "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" 774 "47');" 775 "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000," 776 "129002163642690000,129002163642690000,129002163642690000,-3145728,3," 777 "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 778 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" 779 "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" 780 "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" 781 "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" 782 "652E68746D6C1200');" 783 "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000," 784 "129001555500000000,129001555500000000,129001555500000000,1048576,7," 785 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 786 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" 787 "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" 788 "76F6F676C652E636F6D2F12084147464447415347');" 789 "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000," 790 "129053976170000000,129053976170000000,129053976170000000,-4194304,6," 791 "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 792 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 793 "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000," 794 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 795 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" 796 ",'google_chrome',NULL,NULL,NULL);" 797 "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000," 798 "128976864758480000,128976864758480000,128976864758480000,1048576,0," 799 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 800 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 801 "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000," 802 "128976864758480000,128976864758480000,128976864758480000,1048576,1," 803 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," 804 "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 805 "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000," 806 "128976864758480000,128976864758480000,128976864758480000,2097152,2," 807 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 808 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 809 "X'C2881000',X'C2881000');" 810 "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000," 811 "129079956948440000,129079956948440000,129079956948440000,-1048576,8," 812 "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 813 "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," 814 "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" 815 "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" 816 "D2E6F72672F6F7468657212084146414756415346');" 817 "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000," 818 "129079957513650000,129079957513650000,129079957513650000,0,9," 819 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 820 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 821 "X'C2881000');" 822 "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000," 823 "129079957985300000,129079957985300000,129079957985300000,-917504,10," 824 "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 825 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 826 "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," 827 "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" 828 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" 829 "E636F6D2F120744414146415346');" 830 "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000," 831 "129079958383000000,129079958383000000,129079958383000000,1048576,11," 832 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 833 "'The WebKit Open Source Project','The WebKit Open Source Project'," 834 "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 835 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E" 836 "473259');" 837 "CREATE TABLE models (model_id BLOB primary key, " 838 "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);" 839 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 840 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, " 841 "store_birthday TEXT, db_create_version TEXT, db_create_time INT, " 842 "next_id INT default -2, cache_guid TEXT, " 843 "notification_state BLOB);" 844 "INSERT INTO 'share_info' VALUES('nick (at) chromium.org','nick (at) chromium.org'," 845 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542," 846 "'9010788312004066376x-6609234393368420856x',X'C2881000');")); 847 ASSERT_TRUE(connection.CommitTransaction()); 848 } 849 850 void MigrationTest::SetUpVersion74Database() { 851 sql::Connection connection; 852 ASSERT_TRUE(connection.Open(GetDatabasePath())); 853 ASSERT_TRUE(connection.BeginTransaction()); 854 ASSERT_TRUE(connection.Execute( 855 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 856 "INSERT INTO 'share_version' VALUES('nick (at) chromium.org',74);" 857 "CREATE TABLE models (model_id BLOB primary key, last_download_timestamp" 858 " INT, initial_sync_ended BOOLEAN default 0);" 859 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 860 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthd" 861 "ay TEXT, db_create_version TEXT, db_create_time INT, next_id INT de" 862 "fault -2, cache_guid TEXT , notification_state BLOB, autofill_migra" 863 "tion_state INT default 0, bookmarks_added_during_autofill_migration" 864 " INT default 0, autofill_migration_time INT default 0, autofill_ent" 865 "ries_added_during_migration INT default 0, autofill_profiles_added_" 866 "during_migration INT default 0);" 867 "INSERT INTO 'share_info' VALUES('nick (at) chromium.org','nick (at) chromium.org'" 868 ",'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542" 869 ",'9010788312004066376x-6609234393368420856x',NULL,0,0,0,0,0);" 870 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,bas" 871 "e_version bigint default -1,server_version bigint default 0,mtime b" 872 "igint default 0,server_mtime bigint default 0,ctime bigint default " 873 "0,server_ctime bigint default 0,server_position_in_parent bigint de" 874 "fault 0,local_external_id bigint default 0,id varchar(255) default " 875 "'r',parent_id varchar(255) default 'r',server_parent_id varchar(255" 876 ") default 'r',prev_id varchar(255) default 'r',next_id varchar(255)" 877 " default 'r',is_unsynced bit default 0,is_unapplied_update bit defa" 878 "ult 0,is_del bit default 0,is_dir bit default 0,server_is_dir bit d" 879 "efault 0,server_is_del bit default 0,non_unique_name varchar,server" 880 "_non_unique_name varchar(255),unique_server_tag varchar,unique_clie" 881 "nt_tag varchar,specifics blob,server_specifics blob);" 882 "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,1290799566403200" 883 "00,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'" 884 "');" 885 "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,128976886618480" 886 "000,128976886618480000,128976886618480000,-2097152,4,'s_ID_2','s_ID" 887 "_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Item','Deleted " 888 "Item',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E6" 889 "36F6D2F12084141534741534741',X'C28810260A17687474703A2F2F7777772E67" 890 "6F6F676C652E636F6D2F32120B4153414447414447414447');" 891 "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,129002163642690" 892 "000,129002163642690000,129002163642690000,-3145728,3,'s_ID_4','s_ID" 893 "_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to Chromium','W" 894 "elcome to Chromium',NULL,NULL,X'C28810350A31687474703A2F2F7777772E6" 895 "76F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E" 896 "68746D6C1200',X'C28810350A31687474703A2F2F7777772E676F6F676C652E636" 897 "F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E68746D6C1200');" 898 "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,129001555500000" 899 "000,129001555500000000,129001555500000000,1048576,7,'s_ID_5','s_ID_" 900 "9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Google',NULL,NU" 901 "LL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841" 902 "47415347415347',X'C28810220A16687474703A2F2F7777772E676F6F676C652E6" 903 "36F6D2F12084147464447415347');" 904 "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,129053976170000" 905 "000,129053976170000000,129053976170000000,-4194304,6,'s_ID_6','s_ID" 906 "_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The Internet',NULL" 907 ",NULL,X'C2881000',X'C2881000');" 908 "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,128976864758480" 909 "000,128976864758480000,128976864758480000,1048576,0,'s_ID_7','r','r" 910 "','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','google_chrom" 911 "e',NULL,NULL,NULL);" 912 "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,128976864758480" 913 "000,128976864758480000,128976864758480000,1048576,0,'s_ID_8','s_ID_" 914 "7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks','google_chr" 915 "ome_bookmarks',NULL,X'C2881000',X'C2881000');" 916 "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,128976864758480" 917 "000,128976864758480000,128976864758480000,1048576,1,'s_ID_9','s_ID_" 918 "8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','Bookmark Bar'" 919 ",'bookmark_bar',NULL,X'C2881000',X'C2881000');" 920 "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,12897686475848" 921 "0000,128976864758480000,128976864758480000,2097152,2,'s_ID_10','s_I" 922 "D_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks','Other Boo" 923 "kmarks','other_bookmarks',NULL,X'C2881000',X'C2881000');" 924 "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,12907995694844" 925 "0000,129079956948440000,129079956948440000,-1048576,8,'s_ID_11','s_" 926 "ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chromium Projec" 927 "ts)','Home (The Chromium Projects)',NULL,NULL,X'C28810220A186874747" 928 "03A2F2F6465762E6368726F6D69756D2E6F72672F1206414741545741',X'C28810" 929 "290A1D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F74686572120" 930 "84146414756415346');" 931 "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,12907995751365" 932 "0000,129079957513650000,129079957513650000,0,9,'s_ID_12','s_ID_6','" 933 "s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bo" 934 "okmarks',NULL,NULL,X'C2881000',X'C2881000');" 935 "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,12907995798530" 936 "0000,129079957985300000,129079957985300000,-917504,10,'s_ID_13','s_" 937 "ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN | Internet Co" 938 "rporation for Assigned Names and Numbers','ICANN | Internet Corpora" 939 "tion for Assigned Names and Numbers',NULL,NULL,X'C28810240A15687474" 940 "703A2F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646',X'C" 941 "28810200A15687474703A2F2F7777772E6963616E6E2E636F6D2F12074441414641" 942 "5346');" 943 "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,12907995838300" 944 "0000,129079958383000000,129079958383000000,1048576,11,'s_ID_14','s_" 945 "ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Open Source Pr" 946 "oject','The WebKit Open Source Project',NULL,NULL,X'C288101A0A12687" 947 "474703A2F2F7765626B69742E6F72672F1204504E4758',X'C288101C0A13687474" 948 "703A2F2F7765626B69742E6F72672F781205504E473259');" 949 )); 950 ASSERT_TRUE(connection.CommitTransaction()); 951 } 952 953 TEST_F(DirectoryBackingStoreTest, MigrateVersion67To68) { 954 SetUpVersion67Database(); 955 956 { 957 sql::Connection connection; 958 ASSERT_TRUE(connection.Open(GetDatabasePath())); 959 960 // Columns existing before version 67. 961 ASSERT_TRUE(connection.DoesColumnExist("metas", "name")); 962 ASSERT_TRUE(connection.DoesColumnExist("metas", "unsanitized_name")); 963 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_name")); 964 } 965 966 scoped_ptr<DirectoryBackingStore> dbs( 967 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 968 969 dbs->BeginLoad(); 970 ASSERT_FALSE(dbs->needs_column_refresh_); 971 ASSERT_TRUE(dbs->MigrateVersion67To68()); 972 ASSERT_EQ(68, dbs->GetVersion()); 973 dbs->EndLoad(); 974 ASSERT_TRUE(dbs->needs_column_refresh_); 975 } 976 977 TEST_F(DirectoryBackingStoreTest, MigrateVersion68To69) { 978 SetUpVersion68Database(); 979 980 scoped_ptr<DirectoryBackingStore> dbs( 981 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 982 983 dbs->BeginLoad(); 984 ASSERT_FALSE(dbs->needs_column_refresh_); 985 ASSERT_TRUE(dbs->MigrateVersion68To69()); 986 ASSERT_EQ(69, dbs->GetVersion()); 987 dbs->EndLoad(); 988 ASSERT_TRUE(dbs->needs_column_refresh_); 989 990 sql::Connection connection; 991 ASSERT_TRUE(connection.Open(GetDatabasePath())); 992 ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics")); 993 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics")); 994 sql::Statement s(connection.GetUniqueStatement("SELECT non_unique_name," 995 "is_del, is_dir, id, specifics, server_specifics FROM metas " 996 "WHERE metahandle = 2")); 997 ASSERT_TRUE(s.Step()); 998 ASSERT_EQ("Deleted Item", s.ColumnString(0)); 999 ASSERT_TRUE(s.ColumnBool(1)); 1000 ASSERT_FALSE(s.ColumnBool(2)); 1001 ASSERT_EQ("s_ID_2", s.ColumnString(3)); 1002 sync_pb::EntitySpecifics specifics; 1003 specifics.ParseFromArray(s.ColumnBlob(4), s.ColumnByteLength(4)); 1004 ASSERT_TRUE(specifics.HasExtension(sync_pb::bookmark)); 1005 ASSERT_EQ("http://www.google.com/", 1006 specifics.GetExtension(sync_pb::bookmark).url()); 1007 ASSERT_EQ("AASGASGA", specifics.GetExtension(sync_pb::bookmark).favicon()); 1008 specifics.ParseFromArray(s.ColumnBlob(5), s.ColumnByteLength(5)); 1009 ASSERT_TRUE(specifics.HasExtension(sync_pb::bookmark)); 1010 ASSERT_EQ("http://www.google.com/2", 1011 specifics.GetExtension(sync_pb::bookmark).url()); 1012 ASSERT_EQ("ASADGADGADG", specifics.GetExtension(sync_pb::bookmark).favicon()); 1013 ASSERT_FALSE(s.Step()); 1014 } 1015 1016 TEST_F(DirectoryBackingStoreTest, MigrateVersion69To70) { 1017 SetUpVersion69Database(); 1018 1019 { 1020 sql::Connection connection; 1021 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1022 1023 ASSERT_TRUE(connection.DoesColumnExist("metas", "singleton_tag")); 1024 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_server_tag")); 1025 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_client_tag")); 1026 } 1027 1028 scoped_ptr<DirectoryBackingStore> dbs( 1029 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1030 1031 dbs->BeginLoad(); 1032 ASSERT_FALSE(dbs->needs_column_refresh_); 1033 ASSERT_TRUE(dbs->MigrateVersion69To70()); 1034 ASSERT_EQ(70, dbs->GetVersion()); 1035 dbs->EndLoad(); 1036 ASSERT_TRUE(dbs->needs_column_refresh_); 1037 1038 sql::Connection connection; 1039 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1040 1041 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); 1042 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); 1043 sql::Statement s(connection.GetUniqueStatement("SELECT id" 1044 " FROM metas WHERE unique_server_tag = 'google_chrome'")); 1045 ASSERT_TRUE(s.Step()); 1046 EXPECT_EQ("s_ID_7", s.ColumnString(0)); 1047 } 1048 1049 TEST_F(DirectoryBackingStoreTest, MigrateVersion70To71) { 1050 SetUpVersion70Database(); 1051 1052 { 1053 sql::Connection connection; 1054 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1055 ASSERT_TRUE( 1056 connection.DoesColumnExist("share_info", "last_sync_timestamp")); 1057 ASSERT_TRUE( 1058 connection.DoesColumnExist("share_info", "initial_sync_ended")); 1059 ASSERT_FALSE(connection.DoesTableExist("models")); 1060 } 1061 1062 scoped_ptr<DirectoryBackingStore> dbs( 1063 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1064 1065 dbs->BeginLoad(); 1066 ASSERT_FALSE(dbs->needs_column_refresh_); 1067 ASSERT_TRUE(dbs->MigrateVersion70To71()); 1068 ASSERT_EQ(71, dbs->GetVersion()); 1069 dbs->EndLoad(); 1070 ASSERT_FALSE(dbs->needs_column_refresh_); 1071 1072 sql::Connection connection; 1073 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1074 1075 ASSERT_FALSE( 1076 connection.DoesColumnExist("share_info", "last_sync_timestamp")); 1077 ASSERT_FALSE( 1078 connection.DoesColumnExist("share_info", "initial_sync_ended")); 1079 ASSERT_TRUE(connection.DoesTableExist("models")); 1080 ASSERT_TRUE( 1081 connection.DoesColumnExist("models", "initial_sync_ended")); 1082 ASSERT_TRUE( 1083 connection.DoesColumnExist("models", "last_download_timestamp")); 1084 ASSERT_TRUE( 1085 connection.DoesColumnExist("models", "model_id")); 1086 1087 sql::Statement s(connection.GetUniqueStatement("SELECT model_id, " 1088 "initial_sync_ended, last_download_timestamp FROM models")); 1089 ASSERT_TRUE(s.Step()); 1090 std::string model_id = s.ColumnString(0); 1091 EXPECT_EQ("C2881000", base::HexEncode(model_id.data(), model_id.size())) 1092 << "Model ID is expected to be the empty BookmarkSpecifics proto."; 1093 EXPECT_TRUE(s.ColumnBool(1)); 1094 EXPECT_EQ(694, s.ColumnInt64(2)); 1095 ASSERT_FALSE(s.Step()); 1096 } 1097 1098 1099 TEST_F(DirectoryBackingStoreTest, MigrateVersion71To72) { 1100 SetUpVersion71Database(); 1101 1102 { 1103 sql::Connection connection; 1104 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1105 ASSERT_TRUE(connection.DoesTableExist("extended_attributes")); 1106 } 1107 1108 scoped_ptr<DirectoryBackingStore> dbs( 1109 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1110 1111 dbs->BeginLoad(); 1112 ASSERT_FALSE(dbs->needs_column_refresh_); 1113 ASSERT_TRUE(dbs->MigrateVersion71To72()); 1114 ASSERT_EQ(72, dbs->GetVersion()); 1115 dbs->EndLoad(); 1116 ASSERT_FALSE(dbs->needs_column_refresh_); 1117 1118 sql::Connection connection; 1119 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1120 ASSERT_FALSE(connection.DoesTableExist("extended_attributes")); 1121 } 1122 1123 TEST_F(DirectoryBackingStoreTest, MigrateVersion72To73) { 1124 SetUpVersion72Database(); 1125 1126 { 1127 sql::Connection connection; 1128 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1129 ASSERT_FALSE( 1130 connection.DoesColumnExist("share_info", "notification_state")); 1131 } 1132 1133 scoped_ptr<DirectoryBackingStore> dbs( 1134 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1135 1136 dbs->BeginLoad(); 1137 ASSERT_FALSE(dbs->needs_column_refresh_); 1138 ASSERT_TRUE(dbs->MigrateVersion72To73()); 1139 ASSERT_EQ(73, dbs->GetVersion()); 1140 dbs->EndLoad(); 1141 ASSERT_FALSE(dbs->needs_column_refresh_); 1142 1143 sql::Connection connection; 1144 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1145 ASSERT_TRUE( 1146 connection.DoesColumnExist("share_info", "notification_state")); 1147 } 1148 1149 TEST_F(DirectoryBackingStoreTest, MigrateVersion73To74) { 1150 SetUpVersion73Database(); 1151 1152 { 1153 sql::Connection connection; 1154 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1155 ASSERT_FALSE( 1156 connection.DoesColumnExist("share_info", "autofill_migration_state")); 1157 ASSERT_FALSE( 1158 connection.DoesColumnExist("share_info", 1159 "bookmarks_added_during_autofill_migration")); 1160 ASSERT_FALSE( 1161 connection.DoesColumnExist("share_info", "autofill_migration_time")); 1162 ASSERT_FALSE( 1163 connection.DoesColumnExist("share_info", 1164 "autofill_entries_added_during_migration")); 1165 1166 ASSERT_FALSE( 1167 connection.DoesColumnExist("share_info", 1168 "autofill_profiles_added_during_migration")); 1169 } 1170 1171 scoped_ptr<DirectoryBackingStore> dbs( 1172 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1173 1174 dbs->BeginLoad(); 1175 ASSERT_FALSE(dbs->needs_column_refresh_); 1176 ASSERT_TRUE(dbs->MigrateVersion73To74()); 1177 ASSERT_EQ(74, dbs->GetVersion()); 1178 dbs->EndLoad(); 1179 ASSERT_FALSE(dbs->needs_column_refresh_); 1180 1181 sql::Connection connection; 1182 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1183 ASSERT_TRUE( 1184 connection.DoesColumnExist("share_info", "autofill_migration_state")); 1185 ASSERT_TRUE( 1186 connection.DoesColumnExist("share_info", 1187 "bookmarks_added_during_autofill_migration")); 1188 ASSERT_TRUE( 1189 connection.DoesColumnExist("share_info", "autofill_migration_time")); 1190 ASSERT_TRUE( 1191 connection.DoesColumnExist("share_info", 1192 "autofill_entries_added_during_migration")); 1193 1194 ASSERT_TRUE( 1195 connection.DoesColumnExist("share_info", 1196 "autofill_profiles_added_during_migration")); 1197 } 1198 1199 TEST_F(DirectoryBackingStoreTest, MigrateVersion74To75) { 1200 SetUpVersion74Database(); 1201 1202 { 1203 sql::Connection connection; 1204 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1205 ASSERT_FALSE(connection.DoesColumnExist("models", "progress_marker")); 1206 ASSERT_TRUE(connection.DoesColumnExist("models", 1207 "last_download_timestamp")); 1208 } 1209 1210 scoped_ptr<DirectoryBackingStore> dbs( 1211 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1212 1213 dbs->BeginLoad(); 1214 ASSERT_FALSE(dbs->needs_column_refresh_); 1215 ASSERT_TRUE(dbs->MigrateVersion74To75()); 1216 ASSERT_EQ(75, dbs->GetVersion()); 1217 dbs->EndLoad(); 1218 ASSERT_FALSE(dbs->needs_column_refresh_); 1219 1220 sql::Connection connection; 1221 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1222 1223 ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker")); 1224 ASSERT_FALSE(connection.DoesColumnExist("models", 1225 "last_download_timestamp")); 1226 } 1227 1228 TEST_P(MigrationTest, ToCurrentVersion) { 1229 switch (GetParam()) { 1230 case 67: 1231 SetUpVersion67Database(); 1232 break; 1233 case 68: 1234 SetUpVersion68Database(); 1235 break; 1236 case 69: 1237 SetUpVersion69Database(); 1238 break; 1239 case 70: 1240 SetUpVersion70Database(); 1241 break; 1242 case 71: 1243 SetUpVersion71Database(); 1244 break; 1245 case 72: 1246 SetUpVersion72Database(); 1247 break; 1248 case 73: 1249 SetUpVersion73Database(); 1250 break; 1251 case 74: 1252 SetUpVersion74Database(); 1253 break; 1254 default: 1255 // If you see this error, it may mean that you've increased the 1256 // database version number but you haven't finished adding unit tests 1257 // for the database migration code. You need to need to supply a 1258 // SetUpVersionXXDatabase function with a dump of the test database 1259 // at the old schema. Here's one way to do that: 1260 // 1. Start on a clean tree (with none of your pending schema changes). 1261 // 2. Set a breakpoint in this function and run the unit test. 1262 // 3. Allow this test to run to completion (step out of the call), 1263 // without allowing ~MigrationTest to execute. 1264 // 4. Examine this->scoped_dir_ to determine the location of the 1265 // test database (it is currently of the version you need). 1266 // 5. Dump this using the sqlite command line tool: 1267 // > .output foo_dump.sql 1268 // > .dump 1269 FAIL() << "Need to supply database dump for version " << GetParam(); 1270 } 1271 1272 scoped_ptr<DirectoryBackingStore> dbs( 1273 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1274 1275 dbs->BeginLoad(); 1276 ASSERT_TRUE(OPENED == dbs->InitializeTables()); 1277 ASSERT_FALSE(dbs->needs_column_refresh_); 1278 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); 1279 1280 { 1281 sql::Connection connection; 1282 ASSERT_TRUE(connection.Open(GetDatabasePath())); 1283 1284 // Columns deleted in Version 67. 1285 ASSERT_FALSE(connection.DoesColumnExist("metas", "name")); 1286 ASSERT_FALSE(connection.DoesColumnExist("metas", "unsanitized_name")); 1287 ASSERT_FALSE(connection.DoesColumnExist("metas", "server_name")); 1288 1289 // Columns added in Version 68. 1290 ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics")); 1291 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics")); 1292 1293 // Columns deleted in Version 68. 1294 ASSERT_FALSE(connection.DoesColumnExist("metas", "is_bookmark_object")); 1295 ASSERT_FALSE(connection.DoesColumnExist("metas", 1296 "server_is_bookmark_object")); 1297 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_favicon")); 1298 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_url")); 1299 ASSERT_FALSE(connection.DoesColumnExist("metas", "server_bookmark_url")); 1300 1301 // Renamed a column in Version 70 1302 ASSERT_FALSE(connection.DoesColumnExist("metas", "singleton_tag")); 1303 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); 1304 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); 1305 1306 // Removed extended attributes in Version 72. 1307 ASSERT_FALSE(connection.DoesTableExist("extended_attributes")); 1308 1309 // Columns added in Version 73. 1310 ASSERT_TRUE(connection.DoesColumnExist( 1311 "share_info", "notification_state")); 1312 1313 // Columns added in version 74. 1314 ASSERT_TRUE(connection.DoesColumnExist("share_info", 1315 "autofill_migration_state")); 1316 1317 // Column replaced in version 75. 1318 ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker")); 1319 ASSERT_FALSE(connection.DoesColumnExist("models", 1320 "last_download_timestamp")); 1321 } 1322 { 1323 syncable::Directory::KernelLoadInfo dir_info; 1324 dbs->LoadInfo(&dir_info); 1325 1326 // Check download_progress state (v75 migration) 1327 ASSERT_EQ(694, 1328 dir_info.kernel_info.download_progress[syncable::BOOKMARKS] 1329 .timestamp_token_for_migration()); 1330 ASSERT_FALSE( 1331 dir_info.kernel_info.download_progress[syncable::BOOKMARKS] 1332 .has_token()); 1333 ASSERT_EQ(32904, 1334 dir_info.kernel_info.download_progress[syncable::BOOKMARKS] 1335 .data_type_id()); 1336 ASSERT_FALSE( 1337 dir_info.kernel_info.download_progress[syncable::THEMES] 1338 .has_timestamp_token_for_migration()); 1339 ASSERT_TRUE( 1340 dir_info.kernel_info.download_progress[syncable::THEMES] 1341 .has_token()); 1342 ASSERT_TRUE( 1343 dir_info.kernel_info.download_progress[syncable::THEMES] 1344 .token().empty()); 1345 ASSERT_EQ(41210, 1346 dir_info.kernel_info.download_progress[syncable::THEMES] 1347 .data_type_id()); 1348 } 1349 1350 MetahandlesIndex index; 1351 STLElementDeleter<MetahandlesIndex> index_deleter(&index); 1352 dbs->LoadEntries(&index); 1353 dbs->EndLoad(); 1354 1355 MetahandlesIndex::iterator it = index.begin(); 1356 ASSERT_TRUE(it != index.end()); 1357 ASSERT_EQ(1, (*it)->ref(META_HANDLE)); 1358 EXPECT_TRUE((*it)->ref(ID).IsRoot()); 1359 1360 ASSERT_TRUE(++it != index.end()) << "Upgrade destroyed database contents."; 1361 ASSERT_EQ(2, (*it)->ref(META_HANDLE)); 1362 EXPECT_TRUE((*it)->ref(IS_DEL)); 1363 EXPECT_TRUE((*it)->ref(SERVER_IS_DEL)); 1364 EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark)); 1365 EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark)); 1366 EXPECT_EQ("http://www.google.com/", 1367 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).url()); 1368 EXPECT_EQ("AASGASGA", 1369 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).favicon()); 1370 EXPECT_EQ("http://www.google.com/2", 1371 (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).url()); 1372 EXPECT_EQ("ASADGADGADG", 1373 (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).favicon()); 1374 EXPECT_EQ("", (*it)->ref(UNIQUE_SERVER_TAG)); 1375 EXPECT_EQ("Deleted Item", (*it)->ref(NON_UNIQUE_NAME)); 1376 EXPECT_EQ("Deleted Item", (*it)->ref(SERVER_NON_UNIQUE_NAME)); 1377 1378 ASSERT_TRUE(++it != index.end()); 1379 ASSERT_EQ(4, (*it)->ref(META_HANDLE)); 1380 EXPECT_TRUE((*it)->ref(IS_DEL)); 1381 EXPECT_TRUE((*it)->ref(SERVER_IS_DEL)); 1382 1383 ASSERT_TRUE(++it != index.end()); 1384 ASSERT_EQ(5, (*it)->ref(META_HANDLE)); 1385 EXPECT_TRUE((*it)->ref(IS_DEL)); 1386 EXPECT_TRUE((*it)->ref(SERVER_IS_DEL)); 1387 1388 ASSERT_TRUE(++it != index.end()); 1389 ASSERT_EQ(6, (*it)->ref(META_HANDLE)); 1390 EXPECT_TRUE((*it)->ref(IS_DIR)); 1391 EXPECT_TRUE((*it)->ref(SERVER_IS_DIR)); 1392 EXPECT_FALSE( 1393 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_url()); 1394 EXPECT_FALSE( 1395 (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).has_url()); 1396 EXPECT_FALSE( 1397 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_favicon()); 1398 EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS). 1399 GetExtension(sync_pb::bookmark).has_favicon()); 1400 1401 ASSERT_TRUE(++it != index.end()); 1402 ASSERT_EQ(7, (*it)->ref(META_HANDLE)); 1403 EXPECT_EQ("google_chrome", (*it)->ref(UNIQUE_SERVER_TAG)); 1404 EXPECT_FALSE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark)); 1405 EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark)); 1406 1407 ASSERT_TRUE(++it != index.end()); 1408 ASSERT_EQ(8, (*it)->ref(META_HANDLE)); 1409 EXPECT_EQ("google_chrome_bookmarks", (*it)->ref(UNIQUE_SERVER_TAG)); 1410 EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark)); 1411 EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark)); 1412 1413 ASSERT_TRUE(++it != index.end()); 1414 ASSERT_EQ(9, (*it)->ref(META_HANDLE)); 1415 EXPECT_EQ("bookmark_bar", (*it)->ref(UNIQUE_SERVER_TAG)); 1416 EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark)); 1417 EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark)); 1418 1419 ASSERT_TRUE(++it != index.end()); 1420 ASSERT_EQ(10, (*it)->ref(META_HANDLE)); 1421 EXPECT_FALSE((*it)->ref(IS_DEL)); 1422 EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark)); 1423 EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark)); 1424 EXPECT_FALSE((*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_url()); 1425 EXPECT_FALSE( 1426 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_favicon()); 1427 EXPECT_FALSE( 1428 (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).has_url()); 1429 EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS). 1430 GetExtension(sync_pb::bookmark).has_favicon()); 1431 EXPECT_EQ("other_bookmarks", (*it)->ref(UNIQUE_SERVER_TAG)); 1432 EXPECT_EQ("Other Bookmarks", (*it)->ref(NON_UNIQUE_NAME)); 1433 EXPECT_EQ("Other Bookmarks", (*it)->ref(SERVER_NON_UNIQUE_NAME)); 1434 1435 ASSERT_TRUE(++it != index.end()); 1436 ASSERT_EQ(11, (*it)->ref(META_HANDLE)); 1437 EXPECT_FALSE((*it)->ref(IS_DEL)); 1438 EXPECT_FALSE((*it)->ref(IS_DIR)); 1439 EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark)); 1440 EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark)); 1441 EXPECT_EQ("http://dev.chromium.org/", 1442 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).url()); 1443 EXPECT_EQ("AGATWA", 1444 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).favicon()); 1445 EXPECT_EQ("http://dev.chromium.org/other", 1446 (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).url()); 1447 EXPECT_EQ("AFAGVASF", 1448 (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).favicon()); 1449 EXPECT_EQ("", (*it)->ref(UNIQUE_SERVER_TAG)); 1450 EXPECT_EQ("Home (The Chromium Projects)", (*it)->ref(NON_UNIQUE_NAME)); 1451 EXPECT_EQ("Home (The Chromium Projects)", (*it)->ref(SERVER_NON_UNIQUE_NAME)); 1452 1453 ASSERT_TRUE(++it != index.end()); 1454 ASSERT_EQ(12, (*it)->ref(META_HANDLE)); 1455 EXPECT_FALSE((*it)->ref(IS_DEL)); 1456 EXPECT_TRUE((*it)->ref(IS_DIR)); 1457 EXPECT_EQ("Extra Bookmarks", (*it)->ref(NON_UNIQUE_NAME)); 1458 EXPECT_EQ("Extra Bookmarks", (*it)->ref(SERVER_NON_UNIQUE_NAME)); 1459 EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark)); 1460 EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark)); 1461 EXPECT_FALSE( 1462 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_url()); 1463 EXPECT_FALSE( 1464 (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).has_url()); 1465 EXPECT_FALSE( 1466 (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_favicon()); 1467 EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS). 1468 GetExtension(sync_pb::bookmark).has_favicon()); 1469 1470 ASSERT_TRUE(++it != index.end()); 1471 ASSERT_EQ(13, (*it)->ref(META_HANDLE)); 1472 1473 ASSERT_TRUE(++it != index.end()); 1474 ASSERT_EQ(14, (*it)->ref(META_HANDLE)); 1475 1476 ASSERT_TRUE(++it == index.end()); 1477 } 1478 1479 INSTANTIATE_TEST_CASE_P(DirectoryBackingStore, MigrationTest, 1480 testing::Range(67, kCurrentDBVersion)); 1481 1482 TEST_F(DirectoryBackingStoreTest, ModelTypeIds) { 1483 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { 1484 std::string model_id = 1485 DirectoryBackingStore::ModelTypeEnumToModelId(ModelTypeFromInt(i)); 1486 EXPECT_EQ(i, 1487 DirectoryBackingStore::ModelIdToModelTypeEnum(model_id.data(), 1488 model_id.size())); 1489 } 1490 } 1491 1492 TEST_F(DirectoryBackingStoreTest, Corruption) { 1493 { 1494 scoped_ptr<DirectoryBackingStore> dbs( 1495 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1496 EXPECT_TRUE(dbs->BeginLoad()); 1497 } 1498 std::string bad_data("BAD DATA"); 1499 EXPECT_TRUE(file_util::WriteFile(GetDatabasePath(), bad_data.data(), 1500 bad_data.size())); 1501 { 1502 scoped_ptr<DirectoryBackingStore> dbs( 1503 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1504 1505 // In release mode, we expect the sync database to nuke itself and start 1506 // over if it detects invalid/corrupted data. 1507 #if defined(NDEBUG) 1508 EXPECT_TRUE(dbs->BeginLoad()); 1509 #else 1510 EXPECT_DEATH(dbs->BeginLoad(), "sqlite error"); 1511 #endif 1512 } 1513 } 1514 1515 TEST_F(DirectoryBackingStoreTest, DeleteEntries) { 1516 SetUpCurrentDatabaseAndCheckVersion(); 1517 scoped_ptr<DirectoryBackingStore> dbs( 1518 new DirectoryBackingStore(GetUsername(), GetDatabasePath())); 1519 dbs->BeginLoad(); 1520 MetahandlesIndex index; 1521 STLElementDeleter<MetahandlesIndex> index_deleter(&index); 1522 dbs->LoadEntries(&index); 1523 size_t initial_size = index.size(); 1524 ASSERT_LT(0U, initial_size) << "Test requires entries to delete."; 1525 int64 first_to_die = (*index.begin())->ref(META_HANDLE); 1526 MetahandleSet to_delete; 1527 to_delete.insert(first_to_die); 1528 EXPECT_TRUE(dbs->DeleteEntries(to_delete)); 1529 1530 STLDeleteElements(&index); 1531 dbs->LoadEntries(&index); 1532 1533 EXPECT_EQ(initial_size - 1, index.size()); 1534 bool delete_failed = false; 1535 for (MetahandlesIndex::iterator it = index.begin(); it != index.end(); 1536 ++it) { 1537 if ((*it)->ref(META_HANDLE) == first_to_die) { 1538 delete_failed = true; 1539 break; 1540 } 1541 } 1542 EXPECT_FALSE(delete_failed); 1543 1544 to_delete.clear(); 1545 for (MetahandlesIndex::iterator it = index.begin(); it != index.end(); 1546 ++it) { 1547 to_delete.insert((*it)->ref(META_HANDLE)); 1548 } 1549 1550 EXPECT_TRUE(dbs->DeleteEntries(to_delete)); 1551 1552 STLDeleteElements(&index); 1553 dbs->LoadEntries(&index); 1554 EXPECT_EQ(0U, index.size()); 1555 1556 dbs->EndLoad(); 1557 dbs->EndSave(); 1558 } 1559 1560 } // namespace syncable 1561