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