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