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