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