| Index: components/offline_pages/offline_page_metadata_store_impl_unittest.cc
 | 
| diff --git a/components/offline_pages/offline_page_metadata_store_impl_unittest.cc b/components/offline_pages/offline_page_metadata_store_impl_unittest.cc
 | 
| index 351fa3602ec7e438327a15d9a106b4d37d09c8f4..ae2c71e9f5f74b2a70ce2365a68dea18957f0a2e 100644
 | 
| --- a/components/offline_pages/offline_page_metadata_store_impl_unittest.cc
 | 
| +++ b/components/offline_pages/offline_page_metadata_store_impl_unittest.cc
 | 
| @@ -149,7 +149,7 @@ void BuildTestStoreWithSchemaFromM54(const base::FilePath& file) {
 | 
|                                   "client_id VARCHAR NOT NULL, "
 | 
|                                   "online_url VARCHAR NOT NULL, "
 | 
|                                   "offline_url VARCHAR NOT NULL DEFAULT '', "
 | 
| -                                 "file_path VARCHAR NOT NULL "
 | 
| +                                 "file_path VARCHAR NOT NULL, "
 | 
|                                   "title VARCHAR NOT NULL DEFAULT ''"
 | 
|                                   ")"));
 | 
|    ASSERT_TRUE(connection.CommitTransaction());
 | 
| @@ -158,7 +158,7 @@ void BuildTestStoreWithSchemaFromM54(const base::FilePath& file) {
 | 
|        "(offline_id, creation_time, file_size, version, "
 | 
|        "last_access_time, access_count, client_namespace, "
 | 
|        "client_id, online_url, file_path, expiration_time, title) "
 | 
| -      "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
 | 
| +      "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
 | 
|    statement.BindInt64(0, kOfflineId);
 | 
|    statement.BindInt(1, 0);
 | 
|    statement.BindInt64(2, kFileSize);
 | 
| @@ -225,6 +225,51 @@ void BuildTestStoreWithSchemaFromM55(const base::FilePath& file) {
 | 
|        connection.DoesColumnExist(OFFLINE_PAGES_TABLE_V1, "original_url"));
 | 
|  }
 | 
|  
 | 
| +void BuildTestStoreWithSchemaFromM56(const base::FilePath& file) {
 | 
| +  sql::Connection connection;
 | 
| +  ASSERT_TRUE(
 | 
| +      connection.Open(file.Append(FILE_PATH_LITERAL("OfflinePages.db"))));
 | 
| +  ASSERT_TRUE(connection.is_open());
 | 
| +  ASSERT_TRUE(connection.BeginTransaction());
 | 
| +  ASSERT_TRUE(connection.Execute("CREATE TABLE " OFFLINE_PAGES_TABLE_V1
 | 
| +                                 "(offline_id INTEGER PRIMARY KEY NOT NULL, "
 | 
| +                                 "creation_time INTEGER NOT NULL, "
 | 
| +                                 "file_size INTEGER NOT NULL, "
 | 
| +                                 "last_access_time INTEGER NOT NULL, "
 | 
| +                                 "access_count INTEGER NOT NULL, "
 | 
| +                                 "expiration_time INTEGER NOT NULL DEFAULT 0, "
 | 
| +                                 "client_namespace VARCHAR NOT NULL, "
 | 
| +                                 "client_id VARCHAR NOT NULL, "
 | 
| +                                 "online_url VARCHAR NOT NULL, "
 | 
| +                                 "file_path VARCHAR NOT NULL, "
 | 
| +                                 "title VARCHAR NOT NULL DEFAULT '', "
 | 
| +                                 "original_url VARCHAR NOT NULL DEFAULT ''"
 | 
| +                                 ")"));
 | 
| +  ASSERT_TRUE(connection.CommitTransaction());
 | 
| +  sql::Statement statement(connection.GetUniqueStatement(
 | 
| +      "INSERT INTO " OFFLINE_PAGES_TABLE_V1
 | 
| +      "(offline_id, creation_time, file_size, "
 | 
| +      "last_access_time, access_count, client_namespace, "
 | 
| +      "client_id, online_url, file_path, expiration_time, title, original_url) "
 | 
| +      "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"));
 | 
| +  statement.BindInt64(0, kOfflineId);
 | 
| +  statement.BindInt(1, 0);
 | 
| +  statement.BindInt64(2, kFileSize);
 | 
| +  statement.BindInt(3, 0);
 | 
| +  statement.BindInt(4, 1);
 | 
| +  statement.BindCString(5, kTestClientNamespace);
 | 
| +  statement.BindString(6, kTestClientId2.id);
 | 
| +  statement.BindCString(7, kTestURL);
 | 
| +  statement.BindString(8, base::FilePath(kFilePath).MaybeAsASCII());
 | 
| +  statement.BindInt64(9, base::Time::Now().ToInternalValue());
 | 
| +  statement.BindString16(10, base::UTF8ToUTF16("Test title"));
 | 
| +  statement.BindCString(11, kOriginalTestURL);
 | 
| +  ASSERT_TRUE(statement.Run());
 | 
| +  ASSERT_TRUE(connection.DoesTableExist(OFFLINE_PAGES_TABLE_V1));
 | 
| +  ASSERT_TRUE(
 | 
| +      connection.DoesColumnExist(OFFLINE_PAGES_TABLE_V1, "expiration_time"));
 | 
| +}
 | 
| +
 | 
|  class OfflinePageMetadataStoreFactory {
 | 
|   public:
 | 
|    OfflinePageMetadataStore* BuildStore(const base::FilePath& file_path) {
 | 
| @@ -260,6 +305,13 @@ class OfflinePageMetadataStoreFactory {
 | 
|          base::ThreadTaskRunnerHandle::Get(), file_path);
 | 
|      return store;
 | 
|    }
 | 
| +
 | 
| +  OfflinePageMetadataStore* BuildStoreM56(const base::FilePath& file_path) {
 | 
| +    BuildTestStoreWithSchemaFromM56(file_path);
 | 
| +    OfflinePageMetadataStoreSQL* store = new OfflinePageMetadataStoreSQL(
 | 
| +        base::ThreadTaskRunnerHandle::Get(), file_path);
 | 
| +    return store;
 | 
| +  }
 | 
|  };
 | 
|  
 | 
|  enum CalledCallback { NONE, LOAD, ADD, UPDATE, REMOVE, RESET };
 | 
| @@ -280,6 +332,7 @@ class OfflinePageMetadataStoreTest : public testing::Test {
 | 
|    std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM53();
 | 
|    std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM54();
 | 
|    std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM55();
 | 
| +  std::unique_ptr<OfflinePageMetadataStore> BuildStoreWithSchemaFromM56();
 | 
|  
 | 
|    void PumpLoop();
 | 
|  
 | 
| @@ -379,8 +432,6 @@ void OfflinePageMetadataStoreTest::CheckThatOfflinePageCanBeSaved(
 | 
|    OfflinePageItem offline_page(GURL(kTestURL), 1234LL, kTestClientId1,
 | 
|                                 base::FilePath(kFilePath), kFileSize);
 | 
|    offline_page.title = base::UTF8ToUTF16("a title");
 | 
| -  base::Time expiration_time = base::Time::Now();
 | 
| -  offline_page.expiration_time = expiration_time;
 | 
|    offline_page.original_url = GURL(kOriginalTestURL);
 | 
|  
 | 
|    store->AddOfflinePage(offline_page,
 | 
| @@ -457,7 +508,7 @@ OfflinePageMetadataStoreTest::BuildStoreWithSchemaFromM53() {
 | 
|  std::unique_ptr<OfflinePageMetadataStore>
 | 
|  OfflinePageMetadataStoreTest::BuildStoreWithSchemaFromM54() {
 | 
|    std::unique_ptr<OfflinePageMetadataStore> store(
 | 
| -      factory_.BuildStoreM53(temp_directory_.GetPath()));
 | 
| +      factory_.BuildStoreM54(temp_directory_.GetPath()));
 | 
|    PumpLoop();
 | 
|    store->Initialize(
 | 
|        base::Bind(&OfflinePageMetadataStoreTest::InitializeCallback,
 | 
| @@ -486,6 +537,22 @@ OfflinePageMetadataStoreTest::BuildStoreWithSchemaFromM55() {
 | 
|    return store;
 | 
|  }
 | 
|  
 | 
| +std::unique_ptr<OfflinePageMetadataStore>
 | 
| +OfflinePageMetadataStoreTest::BuildStoreWithSchemaFromM56() {
 | 
| +  std::unique_ptr<OfflinePageMetadataStore> store(
 | 
| +      factory_.BuildStoreM56(temp_directory_.GetPath()));
 | 
| +  PumpLoop();
 | 
| +  store->Initialize(
 | 
| +      base::Bind(&OfflinePageMetadataStoreTest::InitializeCallback,
 | 
| +                 base::Unretained(this)));
 | 
| +  PumpLoop();
 | 
| +  store->GetOfflinePages(
 | 
| +      base::Bind(&OfflinePageMetadataStoreTest::GetOfflinePagesCallback,
 | 
| +                 base::Unretained(this)));
 | 
| +  PumpLoop();
 | 
| +  return store;
 | 
| +}
 | 
| +
 | 
|  // Loads empty store and makes sure that there are no offline pages stored in
 | 
|  // it.
 | 
|  TEST_F(OfflinePageMetadataStoreTest, LoadEmptyStore) {
 | 
| @@ -574,7 +641,7 @@ TEST_F(OfflinePageMetadataStoreTest, LoadVersion52Store) {
 | 
|    std::unique_ptr<OfflinePageMetadataStore> store(
 | 
|        BuildStoreWithSchemaFromM52());
 | 
|  
 | 
| -  CheckThatStoreHasOneItem();
 | 
| +  OfflinePageItem item = CheckThatStoreHasOneItem();
 | 
|    CheckThatOfflinePageCanBeSaved(std::move(store));
 | 
|  }
 | 
|  
 | 
| @@ -587,36 +654,42 @@ TEST_F(OfflinePageMetadataStoreTest, LoadVersion53Store) {
 | 
|        BuildStoreWithSchemaFromM53());
 | 
|  
 | 
|    OfflinePageItem item = CheckThatStoreHasOneItem();
 | 
| -  // We should have a valid expiration time after upgrade.
 | 
| -  EXPECT_NE(base::Time::FromInternalValue(0),
 | 
| -            offline_pages_[0].expiration_time);
 | 
| -
 | 
|    CheckThatOfflinePageCanBeSaved(std::move(store));
 | 
|  }
 | 
|  
 | 
|  // Loads a string with schema from M54.
 | 
| -// Because for now we only reduce the number of fields it just makes sure there
 | 
| -// are no crashes in the process.
 | 
| +// This test case would crash if it's not handling correctly when we're loading
 | 
| +// old version stores.
 | 
|  // TODO(romax): Move this to sql_unittest.
 | 
|  TEST_F(OfflinePageMetadataStoreTest, LoadVersion54Store) {
 | 
|    std::unique_ptr<OfflinePageMetadataStore> store(
 | 
|        BuildStoreWithSchemaFromM54());
 | 
|  
 | 
|    OfflinePageItem item = CheckThatStoreHasOneItem();
 | 
| -
 | 
|    CheckThatOfflinePageCanBeSaved(std::move(store));
 | 
|  }
 | 
|  
 | 
|  // Loads a string with schema from M55.
 | 
| -// Because for now we only reduce the number of fields it just makes sure there
 | 
| -// are no crashes in the process.
 | 
| +// This test case would crash if it's not handling correctly when we're loading
 | 
| +// old version stores.
 | 
|  // TODO(romax): Move this to sql_unittest.
 | 
|  TEST_F(OfflinePageMetadataStoreTest, LoadVersion55Store) {
 | 
|    std::unique_ptr<OfflinePageMetadataStore> store(
 | 
|        BuildStoreWithSchemaFromM55());
 | 
|  
 | 
|    OfflinePageItem item = CheckThatStoreHasOneItem();
 | 
| +  CheckThatOfflinePageCanBeSaved(std::move(store));
 | 
| +}
 | 
|  
 | 
| +// Loads a string with schema from M56.
 | 
| +// This test case would crash if it's not handling correctly when we're loading
 | 
| +// old version stores.
 | 
| +// TODO(romax): Move this to sql_unittest.
 | 
| +TEST_F(OfflinePageMetadataStoreTest, LoadVersion56Store) {
 | 
| +  std::unique_ptr<OfflinePageMetadataStore> store(
 | 
| +      BuildStoreWithSchemaFromM56());
 | 
| +
 | 
| +  OfflinePageItem item = CheckThatStoreHasOneItem();
 | 
|    CheckThatOfflinePageCanBeSaved(std::move(store));
 | 
|  }
 | 
|  
 | 
| @@ -632,8 +705,6 @@ TEST_F(OfflinePageMetadataStoreTest, AddSameOfflinePageTwice) {
 | 
|    OfflinePageItem offline_page(GURL(kTestURL), 1234LL, kTestClientId1,
 | 
|                                 base::FilePath(kFilePath), kFileSize);
 | 
|    offline_page.title = base::UTF8ToUTF16("a title");
 | 
| -  base::Time expiration_time = base::Time::Now();
 | 
| -  offline_page.expiration_time = expiration_time;
 | 
|  
 | 
|    store->AddOfflinePage(offline_page,
 | 
|                          base::Bind(&OfflinePageMetadataStoreTest::AddCallback,
 | 
| @@ -734,7 +805,6 @@ TEST_F(OfflinePageMetadataStoreTest, AddRemoveMultipleOfflinePages) {
 | 
|    OfflinePageItem offline_page_2(GURL("https://other.page.com"), 5678LL,
 | 
|                                   kTestClientId2, file_path_2, 12345,
 | 
|                                   base::Time::Now());
 | 
| -  offline_page_2.expiration_time = base::Time::Now();
 | 
|    offline_page_2.original_url = GURL("https://example.com/bar");
 | 
|    store->AddOfflinePage(offline_page_2,
 | 
|                          base::Bind(&OfflinePageMetadataStoreTest::AddCallback,
 | 
| @@ -790,7 +860,6 @@ TEST_F(OfflinePageMetadataStoreTest, AddRemoveMultipleOfflinePages) {
 | 
|    EXPECT_EQ(offline_page_2.creation_time, offline_pages_[0].creation_time);
 | 
|    EXPECT_EQ(offline_page_2.last_access_time,
 | 
|              offline_pages_[0].last_access_time);
 | 
| -  EXPECT_EQ(offline_page_2.expiration_time, offline_pages_[0].expiration_time);
 | 
|    EXPECT_EQ(offline_page_2.access_count, offline_pages_[0].access_count);
 | 
|    EXPECT_EQ(offline_page_2.client_id, offline_pages_[0].client_id);
 | 
|  }
 | 
| @@ -822,7 +891,6 @@ TEST_F(OfflinePageMetadataStoreTest, UpdateOfflinePage) {
 | 
|    // Then update some data.
 | 
|    offline_page.file_size = kFileSize + 1;
 | 
|    offline_page.access_count++;
 | 
| -  offline_page.expiration_time = base::Time::Now();
 | 
|    offline_page.original_url = GURL("https://example.com/bar");
 | 
|    std::vector<OfflinePageItem> items_to_update;
 | 
|    items_to_update.push_back(offline_page);
 | 
| 
 |