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