Index: trunk/src/chrome/browser/history/thumbnail_database_unittest.cc |
=================================================================== |
--- trunk/src/chrome/browser/history/thumbnail_database_unittest.cc (revision 235594) |
+++ trunk/src/chrome/browser/history/thumbnail_database_unittest.cc (working copy) |
@@ -790,7 +790,12 @@ |
{ |
sql::Connection raw_db; |
EXPECT_TRUE(raw_db.Open(file_name_)); |
- ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db)); |
+ { |
+ sql::Statement statement( |
+ raw_db.GetUniqueStatement("PRAGMA integrity_check")); |
+ EXPECT_TRUE(statement.Step()); |
+ ASSERT_EQ("ok", statement.ColumnString(0)); |
+ } |
const char kIndexName[] = "icon_mapping_page_url_idx"; |
const int idx_root_page = GetRootPage(&raw_db, kIndexName); |
@@ -813,7 +818,10 @@ |
{ |
sql::Connection raw_db; |
EXPECT_TRUE(raw_db.Open(file_name_)); |
- ASSERT_NE("ok", sql::test::IntegrityCheck(&raw_db)); |
+ sql::Statement statement( |
+ raw_db.GetUniqueStatement("PRAGMA integrity_check")); |
+ EXPECT_TRUE(statement.Step()); |
+ ASSERT_NE("ok", statement.ColumnString(0)); |
} |
// Open the database and access the corrupt index. |
@@ -836,7 +844,10 @@ |
{ |
sql::Connection raw_db; |
EXPECT_TRUE(raw_db.Open(file_name_)); |
- ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db)); |
+ sql::Statement statement( |
+ raw_db.GetUniqueStatement("PRAGMA integrity_check")); |
+ EXPECT_TRUE(statement.Step()); |
+ EXPECT_EQ("ok", statement.ColumnString(0)); |
// Check that the expected tables exist. |
VerifyTablesAndColumns(&raw_db); |
@@ -856,8 +867,21 @@ |
kIconUrl1, kLargeSize, sizeof(kBlob1), kBlob1)); |
} |
- // Corrupt the database again by adjusting the header. |
- EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_)); |
+ // 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())); |
+ } |
// Database is unusable at the SQLite level. |
{ |
@@ -894,10 +918,23 @@ |
// (which would upgrade it). |
EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "Favicons.v6.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-6 recovery will occur. |
- EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_)); |
+ // 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())); |
+ } |
// Database is unusable at the SQLite level. |
{ |
@@ -933,64 +970,16 @@ |
{ |
sql::Connection raw_db; |
EXPECT_TRUE(raw_db.Open(file_name_)); |
- ASSERT_EQ("ok", sql::test::IntegrityCheck(&raw_db)); |
+ sql::Statement statement( |
+ raw_db.GetUniqueStatement("PRAGMA integrity_check")); |
+ EXPECT_TRUE(statement.Step()); |
+ EXPECT_EQ("ok", statement.ColumnString(0)); |
// 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) { |