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