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