| Index: trunk/src/chrome/browser/history/thumbnail_database_unittest.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/history/thumbnail_database_unittest.cc (revision 235603)
|
| +++ trunk/src/chrome/browser/history/thumbnail_database_unittest.cc (working copy)
|
| @@ -790,12 +790,7 @@
|
| {
|
| sql::Connection raw_db;
|
| EXPECT_TRUE(raw_db.Open(file_name_));
|
| - {
|
| - sql::Statement statement(
|
| - raw_db.GetUniqueStatement("PRAGMA integrity_check"));
|
| - EXPECT_TRUE(statement.Step());
|
| - ASSERT_EQ("ok", statement.ColumnString(0));
|
| - }
|
| + ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db));
|
|
|
| const char kIndexName[] = "icon_mapping_page_url_idx";
|
| const int idx_root_page = GetRootPage(&raw_db, kIndexName);
|
| @@ -818,10 +813,7 @@
|
| {
|
| sql::Connection raw_db;
|
| EXPECT_TRUE(raw_db.Open(file_name_));
|
| - sql::Statement statement(
|
| - raw_db.GetUniqueStatement("PRAGMA integrity_check"));
|
| - EXPECT_TRUE(statement.Step());
|
| - ASSERT_NE("ok", statement.ColumnString(0));
|
| + ASSERT_NE("ok", sql::test::IntegrityCheck(&raw_db));
|
| }
|
|
|
| // Open the database and access the corrupt index.
|
| @@ -844,10 +836,7 @@
|
| {
|
| sql::Connection raw_db;
|
| EXPECT_TRUE(raw_db.Open(file_name_));
|
| - sql::Statement statement(
|
| - raw_db.GetUniqueStatement("PRAGMA integrity_check"));
|
| - EXPECT_TRUE(statement.Step());
|
| - EXPECT_EQ("ok", statement.ColumnString(0));
|
| + ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db));
|
|
|
| // Check that the expected tables exist.
|
| VerifyTablesAndColumns(&raw_db);
|
| @@ -867,21 +856,8 @@
|
| kIconUrl1, kLargeSize, sizeof(kBlob1), kBlob1));
|
| }
|
|
|
| - // Corrupt the database again by making the actual file shorter than
|
| - // the header expects.
|
| - {
|
| - int64 db_size = 0;
|
| - EXPECT_TRUE(file_util::GetFileSize(file_name_, &db_size));
|
| - {
|
| - sql::Connection raw_db;
|
| - EXPECT_TRUE(raw_db.Open(file_name_));
|
| - EXPECT_TRUE(raw_db.Execute("CREATE TABLE t(x)"));
|
| - }
|
| - file_util::ScopedFILE file(file_util::OpenFile(file_name_, "rb+"));
|
| - ASSERT_TRUE(file.get() != NULL);
|
| - EXPECT_EQ(0, fseek(file.get(), static_cast<long>(db_size), SEEK_SET));
|
| - EXPECT_TRUE(file_util::TruncateFile(file.get()));
|
| - }
|
| + // Corrupt the database again by adjusting the header.
|
| + EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
|
|
|
| // Database is unusable at the SQLite level.
|
| {
|
| @@ -918,23 +894,10 @@
|
| // (which would upgrade it).
|
| EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "Favicons.v6.sql"));
|
|
|
| - // Corrupt the database by making the actual file shorter than the
|
| - // SQLite header expects. This form of corruption will cause
|
| - // immediate failures during Open(), before the migration code runs,
|
| - // so the version-6 recovery will occur.
|
| - {
|
| - int64 db_size = 0;
|
| - EXPECT_TRUE(file_util::GetFileSize(file_name_, &db_size));
|
| - {
|
| - sql::Connection raw_db;
|
| - EXPECT_TRUE(raw_db.Open(file_name_));
|
| - EXPECT_TRUE(raw_db.Execute("CREATE TABLE t(x)"));
|
| - }
|
| - file_util::ScopedFILE file(file_util::OpenFile(file_name_, "rb+"));
|
| - ASSERT_TRUE(file.get() != NULL);
|
| - EXPECT_EQ(0, fseek(file.get(), static_cast<long>(db_size), SEEK_SET));
|
| - EXPECT_TRUE(file_util::TruncateFile(file.get()));
|
| - }
|
| + // Corrupt the database again by adjusting the header. This form of
|
| + // corruption will cause immediate failures during Open(), before
|
| + // the migration code runs, so the version-6 recovery will occur.
|
| + EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
|
|
|
| // Database is unusable at the SQLite level.
|
| {
|
| @@ -970,16 +933,64 @@
|
| {
|
| sql::Connection raw_db;
|
| EXPECT_TRUE(raw_db.Open(file_name_));
|
| - sql::Statement statement(
|
| - raw_db.GetUniqueStatement("PRAGMA integrity_check"));
|
| - EXPECT_TRUE(statement.Step());
|
| - EXPECT_EQ("ok", statement.ColumnString(0));
|
| + ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db));
|
|
|
| // Check that the expected tables exist.
|
| VerifyTablesAndColumns(&raw_db);
|
| }
|
| }
|
|
|
| +TEST_F(ThumbnailDatabaseTest, Recovery5) {
|
| + // Create an example database without loading into ThumbnailDatabase
|
| + // (which would upgrade it).
|
| + EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "Favicons.v5.sql"));
|
| +
|
| + // Corrupt the database again by adjusting the header. This form of
|
| + // corruption will cause immediate failures during Open(), before
|
| + // the migration code runs, so the version-5 recovery will occur.
|
| + EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
|
| +
|
| + // Database is unusable at the SQLite level.
|
| + {
|
| + sql::ScopedErrorIgnorer ignore_errors;
|
| + ignore_errors.IgnoreError(SQLITE_CORRUPT);
|
| + sql::Connection raw_db;
|
| + EXPECT_TRUE(raw_db.Open(file_name_));
|
| + EXPECT_FALSE(raw_db.IsSQLValid("PRAGMA integrity_check"));
|
| + ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
|
| + }
|
| +
|
| + // Database should be recovered during open.
|
| + {
|
| + sql::ScopedErrorIgnorer ignore_errors;
|
| + ignore_errors.IgnoreError(SQLITE_CORRUPT);
|
| + ThumbnailDatabase db;
|
| + ASSERT_EQ(sql::INIT_OK, db.Init(file_name_));
|
| +
|
| + // Test that some data is present, copied from
|
| + // ThumbnailDatabaseTest.Version5 .
|
| + EXPECT_TRUE(
|
| + CheckPageHasIcon(&db, kPageUrl3, chrome::FAVICON,
|
| + kIconUrl1, gfx::Size(), sizeof(kBlob1), kBlob1));
|
| + EXPECT_TRUE(
|
| + CheckPageHasIcon(&db, kPageUrl3, chrome::TOUCH_ICON,
|
| + kIconUrl3, gfx::Size(), sizeof(kBlob2), kBlob2));
|
| +
|
| + ASSERT_TRUE(ignore_errors.CheckIgnoredErrors());
|
| + }
|
| +
|
| + // Check that the database is recovered at a SQLite level, and that
|
| + // the current schema is in place.
|
| + {
|
| + sql::Connection raw_db;
|
| + EXPECT_TRUE(raw_db.Open(file_name_));
|
| + ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db));
|
| +
|
| + // Check that the expected tables exist.
|
| + VerifyTablesAndColumns(&raw_db);
|
| + }
|
| +}
|
| +
|
| // Test that various broken schema found in the wild can be opened
|
| // successfully, and result in the correct schema.
|
| TEST_F(ThumbnailDatabaseTest, WildSchema) {
|
|
|