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