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