Home | History | Annotate | Download | only in syncable
      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 
     25 namespace syncable {
     26 
     27 extern const int32 kCurrentDBVersion;
     28 
     29 class 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 (at) 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 
     69 class DirectoryBackingStoreTest : public MigrationTest {};
     70 
     71 void 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 (at) chromium.org',694,"
    185           "'nick (at) 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 (at) chromium.org',68);"));
    190   ASSERT_TRUE(connection.CommitTransaction());
    191 }
    192 
    193 void 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 (at) chromium.org',694,"
    295           "'nick (at) 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 (at) chromium.org',68);"));
    300   ASSERT_TRUE(connection.CommitTransaction());
    301 }
    302 
    303 void 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 (at) chromium.org',694,"
    416           "'nick (at) 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 (at) chromium.org',69);"
    421   ));
    422   ASSERT_TRUE(connection.CommitTransaction());
    423 }
    424 
    425 void 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 (at) chromium.org',694,"
    438           "'nick (at) 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 (at) 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 
    535 void 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 (at) 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 (at) chromium.org','nick (at) chromium.org',"
    636           "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,"
    637           "'9010788312004066376x-6609234393368420856x');"));
    638   ASSERT_TRUE(connection.CommitTransaction());
    639 }
    640 
    641 void 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 (at) 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 (at) chromium.org','nick (at) chromium.org',"
    740           "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,"
    741           "'9010788312004066376x-6609234393368420856x');"));
    742   ASSERT_TRUE(connection.CommitTransaction());
    743 }
    744 
    745 void 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 (at) 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 (at) chromium.org','nick (at) chromium.org',"
    845           "'c27e9f59-08ca-46f8-b0cc-f16a2ed778bb','Unknown',1263522064,-65542,"
    846           "'9010788312004066376x-6609234393368420856x',X'C2881000');"));
    847   ASSERT_TRUE(connection.CommitTransaction());
    848 }
    849 
    850 void 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 (at) 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 (at) chromium.org','nick (at) 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 
    953 TEST_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 
    977 TEST_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 
   1016 TEST_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 
   1049 TEST_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 
   1099 TEST_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 
   1123 TEST_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 
   1149 TEST_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 
   1199 TEST_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 
   1228 TEST_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 
   1479 INSTANTIATE_TEST_CASE_P(DirectoryBackingStore, MigrationTest,
   1480                         testing::Range(67, kCurrentDBVersion));
   1481 
   1482 TEST_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 
   1492 TEST_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 
   1515 TEST_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