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