1// Copyright (c) 2011 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 "app/sql/connection.h"
10#include "app/sql/statement.h"
11#include "base/file_path.h"
12#include "base/file_util.h"
13#include "base/memory/scoped_ptr.h"
14#include "base/memory/scoped_temp_dir.h"
15#include "base/stl_util-inl.h"
16#include "base/string_number_conversions.h"
17#include "chrome/browser/sync/protocol/bookmark_specifics.pb.h"
18#include "chrome/browser/sync/protocol/sync.pb.h"
19#include "chrome/browser/sync/syncable/directory_backing_store.h"
20#include "chrome/browser/sync/syncable/directory_manager.h"
21#include "chrome/browser/sync/syncable/syncable-inl.h"
22#include "chrome/browser/sync/syncable/syncable.h"
23#include "testing/gtest/include/gtest/gtest-param-test.h"
24
25namespace syncable {
26
27extern const int32 kCurrentDBVersion;
28
29class MigrationTest : public testing::TestWithParam<int> {
30 public:
31  virtual void SetUp() {
32    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
33  }
34
35 protected:
36  std::string GetUsername() {
37    return "nick@chromium.org";
38  }
39
40  FilePath GetDatabasePath() {
41    return temp_dir_.path().Append(
42        DirectoryManager::GetSyncDataDatabaseFilename());
43  }
44  void SetUpVersion67Database();
45  void SetUpVersion68Database();
46  void SetUpVersion69Database();
47  void SetUpVersion70Database();
48  void SetUpVersion71Database();
49  void SetUpVersion72Database();
50  void SetUpVersion73Database();
51  void SetUpVersion74Database();
52
53  void SetUpCurrentDatabaseAndCheckVersion() {
54    SetUpVersion70Database();  // Prepopulates data.
55    scoped_ptr<DirectoryBackingStore> dbs(
56        new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
57
58    dbs->BeginLoad();
59    ASSERT_EQ(OPENED, dbs->InitializeTables());
60    ASSERT_FALSE(dbs->needs_column_refresh_);
61    ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion());
62    dbs->EndLoad();
63  }
64
65 private:
66  ScopedTempDir temp_dir_;
67};
68
69class DirectoryBackingStoreTest : public MigrationTest {};
70
71void MigrationTest::SetUpVersion67Database() {
72  // This is a version 67 database dump whose contents were backformed from
73  // the contents of the version 68 database dump (the v68 migration was
74  // actually written first).
75  sql::Connection connection;
76  ASSERT_TRUE(connection.Open(GetDatabasePath()));
77  ASSERT_TRUE(connection.BeginTransaction());
78  ASSERT_TRUE(connection.Execute(
79      "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), "
80          "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);"
81      "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL,"
82          "base_version bigint default -1,server_version bigint default 0,"
83          "mtime bigint default 0,server_mtime bigint default 0,"
84          "ctime bigint default 0,server_ctime bigint default 0,"
85          "server_position_in_parent bigint default 0,"
86          "local_external_id bigint default 0,id varchar(255) default 'r',"
87          "parent_id varchar(255) default 'r',"
88          "server_parent_id varchar(255) default 'r',"
89          "prev_id varchar(255) default 'r',next_id varchar(255) default 'r',"
90          "is_unsynced bit default 0,is_unapplied_update bit default 0,"
91          "is_del bit default 0,is_dir bit default 0,"
92          "is_bookmark_object bit default 0,server_is_dir bit default 0,"
93          "server_is_del bit default 0,server_is_bookmark_object bit default 0,"
94          "name varchar(255), "  /* COLLATE PATHNAME, */
95          "unsanitized_name varchar(255)," /* COLLATE PATHNAME, */
96          "non_unique_name varchar,"
97          "server_name varchar(255),"  /* COLLATE PATHNAME */
98          "server_non_unique_name varchar,"
99          "bookmark_url varchar,server_bookmark_url varchar,"
100          "singleton_tag varchar,bookmark_favicon blob,"
101          "server_bookmark_favicon blob);"
102      "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,"
103          "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL,"
104          "NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);"
105      "INSERT INTO metas VALUES(2,669,669,128976886618480000,"
106          "128976886618480000,128976886618480000,128976886618480000,-2097152,"
107          "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1,"
108          "'Deleted Item',NULL,'Deleted Item','Deleted Item','Deleted Item',"
109          "'http://www.google.com/','http://www.google.com/2',NULL,'AASGASGA',"
110          "'ASADGADGADG');"
111      "INSERT INTO metas VALUES(4,681,681,129002163642690000,"
112          "129002163642690000,129002163642690000,129002163642690000,-3145728,"
113          "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1,"
114          "'Welcome to Chromium',NULL,'Welcome to Chromium',"
115          "'Welcome to Chromium','Welcome to Chromium',"
116          "'http://www.google.com/chrome/intl/en/welcome.html',"
117          "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL,"
118          "NULL);"
119      "INSERT INTO metas VALUES(5,677,677,129001555500000000,"
120          "129001555500000000,129001555500000000,129001555500000000,1048576,"
121          "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1,"
122          "'Google',NULL,'Google','Google','Google','http://www.google.com/',"
123          "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');"
124      "INSERT INTO metas VALUES(6,694,694,129053976170000000,"
125          "129053976170000000,129053976170000000,129053976170000000,-4194304,"
126          "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1,"
127          "'The Internet',NULL,'The Internet','The Internet',"
128          "'The Internet',NULL,NULL,NULL,NULL,NULL);"
129      "INSERT INTO metas VALUES(7,663,663,128976864758480000,"
130          "128976864758480000,128976864758480000,128976864758480000,"
131          "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1,"
132          "'Google Chrome',NULL,'Google Chrome','Google Chrome',"
133          "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL);"
134      "INSERT INTO metas VALUES(8,664,664,128976864758480000,"
135          "128976864758480000,128976864758480000,128976864758480000,1048576,"
136          "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks',"
137          "NULL,'Bookmarks','Bookmarks','Bookmarks',NULL,NULL,"
138          "'google_chrome_bookmarks',NULL,NULL);"
139      "INSERT INTO metas VALUES(9,665,665,128976864758480000,"
140          "128976864758480000,128976864758480000,128976864758480000,"
141          "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0,"
142          "1,'Bookmark Bar',NULL,'Bookmark Bar','Bookmark Bar','Bookmark Bar',"
143          "NULL,NULL,'bookmark_bar',NULL,NULL);"
144      "INSERT INTO metas VALUES(10,666,666,128976864758480000,"
145          "128976864758480000,128976864758480000,128976864758480000,2097152,"
146          "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1,"
147          "'Other Bookmarks',NULL,'Other Bookmarks','Other Bookmarks',"
148          "'Other Bookmarks',NULL,NULL,'other_bookmarks',"
149          "NULL,NULL);"
150      "INSERT INTO metas VALUES(11,683,683,129079956948440000,"
151          "129079956948440000,129079956948440000,129079956948440000,-1048576,"
152          "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1,"
153          "'Home (The Chromium Projects)',NULL,'Home (The Chromium Projects)',"
154          "'Home (The Chromium Projects)','Home (The Chromium Projects)',"
155          "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL,"
156          "'AGATWA','AFAGVASF');"
157      "INSERT INTO metas VALUES(12,685,685,129079957513650000,"
158          "129079957513650000,129079957513650000,129079957513650000,0,9,"
159          "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1,"
160          "'Extra Bookmarks',NULL,'Extra Bookmarks','Extra Bookmarks',"
161          "'Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);"
162      "INSERT INTO metas VALUES(13,687,687,129079957985300000,"
163          "129079957985300000,129079957985300000,129079957985300000,-917504,"
164          "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0,"
165          "1,'ICANN | Internet Corporation for Assigned Names and Numbers',"
166          "'ICANN  Internet Corporation for Assigned Names and Numbers',"
167          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
168          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
169          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
170          "'http://www.icann.com/','http://www.icann.com/',NULL,"
171          "'PNGAXF0AAFF','DAAFASF');"
172      "INSERT INTO metas VALUES(14,692,692,129079958383000000,"
173          "129079958383000000,129079958383000000,129079958383000000,1048576,"
174          "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1,"
175          "'The WebKit Open Source Project',NULL,"
176          "'The WebKit Open Source Project','The WebKit Open Source Project',"
177          "'The WebKit Open Source Project','http://webkit.org/',"
178          "'http://webkit.org/x',NULL,'PNGX','PNG2Y');"
179      "CREATE TABLE share_info (id VARCHAR(128) primary key, "
180          "last_sync_timestamp INT, name VARCHAR(128), "
181          "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), "
182          "db_create_version VARCHAR(128), db_create_time int, "
183          "next_id bigint default -2, cache_guid VARCHAR(32));"
184      "INSERT INTO share_info VALUES('nick@chromium.org',694,"
185          "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb',"
186          "'Unknown',1263522064,-65542,"
187          "'9010788312004066376x-6609234393368420856x');"
188      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
189      "INSERT INTO share_version VALUES('nick@chromium.org',68);"));
190  ASSERT_TRUE(connection.CommitTransaction());
191}
192
193void MigrationTest::SetUpVersion68Database() {
194  // This sets up an actual version 68 database dump.  The IDs were
195  // canonicalized to be less huge, and the favicons were overwritten
196  // with random junk so that they didn't contain any unprintable
197  // characters.  A few server URLs were tweaked so that they'd be
198  // different from the local URLs.  Lastly, the custom collation on
199  // the server_non_unique_name column was removed.
200  sql::Connection connection;
201  ASSERT_TRUE(connection.Open(GetDatabasePath()));
202  ASSERT_TRUE(connection.BeginTransaction());
203  ASSERT_TRUE(connection.Execute(
204      "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), "
205          "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);"
206      "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL,"
207          "base_version bigint default -1,server_version bigint default 0,"
208          "mtime bigint default 0,server_mtime bigint default 0,"
209          "ctime bigint default 0,server_ctime bigint default 0,"
210          "server_position_in_parent bigint default 0,"
211          "local_external_id bigint default 0,id varchar(255) default 'r',"
212          "parent_id varchar(255) default 'r',"
213          "server_parent_id varchar(255) default 'r',"
214          "prev_id varchar(255) default 'r',next_id varchar(255) default 'r',"
215          "is_unsynced bit default 0,is_unapplied_update bit default 0,"
216          "is_del bit default 0,is_dir bit default 0,"
217          "is_bookmark_object bit default 0,server_is_dir bit default 0,"
218          "server_is_del bit default 0,"
219          "server_is_bookmark_object bit default 0,"
220          "non_unique_name varchar,server_non_unique_name varchar(255),"
221          "bookmark_url varchar,server_bookmark_url varchar,"
222          "singleton_tag varchar,bookmark_favicon blob,"
223          "server_bookmark_favicon blob);"
224      "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,"
225          "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL,"
226          "NULL,NULL,NULL,NULL,NULL,NULL);"
227      "INSERT INTO metas VALUES(2,669,669,128976886618480000,"
228          "128976886618480000,128976886618480000,128976886618480000,-2097152,"
229          "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1,"
230          "'Deleted Item','Deleted Item','http://www.google.com/',"
231          "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG');"
232      "INSERT INTO metas VALUES(4,681,681,129002163642690000,"
233          "129002163642690000,129002163642690000,129002163642690000,-3145728,"
234          "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1,"
235          "'Welcome to Chromium','Welcome to Chromium',"
236          "'http://www.google.com/chrome/intl/en/welcome.html',"
237          "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL,"
238          "NULL);"
239      "INSERT INTO metas VALUES(5,677,677,129001555500000000,"
240          "129001555500000000,129001555500000000,129001555500000000,1048576,"
241          "7,'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1,"
242          "'Google','Google','http://www.google.com/',"
243          "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG');"
244      "INSERT INTO metas VALUES(6,694,694,129053976170000000,"
245          "129053976170000000,129053976170000000,129053976170000000,-4194304,"
246          "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1,"
247          "'The Internet','The Internet',NULL,NULL,NULL,NULL,NULL);"
248      "INSERT INTO metas VALUES(7,663,663,128976864758480000,"
249          "128976864758480000,128976864758480000,128976864758480000,"
250          "1048576,0,'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1,"
251          "'Google Chrome','Google Chrome',NULL,NULL,'google_chrome',NULL,"
252          "NULL);"
253      "INSERT INTO metas VALUES(8,664,664,128976864758480000,"
254          "128976864758480000,128976864758480000,128976864758480000,1048576,"
255          "0,'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks',"
256          "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL);"
257      "INSERT INTO metas VALUES(9,665,665,128976864758480000,"
258          "128976864758480000,128976864758480000,128976864758480000,"
259          "1048576,1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0,"
260          "1,'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL,"
261          "NULL);"
262      "INSERT INTO metas VALUES(10,666,666,128976864758480000,"
263          "128976864758480000,128976864758480000,128976864758480000,2097152,"
264          "2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1,"
265          "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks',"
266          "NULL,NULL);"
267      "INSERT INTO metas VALUES(11,683,683,129079956948440000,"
268          "129079956948440000,129079956948440000,129079956948440000,-1048576,"
269          "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1,"
270          "'Home (The Chromium Projects)','Home (The Chromium Projects)',"
271          "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL,"
272          "'AGATWA','AFAGVASF');"
273      "INSERT INTO metas VALUES(12,685,685,129079957513650000,"
274          "129079957513650000,129079957513650000,129079957513650000,0,9,"
275          "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1,"
276          "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL);"
277      "INSERT INTO metas VALUES(13,687,687,129079957985300000,"
278          "129079957985300000,129079957985300000,129079957985300000,-917504,"
279          "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0,"
280          "1,'ICANN | Internet Corporation for Assigned Names and Numbers',"
281          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
282          "'http://www.icann.com/','http://www.icann.com/',NULL,"
283          "'PNGAXF0AAFF','DAAFASF');"
284      "INSERT INTO metas VALUES(14,692,692,129079958383000000,"
285          "129079958383000000,129079958383000000,129079958383000000,1048576,"
286          "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1,"
287          "'The WebKit Open Source Project','The WebKit Open Source Project',"
288          "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y');"
289      "CREATE TABLE share_info (id VARCHAR(128) primary key, "
290          "last_sync_timestamp INT, name VARCHAR(128), "
291          "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), "
292          "db_create_version VARCHAR(128), db_create_time int, "
293          "next_id bigint default -2, cache_guid VARCHAR(32));"
294      "INSERT INTO share_info VALUES('nick@chromium.org',694,"
295          "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb',"
296          "'Unknown',1263522064,-65542,"
297          "'9010788312004066376x-6609234393368420856x');"
298      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
299      "INSERT INTO share_version VALUES('nick@chromium.org',68);"));
300  ASSERT_TRUE(connection.CommitTransaction());
301}
302
303void MigrationTest::SetUpVersion69Database() {
304  sql::Connection connection;
305  ASSERT_TRUE(connection.Open(GetDatabasePath()));
306  ASSERT_TRUE(connection.BeginTransaction());
307  ASSERT_TRUE(connection.Execute(
308      "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), "
309          "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);"
310      "CREATE TABLE metas (metahandle bigint primary key ON CONFLICT FAIL,"
311          "base_version bigint default -1,server_version bigint default 0,"
312          "mtime bigint default 0,server_mtime bigint default 0,"
313          "ctime bigint default 0,server_ctime bigint default 0,"
314          "server_position_in_parent bigint default 0,"
315          "local_external_id bigint default 0,id varchar(255) default 'r',"
316          "parent_id varchar(255) default 'r',"
317          "server_parent_id varchar(255) default 'r',"
318          "prev_id varchar(255) default 'r',next_id varchar(255) default 'r',"
319          "is_unsynced bit default 0,is_unapplied_update bit default 0,"
320          "is_del bit default 0,is_dir bit default 0,"
321          "is_bookmark_object bit default 0,server_is_dir bit default 0,"
322          "server_is_del bit default 0,"
323          "server_is_bookmark_object bit default 0,"
324          "non_unique_name varchar,server_non_unique_name varchar(255),"
325          "bookmark_url varchar,server_bookmark_url varchar,"
326          "singleton_tag varchar,bookmark_favicon blob,"
327          "server_bookmark_favicon blob, specifics blob, "
328          "server_specifics blob);"
329      "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,129079956640320000,"
330          "0,0,0,'r','r','r','r','r',0,0,0,1,0,0,0,0,NULL,NULL,NULL,NULL,NULL,"
331          "NULL,NULL,X'',X'');"
332      "INSERT INTO metas VALUES(2,669,669,128976886618480000,"
333          "128976886618480000,128976886618480000,128976886618480000,-2097152,"
334          "4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,1,0,1,1,"
335          "'Deleted Item','Deleted Item','http://www.google.com/',"
336          "'http://www.google.com/2',NULL,'AASGASGA','ASADGADGADG',"
337          "X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841415"
338          "34741534741',X'C28810260A17687474703A2F2F7777772E676F6F676C652E636F"
339          "6D2F32120B4153414447414447414447');"
340      "INSERT INTO metas VALUES(4,681,681,129002163642690000,"
341          "129002163642690000,129002163642690000,129002163642690000,-3145728,"
342          "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,1,0,1,1,"
343          "'Welcome to Chromium','Welcome to Chromium',"
344          "'http://www.google.com/chrome/intl/en/welcome.html',"
345          "'http://www.google.com/chrome/intl/en/welcome.html',NULL,NULL,NULL,"
346          "X'C28810350A31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6"
347          "D652F696E746C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A3168"
348          "7474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F6"
349          "56E2F77656C636F6D652E68746D6C1200');"
350      "INSERT INTO metas VALUES(5,677,677,129001555500000000,"
351          "129001555500000000,129001555500000000,129001555500000000,1048576,7,"
352          "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,1,0,1,1,"
353          "'Google','Google','http://www.google.com/',"
354          "'http://www.google.com/',NULL,'AGASGASG','AGFDGASG',X'C28810220A166"
355          "87474703A2F2F7777772E676F6F676C652E636F6D2F12084147415347415347',X'"
356          "C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F12084147464"
357          "447415347');"
358      "INSERT INTO metas VALUES(6,694,694,129053976170000000,"
359          "129053976170000000,129053976170000000,129053976170000000,-4194304,6"
360          ",'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,1,0,1,'The Internet',"
361          "'The Internet',NULL,NULL,NULL,NULL,NULL,X'C2881000',X'C2881000');"
362      "INSERT INTO metas VALUES(7,663,663,128976864758480000,"
363          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
364          "'s_ID_7','r','r','r','r',0,0,0,1,1,1,0,1,'Google Chrome',"
365          "'Google Chrome',NULL,NULL,'google_chrome',NULL,NULL,NULL,NULL);"
366      "INSERT INTO metas VALUES(8,664,664,128976864758480000,"
367          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
368          "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,1,0,1,'Bookmarks',"
369          "'Bookmarks',NULL,NULL,'google_chrome_bookmarks',NULL,NULL,"
370          "X'C2881000',X'C2881000');"
371      "INSERT INTO metas VALUES(9,665,665,128976864758480000,"
372          "128976864758480000,128976864758480000,128976864758480000,1048576,1,"
373          "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,1,0,1,"
374          "'Bookmark Bar','Bookmark Bar',NULL,NULL,'bookmark_bar',NULL,NULL,"
375          "X'C2881000',X'C2881000');"
376      "INSERT INTO metas VALUES(10,666,666,128976864758480000,"
377          "128976864758480000,128976864758480000,128976864758480000,2097152,2,"
378          "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,1,0,1,"
379          "'Other Bookmarks','Other Bookmarks',NULL,NULL,'other_bookmarks',"
380          "NULL,NULL,X'C2881000',X'C2881000');"
381      "INSERT INTO metas VALUES(11,683,683,129079956948440000,"
382          "129079956948440000,129079956948440000,129079956948440000,-1048576,"
383          "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,1,0,0,1,"
384          "'Home (The Chromium Projects)','Home (The Chromium Projects)',"
385          "'http://dev.chromium.org/','http://dev.chromium.org/other',NULL,"
386          "'AGATWA','AFAGVASF',X'C28810220A18687474703A2F2F6465762E6368726F6D6"
387          "9756D2E6F72672F1206414741545741',X'C28810290A1D687474703A2F2F646576"
388          "2E6368726F6D69756D2E6F72672F6F7468657212084146414756415346');"
389      "INSERT INTO metas VALUES(12,685,685,129079957513650000,"
390          "129079957513650000,129079957513650000,129079957513650000,0,9,"
391          "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,1,0,1,"
392          "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,NULL,NULL,NULL,"
393          "X'C2881000',X'C2881000');"
394      "INSERT INTO metas VALUES(13,687,687,129079957985300000,"
395          "129079957985300000,129079957985300000,129079957985300000,-917504,"
396          "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,1,0,0,"
397          "1,'ICANN | Internet Corporation for Assigned Names and Numbers',"
398          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
399          "'http://www.icann.com/','http://www.icann.com/',NULL,'PNGAXF0AAFF',"
400          "'DAAFASF',X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F1"
401          "20B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963"
402          "616E6E2E636F6D2F120744414146415346');"
403      "INSERT INTO metas VALUES(14,692,692,129079958383000000,"
404          "129079958383000000,129079958383000000,129079958383000000,1048576,11,"
405          "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,1,0,0,1,"
406          "'The WebKit Open Source Project','The WebKit Open Source Project',"
407          "'http://webkit.org/','http://webkit.org/x',NULL,'PNGX','PNG2Y',"
408          "X'C288101A0A12687474703A2F2F7765626B69742E6F72672F1204504E4758',X'C2"
409          "88101C0A13687474703A2F2F7765626B69742E6F72672F781205504E473259');"
410      "CREATE TABLE share_info (id VARCHAR(128) primary key, "
411          "last_sync_timestamp INT, name VARCHAR(128), "
412          "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), "
413          "db_create_version VARCHAR(128), db_create_time int, "
414          "next_id bigint default -2, cache_guid VARCHAR(32));"
415      "INSERT INTO share_info VALUES('nick@chromium.org',694,"
416          "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb',"
417          "'Unknown',1263522064,-65542,"
418          "'9010788312004066376x-6609234393368420856x');"
419      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
420      "INSERT INTO share_version VALUES('nick@chromium.org',69);"
421  ));
422  ASSERT_TRUE(connection.CommitTransaction());
423}
424
425void MigrationTest::SetUpVersion70Database() {
426  sql::Connection connection;
427  ASSERT_TRUE(connection.Open(GetDatabasePath()));
428  ASSERT_TRUE(connection.BeginTransaction());
429  ASSERT_TRUE(connection.Execute(
430      "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), "
431          "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);"
432      "CREATE TABLE share_info (id VARCHAR(128) primary key, "
433          "last_sync_timestamp INT, name VARCHAR(128), "
434          "initial_sync_ended BIT default 0, store_birthday VARCHAR(256), "
435          "db_create_version VARCHAR(128), db_create_time int, "
436          "next_id bigint default -2, cache_guid VARCHAR(32));"
437      "INSERT INTO share_info VALUES('nick@chromium.org',694,"
438          "'nick@chromium.org',1,'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb',"
439          "'Unknown',1263522064,-65542,"
440          "'9010788312004066376x-6609234393368420856x');"
441      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
442      "INSERT INTO share_version VALUES('nick@chromium.org',70);"
443      "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL,"
444          "base_version bigint default -1,server_version bigint default 0,"
445          "mtime bigint default 0,server_mtime bigint default 0,"
446          "ctime bigint default 0,server_ctime bigint default 0,"
447          "server_position_in_parent bigint default 0,"
448          "local_external_id bigint default 0,id varchar(255) default 'r',"
449          "parent_id varchar(255) default 'r',"
450          "server_parent_id varchar(255) default 'r',"
451          "prev_id varchar(255) default 'r',next_id varchar(255) default 'r',"
452          "is_unsynced bit default 0,is_unapplied_update bit default 0,"
453          "is_del bit default 0,is_dir bit default 0,"
454          "server_is_dir bit default 0,server_is_del bit default 0,"
455          "non_unique_name varchar,server_non_unique_name varchar(255),"
456          "unique_server_tag varchar,unique_client_tag varchar,"
457          "specifics blob,server_specifics blob);"
458      "INSERT INTO metas VALUES(1,-1,0,129079956640320000,0,129079956640320000,"
459          "0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'');"
460      "INSERT INTO metas VALUES(2,669,669,128976886618480000,"
461          "128976886618480000,128976886618480000,128976886618480000,"
462          "-2097152,4,'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,"
463          "1,'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A"
464          "2F2F7777772E676F6F676C652E636F6D2F12084141534741534741',X'C2881026"
465          "0A17687474703A2F2F7777772E676F6F676C652E636F6D2F32120B415341444741"
466          "4447414447');"
467      "INSERT INTO metas VALUES(4,681,681,129002163642690000,"
468          "129002163642690000,129002163642690000,129002163642690000,-3145728,"
469          "3,'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,"
470          "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A"
471          "31687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E74"
472          "6C2F656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F"
473          "2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F7765"
474          "6C636F6D652E68746D6C1200');"
475      "INSERT INTO metas VALUES(5,677,677,129001555500000000,"
476          "129001555500000000,129001555500000000,129001555500000000,1048576,7,"
477          "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google',"
478          "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C6"
479          "52E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F77777"
480          "72E676F6F676C652E636F6D2F12084147464447415347');"
481      "INSERT INTO metas VALUES(6,694,694,129053976170000000,"
482          "129053976170000000,129053976170000000,129053976170000000,-4194304,"
483          "6,'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet',"
484          "'The Internet',NULL,NULL,X'C2881000',X'C2881000');"
485      "INSERT INTO metas VALUES(7,663,663,128976864758480000,"
486          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
487          "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome',"
488          "'Google Chrome','google_chrome',NULL,NULL,NULL);"
489      "INSERT INTO metas VALUES(8,664,664,128976864758480000,"
490          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
491          "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks',"
492          "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',"
493          "X'C2881000');"
494      "INSERT INTO metas VALUES(9,665,665,128976864758480000,"
495          "128976864758480000,128976864758480000,128976864758480000,1048576,"
496          "1,'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,"
497          "'Bookmark Bar','Bookmark Bar','bookmark_bar',NULL,X'C2881000',"
498          "X'C2881000');"
499      "INSERT INTO metas VALUES(10,666,666,128976864758480000,"
500          "128976864758480000,128976864758480000,128976864758480000,"
501          "2097152,2,'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,"
502          "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL,"
503          "X'C2881000',X'C2881000');"
504      "INSERT INTO metas VALUES(11,683,683,129079956948440000,"
505          "129079956948440000,129079956948440000,129079956948440000,-1048576,"
506          "8,'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,"
507          "'Home (The Chromium Projects)','Home (The Chromium Projects)',"
508          "NULL,NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F"
509          "72672F1206414741545741',X'C28810290A1D687474703A2F2F6465762E636872"
510          "6F6D69756D2E6F72672F6F7468657212084146414756415346');"
511      "INSERT INTO metas VALUES(12,685,685,129079957513650000,"
512          "129079957513650000,129079957513650000,129079957513650000,0,9,"
513          "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,"
514          "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000',"
515          "X'C2881000');"
516      "INSERT INTO metas VALUES(13,687,687,129079957985300000,"
517          "129079957985300000,129079957985300000,129079957985300000,-917504,"
518          "10,'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,"
519          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
520          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
521          "NULL,NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F"
522          "120B504E474158463041414646',X'C28810200A15687474703A2F2F7777772E69"
523          "63616E6E2E636F6D2F120744414146415346');"
524      "INSERT INTO metas VALUES(14,692,692,129079958383000000,"
525          "129079958383000000,129079958383000000,129079958383000000,1048576,"
526          "11,'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,"
527          "'The WebKit Open Source Project','The WebKit Open Source Project',"
528          "NULL,NULL,X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450"
529          "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F78120550"
530          "4E473259');"
531      ));
532  ASSERT_TRUE(connection.CommitTransaction());
533}
534
535void MigrationTest::SetUpVersion71Database() {
536  sql::Connection connection;
537  ASSERT_TRUE(connection.Open(GetDatabasePath()));
538  ASSERT_TRUE(connection.BeginTransaction());
539  ASSERT_TRUE(connection.Execute(
540      "CREATE TABLE extended_attributes(metahandle bigint, key varchar(127), "
541          "value blob, PRIMARY KEY(metahandle, key) ON CONFLICT REPLACE);"
542      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
543      "INSERT INTO 'share_version' VALUES('nick@chromium.org',71);"
544      "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL,"
545          "base_version bigint default -1,server_version bigint default 0,"
546          "mtime bigint default 0,server_mtime bigint default 0,ctime bigint "
547          "default 0,server_ctime bigint default 0,server_position_in_parent "
548          "bigint default 0,local_external_id bigint default 0,id varchar(255) "
549          "default 'r',parent_id varchar(255) default 'r',server_parent_id "
550          "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id "
551          "varchar(255) default 'r',is_unsynced bit default 0,"
552          "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit "
553          "default 0,server_is_dir bit default 0,server_is_del bit default 0,"
554          "non_unique_name varchar,server_non_unique_name varchar(255),"
555          "unique_server_tag varchar,unique_client_tag varchar,specifics blob,"
556          "server_specifics blob);"
557      "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,"
558          "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,"
559          "NULL,NULL,X'',X'');"
560      "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,"
561          "128976886618480000,128976886618480000,128976886618480000,-2097152,4,"
562          "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,"
563          "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F"
564          "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768"
565          "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144"
566          "47');"
567      "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,"
568          "129002163642690000,129002163642690000,129002163642690000,-3145728,3,"
569          "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,"
570          "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31"
571          "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F"
572          "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777"
573          "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D"
574          "652E68746D6C1200');"
575      "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,"
576          "129001555500000000,129001555500000000,129001555500000000,1048576,7,"
577          "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google',"
578          "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652"
579          "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6"
580          "76F6F676C652E636F6D2F12084147464447415347');"
581      "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,"
582          "129053976170000000,129053976170000000,129053976170000000,-4194304,6,"
583          "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet',"
584          "'The Internet',NULL,NULL,X'C2881000',X'C2881000');"
585      "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,"
586          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
587          "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'"
588          ",'google_chrome',NULL,NULL,NULL);"
589      "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,"
590          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
591          "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks',"
592          "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');"
593      "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,"
594          "128976864758480000,128976864758480000,128976864758480000,1048576,1,"
595          "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar',"
596          "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');"
597      "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,"
598          "128976864758480000,128976864758480000,128976864758480000,2097152,2,"
599          "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,"
600          "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL,"
601          "X'C2881000',X'C2881000');"
602      "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,"
603          "129079956948440000,129079956948440000,129079956948440000,-1048576,8,"
604          "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,"
605          "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL,"
606          "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1"
607          "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756"
608          "D2E6F72672F6F7468657212084146414756415346');"
609      "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,"
610          "129079957513650000,129079957513650000,129079957513650000,0,9,"
611          "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,"
612          "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000',"
613          "X'C2881000');"
614      "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,"
615          "129079957985300000,129079957985300000,129079957985300000,-917504,10,"
616          "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,"
617          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
618          "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL,"
619          "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504"
620          "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2"
621          "E636F6D2F120744414146415346');"
622      "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,"
623          "129079958383000000,129079958383000000,129079958383000000,1048576,11,"
624          "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,"
625          "'The WebKit Open Source Project','The WebKit Open Source Project',"
626          "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450"
627          "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E"
628          "473259');"
629      "CREATE TABLE models (model_id BLOB primary key, "
630          "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);"
631      "INSERT INTO 'models' VALUES(X'C2881000',694,1);"
632      "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, "
633          "store_birthday TEXT, db_create_version TEXT, db_create_time INT, "
634          "next_id INT default -2, cache_guid TEXT);"
635      "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org',"
636          "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,"
637          "'9010788312004066376x-6609234393368420856x');"));
638  ASSERT_TRUE(connection.CommitTransaction());
639}
640
641void MigrationTest::SetUpVersion72Database() {
642  sql::Connection connection;
643  ASSERT_TRUE(connection.Open(GetDatabasePath()));
644  ASSERT_TRUE(connection.BeginTransaction());
645  ASSERT_TRUE(connection.Execute(
646      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
647      "INSERT INTO 'share_version' VALUES('nick@chromium.org',72);"
648      "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL,"
649          "base_version bigint default -1,server_version bigint default 0,"
650          "mtime bigint default 0,server_mtime bigint default 0,ctime bigint "
651          "default 0,server_ctime bigint default 0,server_position_in_parent "
652          "bigint default 0,local_external_id bigint default 0,id varchar(255) "
653          "default 'r',parent_id varchar(255) default 'r',server_parent_id "
654          "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id "
655          "varchar(255) default 'r',is_unsynced bit default 0,"
656          "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit "
657          "default 0,server_is_dir bit default 0,server_is_del bit default 0,"
658          "non_unique_name varchar,server_non_unique_name varchar(255),"
659          "unique_server_tag varchar,unique_client_tag varchar,specifics blob,"
660          "server_specifics blob);"
661      "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,"
662          "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,"
663          "NULL,NULL,X'',X'');"
664      "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,"
665          "128976886618480000,128976886618480000,128976886618480000,-2097152,4,"
666          "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,"
667          "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F"
668          "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768"
669          "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144"
670          "47');"
671      "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,"
672          "129002163642690000,129002163642690000,129002163642690000,-3145728,3,"
673          "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,"
674          "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31"
675          "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F"
676          "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777"
677          "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D"
678          "652E68746D6C1200');"
679      "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,"
680          "129001555500000000,129001555500000000,129001555500000000,1048576,7,"
681          "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google',"
682          "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652"
683          "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6"
684          "76F6F676C652E636F6D2F12084147464447415347');"
685      "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,"
686          "129053976170000000,129053976170000000,129053976170000000,-4194304,6,"
687          "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet',"
688          "'The Internet',NULL,NULL,X'C2881000',X'C2881000');"
689      "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,"
690          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
691          "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'"
692          ",'google_chrome',NULL,NULL,NULL);"
693      "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,"
694          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
695          "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks',"
696          "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');"
697      "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,"
698          "128976864758480000,128976864758480000,128976864758480000,1048576,1,"
699          "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar',"
700          "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');"
701      "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,"
702          "128976864758480000,128976864758480000,128976864758480000,2097152,2,"
703          "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,"
704          "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL,"
705          "X'C2881000',X'C2881000');"
706      "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,"
707          "129079956948440000,129079956948440000,129079956948440000,-1048576,8,"
708          "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,"
709          "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL,"
710          "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1"
711          "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756"
712          "D2E6F72672F6F7468657212084146414756415346');"
713      "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,"
714          "129079957513650000,129079957513650000,129079957513650000,0,9,"
715          "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,"
716          "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000',"
717          "X'C2881000');"
718      "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,"
719          "129079957985300000,129079957985300000,129079957985300000,-917504,10,"
720          "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,"
721          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
722          "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL,"
723          "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504"
724          "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2"
725          "E636F6D2F120744414146415346');"
726      "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,"
727          "129079958383000000,129079958383000000,129079958383000000,1048576,11,"
728          "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,"
729          "'The WebKit Open Source Project','The WebKit Open Source Project',"
730          "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450"
731          "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E"
732          "473259');"
733      "CREATE TABLE models (model_id BLOB primary key, "
734          "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);"
735      "INSERT INTO 'models' VALUES(X'C2881000',694,1);"
736      "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, "
737          "store_birthday TEXT, db_create_version TEXT, db_create_time INT, "
738          "next_id INT default -2, cache_guid TEXT);"
739      "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org',"
740          "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,"
741          "'9010788312004066376x-6609234393368420856x');"));
742  ASSERT_TRUE(connection.CommitTransaction());
743}
744
745void MigrationTest::SetUpVersion73Database() {
746  sql::Connection connection;
747  ASSERT_TRUE(connection.Open(GetDatabasePath()));
748  ASSERT_TRUE(connection.BeginTransaction());
749  ASSERT_TRUE(connection.Execute(
750      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
751      "INSERT INTO 'share_version' VALUES('nick@chromium.org',73);"
752      "CREATE TABLE metas(metahandle bigint primary key ON CONFLICT FAIL,"
753          "base_version bigint default -1,server_version bigint default 0,"
754          "mtime bigint default 0,server_mtime bigint default 0,ctime bigint "
755          "default 0,server_ctime bigint default 0,server_position_in_parent "
756          "bigint default 0,local_external_id bigint default 0,id varchar(255) "
757          "default 'r',parent_id varchar(255) default 'r',server_parent_id "
758          "varchar(255) default 'r',prev_id varchar(255) default 'r',next_id "
759          "varchar(255) default 'r',is_unsynced bit default 0,"
760          "is_unapplied_update bit default 0,is_del bit default 0,is_dir bit "
761          "default 0,server_is_dir bit default 0,server_is_del bit default 0,"
762          "non_unique_name varchar,server_non_unique_name varchar(255),"
763          "unique_server_tag varchar,unique_client_tag varchar,specifics blob,"
764          "server_specifics blob);"
765      "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,"
766          "129079956640320000,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,"
767          "NULL,NULL,X'',X'');"
768      "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,"
769          "128976886618480000,128976886618480000,128976886618480000,-2097152,4,"
770          "'s_ID_2','s_ID_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,"
771          "'Deleted Item','Deleted Item',NULL,NULL,X'C28810220A16687474703A2F2F"
772          "7777772E676F6F676C652E636F6D2F12084141534741534741',X'C28810260A1768"
773          "7474703A2F2F7777772E676F6F676C652E636F6D2F32120B41534144474144474144"
774          "47');"
775      "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,"
776          "129002163642690000,129002163642690000,129002163642690000,-3145728,3,"
777          "'s_ID_4','s_ID_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,"
778          "'Welcome to Chromium','Welcome to Chromium',NULL,NULL,X'C28810350A31"
779          "687474703A2F2F7777772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F"
780          "656E2F77656C636F6D652E68746D6C1200',X'C28810350A31687474703A2F2F7777"
781          "772E676F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D"
782          "652E68746D6C1200');"
783      "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,"
784          "129001555500000000,129001555500000000,129001555500000000,1048576,7,"
785          "'s_ID_5','s_ID_9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google',"
786          "'Google',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652"
787          "E636F6D2F12084147415347415347',X'C28810220A16687474703A2F2F7777772E6"
788          "76F6F676C652E636F6D2F12084147464447415347');"
789      "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,"
790          "129053976170000000,129053976170000000,129053976170000000,-4194304,6,"
791          "'s_ID_6','s_ID_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet',"
792          "'The Internet',NULL,NULL,X'C2881000',X'C2881000');"
793      "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,"
794          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
795          "'s_ID_7','r','r','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome'"
796          ",'google_chrome',NULL,NULL,NULL);"
797      "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,"
798          "128976864758480000,128976864758480000,128976864758480000,1048576,0,"
799          "'s_ID_8','s_ID_7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks',"
800          "'Bookmarks','google_chrome_bookmarks',NULL,X'C2881000',X'C2881000');"
801      "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,"
802          "128976864758480000,128976864758480000,128976864758480000,1048576,1,"
803          "'s_ID_9','s_ID_8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar',"
804          "'Bookmark Bar','bookmark_bar',NULL,X'C2881000',X'C2881000');"
805      "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,"
806          "128976864758480000,128976864758480000,128976864758480000,2097152,2,"
807          "'s_ID_10','s_ID_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,"
808          "'Other Bookmarks','Other Bookmarks','other_bookmarks',NULL,"
809          "X'C2881000',X'C2881000');"
810      "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,"
811          "129079956948440000,129079956948440000,129079956948440000,-1048576,8,"
812          "'s_ID_11','s_ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,"
813          "'Home (The Chromium Projects)','Home (The Chromium Projects)',NULL,"
814          "NULL,X'C28810220A18687474703A2F2F6465762E6368726F6D69756D2E6F72672F1"
815          "206414741545741',X'C28810290A1D687474703A2F2F6465762E6368726F6D69756"
816          "D2E6F72672F6F7468657212084146414756415346');"
817      "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,"
818          "129079957513650000,129079957513650000,129079957513650000,0,9,"
819          "'s_ID_12','s_ID_6','s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,"
820          "'Extra Bookmarks','Extra Bookmarks',NULL,NULL,X'C2881000',"
821          "X'C2881000');"
822      "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,"
823          "129079957985300000,129079957985300000,129079957985300000,-917504,10,"
824          "'s_ID_13','s_ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,"
825          "'ICANN | Internet Corporation for Assigned Names and Numbers',"
826          "'ICANN | Internet Corporation for Assigned Names and Numbers',NULL,"
827          "NULL,X'C28810240A15687474703A2F2F7777772E6963616E6E2E636F6D2F120B504"
828          "E474158463041414646',X'C28810200A15687474703A2F2F7777772E6963616E6E2"
829          "E636F6D2F120744414146415346');"
830      "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,"
831          "129079958383000000,129079958383000000,129079958383000000,1048576,11,"
832          "'s_ID_14','s_ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,"
833          "'The WebKit Open Source Project','The WebKit Open Source Project',"
834          "NULL,NULL,""X'C288101A0A12687474703A2F2F7765626B69742E6F72672F120450"
835          "4E4758',X'C288101C0A13687474703A2F2F7765626B69742E6F72672F781205504E"
836          "473259');"
837      "CREATE TABLE models (model_id BLOB primary key, "
838          "last_download_timestamp INT, initial_sync_ended BOOLEAN default 0);"
839      "INSERT INTO 'models' VALUES(X'C2881000',694,1);"
840      "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, "
841          "store_birthday TEXT, db_create_version TEXT, db_create_time INT, "
842          "next_id INT default -2, cache_guid TEXT, "
843          "notification_state BLOB);"
844      "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org',"
845          "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,"
846          "'9010788312004066376x-6609234393368420856x',X'C2881000');"));
847  ASSERT_TRUE(connection.CommitTransaction());
848}
849
850void MigrationTest::SetUpVersion74Database() {
851  sql::Connection connection;
852  ASSERT_TRUE(connection.Open(GetDatabasePath()));
853  ASSERT_TRUE(connection.BeginTransaction());
854  ASSERT_TRUE(connection.Execute(
855      "CREATE TABLE share_version (id VARCHAR(128) primary key, data INT);"
856      "INSERT INTO 'share_version' VALUES('nick@chromium.org',74);"
857      "CREATE TABLE models (model_id BLOB primary key, last_download_timestamp"
858          " INT, initial_sync_ended BOOLEAN default 0);"
859      "INSERT INTO 'models' VALUES(X'C2881000',694,1);"
860      "CREATE TABLE 'share_info' (id TEXT primary key, name TEXT, store_birthd"
861          "ay TEXT, db_create_version TEXT, db_create_time INT, next_id INT de"
862          "fault -2, cache_guid TEXT , notification_state BLOB, autofill_migra"
863          "tion_state INT default 0, bookmarks_added_during_autofill_migration"
864          " INT default 0, autofill_migration_time INT default 0, autofill_ent"
865          "ries_added_during_migration INT default 0, autofill_profiles_added_"
866          "during_migration INT default 0);"
867      "INSERT INTO 'share_info' VALUES('nick@chromium.org','nick@chromium.org'"
868          ",'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542"
869          ",'9010788312004066376x-6609234393368420856x',NULL,0,0,0,0,0);"
870      "CREATE TABLE 'metas'(metahandle bigint primary key ON CONFLICT FAIL,bas"
871          "e_version bigint default -1,server_version bigint default 0,mtime b"
872          "igint default 0,server_mtime bigint default 0,ctime bigint default "
873          "0,server_ctime bigint default 0,server_position_in_parent bigint de"
874          "fault 0,local_external_id bigint default 0,id varchar(255) default "
875          "'r',parent_id varchar(255) default 'r',server_parent_id varchar(255"
876          ") default 'r',prev_id varchar(255) default 'r',next_id varchar(255)"
877          " default 'r',is_unsynced bit default 0,is_unapplied_update bit defa"
878          "ult 0,is_del bit default 0,is_dir bit default 0,server_is_dir bit d"
879          "efault 0,server_is_del bit default 0,non_unique_name varchar,server"
880          "_non_unique_name varchar(255),unique_server_tag varchar,unique_clie"
881          "nt_tag varchar,specifics blob,server_specifics blob);"
882      "INSERT INTO 'metas' VALUES(1,-1,0,129079956640320000,0,1290799566403200"
883          "00,0,0,0,'r','r','r','r','r',0,0,0,1,0,0,NULL,NULL,NULL,NULL,X'',X'"
884          "');"
885      "INSERT INTO 'metas' VALUES(2,669,669,128976886618480000,128976886618480"
886          "000,128976886618480000,128976886618480000,-2097152,4,'s_ID_2','s_ID"
887          "_9','s_ID_9','s_ID_2','s_ID_2',0,0,1,0,0,1,'Deleted Item','Deleted "
888          "Item',NULL,NULL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E6"
889          "36F6D2F12084141534741534741',X'C28810260A17687474703A2F2F7777772E67"
890          "6F6F676C652E636F6D2F32120B4153414447414447414447');"
891      "INSERT INTO 'metas' VALUES(4,681,681,129002163642690000,129002163642690"
892          "000,129002163642690000,129002163642690000,-3145728,3,'s_ID_4','s_ID"
893          "_9','s_ID_9','s_ID_4','s_ID_4',0,0,1,0,0,1,'Welcome to Chromium','W"
894          "elcome to Chromium',NULL,NULL,X'C28810350A31687474703A2F2F7777772E6"
895          "76F6F676C652E636F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E"
896          "68746D6C1200',X'C28810350A31687474703A2F2F7777772E676F6F676C652E636"
897          "F6D2F6368726F6D652F696E746C2F656E2F77656C636F6D652E68746D6C1200');"
898      "INSERT INTO 'metas' VALUES(5,677,677,129001555500000000,129001555500000"
899          "000,129001555500000000,129001555500000000,1048576,7,'s_ID_5','s_ID_"
900          "9','s_ID_9','s_ID_5','s_ID_5',0,0,1,0,0,1,'Google','Google',NULL,NU"
901          "LL,X'C28810220A16687474703A2F2F7777772E676F6F676C652E636F6D2F120841"
902          "47415347415347',X'C28810220A16687474703A2F2F7777772E676F6F676C652E6"
903          "36F6D2F12084147464447415347');"
904      "INSERT INTO 'metas' VALUES(6,694,694,129053976170000000,129053976170000"
905          "000,129053976170000000,129053976170000000,-4194304,6,'s_ID_6','s_ID"
906          "_9','s_ID_9','r','r',0,0,0,1,1,0,'The Internet','The Internet',NULL"
907          ",NULL,X'C2881000',X'C2881000');"
908      "INSERT INTO 'metas' VALUES(7,663,663,128976864758480000,128976864758480"
909          "000,128976864758480000,128976864758480000,1048576,0,'s_ID_7','r','r"
910          "','r','r',0,0,0,1,1,0,'Google Chrome','Google Chrome','google_chrom"
911          "e',NULL,NULL,NULL);"
912      "INSERT INTO 'metas' VALUES(8,664,664,128976864758480000,128976864758480"
913          "000,128976864758480000,128976864758480000,1048576,0,'s_ID_8','s_ID_"
914          "7','s_ID_7','r','r',0,0,0,1,1,0,'Bookmarks','Bookmarks','google_chr"
915          "ome_bookmarks',NULL,X'C2881000',X'C2881000');"
916      "INSERT INTO 'metas' VALUES(9,665,665,128976864758480000,128976864758480"
917          "000,128976864758480000,128976864758480000,1048576,1,'s_ID_9','s_ID_"
918          "8','s_ID_8','r','s_ID_10',0,0,0,1,1,0,'Bookmark Bar','Bookmark Bar'"
919          ",'bookmark_bar',NULL,X'C2881000',X'C2881000');"
920      "INSERT INTO 'metas' VALUES(10,666,666,128976864758480000,12897686475848"
921          "0000,128976864758480000,128976864758480000,2097152,2,'s_ID_10','s_I"
922          "D_8','s_ID_8','s_ID_9','r',0,0,0,1,1,0,'Other Bookmarks','Other Boo"
923          "kmarks','other_bookmarks',NULL,X'C2881000',X'C2881000');"
924      "INSERT INTO 'metas' VALUES(11,683,683,129079956948440000,12907995694844"
925          "0000,129079956948440000,129079956948440000,-1048576,8,'s_ID_11','s_"
926          "ID_6','s_ID_6','r','s_ID_13',0,0,0,0,0,0,'Home (The Chromium Projec"
927          "ts)','Home (The Chromium Projects)',NULL,NULL,X'C28810220A186874747"
928          "03A2F2F6465762E6368726F6D69756D2E6F72672F1206414741545741',X'C28810"
929          "290A1D687474703A2F2F6465762E6368726F6D69756D2E6F72672F6F74686572120"
930          "84146414756415346');"
931      "INSERT INTO 'metas' VALUES(12,685,685,129079957513650000,12907995751365"
932          "0000,129079957513650000,129079957513650000,0,9,'s_ID_12','s_ID_6','"
933          "s_ID_6','s_ID_13','s_ID_14',0,0,0,1,1,0,'Extra Bookmarks','Extra Bo"
934          "okmarks',NULL,NULL,X'C2881000',X'C2881000');"
935      "INSERT INTO 'metas' VALUES(13,687,687,129079957985300000,12907995798530"
936          "0000,129079957985300000,129079957985300000,-917504,10,'s_ID_13','s_"
937          "ID_6','s_ID_6','s_ID_11','s_ID_12',0,0,0,0,0,0,'ICANN | Internet Co"
938          "rporation for Assigned Names and Numbers','ICANN | Internet Corpora"
939          "tion for Assigned Names and Numbers',NULL,NULL,X'C28810240A15687474"
940          "703A2F2F7777772E6963616E6E2E636F6D2F120B504E474158463041414646',X'C"
941          "28810200A15687474703A2F2F7777772E6963616E6E2E636F6D2F12074441414641"
942          "5346');"
943      "INSERT INTO 'metas' VALUES(14,692,692,129079958383000000,12907995838300"
944          "0000,129079958383000000,129079958383000000,1048576,11,'s_ID_14','s_"
945          "ID_6','s_ID_6','s_ID_12','r',0,0,0,0,0,0,'The WebKit Open Source Pr"
946          "oject','The WebKit Open Source Project',NULL,NULL,X'C288101A0A12687"
947          "474703A2F2F7765626B69742E6F72672F1204504E4758',X'C288101C0A13687474"
948          "703A2F2F7765626B69742E6F72672F781205504E473259');"
949      ));
950  ASSERT_TRUE(connection.CommitTransaction());
951}
952
953TEST_F(DirectoryBackingStoreTest, MigrateVersion67To68) {
954  SetUpVersion67Database();
955
956  {
957    sql::Connection connection;
958    ASSERT_TRUE(connection.Open(GetDatabasePath()));
959
960    // Columns existing before version 67.
961    ASSERT_TRUE(connection.DoesColumnExist("metas", "name"));
962    ASSERT_TRUE(connection.DoesColumnExist("metas", "unsanitized_name"));
963    ASSERT_TRUE(connection.DoesColumnExist("metas", "server_name"));
964  }
965
966  scoped_ptr<DirectoryBackingStore> dbs(
967      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
968
969  dbs->BeginLoad();
970  ASSERT_FALSE(dbs->needs_column_refresh_);
971  ASSERT_TRUE(dbs->MigrateVersion67To68());
972  ASSERT_EQ(68, dbs->GetVersion());
973  dbs->EndLoad();
974  ASSERT_TRUE(dbs->needs_column_refresh_);
975}
976
977TEST_F(DirectoryBackingStoreTest, MigrateVersion68To69) {
978  SetUpVersion68Database();
979
980  scoped_ptr<DirectoryBackingStore> dbs(
981      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
982
983  dbs->BeginLoad();
984  ASSERT_FALSE(dbs->needs_column_refresh_);
985  ASSERT_TRUE(dbs->MigrateVersion68To69());
986  ASSERT_EQ(69, dbs->GetVersion());
987  dbs->EndLoad();
988  ASSERT_TRUE(dbs->needs_column_refresh_);
989
990  sql::Connection connection;
991  ASSERT_TRUE(connection.Open(GetDatabasePath()));
992  ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics"));
993  ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics"));
994  sql::Statement s(connection.GetUniqueStatement("SELECT non_unique_name,"
995      "is_del, is_dir, id, specifics, server_specifics FROM metas "
996      "WHERE metahandle = 2"));
997  ASSERT_TRUE(s.Step());
998  ASSERT_EQ("Deleted Item", s.ColumnString(0));
999  ASSERT_TRUE(s.ColumnBool(1));
1000  ASSERT_FALSE(s.ColumnBool(2));
1001  ASSERT_EQ("s_ID_2", s.ColumnString(3));
1002  sync_pb::EntitySpecifics specifics;
1003  specifics.ParseFromArray(s.ColumnBlob(4), s.ColumnByteLength(4));
1004  ASSERT_TRUE(specifics.HasExtension(sync_pb::bookmark));
1005  ASSERT_EQ("http://www.google.com/",
1006      specifics.GetExtension(sync_pb::bookmark).url());
1007  ASSERT_EQ("AASGASGA", specifics.GetExtension(sync_pb::bookmark).favicon());
1008  specifics.ParseFromArray(s.ColumnBlob(5), s.ColumnByteLength(5));
1009  ASSERT_TRUE(specifics.HasExtension(sync_pb::bookmark));
1010  ASSERT_EQ("http://www.google.com/2",
1011      specifics.GetExtension(sync_pb::bookmark).url());
1012  ASSERT_EQ("ASADGADGADG", specifics.GetExtension(sync_pb::bookmark).favicon());
1013  ASSERT_FALSE(s.Step());
1014}
1015
1016TEST_F(DirectoryBackingStoreTest, MigrateVersion69To70) {
1017  SetUpVersion69Database();
1018
1019  {
1020    sql::Connection connection;
1021    ASSERT_TRUE(connection.Open(GetDatabasePath()));
1022
1023    ASSERT_TRUE(connection.DoesColumnExist("metas", "singleton_tag"));
1024    ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_server_tag"));
1025    ASSERT_FALSE(connection.DoesColumnExist("metas", "unique_client_tag"));
1026  }
1027
1028  scoped_ptr<DirectoryBackingStore> dbs(
1029      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1030
1031  dbs->BeginLoad();
1032  ASSERT_FALSE(dbs->needs_column_refresh_);
1033  ASSERT_TRUE(dbs->MigrateVersion69To70());
1034  ASSERT_EQ(70, dbs->GetVersion());
1035  dbs->EndLoad();
1036  ASSERT_TRUE(dbs->needs_column_refresh_);
1037
1038  sql::Connection connection;
1039  ASSERT_TRUE(connection.Open(GetDatabasePath()));
1040
1041  EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag"));
1042  EXPECT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag"));
1043  sql::Statement s(connection.GetUniqueStatement("SELECT id"
1044      " FROM metas WHERE unique_server_tag = 'google_chrome'"));
1045  ASSERT_TRUE(s.Step());
1046  EXPECT_EQ("s_ID_7", s.ColumnString(0));
1047}
1048
1049TEST_F(DirectoryBackingStoreTest, MigrateVersion70To71) {
1050  SetUpVersion70Database();
1051
1052  {
1053    sql::Connection connection;
1054    ASSERT_TRUE(connection.Open(GetDatabasePath()));
1055    ASSERT_TRUE(
1056        connection.DoesColumnExist("share_info", "last_sync_timestamp"));
1057    ASSERT_TRUE(
1058        connection.DoesColumnExist("share_info", "initial_sync_ended"));
1059    ASSERT_FALSE(connection.DoesTableExist("models"));
1060  }
1061
1062  scoped_ptr<DirectoryBackingStore> dbs(
1063      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1064
1065  dbs->BeginLoad();
1066  ASSERT_FALSE(dbs->needs_column_refresh_);
1067  ASSERT_TRUE(dbs->MigrateVersion70To71());
1068  ASSERT_EQ(71, dbs->GetVersion());
1069  dbs->EndLoad();
1070  ASSERT_FALSE(dbs->needs_column_refresh_);
1071
1072  sql::Connection connection;
1073  ASSERT_TRUE(connection.Open(GetDatabasePath()));
1074
1075  ASSERT_FALSE(
1076      connection.DoesColumnExist("share_info", "last_sync_timestamp"));
1077  ASSERT_FALSE(
1078      connection.DoesColumnExist("share_info", "initial_sync_ended"));
1079  ASSERT_TRUE(connection.DoesTableExist("models"));
1080  ASSERT_TRUE(
1081      connection.DoesColumnExist("models", "initial_sync_ended"));
1082  ASSERT_TRUE(
1083      connection.DoesColumnExist("models", "last_download_timestamp"));
1084  ASSERT_TRUE(
1085      connection.DoesColumnExist("models", "model_id"));
1086
1087  sql::Statement s(connection.GetUniqueStatement("SELECT model_id, "
1088      "initial_sync_ended, last_download_timestamp FROM models"));
1089  ASSERT_TRUE(s.Step());
1090  std::string model_id = s.ColumnString(0);
1091  EXPECT_EQ("C2881000", base::HexEncode(model_id.data(), model_id.size()))
1092      << "Model ID is expected to be the empty BookmarkSpecifics proto.";
1093  EXPECT_TRUE(s.ColumnBool(1));
1094  EXPECT_EQ(694, s.ColumnInt64(2));
1095  ASSERT_FALSE(s.Step());
1096}
1097
1098
1099TEST_F(DirectoryBackingStoreTest, MigrateVersion71To72) {
1100  SetUpVersion71Database();
1101
1102  {
1103    sql::Connection connection;
1104    ASSERT_TRUE(connection.Open(GetDatabasePath()));
1105    ASSERT_TRUE(connection.DoesTableExist("extended_attributes"));
1106  }
1107
1108  scoped_ptr<DirectoryBackingStore> dbs(
1109      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1110
1111  dbs->BeginLoad();
1112  ASSERT_FALSE(dbs->needs_column_refresh_);
1113  ASSERT_TRUE(dbs->MigrateVersion71To72());
1114  ASSERT_EQ(72, dbs->GetVersion());
1115  dbs->EndLoad();
1116  ASSERT_FALSE(dbs->needs_column_refresh_);
1117
1118  sql::Connection connection;
1119  ASSERT_TRUE(connection.Open(GetDatabasePath()));
1120  ASSERT_FALSE(connection.DoesTableExist("extended_attributes"));
1121}
1122
1123TEST_F(DirectoryBackingStoreTest, MigrateVersion72To73) {
1124  SetUpVersion72Database();
1125
1126  {
1127    sql::Connection connection;
1128    ASSERT_TRUE(connection.Open(GetDatabasePath()));
1129    ASSERT_FALSE(
1130        connection.DoesColumnExist("share_info", "notification_state"));
1131  }
1132
1133  scoped_ptr<DirectoryBackingStore> dbs(
1134      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1135
1136  dbs->BeginLoad();
1137  ASSERT_FALSE(dbs->needs_column_refresh_);
1138  ASSERT_TRUE(dbs->MigrateVersion72To73());
1139  ASSERT_EQ(73, dbs->GetVersion());
1140  dbs->EndLoad();
1141  ASSERT_FALSE(dbs->needs_column_refresh_);
1142
1143  sql::Connection connection;
1144  ASSERT_TRUE(connection.Open(GetDatabasePath()));
1145  ASSERT_TRUE(
1146      connection.DoesColumnExist("share_info", "notification_state"));
1147}
1148
1149TEST_F(DirectoryBackingStoreTest, MigrateVersion73To74) {
1150  SetUpVersion73Database();
1151
1152  {
1153    sql::Connection connection;
1154    ASSERT_TRUE(connection.Open(GetDatabasePath()));
1155    ASSERT_FALSE(
1156        connection.DoesColumnExist("share_info", "autofill_migration_state"));
1157    ASSERT_FALSE(
1158        connection.DoesColumnExist("share_info",
1159            "bookmarks_added_during_autofill_migration"));
1160    ASSERT_FALSE(
1161        connection.DoesColumnExist("share_info", "autofill_migration_time"));
1162    ASSERT_FALSE(
1163        connection.DoesColumnExist("share_info",
1164            "autofill_entries_added_during_migration"));
1165
1166    ASSERT_FALSE(
1167        connection.DoesColumnExist("share_info",
1168            "autofill_profiles_added_during_migration"));
1169  }
1170
1171  scoped_ptr<DirectoryBackingStore> dbs(
1172      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1173
1174  dbs->BeginLoad();
1175  ASSERT_FALSE(dbs->needs_column_refresh_);
1176  ASSERT_TRUE(dbs->MigrateVersion73To74());
1177  ASSERT_EQ(74, dbs->GetVersion());
1178  dbs->EndLoad();
1179  ASSERT_FALSE(dbs->needs_column_refresh_);
1180
1181  sql::Connection connection;
1182  ASSERT_TRUE(connection.Open(GetDatabasePath()));
1183  ASSERT_TRUE(
1184      connection.DoesColumnExist("share_info", "autofill_migration_state"));
1185  ASSERT_TRUE(
1186      connection.DoesColumnExist("share_info",
1187          "bookmarks_added_during_autofill_migration"));
1188  ASSERT_TRUE(
1189      connection.DoesColumnExist("share_info", "autofill_migration_time"));
1190  ASSERT_TRUE(
1191      connection.DoesColumnExist("share_info",
1192          "autofill_entries_added_during_migration"));
1193
1194  ASSERT_TRUE(
1195      connection.DoesColumnExist("share_info",
1196          "autofill_profiles_added_during_migration"));
1197}
1198
1199TEST_F(DirectoryBackingStoreTest, MigrateVersion74To75) {
1200  SetUpVersion74Database();
1201
1202  {
1203    sql::Connection connection;
1204    ASSERT_TRUE(connection.Open(GetDatabasePath()));
1205    ASSERT_FALSE(connection.DoesColumnExist("models", "progress_marker"));
1206    ASSERT_TRUE(connection.DoesColumnExist("models",
1207        "last_download_timestamp"));
1208  }
1209
1210  scoped_ptr<DirectoryBackingStore> dbs(
1211      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1212
1213  dbs->BeginLoad();
1214  ASSERT_FALSE(dbs->needs_column_refresh_);
1215  ASSERT_TRUE(dbs->MigrateVersion74To75());
1216  ASSERT_EQ(75, dbs->GetVersion());
1217  dbs->EndLoad();
1218  ASSERT_FALSE(dbs->needs_column_refresh_);
1219
1220  sql::Connection connection;
1221  ASSERT_TRUE(connection.Open(GetDatabasePath()));
1222
1223  ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker"));
1224  ASSERT_FALSE(connection.DoesColumnExist("models",
1225      "last_download_timestamp"));
1226}
1227
1228TEST_P(MigrationTest, ToCurrentVersion) {
1229  switch (GetParam()) {
1230    case 67:
1231      SetUpVersion67Database();
1232      break;
1233    case 68:
1234      SetUpVersion68Database();
1235      break;
1236    case 69:
1237      SetUpVersion69Database();
1238      break;
1239    case 70:
1240      SetUpVersion70Database();
1241      break;
1242    case 71:
1243      SetUpVersion71Database();
1244      break;
1245    case 72:
1246      SetUpVersion72Database();
1247      break;
1248    case 73:
1249      SetUpVersion73Database();
1250      break;
1251    case 74:
1252      SetUpVersion74Database();
1253      break;
1254    default:
1255      // If you see this error, it may mean that you've increased the
1256      // database version number but you haven't finished adding unit tests
1257      // for the database migration code.  You need to need to supply a
1258      // SetUpVersionXXDatabase function with a dump of the test database
1259      // at the old schema.  Here's one way to do that:
1260      //   1. Start on a clean tree (with none of your pending schema changes).
1261      //   2. Set a breakpoint in this function and run the unit test.
1262      //   3. Allow this test to run to completion (step out of the call),
1263      //      without allowing ~MigrationTest to execute.
1264      //   4. Examine this->scoped_dir_ to determine the location of the
1265      //      test database (it is currently of the version you need).
1266      //   5. Dump this using the sqlite command line tool:
1267      //        > .output foo_dump.sql
1268      //        > .dump
1269      FAIL() << "Need to supply database dump for version " << GetParam();
1270  }
1271
1272  scoped_ptr<DirectoryBackingStore> dbs(
1273      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1274
1275  dbs->BeginLoad();
1276  ASSERT_TRUE(OPENED == dbs->InitializeTables());
1277  ASSERT_FALSE(dbs->needs_column_refresh_);
1278  ASSERT_EQ(kCurrentDBVersion, dbs->GetVersion());
1279
1280  {
1281    sql::Connection connection;
1282    ASSERT_TRUE(connection.Open(GetDatabasePath()));
1283
1284    // Columns deleted in Version 67.
1285    ASSERT_FALSE(connection.DoesColumnExist("metas", "name"));
1286    ASSERT_FALSE(connection.DoesColumnExist("metas", "unsanitized_name"));
1287    ASSERT_FALSE(connection.DoesColumnExist("metas", "server_name"));
1288
1289    // Columns added in Version 68.
1290    ASSERT_TRUE(connection.DoesColumnExist("metas", "specifics"));
1291    ASSERT_TRUE(connection.DoesColumnExist("metas", "server_specifics"));
1292
1293    // Columns deleted in Version 68.
1294    ASSERT_FALSE(connection.DoesColumnExist("metas", "is_bookmark_object"));
1295    ASSERT_FALSE(connection.DoesColumnExist("metas",
1296                                            "server_is_bookmark_object"));
1297    ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_favicon"));
1298    ASSERT_FALSE(connection.DoesColumnExist("metas", "bookmark_url"));
1299    ASSERT_FALSE(connection.DoesColumnExist("metas", "server_bookmark_url"));
1300
1301    // Renamed a column in Version 70
1302    ASSERT_FALSE(connection.DoesColumnExist("metas", "singleton_tag"));
1303    ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_server_tag"));
1304    ASSERT_TRUE(connection.DoesColumnExist("metas", "unique_client_tag"));
1305
1306    // Removed extended attributes in Version 72.
1307    ASSERT_FALSE(connection.DoesTableExist("extended_attributes"));
1308
1309    // Columns added in Version 73.
1310    ASSERT_TRUE(connection.DoesColumnExist(
1311        "share_info", "notification_state"));
1312
1313    // Columns added in version 74.
1314    ASSERT_TRUE(connection.DoesColumnExist("share_info",
1315        "autofill_migration_state"));
1316
1317    // Column replaced in version 75.
1318    ASSERT_TRUE(connection.DoesColumnExist("models", "progress_marker"));
1319    ASSERT_FALSE(connection.DoesColumnExist("models",
1320        "last_download_timestamp"));
1321  }
1322  {
1323    syncable::Directory::KernelLoadInfo dir_info;
1324    dbs->LoadInfo(&dir_info);
1325
1326    // Check download_progress state (v75 migration)
1327    ASSERT_EQ(694,
1328        dir_info.kernel_info.download_progress[syncable::BOOKMARKS]
1329        .timestamp_token_for_migration());
1330    ASSERT_FALSE(
1331        dir_info.kernel_info.download_progress[syncable::BOOKMARKS]
1332        .has_token());
1333    ASSERT_EQ(32904,
1334        dir_info.kernel_info.download_progress[syncable::BOOKMARKS]
1335        .data_type_id());
1336    ASSERT_FALSE(
1337        dir_info.kernel_info.download_progress[syncable::THEMES]
1338        .has_timestamp_token_for_migration());
1339    ASSERT_TRUE(
1340        dir_info.kernel_info.download_progress[syncable::THEMES]
1341        .has_token());
1342    ASSERT_TRUE(
1343        dir_info.kernel_info.download_progress[syncable::THEMES]
1344        .token().empty());
1345    ASSERT_EQ(41210,
1346        dir_info.kernel_info.download_progress[syncable::THEMES]
1347        .data_type_id());
1348  }
1349
1350  MetahandlesIndex index;
1351  STLElementDeleter<MetahandlesIndex> index_deleter(&index);
1352  dbs->LoadEntries(&index);
1353  dbs->EndLoad();
1354
1355  MetahandlesIndex::iterator it = index.begin();
1356  ASSERT_TRUE(it != index.end());
1357  ASSERT_EQ(1, (*it)->ref(META_HANDLE));
1358  EXPECT_TRUE((*it)->ref(ID).IsRoot());
1359
1360  ASSERT_TRUE(++it != index.end()) << "Upgrade destroyed database contents.";
1361  ASSERT_EQ(2, (*it)->ref(META_HANDLE));
1362  EXPECT_TRUE((*it)->ref(IS_DEL));
1363  EXPECT_TRUE((*it)->ref(SERVER_IS_DEL));
1364  EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark));
1365  EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark));
1366  EXPECT_EQ("http://www.google.com/",
1367      (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).url());
1368  EXPECT_EQ("AASGASGA",
1369      (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).favicon());
1370  EXPECT_EQ("http://www.google.com/2",
1371      (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).url());
1372  EXPECT_EQ("ASADGADGADG",
1373      (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).favicon());
1374  EXPECT_EQ("", (*it)->ref(UNIQUE_SERVER_TAG));
1375  EXPECT_EQ("Deleted Item", (*it)->ref(NON_UNIQUE_NAME));
1376  EXPECT_EQ("Deleted Item", (*it)->ref(SERVER_NON_UNIQUE_NAME));
1377
1378  ASSERT_TRUE(++it != index.end());
1379  ASSERT_EQ(4, (*it)->ref(META_HANDLE));
1380  EXPECT_TRUE((*it)->ref(IS_DEL));
1381  EXPECT_TRUE((*it)->ref(SERVER_IS_DEL));
1382
1383  ASSERT_TRUE(++it != index.end());
1384  ASSERT_EQ(5, (*it)->ref(META_HANDLE));
1385  EXPECT_TRUE((*it)->ref(IS_DEL));
1386  EXPECT_TRUE((*it)->ref(SERVER_IS_DEL));
1387
1388  ASSERT_TRUE(++it != index.end());
1389  ASSERT_EQ(6, (*it)->ref(META_HANDLE));
1390  EXPECT_TRUE((*it)->ref(IS_DIR));
1391  EXPECT_TRUE((*it)->ref(SERVER_IS_DIR));
1392  EXPECT_FALSE(
1393      (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_url());
1394  EXPECT_FALSE(
1395      (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).has_url());
1396  EXPECT_FALSE(
1397      (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_favicon());
1398  EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS).
1399      GetExtension(sync_pb::bookmark).has_favicon());
1400
1401  ASSERT_TRUE(++it != index.end());
1402  ASSERT_EQ(7, (*it)->ref(META_HANDLE));
1403  EXPECT_EQ("google_chrome", (*it)->ref(UNIQUE_SERVER_TAG));
1404  EXPECT_FALSE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark));
1405  EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark));
1406
1407  ASSERT_TRUE(++it != index.end());
1408  ASSERT_EQ(8, (*it)->ref(META_HANDLE));
1409  EXPECT_EQ("google_chrome_bookmarks", (*it)->ref(UNIQUE_SERVER_TAG));
1410  EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark));
1411  EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark));
1412
1413  ASSERT_TRUE(++it != index.end());
1414  ASSERT_EQ(9, (*it)->ref(META_HANDLE));
1415  EXPECT_EQ("bookmark_bar", (*it)->ref(UNIQUE_SERVER_TAG));
1416  EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark));
1417  EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark));
1418
1419  ASSERT_TRUE(++it != index.end());
1420  ASSERT_EQ(10, (*it)->ref(META_HANDLE));
1421  EXPECT_FALSE((*it)->ref(IS_DEL));
1422  EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark));
1423  EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark));
1424  EXPECT_FALSE((*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_url());
1425  EXPECT_FALSE(
1426      (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_favicon());
1427  EXPECT_FALSE(
1428      (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).has_url());
1429  EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS).
1430      GetExtension(sync_pb::bookmark).has_favicon());
1431  EXPECT_EQ("other_bookmarks", (*it)->ref(UNIQUE_SERVER_TAG));
1432  EXPECT_EQ("Other Bookmarks", (*it)->ref(NON_UNIQUE_NAME));
1433  EXPECT_EQ("Other Bookmarks", (*it)->ref(SERVER_NON_UNIQUE_NAME));
1434
1435  ASSERT_TRUE(++it != index.end());
1436  ASSERT_EQ(11, (*it)->ref(META_HANDLE));
1437  EXPECT_FALSE((*it)->ref(IS_DEL));
1438  EXPECT_FALSE((*it)->ref(IS_DIR));
1439  EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark));
1440  EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark));
1441  EXPECT_EQ("http://dev.chromium.org/",
1442    (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).url());
1443  EXPECT_EQ("AGATWA",
1444    (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).favicon());
1445  EXPECT_EQ("http://dev.chromium.org/other",
1446    (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).url());
1447  EXPECT_EQ("AFAGVASF",
1448    (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).favicon());
1449  EXPECT_EQ("", (*it)->ref(UNIQUE_SERVER_TAG));
1450  EXPECT_EQ("Home (The Chromium Projects)", (*it)->ref(NON_UNIQUE_NAME));
1451  EXPECT_EQ("Home (The Chromium Projects)", (*it)->ref(SERVER_NON_UNIQUE_NAME));
1452
1453  ASSERT_TRUE(++it != index.end());
1454  ASSERT_EQ(12, (*it)->ref(META_HANDLE));
1455  EXPECT_FALSE((*it)->ref(IS_DEL));
1456  EXPECT_TRUE((*it)->ref(IS_DIR));
1457  EXPECT_EQ("Extra Bookmarks", (*it)->ref(NON_UNIQUE_NAME));
1458  EXPECT_EQ("Extra Bookmarks", (*it)->ref(SERVER_NON_UNIQUE_NAME));
1459  EXPECT_TRUE((*it)->ref(SPECIFICS).HasExtension(sync_pb::bookmark));
1460  EXPECT_TRUE((*it)->ref(SERVER_SPECIFICS).HasExtension(sync_pb::bookmark));
1461  EXPECT_FALSE(
1462      (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_url());
1463  EXPECT_FALSE(
1464      (*it)->ref(SERVER_SPECIFICS).GetExtension(sync_pb::bookmark).has_url());
1465  EXPECT_FALSE(
1466      (*it)->ref(SPECIFICS).GetExtension(sync_pb::bookmark).has_favicon());
1467  EXPECT_FALSE((*it)->ref(SERVER_SPECIFICS).
1468      GetExtension(sync_pb::bookmark).has_favicon());
1469
1470  ASSERT_TRUE(++it != index.end());
1471  ASSERT_EQ(13, (*it)->ref(META_HANDLE));
1472
1473  ASSERT_TRUE(++it != index.end());
1474  ASSERT_EQ(14, (*it)->ref(META_HANDLE));
1475
1476  ASSERT_TRUE(++it == index.end());
1477}
1478
1479INSTANTIATE_TEST_CASE_P(DirectoryBackingStore, MigrationTest,
1480                        testing::Range(67, kCurrentDBVersion));
1481
1482TEST_F(DirectoryBackingStoreTest, ModelTypeIds) {
1483  for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) {
1484    std::string model_id =
1485        DirectoryBackingStore::ModelTypeEnumToModelId(ModelTypeFromInt(i));
1486    EXPECT_EQ(i,
1487        DirectoryBackingStore::ModelIdToModelTypeEnum(model_id.data(),
1488                                                      model_id.size()));
1489  }
1490}
1491
1492TEST_F(DirectoryBackingStoreTest, Corruption) {
1493  {
1494    scoped_ptr<DirectoryBackingStore> dbs(
1495        new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1496    EXPECT_TRUE(dbs->BeginLoad());
1497  }
1498  std::string bad_data("BAD DATA");
1499  EXPECT_TRUE(file_util::WriteFile(GetDatabasePath(), bad_data.data(),
1500                                   bad_data.size()));
1501  {
1502    scoped_ptr<DirectoryBackingStore> dbs(
1503        new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1504
1505    // In release mode, we expect the sync database to nuke itself and start
1506    // over if it detects invalid/corrupted data.
1507#if defined(NDEBUG)
1508    EXPECT_TRUE(dbs->BeginLoad());
1509#else
1510    EXPECT_DEATH(dbs->BeginLoad(), "sqlite error");
1511#endif
1512  }
1513}
1514
1515TEST_F(DirectoryBackingStoreTest, DeleteEntries) {
1516  SetUpCurrentDatabaseAndCheckVersion();
1517  scoped_ptr<DirectoryBackingStore> dbs(
1518      new DirectoryBackingStore(GetUsername(), GetDatabasePath()));
1519  dbs->BeginLoad();
1520  MetahandlesIndex index;
1521  STLElementDeleter<MetahandlesIndex> index_deleter(&index);
1522  dbs->LoadEntries(&index);
1523  size_t initial_size = index.size();
1524  ASSERT_LT(0U, initial_size) << "Test requires entries to delete.";
1525  int64 first_to_die = (*index.begin())->ref(META_HANDLE);
1526  MetahandleSet to_delete;
1527  to_delete.insert(first_to_die);
1528  EXPECT_TRUE(dbs->DeleteEntries(to_delete));
1529
1530  STLDeleteElements(&index);
1531  dbs->LoadEntries(&index);
1532
1533  EXPECT_EQ(initial_size - 1, index.size());
1534  bool delete_failed = false;
1535  for (MetahandlesIndex::iterator it = index.begin(); it != index.end();
1536       ++it) {
1537    if ((*it)->ref(META_HANDLE) == first_to_die) {
1538      delete_failed = true;
1539      break;
1540    }
1541  }
1542  EXPECT_FALSE(delete_failed);
1543
1544  to_delete.clear();
1545  for (MetahandlesIndex::iterator it = index.begin(); it != index.end();
1546       ++it) {
1547    to_delete.insert((*it)->ref(META_HANDLE));
1548  }
1549
1550  EXPECT_TRUE(dbs->DeleteEntries(to_delete));
1551
1552  STLDeleteElements(&index);
1553  dbs->LoadEntries(&index);
1554  EXPECT_EQ(0U, index.size());
1555
1556  dbs->EndLoad();
1557  dbs->EndSave();
1558}
1559
1560}  // namespace syncable
1561