directory_backing_store_unittest.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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 3// found in the LICENSE file. 4 5#include "testing/gtest/include/gtest/gtest.h" 6 7#include <string> 8 9#include "base/file_util.h" 10#include "base/files/file_path.h" 11#include "base/files/scoped_temp_dir.h" 12#include "base/memory/scoped_ptr.h" 13#include "base/stl_util.h" 14#include "base/strings/string_number_conversions.h" 15#include "sql/connection.h" 16#include "sql/statement.h" 17#include "sync/base/sync_export.h" 18#include "sync/internal_api/public/base/node_ordinal.h" 19#include "sync/protocol/bookmark_specifics.pb.h" 20#include "sync/protocol/sync.pb.h" 21#include "sync/syncable/directory_backing_store.h" 22#include "sync/syncable/on_disk_directory_backing_store.h" 23#include "sync/syncable/syncable-inl.h" 24#include "sync/test/test_directory_backing_store.h" 25#include "sync/util/time.h" 26#include "testing/gtest/include/gtest/gtest-param-test.h" 27 28namespace syncer { 29namespace syncable { 30 31SYNC_EXPORT_PRIVATE extern const int32 kCurrentDBVersion; 32 33class MigrationTest : public testing::TestWithParam<int> { 34 public: 35 virtual void SetUp() { 36 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 37 } 38 39 protected: 40 std::string GetUsername() { 41 return "nick@chromium.org"; 42 } 43 44 base::FilePath GetDatabasePath() { 45 return temp_dir_.path().Append(Directory::kSyncDatabaseFilename); 46 } 47 48 static bool LoadAndIgnoreReturnedData(DirectoryBackingStore *dbs) { 49 Directory::MetahandlesMap tmp_handles_map; 50 JournalIndex delete_journals; 51 STLValueDeleter<Directory::MetahandlesMap> deleter(&tmp_handles_map); 52 Directory::KernelLoadInfo kernel_load_info; 53 return dbs->Load(&tmp_handles_map, &delete_journals, &kernel_load_info) == 54 OPENED; 55 } 56 57 void SetUpVersion67Database(sql::Connection* connection); 58 void SetUpVersion68Database(sql::Connection* connection); 59 void SetUpVersion69Database(sql::Connection* connection); 60 void SetUpVersion70Database(sql::Connection* connection); 61 void SetUpVersion71Database(sql::Connection* connection); 62 void SetUpVersion72Database(sql::Connection* connection); 63 void SetUpVersion73Database(sql::Connection* connection); 64 void SetUpVersion74Database(sql::Connection* connection); 65 void SetUpVersion75Database(sql::Connection* connection); 66 void SetUpVersion76Database(sql::Connection* connection); 67 void SetUpVersion77Database(sql::Connection* connection); 68 void SetUpVersion78Database(sql::Connection* connection); 69 void SetUpVersion79Database(sql::Connection* connection); 70 void SetUpVersion80Database(sql::Connection* connection); 71 void SetUpVersion81Database(sql::Connection* connection); 72 void SetUpVersion82Database(sql::Connection* connection); 73 void SetUpVersion83Database(sql::Connection* connection); 74 void SetUpVersion84Database(sql::Connection* connection); 75 void SetUpVersion85Database(sql::Connection* connection); 76 void SetUpVersion86Database(sql::Connection* connection); 77 void SetUpVersion87Database(sql::Connection* connection); 78 79 void SetUpCurrentDatabaseAndCheckVersion(sql::Connection* connection) { 80 SetUpVersion87Database(connection); // Prepopulates data. 81 scoped_ptr<TestDirectoryBackingStore> dbs( 82 new TestDirectoryBackingStore(GetUsername(), connection)); 83 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); 84 85 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); 86 ASSERT_FALSE(dbs->needs_column_refresh_); 87 } 88 89 private: 90 base::ScopedTempDir temp_dir_; 91}; 92 93class DirectoryBackingStoreTest : public MigrationTest {}; 94 95#if defined(OS_WIN) 96 97// On Windows, we used to store timestamps in FILETIME format. 98#define LEGACY_META_PROTO_TIMES_1 129079956640320000LL 99#define LEGACY_META_PROTO_TIMES_2 128976886618480000LL 100#define LEGACY_META_PROTO_TIMES_4 129002163642690000LL 101#define LEGACY_META_PROTO_TIMES_5 129001555500000000LL 102#define LEGACY_META_PROTO_TIMES_6 129053976170000000LL 103#define LEGACY_META_PROTO_TIMES_7 128976864758480000LL 104#define LEGACY_META_PROTO_TIMES_8 128976864758480000LL 105#define LEGACY_META_PROTO_TIMES_9 128976864758480000LL 106#define LEGACY_META_PROTO_TIMES_10 128976864758480000LL 107#define LEGACY_META_PROTO_TIMES_11 129079956948440000LL 108#define LEGACY_META_PROTO_TIMES_12 129079957513650000LL 109#define LEGACY_META_PROTO_TIMES_13 129079957985300000LL 110#define LEGACY_META_PROTO_TIMES_14 129079958383000000LL 111 112#define LEGACY_META_PROTO_TIMES_STR_1 "129079956640320000" 113#define LEGACY_META_PROTO_TIMES_STR_2 "128976886618480000" 114#define LEGACY_META_PROTO_TIMES_STR_4 "129002163642690000" 115#define LEGACY_META_PROTO_TIMES_STR_5 "129001555500000000" 116#define LEGACY_META_PROTO_TIMES_STR_6 "129053976170000000" 117#define LEGACY_META_PROTO_TIMES_STR_7 "128976864758480000" 118#define LEGACY_META_PROTO_TIMES_STR_8 "128976864758480000" 119#define LEGACY_META_PROTO_TIMES_STR_9 "128976864758480000" 120#define LEGACY_META_PROTO_TIMES_STR_10 "128976864758480000" 121#define LEGACY_META_PROTO_TIMES_STR_11 "129079956948440000" 122#define LEGACY_META_PROTO_TIMES_STR_12 "129079957513650000" 123#define LEGACY_META_PROTO_TIMES_STR_13 "129079957985300000" 124#define LEGACY_META_PROTO_TIMES_STR_14 "129079958383000000" 125 126// Generated via: 127// 128// ruby -ane '$F[1].sub!("LEGACY_", ""); $F[2] = Integer($F[2].sub!("LL", "")) / 129// 10000 - 11644473600000; print "#{$F[0]} #{$F[1]} #{$F[2]}LL"' 130// 131// Magic numbers taken from 132// http://stackoverflow.com/questions/5398557/ 133// java-library-for-dealing-with-win32-filetime . 134 135// Now we store them in Java format (ms since the Unix epoch). 136#define META_PROTO_TIMES_1 1263522064032LL 137#define META_PROTO_TIMES_2 1253215061848LL 138#define META_PROTO_TIMES_4 1255742764269LL 139#define META_PROTO_TIMES_5 1255681950000LL 140#define META_PROTO_TIMES_6 1260924017000LL 141#define META_PROTO_TIMES_7 1253212875848LL 142#define META_PROTO_TIMES_8 1253212875848LL 143#define META_PROTO_TIMES_9 1253212875848LL 144#define META_PROTO_TIMES_10 1253212875848LL 145#define META_PROTO_TIMES_11 1263522094844LL 146#define META_PROTO_TIMES_12 1263522151365LL 147#define META_PROTO_TIMES_13 1263522198530LL 148#define META_PROTO_TIMES_14 1263522238300LL 149 150#define META_PROTO_TIMES_STR_1 "1263522064032" 151#define META_PROTO_TIMES_STR_2 "1253215061848" 152#define META_PROTO_TIMES_STR_4 "1255742764269" 153#define META_PROTO_TIMES_STR_5 "1255681950000" 154#define META_PROTO_TIMES_STR_6 "1260924017000" 155#define META_PROTO_TIMES_STR_7 "1253212875848" 156#define META_PROTO_TIMES_STR_8 "1253212875848" 157#define META_PROTO_TIMES_STR_9 "1253212875848" 158#define META_PROTO_TIMES_STR_10 "1253212875848" 159#define META_PROTO_TIMES_STR_11 "1263522094844" 160#define META_PROTO_TIMES_STR_12 "1263522151365" 161#define META_PROTO_TIMES_STR_13 "1263522198530" 162#define META_PROTO_TIMES_STR_14 "1263522238300" 163 164#else 165 166// On other platforms, we used to store timestamps in time_t format (s 167// since the Unix epoch). 168#define LEGACY_META_PROTO_TIMES_1 1263522064LL 169#define LEGACY_META_PROTO_TIMES_2 1253215061LL 170#define LEGACY_META_PROTO_TIMES_4 1255742764LL 171#define LEGACY_META_PROTO_TIMES_5 1255681950LL 172#define LEGACY_META_PROTO_TIMES_6 1260924017LL 173#define LEGACY_META_PROTO_TIMES_7 1253212875LL 174#define LEGACY_META_PROTO_TIMES_8 1253212875LL 175#define LEGACY_META_PROTO_TIMES_9 1253212875LL 176#define LEGACY_META_PROTO_TIMES_10 1253212875LL 177#define LEGACY_META_PROTO_TIMES_11 1263522094LL 178#define LEGACY_META_PROTO_TIMES_12 1263522151LL 179#define LEGACY_META_PROTO_TIMES_13 1263522198LL 180#define LEGACY_META_PROTO_TIMES_14 1263522238LL 181 182#define LEGACY_META_PROTO_TIMES_STR_1 "1263522064" 183#define LEGACY_META_PROTO_TIMES_STR_2 "1253215061" 184#define LEGACY_META_PROTO_TIMES_STR_4 "1255742764" 185#define LEGACY_META_PROTO_TIMES_STR_5 "1255681950" 186#define LEGACY_META_PROTO_TIMES_STR_6 "1260924017" 187#define LEGACY_META_PROTO_TIMES_STR_7 "1253212875" 188#define LEGACY_META_PROTO_TIMES_STR_8 "1253212875" 189#define LEGACY_META_PROTO_TIMES_STR_9 "1253212875" 190#define LEGACY_META_PROTO_TIMES_STR_10 "1253212875" 191#define LEGACY_META_PROTO_TIMES_STR_11 "1263522094" 192#define LEGACY_META_PROTO_TIMES_STR_12 "1263522151" 193#define LEGACY_META_PROTO_TIMES_STR_13 "1263522198" 194#define LEGACY_META_PROTO_TIMES_STR_14 "1263522238" 195 196// Now we store them in Java format (ms since the Unix epoch). 197#define META_PROTO_TIMES_1 1263522064000LL 198#define META_PROTO_TIMES_2 1253215061000LL 199#define META_PROTO_TIMES_4 1255742764000LL 200#define META_PROTO_TIMES_5 1255681950000LL 201#define META_PROTO_TIMES_6 1260924017000LL 202#define META_PROTO_TIMES_7 1253212875000LL 203#define META_PROTO_TIMES_8 1253212875000LL 204#define META_PROTO_TIMES_9 1253212875000LL 205#define META_PROTO_TIMES_10 1253212875000LL 206#define META_PROTO_TIMES_11 1263522094000LL 207#define META_PROTO_TIMES_12 1263522151000LL 208#define META_PROTO_TIMES_13 1263522198000LL 209#define META_PROTO_TIMES_14 1263522238000LL 210 211#define META_PROTO_TIMES_STR_1 "1263522064000" 212#define META_PROTO_TIMES_STR_2 "1253215061000" 213#define META_PROTO_TIMES_STR_4 "1255742764000" 214#define META_PROTO_TIMES_STR_5 "1255681950000" 215#define META_PROTO_TIMES_STR_6 "1260924017000" 216#define META_PROTO_TIMES_STR_7 "1253212875000" 217#define META_PROTO_TIMES_STR_8 "1253212875000" 218#define META_PROTO_TIMES_STR_9 "1253212875000" 219#define META_PROTO_TIMES_STR_10 "1253212875000" 220#define META_PROTO_TIMES_STR_11 "1263522094000" 221#define META_PROTO_TIMES_STR_12 "1263522151000" 222#define META_PROTO_TIMES_STR_13 "1263522198000" 223#define META_PROTO_TIMES_STR_14 "1263522238000" 224 225#endif 226 227// Helper macros for the database dumps in the SetUpVersion*Database 228// functions. 229#define LEGACY_META_PROTO_TIMES(x) LEGACY_META_PROTO_TIMES_##x 230#define LEGACY_META_PROTO_TIMES_STR(x) LEGACY_META_PROTO_TIMES_STR_##x 231#define LEGACY_PROTO_TIME_VALS(x) \ 232 LEGACY_META_PROTO_TIMES_STR(x) "," \ 233 LEGACY_META_PROTO_TIMES_STR(x) "," \ 234 LEGACY_META_PROTO_TIMES_STR(x) "," \ 235 LEGACY_META_PROTO_TIMES_STR(x) 236#define META_PROTO_TIMES(x) META_PROTO_TIMES_##x 237#define META_PROTO_TIMES_STR(x) META_PROTO_TIMES_STR_##x 238#define META_PROTO_TIMES_VALS(x) \ 239 META_PROTO_TIMES_STR(x) "," \ 240 META_PROTO_TIMES_STR(x) "," \ 241 META_PROTO_TIMES_STR(x) "," \ 242 META_PROTO_TIMES_STR(x) 243 244namespace { 245 246// Helper functions for testing. 247 248enum ShouldIncludeDeletedItems { 249 INCLUDE_DELETED_ITEMS, 250 DONT_INCLUDE_DELETED_ITEMS 251}; 252 253// Returns a map from metahandle -> expected legacy time (in proto 254// format). 255std::map<int64, int64> GetExpectedLegacyMetaProtoTimes( 256 enum ShouldIncludeDeletedItems include_deleted) { 257 std::map<int64, int64> expected_legacy_meta_proto_times; 258 expected_legacy_meta_proto_times[1] = LEGACY_META_PROTO_TIMES(1); 259 if (include_deleted == INCLUDE_DELETED_ITEMS) { 260 expected_legacy_meta_proto_times[2] = LEGACY_META_PROTO_TIMES(2); 261 expected_legacy_meta_proto_times[4] = LEGACY_META_PROTO_TIMES(4); 262 expected_legacy_meta_proto_times[5] = LEGACY_META_PROTO_TIMES(5); 263 } 264 expected_legacy_meta_proto_times[6] = LEGACY_META_PROTO_TIMES(6); 265 expected_legacy_meta_proto_times[7] = LEGACY_META_PROTO_TIMES(7); 266 expected_legacy_meta_proto_times[8] = LEGACY_META_PROTO_TIMES(8); 267 expected_legacy_meta_proto_times[9] = LEGACY_META_PROTO_TIMES(9); 268 expected_legacy_meta_proto_times[10] = LEGACY_META_PROTO_TIMES(10); 269 expected_legacy_meta_proto_times[11] = LEGACY_META_PROTO_TIMES(11); 270 expected_legacy_meta_proto_times[12] = LEGACY_META_PROTO_TIMES(12); 271 expected_legacy_meta_proto_times[13] = LEGACY_META_PROTO_TIMES(13); 272 expected_legacy_meta_proto_times[14] = LEGACY_META_PROTO_TIMES(14); 273 return expected_legacy_meta_proto_times; 274} 275 276// Returns a map from metahandle -> expected time (in proto format). 277std::map<int64, int64> GetExpectedMetaProtoTimes( 278 enum ShouldIncludeDeletedItems include_deleted) { 279 std::map<int64, int64> expected_meta_proto_times; 280 expected_meta_proto_times[1] = META_PROTO_TIMES(1); 281 if (include_deleted == INCLUDE_DELETED_ITEMS) { 282 expected_meta_proto_times[2] = META_PROTO_TIMES(2); 283 expected_meta_proto_times[4] = META_PROTO_TIMES(4); 284 expected_meta_proto_times[5] = META_PROTO_TIMES(5); 285 } 286 expected_meta_proto_times[6] = META_PROTO_TIMES(6); 287 expected_meta_proto_times[7] = META_PROTO_TIMES(7); 288 expected_meta_proto_times[8] = META_PROTO_TIMES(8); 289 expected_meta_proto_times[9] = META_PROTO_TIMES(9); 290 expected_meta_proto_times[10] = META_PROTO_TIMES(10); 291 expected_meta_proto_times[11] = META_PROTO_TIMES(11); 292 expected_meta_proto_times[12] = META_PROTO_TIMES(12); 293 expected_meta_proto_times[13] = META_PROTO_TIMES(13); 294 expected_meta_proto_times[14] = META_PROTO_TIMES(14); 295 return expected_meta_proto_times; 296} 297 298// Returns a map from metahandle -> expected time (as a Time object). 299std::map<int64, base::Time> GetExpectedMetaTimes() { 300 std::map<int64, base::Time> expected_meta_times; 301 const std::map<int64, int64>& expected_meta_proto_times = 302 GetExpectedMetaProtoTimes(INCLUDE_DELETED_ITEMS); 303 for (std::map<int64, int64>::const_iterator it = 304 expected_meta_proto_times.begin(); 305 it != expected_meta_proto_times.end(); ++it) { 306 expected_meta_times[it->first] = ProtoTimeToTime(it->second); 307 } 308 return expected_meta_times; 309} 310 311// Extracts a map from metahandle -> time (in proto format) from the 312// given database. 313std::map<int64, int64> GetMetaProtoTimes(sql::Connection *db) { 314 sql::Statement s(db->GetCachedStatement( 315 SQL_FROM_HERE, 316 "SELECT metahandle, mtime, server_mtime, ctime, server_ctime " 317 "FROM metas")); 318 EXPECT_EQ(5, s.ColumnCount()); 319 std::map<int64, int64> meta_times; 320 while (s.Step()) { 321 int64 metahandle = s.ColumnInt64(0); 322 int64 mtime = s.ColumnInt64(1); 323 int64 server_mtime = s.ColumnInt64(2); 324 int64 ctime = s.ColumnInt64(3); 325 int64 server_ctime = s.ColumnInt64(4); 326 EXPECT_EQ(mtime, server_mtime); 327 EXPECT_EQ(mtime, ctime); 328 EXPECT_EQ(mtime, server_ctime); 329 meta_times[metahandle] = mtime; 330 } 331 EXPECT_TRUE(s.Succeeded()); 332 return meta_times; 333} 334 335::testing::AssertionResult AssertTimesMatch(const char* t1_expr, 336 const char* t2_expr, 337 const base::Time& t1, 338 const base::Time& t2) { 339 if (t1 == t2) 340 return ::testing::AssertionSuccess(); 341 342 return ::testing::AssertionFailure() 343 << t1_expr << " and " << t2_expr 344 << " (internal values: " << t1.ToInternalValue() 345 << " and " << t2.ToInternalValue() 346 << ") (proto time: " << TimeToProtoTime(t1) 347 << " and " << TimeToProtoTime(t2) 348 << ") do not match"; 349} 350 351// Expect that all time fields of the given entry kernel will be the 352// given time. 353void ExpectTime(const EntryKernel& entry_kernel, 354 const base::Time& expected_time) { 355 EXPECT_PRED_FORMAT2(AssertTimesMatch, 356 expected_time, entry_kernel.ref(CTIME)); 357 EXPECT_PRED_FORMAT2(AssertTimesMatch, 358 expected_time, entry_kernel.ref(SERVER_CTIME)); 359 EXPECT_PRED_FORMAT2(AssertTimesMatch, 360 expected_time, entry_kernel.ref(MTIME)); 361 EXPECT_PRED_FORMAT2(AssertTimesMatch, 362 expected_time, entry_kernel.ref(SERVER_MTIME)); 363} 364 365// Expect that all the entries in |entries| have times matching those in 366// the given map (from metahandle to expect time). 367void ExpectTimes(const Directory::MetahandlesMap& handles_map, 368 const std::map<int64, base::Time>& expected_times) { 369 for (Directory::MetahandlesMap::const_iterator it = handles_map.begin(); 370 it != handles_map.end(); ++it) { 371 int64 meta_handle = it->first; 372 SCOPED_TRACE(meta_handle); 373 std::map<int64, base::Time>::const_iterator it2 = 374 expected_times.find(meta_handle); 375 if (it2 == expected_times.end()) { 376 ADD_FAILURE() << "Could not find expected time for " << meta_handle; 377 continue; 378 } 379 ExpectTime(*it->second, it2->second); 380 } 381} 382 383} // namespace 384 385void MigrationTest::SetUpVersion67Database(sql::Connection* connection) { 386 // This is a version 67 database dump whose contents were backformed from 387 // the contents of the version 68 database dump (the v68 migration was 388 // actually written first). 389 ASSERT_TRUE(connection->is_open()); 390 ASSERT_TRUE(connection->BeginTransaction()); 391 ASSERT_TRUE(connection->Execute( 392 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 393 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 394 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," 395 "base_version bigint default -1,server_version bigint default 0," 396 "mtime bigint default 0,server_mtime bigint default 0," 397 "ctime bigint default 0,server_ctime bigint default 0," 398 "server_position_in_parent bigint default 0," 399 "local_external_id bigint default 0,id varchar(255) default 'r'," 400 "parent_id varchar(255) default 'r'," 401 "server_parent_id varchar(255) default 'r'," 402 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 403 "is_unsynced bit default 0,is_unapplied_update bit default 0," 404 "is_del bit default 0,is_dir bit default 0," 405 "is_bookmark_object bit default 0,server_is_dir bit default 0," 406 "server_is_del bit default 0,server_is_bookmark_object bit default 0," 407 "name varchar(255), " /* COLLATE PATHNAME, */ 408 "unsanitized_name varchar(255)," /* COLLATE PATHNAME, */ 409 "non_unique_name varchar," 410 "server_name varchar(255)," /* COLLATE PATHNAME */ 411 "server_non_unique_name varchar," 412 "bookmark_url varchar,server_bookmark_url varchar," 413 "singleton_tag varchar,bookmark_favicon blob," 414 "server_bookmark_favicon blob);" 415 "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 416 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," 417 "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);" 418 "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 419 ",-2097152," 420 "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," 421 "'Deleted Item',NULL,'Deleted Item','Deleted Item','Deleted Item'," 422 "'http://www.google.com/','http://www.google.com/2',NULL,'AASGASGA'," 423 "'ASADGADGADG');" 424 "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 425 ",-3145728," 426 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," 427 "'Welcome to Chromium',NULL,'Welcome to Chromium'," 428 "'Welcome to Chromium','Welcome to Chromium'," 429 "'http://www.google.com/chrome/intl/en/welcome.html'," 430 "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL," 431 "NULL);" 432 "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 433 ",1048576," 434 "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," 435 "'Google',NULL,'Google','Google','Google','http://www.google.com/'," 436 "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');" 437 "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 438 ",-4194304," 439 "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1," 440 "'The Internet',NULL,'The Internet','The Internet'," 441 "'The Internet',NULL,NULL,NULL,NULL,NULL);" 442 "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 443 "," 444 "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1," 445 "'Google Chrome',NULL,'Google Chrome','Google Chrome'," 446 "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL);" 447 "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 448 ",1048576," 449 "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," 450 "NULL,'Bookmarks','Bookmarks','Bookmarks',NULL,NULL," 451 "'google_chrome_bookmarks',NULL,NULL);" 452 "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 453 "," 454 "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0," 455 "1,'Bookmark Bar',NULL,'Bookmark Bar','Bookmark Bar','Bookmark Bar'," 456 "NULL,NULL,'bookmark_bar',NULL,NULL);" 457 "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 458 ",2097152," 459 "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," 460 "'Other Bookmarks',NULL,'Other Bookmarks','Other Bookmarks'," 461 "'Other Bookmarks',NULL,NULL,'other_bookmarks'," 462 "NULL,NULL);" 463 "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 464 ",-1048576," 465 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," 466 "'Home (The Chromium Projects)',NULL,'Home (The Chromium Projects)'," 467 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 468 "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," 469 "'AGATWA','AFAGVASF');" 470 "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 471 ",0,9," 472 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," 473 "'Extra Bookmarks',NULL,'Extra Bookmarks','Extra Bookmarks'," 474 "'Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);" 475 "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 476 ",-917504," 477 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," 478 "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," 479 "'ICANN Internet Corporation for Assigned Names and Numbers'," 480 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 481 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 482 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 483 "'http://www.icann.com/','http://www.icann.com/',NULL," 484 "'PNGAXF0AAFF','DAAFASF');" 485 "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 486 ",1048576," 487 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," 488 "'The WebKit Open Source Project',NULL," 489 "'The WebKit Open Source Project','The WebKit Open Source Project'," 490 "'The WebKit Open Source Project','http://webkit.org/'," 491 "'http://webkit.org/x',NULL,'PNGX','PNG2Y');" 492 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 493 "last_sync_timestamp INT, name VARCHAR(128), " 494 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 495 "db_create_version VARCHAR(128), db_create_time int, " 496 "next_id bigint default -2, cache_guid VARCHAR(32));" 497 "INSERT INTO share_info VALUES('nick@chromium.org',694," 498 "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 499 "'Unknown',1263522064,-65542," 500 "'9010788312004066376x-6609234393368420856x');" 501 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 502 "INSERT INTO share_version VALUES('nick@chromium.org',68);")); 503 ASSERT_TRUE(connection->CommitTransaction()); 504} 505 506void MigrationTest::SetUpVersion68Database(sql::Connection* connection) { 507 // This sets up an actual version 68 database dump. The IDs were 508 // canonicalized to be less huge, and the favicons were overwritten 509 // with random junk so that they didn't contain any unprintable 510 // characters. A few server URLs were tweaked so that they'd be 511 // different from the local URLs. Lastly, the custom collation on 512 // the server_non_unique_name column was removed. 513 ASSERT_TRUE(connection->is_open()); 514 ASSERT_TRUE(connection->BeginTransaction()); 515 ASSERT_TRUE(connection->Execute( 516 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 517 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 518 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," 519 "base_version bigint default -1,server_version bigint default 0," 520 "mtime bigint default 0,server_mtime bigint default 0," 521 "ctime bigint default 0,server_ctime bigint default 0," 522 "server_position_in_parent bigint default 0," 523 "local_external_id bigint default 0,id varchar(255) default 'r'," 524 "parent_id varchar(255) default 'r'," 525 "server_parent_id varchar(255) default 'r'," 526 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 527 "is_unsynced bit default 0,is_unapplied_update bit default 0," 528 "is_del bit default 0,is_dir bit default 0," 529 "is_bookmark_object bit default 0,server_is_dir bit default 0," 530 "server_is_del bit default 0," 531 "server_is_bookmark_object bit default 0," 532 "non_unique_name varchar,server_non_unique_name varchar(255)," 533 "bookmark_url varchar,server_bookmark_url varchar," 534 "singleton_tag varchar,bookmark_favicon blob," 535 "server_bookmark_favicon blob);" 536 "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 537 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL," 538 "NULL,NULL,NULL,NULL,NULL,NULL);" 539 "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 540 ",-2097152," 541 "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," 542 "'Deleted Item','Deleted Item','http://www.google.com/'," 543 "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG');" 544 "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 545 ",-3145728," 546 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," 547 "'Welcome to Chromium','Welcome to Chromium'," 548 "'http://www.google.com/chrome/intl/en/welcome.html'," 549 "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL," 550 "NULL);" 551 "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 552 ",1048576," 553 "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," 554 "'Google','Google','http://www.google.com/'," 555 "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');" 556 "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 557 ",-4194304," 558 "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1," 559 "'The Internet','The Internet',NULL,NULL,NULL,NULL,NULL);" 560 "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 561 "," 562 "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1," 563 "'Google Chrome','Google Chrome',NULL,NULL,'google_chrome',NULL," 564 "NULL);" 565 "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 566 ",1048576," 567 "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," 568 "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL);" 569 "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 570 "," 571 "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0," 572 "1,'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL," 573 "NULL);" 574 "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 575 ",2097152," 576 "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," 577 "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks'," 578 "NULL,NULL);" 579 "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 580 ",-1048576," 581 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," 582 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 583 "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," 584 "'AGATWA','AFAGVASF');" 585 "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 586 ",0,9," 587 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," 588 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);" 589 "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 590 ",-917504," 591 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," 592 "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," 593 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 594 "'http://www.icann.com/','http://www.icann.com/',NULL," 595 "'PNGAXF0AAFF','DAAFASF');" 596 "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 597 ",1048576," 598 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," 599 "'The WebKit Open Source Project','The WebKit Open Source Project'," 600 "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y');" 601 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 602 "last_sync_timestamp INT, name VARCHAR(128), " 603 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 604 "db_create_version VARCHAR(128), db_create_time int, " 605 "next_id bigint default -2, cache_guid VARCHAR(32));" 606 "INSERT INTO share_info VALUES('nick@chromium.org',694," 607 "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 608 "'Unknown',1263522064,-65542," 609 "'9010788312004066376x-6609234393368420856x');" 610 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 611 "INSERT INTO share_version VALUES('nick@chromium.org',68);")); 612 ASSERT_TRUE(connection->CommitTransaction()); 613} 614 615void MigrationTest::SetUpVersion69Database(sql::Connection* connection) { 616 ASSERT_TRUE(connection->is_open()); 617 ASSERT_TRUE(connection->BeginTransaction()); 618 ASSERT_TRUE(connection->Execute( 619 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 620 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 621 "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL," 622 "base_version bigint default -1,server_version bigint default 0," 623 "mtime bigint default 0,server_mtime bigint default 0," 624 "ctime bigint default 0,server_ctime bigint default 0," 625 "server_position_in_parent bigint default 0," 626 "local_external_id bigint default 0,id varchar(255) default 'r'," 627 "parent_id varchar(255) default 'r'," 628 "server_parent_id varchar(255) default 'r'," 629 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 630 "is_unsynced bit default 0,is_unapplied_update bit default 0," 631 "is_del bit default 0,is_dir bit default 0," 632 "is_bookmark_object bit default 0,server_is_dir bit default 0," 633 "server_is_del bit default 0," 634 "server_is_bookmark_object bit default 0," 635 "non_unique_name varchar,server_non_unique_name varchar(255)," 636 "bookmark_url varchar,server_bookmark_url varchar," 637 "singleton_tag varchar,bookmark_favicon blob," 638 "server_bookmark_favicon blob, specifics blob, " 639 "server_specifics blob);" 640 "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 641 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL,NULL,NULL,NULL,NULL," 642 "NULL,NULL,X'',X'');" 643 "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 644 ",-2097152," 645 "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1," 646 "'Deleted Item','Deleted Item','http://www.google.com/'," 647 "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG'," 648 "X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841415" 649 "34741534741',X'C28810260A17687474703A2F2F7777772E676F6F676C652E636F" 650 "6D2F32120B4153414447414447414447');" 651 "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 652 ",-3145728," 653 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1," 654 "'Welcome to Chromium','Welcome to Chromium'," 655 "'http://www.google.com/chrome/intl/en/welcome.html'," 656 "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL,NULL," 657 "X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 658 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A3168" 659 "7474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F6" 660 "56E2F77656C636F6D652E68746D6C1200');" 661 "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 662 ",1048576,7," 663 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1," 664 "'Google','Google','http://www.google.com/'," 665 "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG',X'C28810220A166" 666 "87474703A2F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'" 667 "C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464" 668 "447415347');" 669 "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 670 ",-4194304,6" 671 ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1,'The Internet'," 672 "'The Internet',NULL,NULL,NULL,NULL,NULL,X'C2881000',X'C2881000');" 673 "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 674 ",1048576,0," 675 "'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1,'Google Chrome'," 676 "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL,NULL,NULL);" 677 "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 678 ",1048576,0," 679 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks'," 680 "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL," 681 "X'C2881000',X'C2881000');" 682 "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 683 ",1048576,1," 684 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0,1," 685 "'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL,NULL," 686 "X'C2881000',X'C2881000');" 687 "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 688 ",2097152,2," 689 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1," 690 "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks'," 691 "NULL,NULL,X'C2881000',X'C2881000');" 692 "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 693 ",-1048576," 694 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1," 695 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 696 "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL," 697 "'AGATWA','AFAGVASF',X'C28810220A18687474703A2F2F6465762E6368726F6D6" 698 "9756D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F646576" 699 "2E6368726F6D69756D2E6F72672F6F7468657212084146414756415346');" 700 "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 701 ",0,9," 702 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1," 703 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL," 704 "X'C2881000',X'C2881000');" 705 "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 706 ",-917504," 707 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0," 708 "1,'ICANN | Internet Corporation for Assigned Names and Numbers'," 709 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 710 "'http://www.icann.com/','http://www.icann.com/',NULL,'PNGAXF0AAFF'," 711 "'DAAFASF',X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F1" 712 "20B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963" 713 "616E6E2E636F6D2F120744414146415346');" 714 "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 715 ",1048576,11," 716 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1," 717 "'The WebKit Open Source Project','The WebKit Open Source Project'," 718 "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y'," 719 "X'C288101A0A12687474703A2F2F7765626B69742E6F72672F1204504E4758',X'C2" 720 "88101C0A13687474703A2F2F7765626B69742E6F72672F781205504E473259');" 721 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 722 "last_sync_timestamp INT, name VARCHAR(128), " 723 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 724 "db_create_version VARCHAR(128), db_create_time int, " 725 "next_id bigint default -2, cache_guid VARCHAR(32));" 726 "INSERT INTO share_info VALUES('nick@chromium.org',694," 727 "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 728 "'Unknown',1263522064,-65542," 729 "'9010788312004066376x-6609234393368420856x');" 730 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 731 "INSERT INTO share_version VALUES('nick@chromium.org',69);" 732 )); 733 ASSERT_TRUE(connection->CommitTransaction()); 734} 735 736void MigrationTest::SetUpVersion70Database(sql::Connection* connection) { 737 ASSERT_TRUE(connection->is_open()); 738 ASSERT_TRUE(connection->BeginTransaction()); 739 ASSERT_TRUE(connection->Execute( 740 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 741 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 742 "CREATE TABLE share_info (id VARCHAR(128) primary key, " 743 "last_sync_timestamp INT, name VARCHAR(128), " 744 "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), " 745 "db_create_version VARCHAR(128), db_create_time int, " 746 "next_id bigint default -2, cache_guid VARCHAR(32));" 747 "INSERT INTO share_info VALUES('nick@chromium.org',694," 748 "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb'," 749 "'Unknown',1263522064,-65542," 750 "'9010788312004066376x-6609234393368420856x');" 751 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 752 "INSERT INTO share_version VALUES('nick@chromium.org',70);" 753 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 754 "base_version bigint default -1,server_version bigint default 0," 755 "mtime bigint default 0,server_mtime bigint default 0," 756 "ctime bigint default 0,server_ctime bigint default 0," 757 "server_position_in_parent bigint default 0," 758 "local_external_id bigint default 0,id varchar(255) default 'r'," 759 "parent_id varchar(255) default 'r'," 760 "server_parent_id varchar(255) default 'r'," 761 "prev_id varchar(255) default 'r',next_id varchar(255) default 'r'," 762 "is_unsynced bit default 0,is_unapplied_update bit default 0," 763 "is_del bit default 0,is_dir bit default 0," 764 "server_is_dir bit default 0,server_is_del bit default 0," 765 "non_unique_name varchar,server_non_unique_name varchar(255)," 766 "unique_server_tag varchar,unique_client_tag varchar," 767 "specifics blob,server_specifics blob);" 768 "INSERT INTO metas VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 769 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'');" 770 "INSERT INTO metas VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) "," 771 "-2097152,4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0," 772 "1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A" 773 "2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X'C2881026" 774 "0A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B415341444741" 775 "4447414447');" 776 "INSERT INTO metas VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 777 ",-3145728," 778 "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 779 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A" 780 "31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E74" 781 "6C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F" 782 "2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F7765" 783 "6C636F6D652E68746D6C1200');" 784 "INSERT INTO metas VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 785 ",1048576,7," 786 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 787 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C6" 788 "52E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F77777" 789 "72E676F6F676C652E636F6D2F12084147464447415347');" 790 "INSERT INTO metas VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 791 ",-4194304," 792 "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 793 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 794 "INSERT INTO metas VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 795 ",1048576,0," 796 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome'," 797 "'Google Chrome','google_chrome',NULL,NULL,NULL);" 798 "INSERT INTO metas VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 799 ",1048576,0," 800 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 801 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000'," 802 "X'C2881000');" 803 "INSERT INTO metas VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 804 ",1048576," 805 "1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0," 806 "'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881000'," 807 "X'C2881000');" 808 "INSERT INTO metas VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 809 "," 810 "2097152,2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 811 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 812 "X'C2881000',X'C2881000');" 813 "INSERT INTO metas VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 814 ",-1048576," 815 "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 816 "'Home (The Chromium Projects)','Home (The Chromium Projects)'," 817 "NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F" 818 "72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636872" 819 "6F6D69756D2E6F72672F6F7468657212084146414756415346');" 820 "INSERT INTO metas VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 821 ",0,9," 822 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 823 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 824 "X'C2881000');" 825 "INSERT INTO metas VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 826 ",-917504," 827 "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 828 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 829 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 830 "NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F" 831 "120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E69" 832 "63616E6E2E636F6D2F120744414146415346');" 833 "INSERT INTO metas VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 834 ",1048576," 835 "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 836 "'The WebKit Open Source Project','The WebKit Open Source Project'," 837 "NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 838 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F78120550" 839 "4E473259');" 840 )); 841 ASSERT_TRUE(connection->CommitTransaction()); 842} 843 844void MigrationTest::SetUpVersion71Database(sql::Connection* connection) { 845 ASSERT_TRUE(connection->is_open()); 846 ASSERT_TRUE(connection->BeginTransaction()); 847 ASSERT_TRUE(connection->Execute( 848 "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), " 849 "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);" 850 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 851 "INSERT INTO 'share_version' VALUES('nick@chromium.org',71);" 852 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 853 "base_version bigint default -1,server_version bigint default 0," 854 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint " 855 "default 0,server_ctime bigint default 0,server_position_in_parent " 856 "bigint default 0,local_external_id bigint default 0,id varchar(255) " 857 "default 'r',parent_id varchar(255) default 'r',server_parent_id " 858 "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id " 859 "varchar(255) default 'r',is_unsynced bit default 0," 860 "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit " 861 "default 0,server_is_dir bit default 0,server_is_del bit default 0," 862 "non_unique_name varchar,server_non_unique_name varchar(255)," 863 "unique_server_tag varchar,unique_client_tag varchar,specifics blob," 864 "server_specifics blob);" 865 "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 866 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," 867 "NULL,NULL,X'',X'');" 868 "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 869 ",-2097152,4," 870 "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," 871 "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" 872 "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" 873 "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" 874 "47');" 875 "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 876 ",-3145728,3," 877 "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 878 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" 879 "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" 880 "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" 881 "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" 882 "652E68746D6C1200');" 883 "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 884 ",1048576,7," 885 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 886 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" 887 "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" 888 "76F6F676C652E636F6D2F12084147464447415347');" 889 "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 890 ",-4194304,6," 891 "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 892 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 893 "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 894 ",1048576,0," 895 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" 896 ",'google_chrome',NULL,NULL,NULL);" 897 "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 898 ",1048576,0," 899 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 900 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 901 "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 902 ",1048576,1," 903 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," 904 "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 905 "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 906 ",2097152,2," 907 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 908 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 909 "X'C2881000',X'C2881000');" 910 "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 911 ",-1048576,8," 912 "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 913 "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," 914 "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" 915 "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" 916 "D2E6F72672F6F7468657212084146414756415346');" 917 "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 918 ",0,9," 919 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 920 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 921 "X'C2881000');" 922 "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 923 ",-917504,10," 924 "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 925 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 926 "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," 927 "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" 928 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" 929 "E636F6D2F120744414146415346');" 930 "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 931 ",1048576,11," 932 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 933 "'The WebKit Open Source Project','The WebKit Open Source Project'," 934 "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 935 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E" 936 "473259');" 937 "CREATE TABLE models (model_id BLOB primary key, " 938 "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);" 939 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 940 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, " 941 "store_birthday TEXT, db_create_version TEXT, db_create_time INT, " 942 "next_id INT default -2, cache_guid TEXT);" 943 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 944 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542," 945 "'9010788312004066376x-6609234393368420856x');")); 946 ASSERT_TRUE(connection->CommitTransaction()); 947} 948 949void MigrationTest::SetUpVersion72Database(sql::Connection* connection) { 950 ASSERT_TRUE(connection->is_open()); 951 ASSERT_TRUE(connection->BeginTransaction()); 952 ASSERT_TRUE(connection->Execute( 953 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 954 "INSERT INTO 'share_version' VALUES('nick@chromium.org',72);" 955 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 956 "base_version bigint default -1,server_version bigint default 0," 957 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint " 958 "default 0,server_ctime bigint default 0,server_position_in_parent " 959 "bigint default 0,local_external_id bigint default 0,id varchar(255) " 960 "default 'r',parent_id varchar(255) default 'r',server_parent_id " 961 "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id " 962 "varchar(255) default 'r',is_unsynced bit default 0," 963 "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit " 964 "default 0,server_is_dir bit default 0,server_is_del bit default 0," 965 "non_unique_name varchar,server_non_unique_name varchar(255)," 966 "unique_server_tag varchar,unique_client_tag varchar,specifics blob," 967 "server_specifics blob);" 968 "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 969 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," 970 "NULL,NULL,X'',X'');" 971 "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 972 ",-2097152,4," 973 "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," 974 "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" 975 "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" 976 "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" 977 "47');" 978 "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 979 ",-3145728,3," 980 "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 981 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" 982 "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" 983 "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" 984 "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" 985 "652E68746D6C1200');" 986 "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 987 ",1048576,7," 988 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 989 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" 990 "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" 991 "76F6F676C652E636F6D2F12084147464447415347');" 992 "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 993 ",-4194304,6," 994 "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 995 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 996 "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 997 ",1048576,0," 998 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" 999 ",'google_chrome',NULL,NULL,NULL);" 1000 "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 1001 ",1048576,0," 1002 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 1003 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 1004 "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 1005 ",1048576,1," 1006 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," 1007 "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 1008 "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 1009 ",2097152,2," 1010 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 1011 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 1012 "X'C2881000',X'C2881000');" 1013 "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 1014 ",-1048576,8," 1015 "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 1016 "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," 1017 "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" 1018 "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" 1019 "D2E6F72672F6F7468657212084146414756415346');" 1020 "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 1021 ",0,9," 1022 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 1023 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 1024 "X'C2881000');" 1025 "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 1026 ",-917504,10," 1027 "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 1028 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 1029 "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," 1030 "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" 1031 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" 1032 "E636F6D2F120744414146415346');" 1033 "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 1034 ",1048576,11," 1035 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 1036 "'The WebKit Open Source Project','The WebKit Open Source Project'," 1037 "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 1038 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E" 1039 "473259');" 1040 "CREATE TABLE models (model_id BLOB primary key, " 1041 "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);" 1042 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 1043 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, " 1044 "store_birthday TEXT, db_create_version TEXT, db_create_time INT, " 1045 "next_id INT default -2, cache_guid TEXT);" 1046 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1047 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542," 1048 "'9010788312004066376x-6609234393368420856x');")); 1049 ASSERT_TRUE(connection->CommitTransaction()); 1050} 1051 1052void MigrationTest::SetUpVersion73Database(sql::Connection* connection) { 1053 ASSERT_TRUE(connection->is_open()); 1054 ASSERT_TRUE(connection->BeginTransaction()); 1055 ASSERT_TRUE(connection->Execute( 1056 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1057 "INSERT INTO 'share_version' VALUES('nick@chromium.org',73);" 1058 "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL," 1059 "base_version bigint default -1,server_version bigint default 0," 1060 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint " 1061 "default 0,server_ctime bigint default 0,server_position_in_parent " 1062 "bigint default 0,local_external_id bigint default 0,id varchar(255) " 1063 "default 'r',parent_id varchar(255) default 'r',server_parent_id " 1064 "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id " 1065 "varchar(255) default 'r',is_unsynced bit default 0," 1066 "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit " 1067 "default 0,server_is_dir bit default 0,server_is_del bit default 0," 1068 "non_unique_name varchar,server_non_unique_name varchar(255)," 1069 "unique_server_tag varchar,unique_client_tag varchar,specifics blob," 1070 "server_specifics blob);" 1071 "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 1072 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL," 1073 "NULL,NULL,X'',X'');" 1074 "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 1075 ",-2097152,4," 1076 "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1," 1077 "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F" 1078 "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768" 1079 "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144" 1080 "47');" 1081 "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 1082 ",-3145728,3," 1083 "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1," 1084 "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31" 1085 "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F" 1086 "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777" 1087 "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D" 1088 "652E68746D6C1200');" 1089 "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 1090 ",1048576,7," 1091 "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google'," 1092 "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652" 1093 "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6" 1094 "76F6F676C652E636F6D2F12084147464447415347');" 1095 "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 1096 ",-4194304,6," 1097 "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet'," 1098 "'The Internet',NULL,NULL,X'C2881000',X'C2881000');" 1099 "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 1100 ",1048576,0," 1101 "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'" 1102 ",'google_chrome',NULL,NULL,NULL);" 1103 "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 1104 ",1048576,0," 1105 "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks'," 1106 "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 1107 "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 1108 ",1048576,1," 1109 "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'," 1110 "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 1111 "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 1112 ",2097152,2," 1113 "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0," 1114 "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL," 1115 "X'C2881000',X'C2881000');" 1116 "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 1117 ",-1048576,8," 1118 "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0," 1119 "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL," 1120 "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1" 1121 "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" 1122 "D2E6F72672F6F7468657212084146414756415346');" 1123 "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 1124 ",0,9," 1125 "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0," 1126 "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000'," 1127 "X'C2881000');" 1128 "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 1129 ",-917504,10," 1130 "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0," 1131 "'ICANN | Internet Corporation for Assigned Names and Numbers'," 1132 "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL," 1133 "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" 1134 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2" 1135 "E636F6D2F120744414146415346');" 1136 "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 1137 ",1048576,11," 1138 "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0," 1139 "'The WebKit Open Source Project','The WebKit Open Source Project'," 1140 "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450" 1141 "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E" 1142 "473259');" 1143 "CREATE TABLE models (model_id BLOB primary key, " 1144 "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);" 1145 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 1146 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, " 1147 "store_birthday TEXT, db_create_version TEXT, db_create_time INT, " 1148 "next_id INT default -2, cache_guid TEXT, " 1149 "notification_state BLOB);" 1150 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1151 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542," 1152 "'9010788312004066376x-6609234393368420856x',X'C2881000');")); 1153 ASSERT_TRUE(connection->CommitTransaction()); 1154} 1155 1156void MigrationTest::SetUpVersion74Database(sql::Connection* connection) { 1157 ASSERT_TRUE(connection->is_open()); 1158 ASSERT_TRUE(connection->BeginTransaction()); 1159 ASSERT_TRUE(connection->Execute( 1160 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1161 "INSERT INTO 'share_version' VALUES('nick@chromium.org',74);" 1162 "CREATE TABLE models (model_id BLOB primary key, last_download_timestamp" 1163 " INT, initial_sync_ended BOOLEAN default 0);" 1164 "INSERT INTO 'models' VALUES(X'C2881000',694,1);" 1165 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthd" 1166 "ay TEXT, db_create_version TEXT, db_create_time INT, next_id INT de" 1167 "fault -2, cache_guid TEXT , notification_state BLOB, autofill_migra" 1168 "tion_state INT default 0, bookmarks_added_during_autofill_migration" 1169 " INT default 0, autofill_migration_time INT default 0, autofill_ent" 1170 "ries_added_during_migration INT default 0, autofill_profiles_added_" 1171 "during_migration INT default 0);" 1172 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'" 1173 ",'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542" 1174 ",'9010788312004066376x-6609234393368420856x',NULL,0,0,0,0,0);" 1175 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,bas" 1176 "e_version bigint default -1,server_version bigint default 0,mtime b" 1177 "igint default 0,server_mtime bigint default 0,ctime bigint default " 1178 "0,server_ctime bigint default 0,server_position_in_parent bigint de" 1179 "fault 0,local_external_id bigint default 0,id varchar(255) default " 1180 "'r',parent_id varchar(255) default 'r',server_parent_id varchar(255" 1181 ") default 'r',prev_id varchar(255) default 'r',next_id varchar(255)" 1182 " default 'r',is_unsynced bit default 0,is_unapplied_update bit defa" 1183 "ult 0,is_del bit default 0,is_dir bit default 0,server_is_dir bit d" 1184 "efault 0,server_is_del bit default 0,non_unique_name varchar,server" 1185 "_non_unique_name varchar(255),unique_server_tag varchar,unique_clie" 1186 "nt_tag varchar,specifics blob,server_specifics blob);" 1187 "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 1188 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'" 1189 "');" 1190 "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 1191 ",-2097152,4,'s_ID_2','s_ID" 1192 "_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Item','Deleted " 1193 "Item',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E6" 1194 "36F6D2F12084141534741534741',X'C28810260A17687474703A2F2F7777772E67" 1195 "6F6F676C652E636F6D2F32120B4153414447414447414447');" 1196 "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 1197 ",-3145728,3,'s_ID_4','s_ID" 1198 "_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to Chromium','W" 1199 "elcome to Chromium',NULL,NULL,X'C28810350A31687474703A2F2F7777772E6" 1200 "76F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E" 1201 "68746D6C1200',X'C28810350A31687474703A2F2F7777772E676F6F676C652E636" 1202 "F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E68746D6C1200');" 1203 "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 1204 ",1048576,7,'s_ID_5','s_ID_" 1205 "9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Google',NULL,NU" 1206 "LL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841" 1207 "47415347415347',X'C28810220A16687474703A2F2F7777772E676F6F676C652E6" 1208 "36F6D2F12084147464447415347');" 1209 "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 1210 ",-4194304,6,'s_ID_6','s_ID" 1211 "_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The Internet',NULL" 1212 ",NULL,X'C2881000',X'C2881000');" 1213 "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 1214 ",1048576,0,'s_ID_7','r','r" 1215 "','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','google_chrom" 1216 "e',NULL,NULL,NULL);" 1217 "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 1218 ",1048576,0,'s_ID_8','s_ID_" 1219 "7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks','google_chr" 1220 "ome_bookmarks',NULL,X'C2881000',X'C2881000');" 1221 "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 1222 ",1048576,1,'s_ID_9','s_ID_" 1223 "8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','Bookmark Bar'" 1224 ",'bookmark_bar',NULL,X'C2881000',X'C2881000');" 1225 "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 1226 ",2097152,2,'s_ID_10','s_I" 1227 "D_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks','Other Boo" 1228 "kmarks','other_bookmarks',NULL,X'C2881000',X'C2881000');" 1229 "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 1230 ",-1048576,8,'s_ID_11','s_" 1231 "ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chromium Projec" 1232 "ts)','Home (The Chromium Projects)',NULL,NULL,X'C28810220A186874747" 1233 "03A2F2F6465762E6368726F6D69756D2E6F72672F1206414741545741',X'C28810" 1234 "290A1D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F74686572120" 1235 "84146414756415346');" 1236 "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 1237 ",0,9,'s_ID_12','s_ID_6','" 1238 "s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bo" 1239 "okmarks',NULL,NULL,X'C2881000',X'C2881000');" 1240 "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 1241 ",-917504,10,'s_ID_13','s_" 1242 "ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN | Internet Co" 1243 "rporation for Assigned Names and Numbers','ICANN | Internet Corpora" 1244 "tion for Assigned Names and Numbers',NULL,NULL,X'C28810240A15687474" 1245 "703A2F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646',X'C" 1246 "28810200A15687474703A2F2F7777772E6963616E6E2E636F6D2F12074441414641" 1247 "5346');" 1248 "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 1249 ",1048576,11,'s_ID_14','s_" 1250 "ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Open Source Pr" 1251 "oject','The WebKit Open Source Project',NULL,NULL,X'C288101A0A12687" 1252 "474703A2F2F7765626B69742E6F72672F1204504E4758',X'C288101C0A13687474" 1253 "703A2F2F7765626B69742E6F72672F781205504E473259');" 1254 )); 1255 ASSERT_TRUE(connection->CommitTransaction()); 1256} 1257 1258void MigrationTest::SetUpVersion75Database(sql::Connection* connection) { 1259 ASSERT_TRUE(connection->is_open()); 1260 ASSERT_TRUE(connection->BeginTransaction()); 1261 ASSERT_TRUE(connection->Execute( 1262 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1263 "INSERT INTO 'share_version' VALUES('nick@chromium.org',75);" 1264 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthd" 1265 "ay TEXT, db_create_version TEXT, db_create_time INT, next_id INT de" 1266 "fault -2, cache_guid TEXT , notification_state BLOB, autofill_migra" 1267 "tion_state INT default 0,bookmarks_added_during_autofill_migration " 1268 "INT default 0, autofill_migration_time INT default 0, autofill_entr" 1269 "ies_added_during_migration INT default 0, autofill_profiles_added_d" 1270 "uring_migration INT default 0);" 1271 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org" 1272 "','c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-655" 1273 "42,'9010788312004066376x-6609234393368420856x',NULL,0,0,0,0,0);" 1274 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, " 1275 "initial_sync_ended BOOLEAN default 0);" 1276 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 1277 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,ba" 1278 "se_version bigint default -1,server_version bigint default 0,mtime" 1279 " bigint default 0,server_mtime bigint default 0,ctime bigint defau" 1280 "lt 0,server_ctime bigint default 0,server_position_in_parent bigin" 1281 "t default 0,local_external_id bigint default 0,id varchar(255) def" 1282 "ault 'r',parent_id varchar(255) default 'r',server_parent_id varch" 1283 "ar(255) default 'r',prev_id varchar(255) default 'r',next_id varch" 1284 "ar(255) default 'r',is_unsynced bit default 0,is_unapplied_update " 1285 "bit default 0,is_del bit default 0,is_dir bit default 0,server_is_" 1286 "dir bit default 0,server_is_del bit default 0,non_unique_name varc" 1287 "har,server_non_unique_name varchar(255),unique_server_tag varchar," 1288 "unique_client_tag varchar,specifics blob,server_specifics blob);" 1289 "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 1290 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NUL" 1291 "L,X'',X'');" 1292 "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 1293 ",-2097152,4,'s_ID_" 1294 "2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Ite" 1295 "m','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F7777772" 1296 "E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A176874" 1297 "74703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474" 1298 "14447');" 1299 "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 1300 ",-3145728,3,'s_ID_" 1301 "4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to " 1302 "Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A316874747" 1303 "03A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F65" 1304 "6E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7" 1305 "777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F7765" 1306 "6C636F6D652E68746D6C1200');" 1307 "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 1308 ",1048576,7,'s_ID_5" 1309 "','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Goo" 1310 "gle',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C65" 1311 "2E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F777" 1312 "7772E676F6F676C652E636F6D2F12084147464447415347');" 1313 "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 1314 ",-4194304,6,'s_ID_" 1315 "6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The In" 1316 "ternet',NULL,NULL,X'C2881000',X'C2881000');" 1317 "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 1318 ",1048576,0,'s_ID_7" 1319 "','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','" 1320 "google_chrome',NULL,NULL,NULL);" 1321 "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 1322 ",1048576,0,'s_ID_8" 1323 "','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks'" 1324 ",'google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 1325 "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 1326 ",1048576,1,'s_ID_9" 1327 "','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','B" 1328 "ookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 1329 "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 1330 ",2097152,2,'s_ID_" 1331 "10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks" 1332 "','Other Bookmarks','other_bookmarks',NULL,X'C2881000',X'C28810" 1333 "00');" 1334 "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 1335 ",-1048576,8,'s_ID" 1336 "_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chr" 1337 "omium Projects)','Home (The Chromium Projects)',NULL,NULL,X'C28" 1338 "810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F120641" 1339 "4741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756" 1340 "D2E6F72672F6F7468657212084146414756415346');" 1341 "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 1342 ",0,9,'s_ID_12','s" 1343 "_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmark" 1344 "s','Extra Bookmarks',NULL,NULL,X'C2881000',X'C2881000');" 1345 "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 1346 ",-917504,10,'s_ID" 1347 "_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN |" 1348 " Internet Corporation for Assigned Names and Numbers','ICANN | " 1349 "Internet Corporation for Assigned Names and Numbers',NULL,NULL," 1350 "X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504" 1351 "E474158463041414646',X'C28810200A15687474703A2F2F7777772E696361" 1352 "6E6E2E636F6D2F120744414146415346');" 1353 "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 1354 ",1048576,11,'s_ID" 1355 "_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Op" 1356 "en Source Project','The WebKit Open Source Project',NULL,NULL,X" 1357 "'C288101A0A12687474703A2F2F7765626B69742E6F72672F1204504E4758'," 1358 "X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E473" 1359 "259');" 1360 )); 1361 ASSERT_TRUE(connection->CommitTransaction()); 1362} 1363 1364void MigrationTest::SetUpVersion76Database(sql::Connection* connection) { 1365 ASSERT_TRUE(connection->is_open()); 1366 ASSERT_TRUE(connection->BeginTransaction()); 1367 ASSERT_TRUE(connection->Execute( 1368 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1369 "INSERT INTO 'share_version' VALUES('nick@chromium.org',76);" 1370 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 1371 "itial_sync_ended BOOLEAN default 0);" 1372 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 1373 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 1374 "_version bigint default -1,server_version bigint default 0,mtime big" 1375 "int default 0,server_mtime bigint default 0,ctime bigint default 0,s" 1376 "erver_ctime bigint default 0,server_position_in_parent bigint defaul" 1377 "t 0,local_external_id bigint default 0,id varchar(255) default 'r',p" 1378 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 1379 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 1380 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 1381 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 1382 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 1383 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 1384 "har,specifics blob,server_specifics blob);" 1385 "INSERT INTO 'metas' VALUES(1,-1,0," LEGACY_PROTO_TIME_VALS(1) 1386 ",0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'')" 1387 ";" 1388 "INSERT INTO 'metas' VALUES(2,669,669," LEGACY_PROTO_TIME_VALS(2) 1389 ",-2097152,4,'s_ID_2','s_ID_9" 1390 "','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Item','Deleted Ite" 1391 "m',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6" 1392 "D2F12084141534741534741',X'C28810260A17687474703A2F2F7777772E676F6F6" 1393 "76C652E636F6D2F32120B4153414447414447414447');" 1394 "INSERT INTO 'metas' VALUES(4,681,681," LEGACY_PROTO_TIME_VALS(4) 1395 ",-3145728,3,'s_ID_4','s_ID_9" 1396 "','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to Chromium','Welc" 1397 "ome to Chromium',NULL,NULL,X'C28810350A31687474703A2F2F7777772E676F6" 1398 "F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E68746" 1399 "D6C1200',X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6" 1400 "368726F6D652F696E746C2F656E2F77656C636F6D652E68746D6C1200');" 1401 "INSERT INTO 'metas' VALUES(5,677,677," LEGACY_PROTO_TIME_VALS(5) 1402 ",1048576,7,'s_ID_5','s_ID_9'" 1403 ",'s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Google',NULL,NULL," 1404 "X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F1208414741" 1405 "5347415347',X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D" 1406 "2F12084147464447415347');" 1407 "INSERT INTO 'metas' VALUES(6,694,694," LEGACY_PROTO_TIME_VALS(6) 1408 ",-4194304,6,'s_ID_6','s_ID_9" 1409 "','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The Internet',NULL,NU" 1410 "LL,X'C2881000',X'C2881000');" 1411 "INSERT INTO 'metas' VALUES(7,663,663," LEGACY_PROTO_TIME_VALS(7) 1412 ",1048576,0,'s_ID_7','r','r'," 1413 "'r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','google_chrome'," 1414 "NULL,NULL,NULL);" 1415 "INSERT INTO 'metas' VALUES(8,664,664," LEGACY_PROTO_TIME_VALS(8) 1416 ",1048576,0,'s_ID_8','s_ID_7'" 1417 ",'s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks','google_chrome" 1418 "_bookmarks',NULL,X'C2881000',X'C2881000');" 1419 "INSERT INTO 'metas' VALUES(9,665,665," LEGACY_PROTO_TIME_VALS(9) 1420 ",1048576,1,'s_ID_9','s_ID_8'" 1421 ",'s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','Bookmark Bar','b" 1422 "ookmark_bar',NULL,X'C2881000',X'C2881000');" 1423 "INSERT INTO 'metas' VALUES(10,666,666," LEGACY_PROTO_TIME_VALS(10) 1424 ",2097152,2,'s_ID_10','s_ID_" 1425 "8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks','Other Bookma" 1426 "rks','other_bookmarks',NULL,X'C2881000',X'C2881000');" 1427 "INSERT INTO 'metas' VALUES(11,683,683," LEGACY_PROTO_TIME_VALS(11) 1428 ",-1048576,8,'s_ID_11','s_ID" 1429 "_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chromium Projects)" 1430 "','Home (The Chromium Projects)',NULL,NULL,X'C28810220A18687474703A2" 1431 "F2F6465762E6368726F6D69756D2E6F72672F1206414741545741',X'C28810290A1" 1432 "D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F74686572120841464" 1433 "14756415346');" 1434 "INSERT INTO 'metas' VALUES(12,685,685," LEGACY_PROTO_TIME_VALS(12) 1435 ",0,9,'s_ID_12','s_ID_6','s_" 1436 "ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookm" 1437 "arks',NULL,NULL,X'C2881000',X'C2881000');" 1438 "INSERT INTO 'metas' VALUES(13,687,687," LEGACY_PROTO_TIME_VALS(13) 1439 ",-917504,10,'s_ID_13','s_ID" 1440 "_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN | Internet Corpo" 1441 "ration for Assigned Names and Numbers','ICANN | Internet Corporation" 1442 " for Assigned Names and Numbers',NULL,NULL,X'C28810240A15687474703A2" 1443 "F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646',X'C288102" 1444 "00A15687474703A2F2F7777772E6963616E6E2E636F6D2F120744414146415346');" 1445 "INSERT INTO 'metas' VALUES(14,692,692," LEGACY_PROTO_TIME_VALS(14) 1446 ",1048576,11,'s_ID_14','s_ID" 1447 "_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Open Source Proje" 1448 "ct','The WebKit Open Source Project',NULL,NULL,X'C288101A0A126874747" 1449 "03A2F2F7765626B69742E6F72672F1204504E4758',X'C288101C0A13687474703A2" 1450 "F2F7765626B69742E6F72672F781205504E473259');" 1451 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 1452 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 1453 "ult -2, cache_guid TEXT , notification_state BLOB);" 1454 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1455 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,'" 1456 "9010788312004066376x-6609234393368420856x',NULL);" 1457 )); 1458 ASSERT_TRUE(connection->CommitTransaction()); 1459} 1460 1461void MigrationTest::SetUpVersion77Database(sql::Connection* connection) { 1462 ASSERT_TRUE(connection->is_open()); 1463 ASSERT_TRUE(connection->BeginTransaction()); 1464 ASSERT_TRUE(connection->Execute( 1465 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1466 "INSERT INTO 'share_version' VALUES('nick@chromium.org',77);" 1467 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 1468 "itial_sync_ended BOOLEAN default 0);" 1469 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 1470 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 1471 "_version bigint default -1,server_version bigint default 0,server_po" 1472 "sition_in_parent bigint default 0,local_external_id bigint default 0" 1473 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 1474 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 1475 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 1476 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 1477 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 1478 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 1479 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 1480 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 1481 "har,specifics blob,server_specifics blob);" 1482 "INSERT INTO 'metas' VALUES(1,-1,0,0,0," META_PROTO_TIMES_VALS(1) 1483 ",'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'');" 1484 "INSERT INTO 'metas' VALUES(2,669,669,-2097152,4," 1485 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 1486 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 1487 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 1488 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 1489 "14447414447414447');" 1490 "INSERT INTO 'metas' VALUES(4,681,681,-3145728,3," 1491 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 1492 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 1493 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 1494 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 1495 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 1496 "E2F77656C636F6D652E68746D6C1200');" 1497 "INSERT INTO 'metas' VALUES(5,677,677,1048576,7," META_PROTO_TIMES_VALS(5) 1498 ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','" 1499 "Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E" 1500 "636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E67" 1501 "6F6F676C652E636F6D2F12084147464447415347');" 1502 "INSERT INTO 'metas' VALUES(6,694,694,-4194304,6," 1503 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 1504 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 1505 ");" 1506 "INSERT INTO 'metas' VALUES(7,663,663,1048576,0," META_PROTO_TIMES_VALS(7) 1507 ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Goo" 1508 "gle Chrome','google_chrome',NULL,NULL,NULL);" 1509 "INSERT INTO 'metas' VALUES(8,664,664,1048576,0," META_PROTO_TIMES_VALS(8) 1510 ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmar" 1511 "ks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');" 1512 "INSERT INTO 'metas' VALUES(9,665,665,1048576,1," META_PROTO_TIMES_VALS(9) 1513 ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar'" 1514 ",'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');" 1515 "INSERT INTO 'metas' VALUES(10,666,666,2097152,2," 1516 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 1517 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 1518 "LL,X'C2881000',X'C2881000');" 1519 "INSERT INTO 'metas' VALUES(11,683,683,-1048576,8," 1520 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 1521 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 1522 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 1523 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 1524 "8726F6D69756D2E6F72672F6F7468657212084146414756415346');" 1525 "INSERT INTO 'metas' VALUES(12,685,685,0,9," META_PROTO_TIMES_VALS(12) 1526 ",'s_ID_12','s_ID_6','s_" 1527 "ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookm" 1528 "arks',NULL,NULL,X'C2881000',X'C2881000');" 1529 "INSERT INTO 'metas' VALUES(13,687,687,-917504,10," 1530 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 1531 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 1532 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 1533 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 1534 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 1535 "E6963616E6E2E636F6D2F120744414146415346');" 1536 "INSERT INTO 'metas' VALUES(14,692,692,1048576,11," 1537 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 1538 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 1539 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 1540 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 1541 "81205504E473259');" 1542 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 1543 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 1544 "ult -2, cache_guid TEXT , notification_state BLOB);" 1545 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1546 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,'" 1547 "9010788312004066376x-6609234393368420856x',NULL);" 1548 )); 1549 ASSERT_TRUE(connection->CommitTransaction()); 1550} 1551 1552void MigrationTest::SetUpVersion78Database(sql::Connection* connection) { 1553 ASSERT_TRUE(connection->is_open()); 1554 ASSERT_TRUE(connection->BeginTransaction()); 1555 ASSERT_TRUE(connection->Execute( 1556 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1557 "INSERT INTO 'share_version' VALUES('nick@chromium.org',78);" 1558 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 1559 "itial_sync_ended BOOLEAN default 0);" 1560 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 1561 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 1562 "_version bigint default -1,server_version bigint default 0,server_po" 1563 "sition_in_parent bigint default 0,local_external_id bigint default 0" 1564 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 1565 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 1566 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 1567 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 1568 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 1569 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 1570 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 1571 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 1572 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 1573 ");" 1574 "INSERT INTO 'metas' VALUES(1,-1,0,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 1575 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL);" 1576 "INSERT INTO 'metas' VALUES(2,669,669,-2097152,4," 1577 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 1578 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 1579 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 1580 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 1581 "14447414447414447',NULL);" 1582 "INSERT INTO 'metas' VALUES(4,681,681,-3145728,3," 1583 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 1584 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 1585 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 1586 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 1587 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 1588 "E2F77656C636F6D652E68746D6C1200',NULL);" 1589 "INSERT INTO 'metas' VALUES(5,677,677,1048576,7," 1590 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 1591 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 1592 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 1593 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 1594 "ULL);" 1595 "INSERT INTO 'metas' VALUES(6,694,694,-4194304,6," 1596 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 1597 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 1598 ",NULL);" 1599 "INSERT INTO 'metas' VALUES(7,663,663,1048576,0," 1600 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 1601 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL);" 1602 "INSERT INTO 'metas' VALUES(8,664,664,1048576,0," 1603 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 1604 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 1605 "00',X'C2881000',NULL);" 1606 "INSERT INTO 'metas' VALUES(9,665,665,1048576,1," 1607 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 1608 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 1609 "000',X'C2881000',NULL);" 1610 "INSERT INTO 'metas' VALUES(10,666,666,2097152,2," 1611 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 1612 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 1613 "LL,X'C2881000',X'C2881000',NULL);" 1614 "INSERT INTO 'metas' VALUES(11,683,683,-1048576,8," 1615 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 1616 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 1617 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 1618 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 1619 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL);" 1620 "INSERT INTO 'metas' VALUES(12,685,685,0,9," 1621 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 1622 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 1623 "2881000',X'C2881000',NULL);" 1624 "INSERT INTO 'metas' VALUES(13,687,687,-917504,10," 1625 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 1626 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 1627 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 1628 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 1629 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 1630 "E6963616E6E2E636F6D2F120744414146415346',NULL);" 1631 "INSERT INTO 'metas' VALUES(14,692,692,1048576,11," 1632 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 1633 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 1634 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 1635 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 1636 "81205504E473259',NULL);" 1637 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 1638 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 1639 "ult -2, cache_guid TEXT , notification_state BLOB);" 1640 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1641 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,'" 1642 "9010788312004066376x-6609234393368420856x',NULL);" 1643 )); 1644 ASSERT_TRUE(connection->CommitTransaction()); 1645} 1646 1647void MigrationTest::SetUpVersion79Database(sql::Connection* connection) { 1648 ASSERT_TRUE(connection->is_open()); 1649 ASSERT_TRUE(connection->BeginTransaction()); 1650 ASSERT_TRUE(connection->Execute( 1651 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1652 "INSERT INTO 'share_version' VALUES('nick@chromium.org',79);" 1653 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 1654 "itial_sync_ended BOOLEAN default 0);" 1655 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 1656 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 1657 "_version bigint default -1,server_version bigint default 0,server_po" 1658 "sition_in_parent bigint default 0,local_external_id bigint default 0" 1659 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 1660 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 1661 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 1662 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 1663 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 1664 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 1665 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 1666 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 1667 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 1668 ");" 1669 "INSERT INTO 'metas' VALUES(1,-1,0,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 1670 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL);" 1671 "INSERT INTO 'metas' VALUES(2,669,669,-2097152,4," 1672 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 1673 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 1674 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 1675 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 1676 "14447414447414447',NULL);" 1677 "INSERT INTO 'metas' VALUES(4,681,681,-3145728,3," 1678 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 1679 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 1680 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 1681 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 1682 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 1683 "E2F77656C636F6D652E68746D6C1200',NULL);" 1684 "INSERT INTO 'metas' VALUES(5,677,677,1048576,7," 1685 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 1686 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 1687 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 1688 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 1689 "ULL);" 1690 "INSERT INTO 'metas' VALUES(6,694,694,-4194304,6," 1691 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 1692 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 1693 ",NULL);" 1694 "INSERT INTO 'metas' VALUES(7,663,663,1048576,0," 1695 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 1696 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL);" 1697 "INSERT INTO 'metas' VALUES(8,664,664,1048576,0," 1698 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 1699 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 1700 "00',X'C2881000',NULL);" 1701 "INSERT INTO 'metas' VALUES(9,665,665,1048576,1," 1702 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 1703 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 1704 "000',X'C2881000',NULL);" 1705 "INSERT INTO 'metas' VALUES(10,666,666,2097152,2," 1706 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 1707 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 1708 "LL,X'C2881000',X'C2881000',NULL);" 1709 "INSERT INTO 'metas' VALUES(11,683,683,-1048576,8," 1710 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 1711 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 1712 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 1713 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 1714 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL);" 1715 "INSERT INTO 'metas' VALUES(12,685,685,0,9," 1716 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 1717 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 1718 "2881000',X'C2881000',NULL);" 1719 "INSERT INTO 'metas' VALUES(13,687,687,-917504,10," 1720 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 1721 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 1722 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 1723 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 1724 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 1725 "E6963616E6E2E636F6D2F120744414146415346',NULL);" 1726 "INSERT INTO 'metas' VALUES(14,692,692,1048576,11," 1727 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 1728 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 1729 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 1730 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 1731 "81205504E473259',NULL);" 1732 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 1733 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 1734 "ult -2, cache_guid TEXT , notification_state BLOB);" 1735 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1736 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064," 1737 "-131078,'9010788312004066376x-6609234393368420856x',NULL);" 1738 )); 1739 ASSERT_TRUE(connection->CommitTransaction()); 1740} 1741 1742void MigrationTest::SetUpVersion80Database(sql::Connection* connection) { 1743 ASSERT_TRUE(connection->is_open()); 1744 ASSERT_TRUE(connection->BeginTransaction()); 1745 ASSERT_TRUE(connection->Execute( 1746 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1747 "INSERT INTO 'share_version' VALUES('nick@chromium.org',80);" 1748 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 1749 "itial_sync_ended BOOLEAN default 0);" 1750 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 1751 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 1752 "_version bigint default -1,server_version bigint default 0,server_po" 1753 "sition_in_parent bigint default 0,local_external_id bigint default 0" 1754 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 1755 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 1756 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 1757 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 1758 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 1759 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 1760 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 1761 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 1762 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 1763 ");" 1764 "INSERT INTO 'metas' VALUES(1,-1,0,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 1765 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL);" 1766 "INSERT INTO 'metas' VALUES(2,669,669,-2097152,4," 1767 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 1768 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 1769 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 1770 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 1771 "14447414447414447',NULL);" 1772 "INSERT INTO 'metas' VALUES(4,681,681,-3145728,3," 1773 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 1774 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 1775 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 1776 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 1777 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 1778 "E2F77656C636F6D652E68746D6C1200',NULL);" 1779 "INSERT INTO 'metas' VALUES(5,677,677,1048576,7," 1780 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 1781 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 1782 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 1783 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 1784 "ULL);" 1785 "INSERT INTO 'metas' VALUES(6,694,694,-4194304,6," 1786 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 1787 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 1788 ",NULL);" 1789 "INSERT INTO 'metas' VALUES(7,663,663,1048576,0," 1790 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 1791 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL);" 1792 "INSERT INTO 'metas' VALUES(8,664,664,1048576,0," 1793 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 1794 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 1795 "00',X'C2881000',NULL);" 1796 "INSERT INTO 'metas' VALUES(9,665,665,1048576,1," 1797 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 1798 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 1799 "000',X'C2881000',NULL);" 1800 "INSERT INTO 'metas' VALUES(10,666,666,2097152,2," 1801 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 1802 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 1803 "LL,X'C2881000',X'C2881000',NULL);" 1804 "INSERT INTO 'metas' VALUES(11,683,683,-1048576,8," 1805 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 1806 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 1807 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 1808 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 1809 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL);" 1810 "INSERT INTO 'metas' VALUES(12,685,685,0,9," 1811 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 1812 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 1813 "2881000',X'C2881000',NULL);" 1814 "INSERT INTO 'metas' VALUES(13,687,687,-917504,10," 1815 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 1816 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 1817 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 1818 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 1819 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 1820 "E6963616E6E2E636F6D2F120744414146415346',NULL);" 1821 "INSERT INTO 'metas' VALUES(14,692,692,1048576,11," 1822 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 1823 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 1824 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 1825 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 1826 "81205504E473259',NULL);" 1827 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 1828 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 1829 "ult -2, cache_guid TEXT , notification_state BLOB, bag_of_chips " 1830 "blob);" 1831 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1832 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064," 1833 "-131078,'9010788312004066376x-6609234393368420856x',NULL, NULL);" 1834 )); 1835 ASSERT_TRUE(connection->CommitTransaction()); 1836} 1837 1838 1839// Helper definitions to create the version 81 DB tables. 1840namespace { 1841 1842const int V80_ROW_COUNT = 13; 1843const int64 V80_POSITIONS[V80_ROW_COUNT] = { 1844 0, 1845 -2097152, 1846 -3145728, 1847 1048576, 1848 -4194304, 1849 1048576, 1850 1048576, 1851 1048576, 1852 2097152, 1853 -1048576, 1854 0, 1855 -917504, 1856 1048576 1857}; 1858 1859std::string V81_Ordinal(int n) { 1860 return Int64ToNodeOrdinal(V80_POSITIONS[n]).ToInternalValue(); 1861} 1862 1863} //namespace 1864 1865// Unlike the earlier versions, the rows for version 81 are generated 1866// programmatically to accurately handle unprintable characters for the 1867// server_ordinal_in_parent field. 1868void MigrationTest::SetUpVersion81Database(sql::Connection* connection) { 1869 ASSERT_TRUE(connection->is_open()); 1870 ASSERT_TRUE(connection->BeginTransaction()); 1871 ASSERT_TRUE(connection->Execute( 1872 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1873 "INSERT INTO 'share_version' VALUES('nick@chromium.org',81);" 1874 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 1875 "itial_sync_ended BOOLEAN default 0);" 1876 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 1877 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 1878 "_version bigint default -1,server_version bigint default 0, " 1879 "local_external_id bigint default 0" 1880 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 1881 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 1882 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 1883 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 1884 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 1885 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 1886 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 1887 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 1888 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 1889 ", server_ordinal_in_parent blob);" 1890 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 1891 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 1892 "ult -2, cache_guid TEXT , notification_state BLOB, bag_of_chips " 1893 "blob);" 1894 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 1895 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064," 1896 "-131078,'9010788312004066376x-6609234393368420856x',NULL, NULL);")); 1897 1898 const char* insert_stmts[V80_ROW_COUNT] = { 1899 "INSERT INTO 'metas' VALUES(1,-1,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 1900 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL,?);", 1901 "INSERT INTO 'metas' VALUES(2,669,669,4," 1902 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 1903 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 1904 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 1905 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 1906 "14447414447414447',NULL,?);", 1907 "INSERT INTO 'metas' VALUES(4,681,681,3," 1908 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 1909 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 1910 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 1911 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 1912 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 1913 "E2F77656C636F6D652E68746D6C1200',NULL,?);", 1914 "INSERT INTO 'metas' VALUES(5,677,677,7," 1915 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 1916 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 1917 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 1918 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 1919 "ULL,?);", 1920 "INSERT INTO 'metas' VALUES(6,694,694,6," 1921 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 1922 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 1923 ",NULL,?);", 1924 "INSERT INTO 'metas' VALUES(7,663,663,0," 1925 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 1926 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL,?);", 1927 "INSERT INTO 'metas' VALUES(8,664,664,0," 1928 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 1929 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 1930 "00',X'C2881000',NULL,?);", 1931 "INSERT INTO 'metas' VALUES(9,665,665,1," 1932 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 1933 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 1934 "000',X'C2881000',NULL,?);", 1935 "INSERT INTO 'metas' VALUES(10,666,666,2," 1936 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 1937 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 1938 "LL,X'C2881000',X'C2881000',NULL,?);", 1939 "INSERT INTO 'metas' VALUES(11,683,683,8," 1940 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 1941 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 1942 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 1943 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 1944 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL,?);", 1945 "INSERT INTO 'metas' VALUES(12,685,685,9," 1946 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 1947 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 1948 "2881000',X'C2881000',NULL,?);", 1949 "INSERT INTO 'metas' VALUES(13,687,687,10," 1950 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 1951 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 1952 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 1953 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 1954 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 1955 "E6963616E6E2E636F6D2F120744414146415346',NULL,?);", 1956 "INSERT INTO 'metas' VALUES(14,692,692,11," 1957 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 1958 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 1959 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 1960 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 1961 "81205504E473259',NULL,?);" }; 1962 1963 for (int i = 0; i < V80_ROW_COUNT; i++) { 1964 sql::Statement s(connection->GetUniqueStatement(insert_stmts[i])); 1965 std::string ord = V81_Ordinal(i); 1966 s.BindBlob(0, ord.data(), ord.length()); 1967 ASSERT_TRUE(s.Run()); 1968 s.Reset(true); 1969 } 1970 ASSERT_TRUE(connection->CommitTransaction()); 1971} 1972 1973void MigrationTest::SetUpVersion82Database(sql::Connection* connection) { 1974 ASSERT_TRUE(connection->is_open()); 1975 ASSERT_TRUE(connection->BeginTransaction()); 1976 ASSERT_TRUE(connection->Execute( 1977 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 1978 "INSERT INTO 'share_version' VALUES('nick@chromium.org',82);" 1979 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 1980 "itial_sync_ended BOOLEAN default 0, transaction_version BIGINT " 1981 "default 0);" 1982 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1, 1);" 1983 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 1984 "_version bigint default -1,server_version bigint default 0, " 1985 "local_external_id bigint default 0" 1986 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 1987 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 1988 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 1989 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 1990 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 1991 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 1992 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 1993 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 1994 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 1995 ", server_ordinal_in_parent blob);" 1996 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 1997 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 1998 "ult -2, cache_guid TEXT , notification_state BLOB, bag_of_chips " 1999 "blob);" 2000 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 2001 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064," 2002 "-131078,'9010788312004066376x-6609234393368420856x',NULL, NULL);")); 2003 2004 const char* insert_stmts[V80_ROW_COUNT] = { 2005 "INSERT INTO 'metas' VALUES(1,-1,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 2006 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL,?);", 2007 "INSERT INTO 'metas' VALUES(2,669,669,4," 2008 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 2009 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 2010 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 2011 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 2012 "14447414447414447',NULL,?);", 2013 "INSERT INTO 'metas' VALUES(4,681,681,3," 2014 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 2015 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 2016 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 2017 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 2018 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 2019 "E2F77656C636F6D652E68746D6C1200',NULL,?);", 2020 "INSERT INTO 'metas' VALUES(5,677,677,7," 2021 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 2022 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 2023 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 2024 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 2025 "ULL,?);", 2026 "INSERT INTO 'metas' VALUES(6,694,694,6," 2027 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 2028 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 2029 ",NULL,?);", 2030 "INSERT INTO 'metas' VALUES(7,663,663,0," 2031 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 2032 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL,?);", 2033 "INSERT INTO 'metas' VALUES(8,664,664,0," 2034 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 2035 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 2036 "00',X'C2881000',NULL,?);", 2037 "INSERT INTO 'metas' VALUES(9,665,665,1," 2038 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 2039 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 2040 "000',X'C2881000',NULL,?);", 2041 "INSERT INTO 'metas' VALUES(10,666,666,2," 2042 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 2043 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 2044 "LL,X'C2881000',X'C2881000',NULL,?);", 2045 "INSERT INTO 'metas' VALUES(11,683,683,8," 2046 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 2047 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 2048 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 2049 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 2050 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL,?);", 2051 "INSERT INTO 'metas' VALUES(12,685,685,9," 2052 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 2053 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 2054 "2881000',X'C2881000',NULL,?);", 2055 "INSERT INTO 'metas' VALUES(13,687,687,10," 2056 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 2057 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 2058 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 2059 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 2060 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 2061 "E6963616E6E2E636F6D2F120744414146415346',NULL,?);", 2062 "INSERT INTO 'metas' VALUES(14,692,692,11," 2063 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 2064 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 2065 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 2066 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 2067 "81205504E473259',NULL,?);" }; 2068 2069 for (int i = 0; i < V80_ROW_COUNT; i++) { 2070 sql::Statement s(connection->GetUniqueStatement(insert_stmts[i])); 2071 std::string ord = V81_Ordinal(i); 2072 s.BindBlob(0, ord.data(), ord.length()); 2073 ASSERT_TRUE(s.Run()); 2074 s.Reset(true); 2075 } 2076 ASSERT_TRUE(connection->CommitTransaction()); 2077} 2078 2079void MigrationTest::SetUpVersion83Database(sql::Connection* connection) { 2080 ASSERT_TRUE(connection->is_open()); 2081 ASSERT_TRUE(connection->BeginTransaction()); 2082 ASSERT_TRUE(connection->Execute( 2083 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 2084 "INSERT INTO 'share_version' VALUES('nick@chromium.org',83);" 2085 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 2086 "itial_sync_ended BOOLEAN default 0, transaction_version BIGINT " 2087 "default 0);" 2088 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1, 1);" 2089 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 2090 "_version bigint default -1,server_version bigint default 0, " 2091 "local_external_id bigint default 0" 2092 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 2093 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 2094 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 2095 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 2096 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 2097 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 2098 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 2099 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 2100 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 2101 ", server_ordinal_in_parent blob, transaction_version bigint default " 2102 "0);" 2103 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 2104 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 2105 "ult -2, cache_guid TEXT , notification_state BLOB, bag_of_chips " 2106 "blob);" 2107 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 2108 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064," 2109 "-131078,'9010788312004066376x-6609234393368420856x',NULL, NULL);")); 2110 2111 const char* insert_stmts[V80_ROW_COUNT] = { 2112 "INSERT INTO 'metas' VALUES(1,-1,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 2113 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL,?,0);", 2114 "INSERT INTO 'metas' VALUES(2,669,669,4," 2115 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 2116 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 2117 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 2118 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 2119 "14447414447414447',NULL,?,0);", 2120 "INSERT INTO 'metas' VALUES(4,681,681,3," 2121 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 2122 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 2123 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 2124 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 2125 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 2126 "E2F77656C636F6D652E68746D6C1200',NULL,?,0);", 2127 "INSERT INTO 'metas' VALUES(5,677,677,7," 2128 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 2129 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 2130 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 2131 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 2132 "ULL,?,0);", 2133 "INSERT INTO 'metas' VALUES(6,694,694,6," 2134 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 2135 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 2136 ",NULL,?,0);", 2137 "INSERT INTO 'metas' VALUES(7,663,663,0," 2138 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 2139 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL,?,0);" 2140 "", 2141 "INSERT INTO 'metas' VALUES(8,664,664,0," 2142 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 2143 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 2144 "00',X'C2881000',NULL,?,0);", 2145 "INSERT INTO 'metas' VALUES(9,665,665,1," 2146 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 2147 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 2148 "000',X'C2881000',NULL,?,0);", 2149 "INSERT INTO 'metas' VALUES(10,666,666,2," 2150 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 2151 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 2152 "LL,X'C2881000',X'C2881000',NULL,?,0);", 2153 "INSERT INTO 'metas' VALUES(11,683,683,8," 2154 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 2155 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 2156 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 2157 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 2158 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL,?,0);", 2159 "INSERT INTO 'metas' VALUES(12,685,685,9," 2160 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 2161 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 2162 "2881000',X'C2881000',NULL,?,0);", 2163 "INSERT INTO 'metas' VALUES(13,687,687,10," 2164 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 2165 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 2166 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 2167 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 2168 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 2169 "E6963616E6E2E636F6D2F120744414146415346',NULL,?,0);", 2170 "INSERT INTO 'metas' VALUES(14,692,692,11," 2171 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 2172 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 2173 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 2174 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 2175 "81205504E473259',NULL,?,0);" }; 2176 2177 for (int i = 0; i < V80_ROW_COUNT; i++) { 2178 sql::Statement s(connection->GetUniqueStatement(insert_stmts[i])); 2179 std::string ord = V81_Ordinal(i); 2180 s.BindBlob(0, ord.data(), ord.length()); 2181 ASSERT_TRUE(s.Run()); 2182 s.Reset(true); 2183 } 2184 ASSERT_TRUE(connection->CommitTransaction()); 2185} 2186 2187void MigrationTest::SetUpVersion84Database(sql::Connection* connection) { 2188 ASSERT_TRUE(connection->is_open()); 2189 ASSERT_TRUE(connection->BeginTransaction()); 2190 ASSERT_TRUE(connection->Execute( 2191 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 2192 "INSERT INTO 'share_version' VALUES('nick@chromium.org',84);" 2193 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, in" 2194 "itial_sync_ended BOOLEAN default 0, transaction_version BIGINT " 2195 "default 0);" 2196 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1, 1);" 2197 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 2198 "_version bigint default -1,server_version bigint default 0, " 2199 "local_external_id bigint default 0" 2200 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 2201 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 2202 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 2203 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 2204 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 2205 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 2206 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 2207 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 2208 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 2209 ", server_ordinal_in_parent blob, transaction_version bigint default " 2210 "0);" 2211 "CREATE TABLE 'deleted_metas'" 2212 "(metahandle bigint primary key ON CONFLICT FAIL,base" 2213 "_version bigint default -1,server_version bigint default 0, " 2214 "local_external_id bigint default 0" 2215 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 2216 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 2217 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 2218 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 2219 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 2220 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 2221 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 2222 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 2223 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 2224 ", server_ordinal_in_parent blob, transaction_version bigint default " 2225 "0);" 2226 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 2227 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 2228 "ult -2, cache_guid TEXT , notification_state BLOB, bag_of_chips " 2229 "blob);" 2230 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 2231 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064," 2232 "-131078,'9010788312004066376x-6609234393368420856x',NULL, NULL);")); 2233 2234 const char* insert_stmts[V80_ROW_COUNT] = { 2235 "INSERT INTO 'metas' VALUES(1,-1,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 2236 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL,?,0);", 2237 "INSERT INTO 'metas' VALUES(2,669,669,4," 2238 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 2239 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 2240 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 2241 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 2242 "14447414447414447',NULL,?,0);", 2243 "INSERT INTO 'metas' VALUES(4,681,681,3," 2244 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 2245 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 2246 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 2247 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 2248 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 2249 "E2F77656C636F6D652E68746D6C1200',NULL,?,0);", 2250 "INSERT INTO 'metas' VALUES(5,677,677,7," 2251 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 2252 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 2253 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 2254 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 2255 "ULL,?,0);", 2256 "INSERT INTO 'metas' VALUES(6,694,694,6," 2257 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 2258 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 2259 ",NULL,?,0);", 2260 "INSERT INTO 'metas' VALUES(7,663,663,0," 2261 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 2262 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL,?,0);" 2263 "", 2264 "INSERT INTO 'metas' VALUES(8,664,664,0," 2265 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 2266 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 2267 "00',X'C2881000',NULL,?,0);", 2268 "INSERT INTO 'metas' VALUES(9,665,665,1," 2269 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 2270 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 2271 "000',X'C2881000',NULL,?,0);", 2272 "INSERT INTO 'metas' VALUES(10,666,666,2," 2273 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 2274 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 2275 "LL,X'C2881000',X'C2881000',NULL,?,0);", 2276 "INSERT INTO 'metas' VALUES(11,683,683,8," 2277 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 2278 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 2279 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 2280 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 2281 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL,?,0);", 2282 "INSERT INTO 'metas' VALUES(12,685,685,9," 2283 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 2284 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 2285 "2881000',X'C2881000',NULL,?,0);", 2286 "INSERT INTO 'metas' VALUES(13,687,687,10," 2287 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 2288 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 2289 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 2290 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 2291 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 2292 "E6963616E6E2E636F6D2F120744414146415346',NULL,?,0);", 2293 "INSERT INTO 'metas' VALUES(14,692,692,11," 2294 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 2295 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 2296 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 2297 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 2298 "81205504E473259',NULL,?,0);" }; 2299 2300 for (int i = 0; i < V80_ROW_COUNT; i++) { 2301 sql::Statement s(connection->GetUniqueStatement(insert_stmts[i])); 2302 std::string ord = V81_Ordinal(i); 2303 s.BindBlob(0, ord.data(), ord.length()); 2304 ASSERT_TRUE(s.Run()); 2305 s.Reset(true); 2306 } 2307 ASSERT_TRUE(connection->CommitTransaction()); 2308} 2309 2310void MigrationTest::SetUpVersion85Database(sql::Connection* connection) { 2311 ASSERT_TRUE(connection->is_open()); 2312 ASSERT_TRUE(connection->BeginTransaction()); 2313 ASSERT_TRUE(connection->Execute( 2314 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 2315 "INSERT INTO 'share_version' VALUES('nick@chromium.org',85);" 2316 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, " 2317 "transaction_version BIGINT default 0);" 2318 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605', 1);" 2319 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 2320 "_version bigint default -1,server_version bigint default 0, " 2321 "local_external_id bigint default 0" 2322 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 2323 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 2324 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 2325 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 2326 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 2327 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 2328 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 2329 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 2330 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 2331 ", server_ordinal_in_parent blob, transaction_version bigint default " 2332 "0);" 2333 "CREATE TABLE 'deleted_metas'" 2334 "(metahandle bigint primary key ON CONFLICT FAIL,base" 2335 "_version bigint default -1,server_version bigint default 0, " 2336 "local_external_id bigint default 0" 2337 ",mtime bigint default 0,server_mtime bigint default 0,ctime bigint d" 2338 "efault 0,server_ctime bigint default 0,id varchar(255) default 'r',p" 2339 "arent_id varchar(255) default 'r',server_parent_id varchar(255) defa" 2340 "ult 'r',prev_id varchar(255) default 'r',next_id varchar(255) defaul" 2341 "t 'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is" 2342 "_del bit default 0,is_dir bit default 0,server_is_dir bit default 0," 2343 "server_is_del bit default 0,non_unique_name varchar,server_non_uniqu" 2344 "e_name varchar(255),unique_server_tag varchar,unique_client_tag varc" 2345 "har,specifics blob,server_specifics blob, base_server_specifics BLOB" 2346 ", server_ordinal_in_parent blob, transaction_version bigint default " 2347 "0);" 2348 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 2349 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defa" 2350 "ult -2, cache_guid TEXT , notification_state BLOB, bag_of_chips " 2351 "blob);" 2352 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 2353 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064," 2354 "-131078,'9010788312004066376x-6609234393368420856x',NULL, NULL);")); 2355 2356 const char* insert_stmts[V80_ROW_COUNT] = { 2357 "INSERT INTO 'metas' VALUES(1,-1,0,0," META_PROTO_TIMES_VALS(1) ",'r','" 2358 "r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'',NULL,?,0);", 2359 "INSERT INTO 'metas' VALUES(2,669,669,4," 2360 META_PROTO_TIMES_VALS(2) ",'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_" 2361 "2',0,0,1,0,0,1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A1" 2362 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X" 2363 "'C28810260A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534" 2364 "14447414447414447',NULL,?,0);", 2365 "INSERT INTO 'metas' VALUES(4,681,681,3," 2366 META_PROTO_TIMES_VALS(4) ",'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_" 2367 "4',0,0,1,0,0,1,'Welcome to Chromium','Welcome to Chromium',NULL,NULL" 2368 ",X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6" 2369 "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687" 2370 "474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656" 2371 "E2F77656C636F6D652E68746D6C1200',NULL,?,0);", 2372 "INSERT INTO 'metas' VALUES(5,677,677,7," 2373 META_PROTO_TIMES_VALS(5) ",'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_" 2374 "5',0,0,1,0,0,1,'Google','Google',NULL,NULL,X'C28810220A16687474703A2" 2375 "F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'C28810220A1" 2376 "6687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464447415347',N" 2377 "ULL,?,0);", 2378 "INSERT INTO 'metas' VALUES(6,694,694,6," 2379 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1" 2380 ",1,0,'The Internet','The Internet',NULL,NULL,X'C2881000',X'C2881000'" 2381 ",NULL,?,0);", 2382 "INSERT INTO 'metas' VALUES(7,663,663,0," 2383 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Goog" 2384 "le Chrome','Google Chrome','google_chrome',NULL,NULL,NULL,NULL,?,0);" 2385 "", 2386 "INSERT INTO 'metas' VALUES(8,664,664,0," 2387 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1" 2388 ",1,0,'Bookmarks','Bookmarks','google_chrome_bookmarks',NULL,X'C28810" 2389 "00',X'C2881000',NULL,?,0);", 2390 "INSERT INTO 'metas' VALUES(9,665,665,1," 2391 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0" 2392 ",0,0,1,1,0,'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881" 2393 "000',X'C2881000',NULL,?,0);", 2394 "INSERT INTO 'metas' VALUES(10,666,666,2," 2395 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r'," 2396 "0,0,0,1,1,0,'Other Bookmarks','Other Bookmarks','other_bookmarks',NU" 2397 "LL,X'C2881000',X'C2881000',NULL,?,0);", 2398 "INSERT INTO 'metas' VALUES(11,683,683,8," 2399 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13'" 2400 ",0,0,0,0,0,0,'Home (The Chromium Projects)','Home (The Chromium Proj" 2401 "ects)',NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756" 2402 "D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636" 2403 "8726F6D69756D2E6F72672F6F7468657212084146414756415346',NULL,?,0);", 2404 "INSERT INTO 'metas' VALUES(12,685,685,9," 2405 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_" 2406 "ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C" 2407 "2881000',X'C2881000',NULL,?,0);", 2408 "INSERT INTO 'metas' VALUES(13,687,687,10," 2409 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_" 2410 "ID_12',0,0,0,0,0,0,'ICANN | Internet Corporation for Assigned Names " 2411 "and Numbers','ICANN | Internet Corporation for Assigned Names and Nu" 2412 "mbers',NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636" 2413 "F6D2F120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772" 2414 "E6963616E6E2E636F6D2F120744414146415346',NULL,?,0);", 2415 "INSERT INTO 'metas' VALUES(14,692,692,11," 2416 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r'" 2417 ",0,0,0,0,0,0,'The WebKit Open Source Project','The WebKit Open Sourc" 2418 "e Project',NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F726" 2419 "72F1204504E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F7" 2420 "81205504E473259',NULL,?,0);" }; 2421 2422 for (int i = 0; i < V80_ROW_COUNT; i++) { 2423 sql::Statement s(connection->GetUniqueStatement(insert_stmts[i])); 2424 std::string ord = V81_Ordinal(i); 2425 s.BindBlob(0, ord.data(), ord.length()); 2426 ASSERT_TRUE(s.Run()); 2427 s.Reset(true); 2428 } 2429 ASSERT_TRUE(connection->CommitTransaction()); 2430} 2431 2432void MigrationTest::SetUpVersion86Database(sql::Connection* connection) { 2433 ASSERT_TRUE(connection->is_open()); 2434 ASSERT_TRUE(connection->BeginTransaction()); 2435 ASSERT_TRUE(connection->Execute( 2436 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 2437 "INSERT INTO 'share_version' VALUES('nick@chromium.org',86);" 2438 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB," 2439 " transaction_version BIGINT default 0);" 2440 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 2441 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,b" 2442 "ase_version bigint default -1,server_version bigint default 0,local_e" 2443 "xternal_id bigint default 0,transaction_version bigint default 0,mtim" 2444 "e bigint default 0,server_mtime bigint default 0,ctime bigint default" 2445 " 0,server_ctime bigint default 0,id varchar(255) default 'r',parent_i" 2446 "d varchar(255) default 'r',server_parent_id varchar(255) default 'r'," 2447 "is_unsynced bit default 0,is_unapplied_update bit default 0,is_del bi" 2448 "t default 0,is_dir bit default 0,server_is_dir bit default 0,server_i" 2449 "s_del bit default 0,non_unique_name varchar,server_non_unique_name va" 2450 "rchar(255),unique_server_tag varchar,unique_client_tag varchar,unique" 2451 "_bookmark_tag varchar,specifics blob,server_specifics blob,base_serve" 2452 "r_specifics blob,server_unique_position blob,unique_position blob);" 2453 "INSERT INTO 'metas' VALUES(1,-1,0,0,0," 2454 META_PROTO_TIMES_VALS(1) 2455 ",'r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL," 2456 "X'',X'',X'',NULL,X'2200',X'2200');" 2457 "INSERT INTO 'metas' VALUES(6,694,694,6,0," 2458 META_PROTO_TIMES_VALS(6) ",'s_ID_6','s_ID_9','s_ID_9',0,0,0,1,1,0,'The" 2459 " Internet','The Internet',NULL,NULL,X'6754307476346749735A5734654D653" 2460 "273625336557753582F77673D',X'C2881000',X'C2881000',NULL,X'22247FFFFFF" 2461 "FFFC000006754307476346749735A5734654D653273625336557753582F77673D',X'" 2462 "22247FFFFFFFFFC000006754307476346749735A5734654D653273625336557753582" 2463 "F77673D');" 2464 "INSERT INTO 'metas' VALUES(7,663,663,0,0," 2465 META_PROTO_TIMES_VALS(7) ",'s_ID_7','r','r',0,0,0,1,1,0,'Google Chrome" 2466 "','Google Chrome','google_chrome',NULL,X'',NULL,NULL,NULL,X'2200',X'2" 2467 "200');" 2468 "INSERT INTO 'metas' VALUES(8,664,664,0,0," 2469 META_PROTO_TIMES_VALS(8) ",'s_ID_8','s_ID_7','s_ID_7',0,0,0,1,1,0,'Boo" 2470 "kmarks','Bookmarks','google_chrome_bookmarks',NULL,X'',X'C2881000',X'" 2471 "C2881000',NULL,X'2200',X'2200');" 2472 "INSERT INTO 'metas' VALUES(9,665,665,1,0," 2473 META_PROTO_TIMES_VALS(9) ",'s_ID_9','s_ID_8','s_ID_8',0,0,0,1,1,0,'Boo" 2474 "kmark Bar','Bookmark Bar','bookmark_bar',NULL,X'',X'C2881000',X'C2881" 2475 "000',NULL,X'2200',X'2200');" 2476 "INSERT INTO 'metas' VALUES(10,666,666,2,0," 2477 META_PROTO_TIMES_VALS(10) ",'s_ID_10','s_ID_8','s_ID_8',0,0,0,1,1,0,'O" 2478 "ther Bookmarks','Other Bookmarks','other_bookmarks',NULL,X'',X'C28810" 2479 "00',X'C2881000',NULL,X'2200',X'2200');" 2480 "INSERT INTO 'metas' VALUES(11,683,683,8,0," 2481 META_PROTO_TIMES_VALS(11) ",'s_ID_11','s_ID_6','s_ID_6',0,0,0,0,0,0,'H" 2482 "ome (The Chromium Projects)','Home (The Chromium Projects)',NULL,NULL" 2483 ",X'50514C784A456D623579366267644237646A7A2B62314130346E493D',X'C28810" 2484 "220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F120641474154574" 2485 "1',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F74" 2486 "68657212084146414756415346',NULL,X'22247FFFFFFFFFF0000050514C784A456D" 2487 "623579366267644237646A7A2B62314130346E493D',X'22247FFFFFFFFFF00000505" 2488 "14C784A456D623579366267644237646A7A2B62314130346E493D');" 2489 "INSERT INTO 'metas' VALUES(12,685,685,9,0," 2490 META_PROTO_TIMES_VALS(12) ",'s_ID_12','s_ID_6','s_ID_6',0,0,0,1,1,0,'E" 2491 "xtra Bookmarks','Extra Bookmarks',NULL,NULL,X'7867626A704A646134635A6" 2492 "F616C376A49513338734B46324837773D',X'C2881000',X'C2881000',NULL,X'222" 2493 "480000000000000007867626A704A646134635A6F616C376A49513338734B46324837" 2494 "773D',X'222480000000000000007867626A704A646134635A6F616C376A495133387" 2495 "34B46324837773D');" 2496 "INSERT INTO 'metas' VALUES(13,687,687,10,0," 2497 META_PROTO_TIMES_VALS(13) ",'s_ID_13','s_ID_6','s_ID_6',0,0,0,0,0,0,'I" 2498 "CANN | Internet Corporation for Assigned Names and Numbers','ICANN | " 2499 "Internet Corporation for Assigned Names and Numbers',NULL,NULL,X'3142" 2500 "756B572F7741766956504179672B304A614A514B3452384A413D',X'C28810240A156" 2501 "87474703A2F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646'," 2502 "X'C28810200A15687474703A2F2F7777772E6963616E6E2E636F6D2F1207444141464" 2503 "15346',NULL,X'22247FFFFFFFFFF200003142756B572F7741766956504179672B304" 2504 "A614A514B3452384A413D',X'22247FFFFFFFFFF200003142756B572F774176695650" 2505 "4179672B304A614A514B3452384A413D');" 2506 "INSERT INTO 'metas' VALUES(14,692,692,11,0," 2507 META_PROTO_TIMES_VALS(14) ",'s_ID_14','s_ID_6','s_ID_6',0,0,0,0,0,0,'T" 2508 "he WebKit Open Source Project','The WebKit Open Source Project',NULL," 2509 "NULL,X'5A5678314E7976364579524D3177494F7236563159552F6E644C553D',X'C2" 2510 "88101A0A12687474703A2F2F7765626B69742E6F72672F1204504E4758',X'C288101" 2511 "C0A13687474703A2F2F7765626B69742E6F72672F781205504E473259',NULL,X'222" 2512 "480000000001000005A5678314E7976364579524D3177494F7236563159552F6E644C" 2513 "553D',X'222480000000001000005A5678314E7976364579524D3177494F723656315" 2514 "9552F6E644C553D');" 2515 "CREATE TABLE deleted_metas (metahandle bigint primary key ON CONFLICT FA" 2516 "IL,base_version bigint default -1,server_version bigint default 0,loc" 2517 "al_external_id bigint default 0,transaction_version bigint default 0," 2518 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint def" 2519 "ault 0,server_ctime bigint default 0,id varchar(255) default 'r',pare" 2520 "nt_id varchar(255) default 'r',server_parent_id varchar(255) default " 2521 "'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is_de" 2522 "l bit default 0,is_dir bit default 0,server_is_dir bit default 0,serv" 2523 "er_is_del bit default 0,non_unique_name varchar,server_non_unique_nam" 2524 "e varchar(255),unique_server_tag varchar,unique_client_tag varchar,un" 2525 "ique_bookmark_tag varchar,specifics blob,server_specifics blob,base_s" 2526 "erver_specifics blob,server_unique_position blob,unique_position blob" 2527 ");" 2528 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birt" 2529 "hday TEXT, db_create_version TEXT, db_create_time INT, next_id INT de" 2530 "fault -2, cache_guid TEXT, notification_state BLOB, bag_of_chips BLOB" 2531 ");" 2532 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.or" 2533 "g','c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-13107" 2534 "8,'9010788312004066376x-6609234393368420856x',NULL,NULL);")); 2535 ASSERT_TRUE(connection->CommitTransaction()); 2536} 2537 2538void MigrationTest::SetUpVersion87Database(sql::Connection* connection) { 2539 ASSERT_TRUE(connection->is_open()); 2540 ASSERT_TRUE(connection->BeginTransaction()); 2541 ASSERT_TRUE(connection->Execute( 2542 "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);" 2543 "INSERT INTO 'share_version' VALUES('nick@chromium.org',87);" 2544 "CREATE TABLE models (model_id BLOB primary key, progress_marker BLOB, tr" 2545 "ansaction_version BIGINT default 0);" 2546 "INSERT INTO 'models' VALUES(X'C2881000',X'0888810218B605',1);" 2547 "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,base" 2548 "_version bigint default -1,server_version bigint default 0,local_exte" 2549 "rnal_id bigint default 0,transaction_version bigint default 0,mtime b" 2550 "igint default 0,server_mtime bigint default 0,ctime bigint default 0," 2551 "server_ctime bigint default 0,id varchar(255) default 'r',parent_id v" 2552 "archar(255) default 'r',server_parent_id varchar(255) default 'r',is_" 2553 "unsynced bit default 0,is_unapplied_update bit default 0,is_del bit d" 2554 "efault 0,is_dir bit default 0,server_is_dir bit default 0,server_is_d" 2555 "el bit default 0,non_unique_name varchar,server_non_unique_name varch" 2556 "ar(255),unique_server_tag varchar,unique_client_tag varchar,unique_bo" 2557 "okmark_tag varchar,specifics blob,server_specifics blob,base_server_s" 2558 "pecifics blob,server_unique_position blob,unique_position blob,attach" 2559 "ment_metadata blob);" 2560 "INSERT INTO 'metas' VALUES(1,-1,0,0,0," 2561 META_PROTO_TIMES_VALS(1) 2562 ",'r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X''" 2563 ",X'',X'',NULL,X'2200',X'2200',NULL);" 2564 "INSERT INTO 'metas' VALUES(6,694,694,6,0," 2565 META_PROTO_TIMES_VALS(6) 2566 ",'s_ID_6','s_ID_9','s_ID_9',0,0,0,1,1,0,'The " 2567 "Internet','The Internet',NULL,NULL,X'6754307476346749735A5734654D6532" 2568 "73625336557753582F77673D',X'C2881000',X'C2881000',NULL,X'22247FFFFFFF" 2569 "FFC000006754307476346749735A5734654D653273625336557753582F77673D',X'2" 2570 "2247FFFFFFFFFC000006754307476346749735A5734654D653273625336557753582F" 2571 "77673D',NULL);" 2572 "INSERT INTO 'metas' VALUES(7,663,663,0,0," 2573 META_PROTO_TIMES_VALS(7) 2574 ",'s_ID_7','r','r',0,0,0,1,1,0,'Google Chrome'" 2575 ",'Google Chrome','google_chrome',NULL,X'',NULL,NULL,NULL,X'2200',X'22" 2576 "00',NULL);" 2577 "INSERT INTO 'metas' VALUES(8,664,664,0,0," 2578 META_PROTO_TIMES_VALS(8) 2579 ",'s_ID_8','s_ID_7','s_ID_7',0,0,0,1,1,0,'Book" 2580 "marks','Bookmarks','google_chrome_bookmarks',NULL,X'',X'C2881000',X'C" 2581 "2881000',NULL,X'2200',X'2200',NULL);" 2582 "INSERT INTO 'metas' VALUES(9,665,665,1,0," 2583 META_PROTO_TIMES_VALS(9) 2584 ",'s_ID_9','s_ID_8','s_ID_8',0,0,0,1,1,0,'Book" 2585 "mark Bar','Bookmark Bar','bookmark_bar',NULL,X'',X'C2881000',X'C28810" 2586 "00',NULL,X'2200',X'2200',NULL);" 2587 "INSERT INTO 'metas' VALUES(10,666,666,2,0," 2588 META_PROTO_TIMES_VALS(10) 2589 ",'s_ID_10','s_ID_8','s_ID_8',0,0,0,1,1,0,'Ot" 2590 "her Bookmarks','Other Bookmarks','other_bookmarks',NULL,X'',X'C288100" 2591 "0',X'C2881000',NULL,X'2200',X'2200',NULL);" 2592 "INSERT INTO 'metas' VALUES(11,683,683,8,0," 2593 META_PROTO_TIMES_VALS(11) 2594 ",'s_ID_11','s_ID_6','s_ID_6',0,0,0,0,0,0,'Ho" 2595 "me (The Chromium Projects)','Home (The Chromium Projects)',NULL,NULL," 2596 "X'50514C784A456D623579366267644237646A7A2B62314130346E493D',X'C288102" 2597 "20A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1206414741545741" 2598 "',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F746" 2599 "8657212084146414756415346',NULL,X'22247FFFFFFFFFF0000050514C784A456D6" 2600 "23579366267644237646A7A2B62314130346E493D',X'22247FFFFFFFFFF000005051" 2601 "4C784A456D623579366267644237646A7A2B62314130346E493D',NULL);" 2602 "INSERT INTO 'metas' VALUES(12,685,685,9,0," 2603 META_PROTO_TIMES_VALS(12) 2604 ",'s_ID_12','s_ID_6','s_ID_6',0,0,0,1,1,0,'Ex" 2605 "tra Bookmarks','Extra Bookmarks',NULL,NULL,X'7867626A704A646134635A6F" 2606 "616C376A49513338734B46324837773D',X'C2881000',X'C2881000',NULL,X'2224" 2607 "80000000000000007867626A704A646134635A6F616C376A49513338734B463248377" 2608 "73D',X'222480000000000000007867626A704A646134635A6F616C376A4951333873" 2609 "4B46324837773D',NULL);" 2610 "INSERT INTO 'metas' VALUES(13,687,687,10,0," 2611 META_PROTO_TIMES_VALS(13) 2612 ",'s_ID_13','s_ID_6','s_ID_6',0,0,0,0,0,0,'I" 2613 "CANN | Internet Corporation for Assigned Names and Numbers','ICANN | " 2614 "Internet Corporation for Assigned Names and Numbers',NULL,NULL,X'3142" 2615 "756B572F7741766956504179672B304A614A514B3452384A413D',X'C28810240A156" 2616 "87474703A2F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646'," 2617 "X'C28810200A15687474703A2F2F7777772E6963616E6E2E636F6D2F1207444141464" 2618 "15346',NULL,X'22247FFFFFFFFFF200003142756B572F7741766956504179672B304" 2619 "A614A514B3452384A413D',X'22247FFFFFFFFFF200003142756B572F774176695650" 2620 "4179672B304A614A514B3452384A413D',NULL);" 2621 "INSERT INTO 'metas' VALUES(14,692,692,11,0," 2622 META_PROTO_TIMES_VALS(14) 2623 ",'s_ID_14','s_ID_6','s_ID_6',0,0,0,0,0,0,'T" 2624 "he WebKit Open Source Project','The WebKit Open Source Project',NULL," 2625 "NULL,X'5A5678314E7976364579524D3177494F7236563159552F6E644C553D',X'C2" 2626 "88101A0A12687474703A2F2F7765626B69742E6F72672F1204504E4758',X'C288101" 2627 "C0A13687474703A2F2F7765626B69742E6F72672F781205504E473259',NULL,X'222" 2628 "480000000001000005A5678314E7976364579524D3177494F7236563159552F6E644C" 2629 "553D',X'222480000000001000005A5678314E7976364579524D3177494F723656315" 2630 "9552F6E644C553D',NULL);" 2631 "CREATE TABLE deleted_metas (metahandle bigint primary key ON CONFLICT FA" 2632 "IL,base_version bigint default -1,server_version bigint default 0,loc" 2633 "al_external_id bigint default 0,transaction_version bigint default 0," 2634 "mtime bigint default 0,server_mtime bigint default 0,ctime bigint def" 2635 "ault 0,server_ctime bigint default 0,id varchar(255) default 'r',pare" 2636 "nt_id varchar(255) default 'r',server_parent_id varchar(255) default " 2637 "'r',is_unsynced bit default 0,is_unapplied_update bit default 0,is_de" 2638 "l bit default 0,is_dir bit default 0,server_is_dir bit default 0,serv" 2639 "er_is_del bit default 0,non_unique_name varchar,server_non_unique_nam" 2640 "e varchar(255),unique_server_tag varchar,unique_client_tag varchar,un" 2641 "ique_bookmark_tag varchar,specifics blob,server_specifics blob,base_s" 2642 "erver_specifics blob,server_unique_position blob,unique_position blob" 2643 ",attachment_metadata blob);" 2644 "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthda" 2645 "y TEXT, db_create_version TEXT, db_create_time INT, next_id INT defau" 2646 "lt -2, cache_guid TEXT, notification_state BLOB, bag_of_chips BLOB);" 2647 "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'," 2648 "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-131078,'" 2649 "9010788312004066376x-6609234393368420856x',NULL,NULL);")); 2650 ASSERT_TRUE(connection->CommitTransaction()); 2651} 2652 2653TEST_F(DirectoryBackingStoreTest, MigrateVersion67To68) { 2654 sql::Connection connection; 2655 ASSERT_TRUE(connection.OpenInMemory()); 2656 2657 SetUpVersion67Database(&connection); 2658 2659 // Columns existing before version 67. 2660 ASSERT_TRUE(connection.DoesColumnExist("metas", "name")); 2661 ASSERT_TRUE(connection.DoesColumnExist("metas", "unsanitized_name")); 2662 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_name")); 2663 2664 scoped_ptr<TestDirectoryBackingStore> dbs( 2665 new TestDirectoryBackingStore(GetUsername(), &connection)); 2666 2667 ASSERT_FALSE(dbs->needs_column_refresh_); 2668 ASSERT_TRUE(dbs->MigrateVersion67To68()); 2669 ASSERT_EQ(68, dbs->GetVersion()); 2670 ASSERT_TRUE(dbs->needs_column_refresh_); 2671} 2672 2673TEST_F(DirectoryBackingStoreTest, MigrateVersion68To69) { 2674 sql::Connection connection; 2675 ASSERT_TRUE(connection.OpenInMemory()); 2676 SetUpVersion68Database(&connection); 2677 2678 { 2679 scoped_ptr<TestDirectoryBackingStore> dbs( 2680 new TestDirectoryBackingStore(GetUsername(), &connection)); 2681 2682 ASSERT_FALSE(dbs->needs_column_refresh_); 2683 ASSERT_TRUE(dbs->MigrateVersion68To69()); 2684 ASSERT_EQ(69, dbs->GetVersion()); 2685 ASSERT_TRUE(dbs->needs_column_refresh_); 2686 } 2687 2688 ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics")); 2689 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics")); 2690 sql::Statement s(connection.GetUniqueStatement("SELECT non_unique_name," 2691 "is_del, is_dir, id, specifics, server_specifics FROM metas " 2692 "WHERE metahandle = 2")); 2693 ASSERT_TRUE(s.Step()); 2694 ASSERT_EQ("Deleted Item", s.ColumnString(0)); 2695 ASSERT_TRUE(s.ColumnBool(1)); 2696 ASSERT_FALSE(s.ColumnBool(2)); 2697 ASSERT_EQ("s_ID_2", s.ColumnString(3)); 2698 sync_pb::EntitySpecifics specifics; 2699 specifics.ParseFromArray(s.ColumnBlob(4), s.ColumnByteLength(4)); 2700 ASSERT_TRUE(specifics.has_bookmark()); 2701 ASSERT_EQ("http://www.google.com/", specifics.bookmark().url()); 2702 ASSERT_EQ("AASGASGA", specifics.bookmark().favicon()); 2703 specifics.ParseFromArray(s.ColumnBlob(5), s.ColumnByteLength(5)); 2704 ASSERT_TRUE(specifics.has_bookmark()); 2705 ASSERT_EQ("http://www.google.com/2", specifics.bookmark().url()); 2706 ASSERT_EQ("ASADGADGADG", specifics.bookmark().favicon()); 2707 ASSERT_FALSE(s.Step()); 2708} 2709 2710TEST_F(DirectoryBackingStoreTest, MigrateVersion69To70) { 2711 sql::Connection connection; 2712 ASSERT_TRUE(connection.OpenInMemory()); 2713 SetUpVersion69Database(&connection); 2714 2715 ASSERT_TRUE(connection.DoesColumnExist("metas", "singleton_tag")); 2716 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_server_tag")); 2717 ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_client_tag")); 2718 2719 { 2720 scoped_ptr<TestDirectoryBackingStore> dbs( 2721 new TestDirectoryBackingStore(GetUsername(), &connection)); 2722 2723 ASSERT_FALSE(dbs->needs_column_refresh_); 2724 ASSERT_TRUE(dbs->MigrateVersion69To70()); 2725 ASSERT_EQ(70, dbs->GetVersion()); 2726 ASSERT_TRUE(dbs->needs_column_refresh_); 2727 } 2728 2729 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); 2730 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); 2731 sql::Statement s(connection.GetUniqueStatement("SELECT id" 2732 " FROM metas WHERE unique_server_tag = 'google_chrome'")); 2733 ASSERT_TRUE(s.Step()); 2734 EXPECT_EQ("s_ID_7", s.ColumnString(0)); 2735} 2736 2737TEST_F(DirectoryBackingStoreTest, MigrateVersion70To71) { 2738 sql::Connection connection; 2739 ASSERT_TRUE(connection.OpenInMemory()); 2740 SetUpVersion70Database(&connection); 2741 2742 ASSERT_TRUE(connection.DoesColumnExist("share_info", "last_sync_timestamp")); 2743 ASSERT_TRUE(connection.DoesColumnExist("share_info", "initial_sync_ended")); 2744 ASSERT_FALSE(connection.DoesTableExist("models")); 2745 2746 { 2747 scoped_ptr<TestDirectoryBackingStore> dbs( 2748 new TestDirectoryBackingStore(GetUsername(), &connection)); 2749 2750 ASSERT_FALSE(dbs->needs_column_refresh_); 2751 ASSERT_TRUE(dbs->MigrateVersion70To71()); 2752 ASSERT_EQ(71, dbs->GetVersion()); 2753 ASSERT_FALSE(dbs->needs_column_refresh_); 2754 } 2755 2756 ASSERT_FALSE(connection.DoesColumnExist("share_info", "last_sync_timestamp")); 2757 ASSERT_FALSE(connection.DoesColumnExist("share_info", "initial_sync_ended")); 2758 ASSERT_TRUE(connection.DoesTableExist("models")); 2759 ASSERT_TRUE(connection.DoesColumnExist("models", "initial_sync_ended")); 2760 ASSERT_TRUE(connection.DoesColumnExist("models", "last_download_timestamp")); 2761 ASSERT_TRUE(connection.DoesColumnExist("models", "model_id")); 2762 2763 sql::Statement s(connection.GetUniqueStatement("SELECT model_id, " 2764 "initial_sync_ended, last_download_timestamp FROM models")); 2765 ASSERT_TRUE(s.Step()); 2766 std::string model_id = s.ColumnString(0); 2767 EXPECT_EQ("C2881000", base::HexEncode(model_id.data(), model_id.size())) 2768 << "Model ID is expected to be the empty BookmarkSpecifics proto."; 2769 EXPECT_TRUE(s.ColumnBool(1)); 2770 EXPECT_EQ(694, s.ColumnInt64(2)); 2771 ASSERT_FALSE(s.Step()); 2772} 2773 2774 2775TEST_F(DirectoryBackingStoreTest, MigrateVersion71To72) { 2776 sql::Connection connection; 2777 ASSERT_TRUE(connection.OpenInMemory()); 2778 SetUpVersion71Database(&connection); 2779 2780 ASSERT_TRUE(connection.DoesTableExist("extended_attributes")); 2781 2782 { 2783 scoped_ptr<TestDirectoryBackingStore> dbs( 2784 new TestDirectoryBackingStore(GetUsername(), &connection)); 2785 2786 ASSERT_FALSE(dbs->needs_column_refresh_); 2787 ASSERT_TRUE(dbs->MigrateVersion71To72()); 2788 ASSERT_EQ(72, dbs->GetVersion()); 2789 ASSERT_FALSE(dbs->needs_column_refresh_); 2790 } 2791 2792 ASSERT_FALSE(connection.DoesTableExist("extended_attributes")); 2793} 2794 2795TEST_F(DirectoryBackingStoreTest, MigrateVersion72To73) { 2796 sql::Connection connection; 2797 ASSERT_TRUE(connection.OpenInMemory()); 2798 SetUpVersion72Database(&connection); 2799 2800 ASSERT_FALSE(connection.DoesColumnExist("share_info", "notification_state")); 2801 2802 { 2803 scoped_ptr<TestDirectoryBackingStore> dbs( 2804 new TestDirectoryBackingStore(GetUsername(), &connection)); 2805 2806 ASSERT_FALSE(dbs->needs_column_refresh_); 2807 ASSERT_TRUE(dbs->MigrateVersion72To73()); 2808 ASSERT_EQ(73, dbs->GetVersion()); 2809 ASSERT_FALSE(dbs->needs_column_refresh_); 2810 } 2811 2812 ASSERT_TRUE(connection.DoesColumnExist("share_info", "notification_state")); 2813} 2814 2815TEST_F(DirectoryBackingStoreTest, MigrateVersion73To74) { 2816 sql::Connection connection; 2817 ASSERT_TRUE(connection.OpenInMemory()); 2818 SetUpVersion73Database(&connection); 2819 2820 ASSERT_FALSE( 2821 connection.DoesColumnExist("share_info", "autofill_migration_state")); 2822 ASSERT_FALSE( 2823 connection.DoesColumnExist("share_info", 2824 "bookmarks_added_during_autofill_migration")); 2825 ASSERT_FALSE( 2826 connection.DoesColumnExist("share_info", "autofill_migration_time")); 2827 ASSERT_FALSE( 2828 connection.DoesColumnExist("share_info", 2829 "autofill_entries_added_during_migration")); 2830 2831 ASSERT_FALSE( 2832 connection.DoesColumnExist("share_info", 2833 "autofill_profiles_added_during_migration")); 2834 2835 { 2836 scoped_ptr<TestDirectoryBackingStore> dbs( 2837 new TestDirectoryBackingStore(GetUsername(), &connection)); 2838 2839 ASSERT_FALSE(dbs->needs_column_refresh_); 2840 ASSERT_TRUE(dbs->MigrateVersion73To74()); 2841 ASSERT_EQ(74, dbs->GetVersion()); 2842 ASSERT_FALSE(dbs->needs_column_refresh_); 2843 } 2844 2845 ASSERT_TRUE( 2846 connection.DoesColumnExist("share_info", "autofill_migration_state")); 2847 ASSERT_TRUE( 2848 connection.DoesColumnExist("share_info", 2849 "bookmarks_added_during_autofill_migration")); 2850 ASSERT_TRUE( 2851 connection.DoesColumnExist("share_info", "autofill_migration_time")); 2852 ASSERT_TRUE( 2853 connection.DoesColumnExist("share_info", 2854 "autofill_entries_added_during_migration")); 2855 2856 ASSERT_TRUE( 2857 connection.DoesColumnExist("share_info", 2858 "autofill_profiles_added_during_migration")); 2859} 2860 2861TEST_F(DirectoryBackingStoreTest, MigrateVersion74To75) { 2862 sql::Connection connection; 2863 ASSERT_TRUE(connection.OpenInMemory()); 2864 SetUpVersion74Database(&connection); 2865 2866 ASSERT_FALSE(connection.DoesColumnExist("models", "progress_marker")); 2867 ASSERT_TRUE(connection.DoesColumnExist("models", "last_download_timestamp")); 2868 2869 { 2870 scoped_ptr<TestDirectoryBackingStore> dbs( 2871 new TestDirectoryBackingStore(GetUsername(), &connection)); 2872 2873 ASSERT_FALSE(dbs->needs_column_refresh_); 2874 ASSERT_TRUE(dbs->MigrateVersion74To75()); 2875 ASSERT_EQ(75, dbs->GetVersion()); 2876 ASSERT_FALSE(dbs->needs_column_refresh_); 2877 } 2878 2879 ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker")); 2880 ASSERT_FALSE(connection.DoesColumnExist("models", "last_download_timestamp")); 2881} 2882 2883TEST_F(DirectoryBackingStoreTest, MigrateVersion75To76) { 2884 sql::Connection connection; 2885 ASSERT_TRUE(connection.OpenInMemory()); 2886 SetUpVersion75Database(&connection); 2887 2888 ASSERT_TRUE( 2889 connection.DoesColumnExist("share_info", "autofill_migration_state")); 2890 ASSERT_TRUE(connection.DoesColumnExist("share_info", 2891 "bookmarks_added_during_autofill_migration")); 2892 ASSERT_TRUE( 2893 connection.DoesColumnExist("share_info", "autofill_migration_time")); 2894 ASSERT_TRUE(connection.DoesColumnExist("share_info", 2895 "autofill_entries_added_during_migration")); 2896 ASSERT_TRUE(connection.DoesColumnExist("share_info", 2897 "autofill_profiles_added_during_migration")); 2898 2899 scoped_ptr<TestDirectoryBackingStore> dbs( 2900 new TestDirectoryBackingStore(GetUsername(), &connection)); 2901 ASSERT_FALSE(dbs->needs_column_refresh_); 2902 ASSERT_TRUE(dbs->MigrateVersion75To76()); 2903 ASSERT_EQ(76, dbs->GetVersion()); 2904 ASSERT_TRUE(dbs->needs_column_refresh_); 2905 // Cannot actual refresh columns due to version 76 not containing all 2906 // necessary columns. 2907} 2908 2909TEST_F(DirectoryBackingStoreTest, MigrateVersion76To77) { 2910 sql::Connection connection; 2911 ASSERT_TRUE(connection.OpenInMemory()); 2912 SetUpVersion76Database(&connection); 2913 2914 scoped_ptr<TestDirectoryBackingStore> dbs( 2915 new TestDirectoryBackingStore(GetUsername(), &connection)); 2916 ASSERT_FALSE(dbs->needs_column_refresh_); 2917 2918 EXPECT_EQ(GetExpectedLegacyMetaProtoTimes(INCLUDE_DELETED_ITEMS), 2919 GetMetaProtoTimes(dbs->db_.get())); 2920 // Since the proto times are expected to be in a legacy format, they may not 2921 // be compatible with ProtoTimeToTime, so we don't call ExpectTimes(). 2922 2923 ASSERT_TRUE(dbs->MigrateVersion76To77()); 2924 ASSERT_EQ(77, dbs->GetVersion()); 2925 2926 EXPECT_EQ(GetExpectedMetaProtoTimes(INCLUDE_DELETED_ITEMS), 2927 GetMetaProtoTimes(dbs->db_.get())); 2928 // Cannot actually load entries due to version 77 not having all required 2929 // columns. 2930 ASSERT_FALSE(dbs->needs_column_refresh_); 2931} 2932 2933TEST_F(DirectoryBackingStoreTest, MigrateVersion77To78) { 2934 sql::Connection connection; 2935 ASSERT_TRUE(connection.OpenInMemory()); 2936 SetUpVersion77Database(&connection); 2937 2938 ASSERT_FALSE(connection.DoesColumnExist("metas", "BASE_SERVER_SPECIFICS")); 2939 2940 { 2941 scoped_ptr<TestDirectoryBackingStore> dbs( 2942 new TestDirectoryBackingStore(GetUsername(), &connection)); 2943 ASSERT_FALSE(dbs->needs_column_refresh_); 2944 ASSERT_TRUE(dbs->MigrateVersion77To78()); 2945 ASSERT_EQ(78, dbs->GetVersion()); 2946 2947 ASSERT_FALSE(dbs->needs_column_refresh_); 2948 } 2949 2950 ASSERT_TRUE(connection.DoesColumnExist("metas", "base_server_specifics")); 2951} 2952 2953TEST_F(DirectoryBackingStoreTest, MigrateVersion78To79) { 2954 const int kInitialNextId = -65542; 2955 2956 sql::Connection connection; 2957 ASSERT_TRUE(connection.OpenInMemory()); 2958 SetUpVersion78Database(&connection); 2959 2960 // Double-check the original next_id is what we think it is. 2961 sql::Statement s(connection.GetUniqueStatement( 2962 "SELECT next_id FROM share_info")); 2963 s.Step(); 2964 ASSERT_EQ(kInitialNextId, s.ColumnInt(0)); 2965 2966 scoped_ptr<TestDirectoryBackingStore> dbs( 2967 new TestDirectoryBackingStore(GetUsername(), &connection)); 2968 ASSERT_FALSE(dbs->needs_column_refresh_); 2969 ASSERT_TRUE(dbs->MigrateVersion78To79()); 2970 ASSERT_EQ(79, dbs->GetVersion()); 2971 ASSERT_FALSE(dbs->needs_column_refresh_); 2972 2973 // Ensure the next_id has been incremented. 2974 Directory::MetahandlesMap handles_map; 2975 JournalIndex delete_journals;; 2976 STLValueDeleter<Directory::MetahandlesMap> deleter(&handles_map); 2977 Directory::KernelLoadInfo load_info; 2978 2979 s.Clear(); 2980 ASSERT_TRUE(dbs->Load(&handles_map, &delete_journals, &load_info)); 2981 EXPECT_LE(load_info.kernel_info.next_id, kInitialNextId - 65536); 2982} 2983 2984TEST_F(DirectoryBackingStoreTest, MigrateVersion79To80) { 2985 sql::Connection connection; 2986 ASSERT_TRUE(connection.OpenInMemory()); 2987 SetUpVersion79Database(&connection); 2988 2989 scoped_ptr<TestDirectoryBackingStore> dbs( 2990 new TestDirectoryBackingStore(GetUsername(), &connection)); 2991 ASSERT_FALSE(dbs->needs_column_refresh_); 2992 ASSERT_TRUE(dbs->MigrateVersion79To80()); 2993 ASSERT_EQ(80, dbs->GetVersion()); 2994 ASSERT_FALSE(dbs->needs_column_refresh_); 2995 2996 // Ensure the bag_of_chips has been set. 2997 Directory::MetahandlesMap handles_map; 2998 JournalIndex delete_journals;; 2999 STLValueDeleter<Directory::MetahandlesMap> deleter(&handles_map); 3000 Directory::KernelLoadInfo load_info; 3001 3002 ASSERT_TRUE(dbs->Load(&handles_map, &delete_journals, &load_info)); 3003 // Check that the initial value is the serialization of an empty ChipBag. 3004 sync_pb::ChipBag chip_bag; 3005 std::string serialized_chip_bag; 3006 ASSERT_TRUE(chip_bag.SerializeToString(&serialized_chip_bag)); 3007 EXPECT_EQ(serialized_chip_bag, load_info.kernel_info.bag_of_chips); 3008} 3009 3010TEST_F(DirectoryBackingStoreTest, MigrateVersion80To81) { 3011 sql::Connection connection; 3012 ASSERT_TRUE(connection.OpenInMemory()); 3013 SetUpVersion80Database(&connection); 3014 3015 sql::Statement s(connection.GetUniqueStatement( 3016 "SELECT metahandle, server_position_in_parent " 3017 "FROM metas WHERE unique_server_tag = 'google_chrome'")); 3018 ASSERT_TRUE(s.Step()); 3019 ASSERT_EQ(sql::COLUMN_TYPE_INTEGER, s.ColumnType(1)); 3020 3021 scoped_ptr<TestDirectoryBackingStore> dbs( 3022 new TestDirectoryBackingStore(GetUsername(), &connection)); 3023 ASSERT_TRUE(dbs->MigrateVersion80To81()); 3024 ASSERT_EQ(81, dbs->GetVersion()); 3025 3026 // Test that ordinal values are preserved correctly. 3027 sql::Statement new_s(connection.GetUniqueStatement( 3028 "SELECT metahandle, server_ordinal_in_parent " 3029 "FROM metas WHERE unique_server_tag = 'google_chrome'")); 3030 ASSERT_TRUE(new_s.Step()); 3031 ASSERT_EQ(sql::COLUMN_TYPE_BLOB, new_s.ColumnType(1)); 3032 3033 std::string expected_ordinal = Int64ToNodeOrdinal(1048576).ToInternalValue(); 3034 std::string actual_ordinal; 3035 new_s.ColumnBlobAsString(1, &actual_ordinal); 3036 ASSERT_EQ(expected_ordinal, actual_ordinal); 3037} 3038 3039TEST_F(DirectoryBackingStoreTest, MigrateVersion81To82) { 3040 sql::Connection connection; 3041 ASSERT_TRUE(connection.OpenInMemory()); 3042 SetUpVersion81Database(&connection); 3043 ASSERT_FALSE(connection.DoesColumnExist("models", "transaction_version")); 3044 3045 scoped_ptr<TestDirectoryBackingStore> dbs( 3046 new TestDirectoryBackingStore(GetUsername(), &connection)); 3047 ASSERT_FALSE(dbs->needs_column_refresh_); 3048 ASSERT_TRUE(dbs->MigrateVersion81To82()); 3049 ASSERT_EQ(82, dbs->GetVersion()); 3050 ASSERT_FALSE(dbs->needs_column_refresh_); 3051 3052 ASSERT_TRUE(connection.DoesColumnExist("models", "transaction_version")); 3053} 3054 3055TEST_F(DirectoryBackingStoreTest, MigrateVersion82To83) { 3056 sql::Connection connection; 3057 ASSERT_TRUE(connection.OpenInMemory()); 3058 SetUpVersion82Database(&connection); 3059 ASSERT_FALSE(connection.DoesColumnExist("metas", "transaction_version")); 3060 3061 scoped_ptr<TestDirectoryBackingStore> dbs( 3062 new TestDirectoryBackingStore(GetUsername(), &connection)); 3063 ASSERT_TRUE(dbs->MigrateVersion82To83()); 3064 ASSERT_EQ(83, dbs->GetVersion()); 3065 3066 ASSERT_TRUE(connection.DoesColumnExist("metas", "transaction_version")); 3067} 3068 3069TEST_F(DirectoryBackingStoreTest, MigrateVersion83To84) { 3070 sql::Connection connection; 3071 ASSERT_TRUE(connection.OpenInMemory()); 3072 SetUpVersion83Database(&connection); 3073 ASSERT_FALSE(connection.DoesTableExist("deleted_metas")); 3074 3075 scoped_ptr<TestDirectoryBackingStore> dbs( 3076 new TestDirectoryBackingStore(GetUsername(), &connection)); 3077 ASSERT_TRUE(dbs->MigrateVersion83To84()); 3078 ASSERT_EQ(84, dbs->GetVersion()); 3079 3080 ASSERT_TRUE(connection.DoesTableExist("deleted_metas")); 3081} 3082 3083TEST_F(DirectoryBackingStoreTest, MigrateVersion84To85) { 3084 sql::Connection connection; 3085 ASSERT_TRUE(connection.OpenInMemory()); 3086 SetUpVersion84Database(&connection); 3087 ASSERT_TRUE(connection.DoesColumnExist("models", "initial_sync_ended")); 3088 3089 scoped_ptr<TestDirectoryBackingStore> dbs( 3090 new TestDirectoryBackingStore(GetUsername(), &connection)); 3091 ASSERT_TRUE(dbs->MigrateVersion84To85()); 3092 ASSERT_EQ(85, dbs->GetVersion()); 3093 ASSERT_FALSE(connection.DoesColumnExist("models", "initial_sync_ended")); 3094} 3095 3096TEST_F(DirectoryBackingStoreTest, MigrateVersion85To86) { 3097 sql::Connection connection; 3098 ASSERT_TRUE(connection.OpenInMemory()); 3099 SetUpVersion85Database(&connection); 3100 EXPECT_TRUE(connection.DoesColumnExist("metas", "next_id")); 3101 EXPECT_TRUE(connection.DoesColumnExist("metas", "prev_id")); 3102 EXPECT_TRUE(connection.DoesColumnExist("metas", "server_ordinal_in_parent")); 3103 EXPECT_FALSE(connection.DoesColumnExist("metas", "unique_position")); 3104 EXPECT_FALSE(connection.DoesColumnExist("metas", "server_unique_position")); 3105 EXPECT_FALSE(connection.DoesColumnExist("metas", "unique_bookmark_tag")); 3106 3107 scoped_ptr<TestDirectoryBackingStore> dbs( 3108 new TestDirectoryBackingStore(GetUsername(), &connection)); 3109 ASSERT_TRUE(dbs->MigrateVersion85To86()); 3110 EXPECT_EQ(86, dbs->GetVersion()); 3111 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_position")); 3112 EXPECT_TRUE(connection.DoesColumnExist("metas", "server_unique_position")); 3113 EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_bookmark_tag")); 3114 ASSERT_TRUE(dbs->needs_column_refresh_); 3115} 3116 3117TEST_F(DirectoryBackingStoreTest, MigrateVersion86To87) { 3118 sql::Connection connection; 3119 EXPECT_TRUE(connection.OpenInMemory()); 3120 SetUpVersion86Database(&connection); 3121 EXPECT_FALSE(connection.DoesColumnExist("metas", "attachment_metadata")); 3122 3123 scoped_ptr<TestDirectoryBackingStore> dbs( 3124 new TestDirectoryBackingStore(GetUsername(), &connection)); 3125 EXPECT_TRUE(dbs->MigrateVersion86To87()); 3126 EXPECT_EQ(87, dbs->GetVersion()); 3127 EXPECT_TRUE(connection.DoesColumnExist("metas", "attachment_metadata")); 3128 EXPECT_TRUE(dbs->needs_column_refresh_); 3129} 3130 3131// The purpose of this test case is to make it easier to get a dump of the 3132// database so you can implement a SetUpVersionYDatabase method. Here's what 3133// you should do: 3134// 3135// 1. Say you're going from version X to version Y. Write the migration 3136// method MigrateVersionXToY. 3137// 2. Update the test below to call SetUpVersionXDatabase and then 3138// MigrateVersionXToY. You now have a database at version Y. Let's dump it. 3139// 3. Set a breakpoint to stop execution just after the connection is 3140// destroyed. Examine temp_dir_ to find the version Y database that was 3141// created on disk. E.g. (gdb) p temp_dir_.path().value().c_str() 3142// 4. Dump the database using the sqlite3 command line tool: 3143// > .output foo_dump.sql 3144// > .dump 3145// 5. Replace the timestamp columns with META_PROTO_TIMES(x) (or 3146// LEGACY_META_PROTO_TIMES(x) if before Version 77). Use this dump to write 3147// a SetupVersionYDatabase method. 3148TEST_F(DirectoryBackingStoreTest, MigrateToLatestAndDump) { 3149 { 3150 sql::Connection connection; 3151 ASSERT_TRUE(connection.Open(GetDatabasePath())); 3152 SetUpVersion86Database(&connection); // Update this. 3153 3154 scoped_ptr<TestDirectoryBackingStore> dbs( 3155 new TestDirectoryBackingStore(GetUsername(), &connection)); 3156 ASSERT_TRUE(dbs->MigrateVersion86To87()); // Update this. 3157 ASSERT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); 3158 EXPECT_EQ(87, dbs->GetVersion()); // Update this. 3159 ASSERT_FALSE(dbs->needs_column_refresh_); 3160 } 3161 // Set breakpoint here. 3162} 3163 3164TEST_F(DirectoryBackingStoreTest, DetectInvalidPosition) { 3165 sql::Connection connection; 3166 ASSERT_TRUE(connection.OpenInMemory()); 3167 SetUpVersion86Database(&connection); 3168 3169 scoped_ptr<TestDirectoryBackingStore> dbs( 3170 new TestDirectoryBackingStore(GetUsername(), &connection)); 3171 ASSERT_EQ(86, dbs->GetVersion()); 3172 3173 // Insert row with bad position. 3174 sql::Statement s(connection.GetUniqueStatement( 3175 "INSERT INTO metas " 3176 "( id, metahandle, is_dir, ctime, mtime," 3177 " unique_position, server_unique_position) " 3178 "VALUES('c-invalid', 9999, 1, 0, 0, 'BAD_POS', 'BAD_POS')")); 3179 ASSERT_TRUE(s.Run()); 3180 3181 // Trying to unpack this entry should signal that the DB is corrupted. 3182 Directory::MetahandlesMap handles_map; 3183 JournalIndex delete_journals;; 3184 STLValueDeleter<Directory::MetahandlesMap> deleter(&handles_map); 3185 Directory::KernelLoadInfo kernel_load_info; 3186 ASSERT_EQ(FAILED_DATABASE_CORRUPT, 3187 dbs->Load(&handles_map, &delete_journals, &kernel_load_info)); 3188} 3189 3190TEST_P(MigrationTest, ToCurrentVersion) { 3191 sql::Connection connection; 3192 ASSERT_TRUE(connection.OpenInMemory()); 3193 switch (GetParam()) { 3194 case 67: 3195 SetUpVersion67Database(&connection); 3196 break; 3197 case 68: 3198 SetUpVersion68Database(&connection); 3199 break; 3200 case 69: 3201 SetUpVersion69Database(&connection); 3202 break; 3203 case 70: 3204 SetUpVersion70Database(&connection); 3205 break; 3206 case 71: 3207 SetUpVersion71Database(&connection); 3208 break; 3209 case 72: 3210 SetUpVersion72Database(&connection); 3211 break; 3212 case 73: 3213 SetUpVersion73Database(&connection); 3214 break; 3215 case 74: 3216 SetUpVersion74Database(&connection); 3217 break; 3218 case 75: 3219 SetUpVersion75Database(&connection); 3220 break; 3221 case 76: 3222 SetUpVersion76Database(&connection); 3223 break; 3224 case 77: 3225 SetUpVersion77Database(&connection); 3226 break; 3227 case 78: 3228 SetUpVersion78Database(&connection); 3229 break; 3230 case 79: 3231 SetUpVersion79Database(&connection); 3232 break; 3233 case 80: 3234 SetUpVersion80Database(&connection); 3235 break; 3236 case 81: 3237 SetUpVersion81Database(&connection); 3238 break; 3239 case 82: 3240 SetUpVersion82Database(&connection); 3241 break; 3242 case 83: 3243 SetUpVersion83Database(&connection); 3244 break; 3245 case 84: 3246 SetUpVersion84Database(&connection); 3247 break; 3248 case 85: 3249 SetUpVersion85Database(&connection); 3250 break; 3251 case 86: 3252 SetUpVersion86Database(&connection); 3253 break; 3254 case 87: 3255 SetUpVersion87Database(&connection); 3256 break; 3257 default: 3258 // If you see this error, it may mean that you've increased the 3259 // database version number but you haven't finished adding unit tests 3260 // for the database migration code. You need to need to supply a 3261 // SetUpVersionYDatabase function with a dump of the test database 3262 // at the new schema. See the MigrateToLatestAndDump test case. 3263 FAIL() << "Need to supply database dump for version " << GetParam(); 3264 } 3265 3266 syncable::Directory::KernelLoadInfo dir_info; 3267 Directory::MetahandlesMap handles_map; 3268 JournalIndex delete_journals;; 3269 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); 3270 3271 { 3272 scoped_ptr<TestDirectoryBackingStore> dbs( 3273 new TestDirectoryBackingStore(GetUsername(), &connection)); 3274 ASSERT_EQ(OPENED, dbs->Load(&handles_map, &delete_journals, &dir_info)); 3275 ASSERT_FALSE(dbs->needs_column_refresh_); 3276 ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion()); 3277 } 3278 3279 // Columns deleted in Version 67. 3280 ASSERT_FALSE(connection.DoesColumnExist("metas", "name")); 3281 ASSERT_FALSE(connection.DoesColumnExist("metas", "unsanitized_name")); 3282 ASSERT_FALSE(connection.DoesColumnExist("metas", "server_name")); 3283 3284 // Columns added in Version 68. 3285 ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics")); 3286 ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics")); 3287 3288 // Columns deleted in Version 68. 3289 ASSERT_FALSE(connection.DoesColumnExist("metas", "is_bookmark_object")); 3290 ASSERT_FALSE(connection.DoesColumnExist("metas", 3291 "server_is_bookmark_object")); 3292 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_favicon")); 3293 ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_url")); 3294 ASSERT_FALSE(connection.DoesColumnExist("metas", "server_bookmark_url")); 3295 3296 // Renamed a column in Version 70 3297 ASSERT_FALSE(connection.DoesColumnExist("metas", "singleton_tag")); 3298 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag")); 3299 ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag")); 3300 3301 // Removed extended attributes in Version 72. 3302 ASSERT_FALSE(connection.DoesTableExist("extended_attributes")); 3303 3304 // Columns added in Version 73. 3305 ASSERT_TRUE(connection.DoesColumnExist("share_info", "notification_state")); 3306 3307 // Column replaced in version 75. 3308 ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker")); 3309 ASSERT_FALSE(connection.DoesColumnExist("models", "last_download_timestamp")); 3310 3311 // Columns removed in version 76. 3312 ASSERT_FALSE( 3313 connection.DoesColumnExist("share_info", "autofill_migration_state")); 3314 ASSERT_FALSE(connection.DoesColumnExist("share_info", 3315 "bookmarks_added_during_autofill_migration")); 3316 ASSERT_FALSE( 3317 connection.DoesColumnExist("share_info", "autofill_migration_time")); 3318 ASSERT_FALSE(connection.DoesColumnExist("share_info", 3319 "autofill_entries_added_during_migration")); 3320 ASSERT_FALSE(connection.DoesColumnExist("share_info", 3321 "autofill_profiles_added_during_migration")); 3322 3323 // Column added in version 78. 3324 ASSERT_TRUE(connection.DoesColumnExist("metas", "base_server_specifics")); 3325 3326 // Column added in version 82. 3327 ASSERT_TRUE(connection.DoesColumnExist("models", "transaction_version")); 3328 3329 // Column added in version 83. 3330 ASSERT_TRUE(connection.DoesColumnExist("metas", "transaction_version")); 3331 3332 // Table added in version 84. 3333 ASSERT_TRUE(connection.DoesTableExist("deleted_metas")); 3334 3335 // Column removed in version 85. 3336 ASSERT_FALSE(connection.DoesColumnExist("models", "initial_sync_ended")); 3337 3338 // Columns removed in version 86. 3339 ASSERT_FALSE(connection.DoesColumnExist("metas", "next_id")); 3340 ASSERT_FALSE(connection.DoesColumnExist("metas", "prev_id")); 3341 ASSERT_FALSE(connection.DoesColumnExist("metas", "server_ordinal_in_parent")); 3342 3343 // Column added in version 87. 3344 ASSERT_TRUE(connection.DoesColumnExist("metas", "attachment_metadata")); 3345 3346 // Check download_progress state (v75 migration) 3347 ASSERT_EQ(694, 3348 dir_info.kernel_info.download_progress[BOOKMARKS] 3349 .timestamp_token_for_migration()); 3350 ASSERT_FALSE( 3351 dir_info.kernel_info.download_progress[BOOKMARKS] 3352 .has_token()); 3353 ASSERT_EQ(32904, 3354 dir_info.kernel_info.download_progress[BOOKMARKS] 3355 .data_type_id()); 3356 ASSERT_FALSE( 3357 dir_info.kernel_info.download_progress[THEMES] 3358 .has_timestamp_token_for_migration()); 3359 ASSERT_TRUE( 3360 dir_info.kernel_info.download_progress[THEMES] 3361 .has_token()); 3362 ASSERT_TRUE( 3363 dir_info.kernel_info.download_progress[THEMES] 3364 .token().empty()); 3365 ASSERT_EQ(41210, 3366 dir_info.kernel_info.download_progress[THEMES] 3367 .data_type_id()); 3368 3369 // Check metas 3370 EXPECT_EQ(GetExpectedMetaProtoTimes(DONT_INCLUDE_DELETED_ITEMS), 3371 GetMetaProtoTimes(&connection)); 3372 ExpectTimes(handles_map, GetExpectedMetaTimes()); 3373 3374 Directory::MetahandlesMap::iterator it = handles_map.find(1); 3375 ASSERT_TRUE(it != handles_map.end()); 3376 ASSERT_EQ(1, it->second->ref(META_HANDLE)); 3377 EXPECT_TRUE(it->second->ref(ID).IsRoot()); 3378 EXPECT_FALSE(it->second->ref(UNIQUE_POSITION).IsValid()); 3379 EXPECT_FALSE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3380 EXPECT_TRUE(it->second->ref(UNIQUE_BOOKMARK_TAG).empty()); 3381 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3382 3383 // Items 2, 4, and 5 were deleted. 3384 it = handles_map.find(2); 3385 ASSERT_TRUE(it == handles_map.end()); 3386 it = handles_map.find(4); 3387 ASSERT_TRUE(it == handles_map.end()); 3388 it = handles_map.find(5); 3389 ASSERT_TRUE(it == handles_map.end()); 3390 3391 it = handles_map.find(6); 3392 ASSERT_EQ(6, it->second->ref(META_HANDLE)); 3393 EXPECT_TRUE(it->second->ref(IS_DIR)); 3394 EXPECT_TRUE(it->second->ref(SERVER_IS_DIR)); 3395 EXPECT_FALSE(it->second->ref(SPECIFICS).bookmark().has_url()); 3396 EXPECT_FALSE(it->second->ref(SERVER_SPECIFICS).bookmark().has_url()); 3397 EXPECT_FALSE(it->second->ref(SPECIFICS).bookmark().has_favicon()); 3398 EXPECT_FALSE(it->second->ref(SERVER_SPECIFICS).bookmark().has_favicon()); 3399 EXPECT_TRUE(it->second->ref(UNIQUE_POSITION).IsValid()); 3400 EXPECT_TRUE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3401 EXPECT_EQ(UniquePosition::kSuffixLength, 3402 it->second->ref(UNIQUE_BOOKMARK_TAG).length()); 3403 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3404 3405 it = handles_map.find(7); 3406 ASSERT_EQ(7, it->second->ref(META_HANDLE)); 3407 EXPECT_EQ("google_chrome", it->second->ref(UNIQUE_SERVER_TAG)); 3408 EXPECT_FALSE(it->second->ref(SPECIFICS).has_bookmark()); 3409 EXPECT_FALSE(it->second->ref(SERVER_SPECIFICS).has_bookmark()); 3410 // Make sure we didn't assign positions to google_chrome. 3411 EXPECT_FALSE(it->second->ref(UNIQUE_POSITION).IsValid()); 3412 EXPECT_FALSE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3413 EXPECT_TRUE(it->second->ref(UNIQUE_BOOKMARK_TAG).empty()); 3414 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3415 3416 it = handles_map.find(8); 3417 ASSERT_EQ(8, it->second->ref(META_HANDLE)); 3418 EXPECT_EQ("google_chrome_bookmarks", it->second->ref(UNIQUE_SERVER_TAG)); 3419 EXPECT_TRUE(it->second->ref(SPECIFICS).has_bookmark()); 3420 EXPECT_TRUE(it->second->ref(SERVER_SPECIFICS).has_bookmark()); 3421 ASSERT_EQ(it->second->ref(ID).value(), "s_ID_8"); 3422 // Make sure we didn't mistake the bookmark root node for a real bookmark. 3423 EXPECT_FALSE(it->second->ref(UNIQUE_POSITION).IsValid()); 3424 EXPECT_FALSE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3425 EXPECT_TRUE(it->second->ref(UNIQUE_BOOKMARK_TAG).empty()); 3426 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3427 3428 it = handles_map.find(9); 3429 ASSERT_EQ(9, it->second->ref(META_HANDLE)); 3430 EXPECT_EQ("bookmark_bar", it->second->ref(UNIQUE_SERVER_TAG)); 3431 EXPECT_TRUE(it->second->ref(SPECIFICS).has_bookmark()); 3432 EXPECT_TRUE(it->second->ref(SERVER_SPECIFICS).has_bookmark()); 3433 // Make sure we didn't assign positions to bookmark_bar. 3434 EXPECT_FALSE(it->second->ref(UNIQUE_POSITION).IsValid()); 3435 EXPECT_FALSE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3436 EXPECT_TRUE(it->second->ref(UNIQUE_BOOKMARK_TAG).empty()); 3437 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3438 3439 it = handles_map.find(10); 3440 ASSERT_EQ(10, it->second->ref(META_HANDLE)); 3441 EXPECT_FALSE(it->second->ref(IS_DEL)); 3442 EXPECT_TRUE(it->second->ref(SPECIFICS).has_bookmark()); 3443 EXPECT_TRUE(it->second->ref(SERVER_SPECIFICS).has_bookmark()); 3444 EXPECT_FALSE(it->second->ref(SPECIFICS).bookmark().has_url()); 3445 EXPECT_FALSE(it->second->ref(SPECIFICS).bookmark().has_favicon()); 3446 EXPECT_FALSE(it->second->ref(SERVER_SPECIFICS).bookmark().has_url()); 3447 EXPECT_FALSE(it->second->ref(SERVER_SPECIFICS).bookmark().has_favicon()); 3448 EXPECT_EQ("other_bookmarks", it->second->ref(UNIQUE_SERVER_TAG)); 3449 EXPECT_EQ("Other Bookmarks", it->second->ref(NON_UNIQUE_NAME)); 3450 EXPECT_EQ("Other Bookmarks", it->second->ref(SERVER_NON_UNIQUE_NAME)); 3451 ASSERT_EQ(it->second->ref(ID).value(), "s_ID_10"); 3452 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3453 // Make sure we didn't assign positions to server-created folders, either. 3454 EXPECT_FALSE(it->second->ref(UNIQUE_POSITION).IsValid()); 3455 EXPECT_FALSE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3456 EXPECT_TRUE(it->second->ref(UNIQUE_BOOKMARK_TAG).empty()); 3457 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3458 3459 it = handles_map.find(11); 3460 ASSERT_EQ(11, it->second->ref(META_HANDLE)); 3461 EXPECT_FALSE(it->second->ref(IS_DEL)); 3462 EXPECT_FALSE(it->second->ref(IS_DIR)); 3463 EXPECT_TRUE(it->second->ref(SPECIFICS).has_bookmark()); 3464 EXPECT_TRUE(it->second->ref(SERVER_SPECIFICS).has_bookmark()); 3465 EXPECT_EQ("http://dev.chromium.org/", 3466 it->second->ref(SPECIFICS).bookmark().url()); 3467 EXPECT_EQ("AGATWA", it->second->ref(SPECIFICS).bookmark().favicon()); 3468 EXPECT_EQ("http://dev.chromium.org/other", 3469 it->second->ref(SERVER_SPECIFICS).bookmark().url()); 3470 EXPECT_EQ("AFAGVASF", it->second->ref(SERVER_SPECIFICS).bookmark().favicon()); 3471 EXPECT_EQ("", it->second->ref(UNIQUE_SERVER_TAG)); 3472 EXPECT_EQ("Home (The Chromium Projects)", it->second->ref(NON_UNIQUE_NAME)); 3473 EXPECT_EQ("Home (The Chromium Projects)", 3474 it->second->ref(SERVER_NON_UNIQUE_NAME)); 3475 EXPECT_TRUE(it->second->ref(UNIQUE_POSITION).IsValid()); 3476 EXPECT_TRUE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3477 EXPECT_EQ(UniquePosition::kSuffixLength, 3478 it->second->ref(UNIQUE_BOOKMARK_TAG).length()); 3479 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3480 3481 it = handles_map.find(12); 3482 ASSERT_EQ(12, it->second->ref(META_HANDLE)); 3483 EXPECT_FALSE(it->second->ref(IS_DEL)); 3484 EXPECT_TRUE(it->second->ref(IS_DIR)); 3485 EXPECT_EQ("Extra Bookmarks", it->second->ref(NON_UNIQUE_NAME)); 3486 EXPECT_EQ("Extra Bookmarks", it->second->ref(SERVER_NON_UNIQUE_NAME)); 3487 EXPECT_TRUE(it->second->ref(SPECIFICS).has_bookmark()); 3488 EXPECT_TRUE(it->second->ref(SERVER_SPECIFICS).has_bookmark()); 3489 EXPECT_FALSE(it->second->ref(SPECIFICS).bookmark().has_url()); 3490 EXPECT_FALSE(it->second->ref(SERVER_SPECIFICS).bookmark().has_url()); 3491 EXPECT_FALSE(it->second->ref(SPECIFICS).bookmark().has_favicon()); 3492 EXPECT_FALSE(it->second->ref(SERVER_SPECIFICS).bookmark().has_favicon()); 3493 EXPECT_TRUE(it->second->ref(UNIQUE_POSITION).IsValid()); 3494 EXPECT_TRUE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3495 EXPECT_EQ(UniquePosition::kSuffixLength, 3496 it->second->ref(UNIQUE_BOOKMARK_TAG).length()); 3497 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3498 3499 it = handles_map.find(13); 3500 ASSERT_EQ(13, it->second->ref(META_HANDLE)); 3501 EXPECT_TRUE(it->second->ref(UNIQUE_POSITION).IsValid()); 3502 EXPECT_TRUE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3503 EXPECT_EQ(UniquePosition::kSuffixLength, 3504 it->second->ref(UNIQUE_BOOKMARK_TAG).length()); 3505 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3506 3507 it = handles_map.find(14); 3508 ASSERT_EQ(14, it->second->ref(META_HANDLE)); 3509 EXPECT_TRUE(it->second->ref(UNIQUE_POSITION).IsValid()); 3510 EXPECT_TRUE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3511 EXPECT_EQ(UniquePosition::kSuffixLength, 3512 it->second->ref(UNIQUE_BOOKMARK_TAG).length()); 3513 EXPECT_TRUE(it->second->ref(ATTACHMENT_METADATA).IsInitialized()); 3514 3515 ASSERT_EQ(static_cast<size_t>(10), handles_map.size()); 3516 3517 // Make sure that the syncable::Directory and the migration code agree on 3518 // which items should or should not have unique position values. This test 3519 // may become obsolete if the directory's definition of that function 3520 // changes, but, until then, this is a useful test. 3521 for (it = handles_map.begin(); it != handles_map.end(); it++) { 3522 SCOPED_TRACE(it->second->ref(ID)); 3523 if (it->second->ShouldMaintainPosition()) { 3524 EXPECT_TRUE(it->second->ref(UNIQUE_POSITION).IsValid()); 3525 EXPECT_TRUE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3526 EXPECT_FALSE(it->second->ref(UNIQUE_BOOKMARK_TAG).empty()); 3527 } else { 3528 EXPECT_FALSE(it->second->ref(UNIQUE_POSITION).IsValid()); 3529 EXPECT_FALSE(it->second->ref(SERVER_UNIQUE_POSITION).IsValid()); 3530 EXPECT_TRUE(it->second->ref(UNIQUE_BOOKMARK_TAG).empty()); 3531 } 3532 } 3533} 3534 3535INSTANTIATE_TEST_CASE_P(DirectoryBackingStore, MigrationTest, 3536 testing::Range(67, kCurrentDBVersion + 1)); 3537 3538TEST_F(DirectoryBackingStoreTest, ModelTypeIds) { 3539 ModelTypeSet protocol_types = ProtocolTypes(); 3540 for (ModelTypeSet::Iterator iter = protocol_types.First(); iter.Good(); 3541 iter.Inc()) { 3542 std::string model_id = 3543 TestDirectoryBackingStore::ModelTypeEnumToModelId(iter.Get()); 3544 EXPECT_EQ(iter.Get(), 3545 TestDirectoryBackingStore::ModelIdToModelTypeEnum(model_id.data(), 3546 model_id.size())); 3547 } 3548} 3549 3550namespace { 3551 3552class OnDiskDirectoryBackingStoreForTest : public OnDiskDirectoryBackingStore { 3553 public: 3554 OnDiskDirectoryBackingStoreForTest(const std::string& dir_name, 3555 const base::FilePath& backing_filepath); 3556 virtual ~OnDiskDirectoryBackingStoreForTest(); 3557 bool DidFailFirstOpenAttempt(); 3558 3559 protected: 3560 virtual void ReportFirstTryOpenFailure() OVERRIDE; 3561 3562 private: 3563 bool first_open_failed_; 3564}; 3565 3566OnDiskDirectoryBackingStoreForTest::OnDiskDirectoryBackingStoreForTest( 3567 const std::string& dir_name, 3568 const base::FilePath& backing_filepath) : 3569 OnDiskDirectoryBackingStore(dir_name, backing_filepath), 3570 first_open_failed_(false) { } 3571 3572OnDiskDirectoryBackingStoreForTest::~OnDiskDirectoryBackingStoreForTest() { } 3573 3574void OnDiskDirectoryBackingStoreForTest::ReportFirstTryOpenFailure() { 3575 // Do nothing, just like we would in release-mode. In debug mode, we DCHECK. 3576 first_open_failed_ = true; 3577} 3578 3579bool OnDiskDirectoryBackingStoreForTest::DidFailFirstOpenAttempt() { 3580 return first_open_failed_; 3581} 3582 3583} // namespace 3584 3585// This is a whitebox test intended to exercise the code path where the on-disk 3586// directory load code decides to delete the current directory and start fresh. 3587// 3588// This is considered "minor" corruption because the database recreation is 3589// expected to succeed. The alternative, where recreation does not succeed (ie. 3590// due to read-only file system), is not tested here. 3591TEST_F(DirectoryBackingStoreTest, MinorCorruption) { 3592 { 3593 scoped_ptr<OnDiskDirectoryBackingStore> dbs( 3594 new OnDiskDirectoryBackingStore(GetUsername(), GetDatabasePath())); 3595 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); 3596 } 3597 3598 // Corrupt the root node. 3599 { 3600 sql::Connection connection; 3601 ASSERT_TRUE(connection.Open(GetDatabasePath())); 3602 ASSERT_TRUE(connection.Execute( 3603 "UPDATE metas SET parent_id='bogus' WHERE id = 'r';")); 3604 } 3605 3606 { 3607 scoped_ptr<OnDiskDirectoryBackingStoreForTest> dbs( 3608 new OnDiskDirectoryBackingStoreForTest(GetUsername(), 3609 GetDatabasePath())); 3610 3611 EXPECT_TRUE(LoadAndIgnoreReturnedData(dbs.get())); 3612 EXPECT_TRUE(dbs->DidFailFirstOpenAttempt()); 3613 } 3614} 3615 3616TEST_F(DirectoryBackingStoreTest, DeleteEntries) { 3617 sql::Connection connection; 3618 ASSERT_TRUE(connection.OpenInMemory()); 3619 3620 SetUpCurrentDatabaseAndCheckVersion(&connection); 3621 scoped_ptr<TestDirectoryBackingStore> dbs( 3622 new TestDirectoryBackingStore(GetUsername(), &connection)); 3623 Directory::MetahandlesMap handles_map; 3624 JournalIndex delete_journals; 3625 Directory::KernelLoadInfo kernel_load_info; 3626 STLValueDeleter<Directory::MetahandlesMap> index_deleter(&handles_map); 3627 3628 dbs->Load(&handles_map, &delete_journals, &kernel_load_info); 3629 size_t initial_size = handles_map.size(); 3630 ASSERT_LT(0U, initial_size) << "Test requires handles_map to delete."; 3631 int64 first_to_die = handles_map.begin()->second->ref(META_HANDLE); 3632 MetahandleSet to_delete; 3633 to_delete.insert(first_to_die); 3634 EXPECT_TRUE(dbs->DeleteEntries(TestDirectoryBackingStore::METAS_TABLE, 3635 to_delete)); 3636 3637 STLDeleteValues(&handles_map); 3638 dbs->LoadEntries(&handles_map); 3639 3640 EXPECT_EQ(initial_size - 1, handles_map.size()); 3641 bool delete_failed = false; 3642 for (Directory::MetahandlesMap::iterator it = handles_map.begin(); 3643 it != handles_map.end(); ++it) { 3644 if (it->first == first_to_die) { 3645 delete_failed = true; 3646 break; 3647 } 3648 } 3649 EXPECT_FALSE(delete_failed); 3650 3651 to_delete.clear(); 3652 for (Directory::MetahandlesMap::iterator it = handles_map.begin(); 3653 it != handles_map.end(); ++it) { 3654 to_delete.insert(it->first); 3655 } 3656 3657 EXPECT_TRUE(dbs->DeleteEntries(TestDirectoryBackingStore::METAS_TABLE, 3658 to_delete)); 3659 3660 STLDeleteValues(&handles_map); 3661 dbs->LoadEntries(&handles_map); 3662 EXPECT_EQ(0U, handles_map.size()); 3663} 3664 3665TEST_F(DirectoryBackingStoreTest, GenerateCacheGUID) { 3666 const std::string& guid1 = TestDirectoryBackingStore::GenerateCacheGUID(); 3667 const std::string& guid2 = TestDirectoryBackingStore::GenerateCacheGUID(); 3668 EXPECT_EQ(24U, guid1.size()); 3669 EXPECT_EQ(24U, guid2.size()); 3670 // In theory this test can fail, but it won't before the universe 3671 // dies of heat death. 3672 EXPECT_NE(guid1, guid2); 3673} 3674 3675} // namespace syncable 3676} // namespace syncer 3677