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