diff options
author | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 04:45:13 +0000 |
---|---|---|
committer | shess@chromium.org <shess@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-17 04:45:13 +0000 |
commit | fed734a145c6defbf1063b3b9a497aee88db720d (patch) | |
tree | 3f8fe3a0e49f57a42c1bb514e4f7c145c6c5195c /sql/connection_unittest.cc | |
parent | 5b7355bcdf73ef995001d0cf8fbf2385012a7a52 (diff) | |
download | chromium_src-fed734a145c6defbf1063b3b9a497aee88db720d.zip chromium_src-fed734a145c6defbf1063b3b9a497aee88db720d.tar.gz chromium_src-fed734a145c6defbf1063b3b9a497aee88db720d.tar.bz2 |
[sql] Retry Open() if error handler fixed things.
Since the caller cannot have existing database-derived state before
the database is opened, Open() can be safely retried after the error
handler has razed the database.
BUG=109482
Review URL: https://chromiumcodereview.appspot.com/18641004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@211936 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sql/connection_unittest.cc')
-rw-r--r-- | sql/connection_unittest.cc | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/sql/connection_unittest.cc b/sql/connection_unittest.cc index fc430ac..8cf32fb 100644 --- a/sql/connection_unittest.cc +++ b/sql/connection_unittest.cc @@ -491,7 +491,8 @@ TEST_F(SQLConnectionTest, RazeNOTADB2) { // Test that a callback from Open() can raze the database. This is // essential for cases where the Open() can fail entirely, so the -// Raze() cannot happen later. +// Raze() cannot happen later. Additionally test that when the +// callback does this during Open(), the open is retried and succeeds. // // Most corruptions seen in the wild seem to happen when two pages in // the database were not written transactionally (the transaction @@ -499,7 +500,7 @@ TEST_F(SQLConnectionTest, RazeNOTADB2) { // A special case of that is when the header indicates that the // database contains more pages than are in the file. This breaks // things at a very basic level, verify that Raze() can handle it. -TEST_F(SQLConnectionTest, RazeOpenCallback) { +TEST_F(SQLConnectionTest, RazeCallbackReopen) { const char* kCreateSql = "CREATE TABLE foo (id INTEGER PRIMARY KEY, value)"; ASSERT_TRUE(db().Execute(kCreateSql)); ASSERT_EQ(1, SqliteMasterCount(&db())); @@ -519,19 +520,27 @@ TEST_F(SQLConnectionTest, RazeOpenCallback) { ASSERT_TRUE(file_util::TruncateFile(file.get())); } + // Open() will succeed, even though the PRAGMA calls within will + // fail with SQLITE_CORRUPT, as will this PRAGMA. + { + sql::ScopedErrorIgnorer ignore_errors; + ignore_errors.IgnoreError(SQLITE_CORRUPT); + ASSERT_TRUE(db().Open(db_path())); + ASSERT_FALSE(db().Execute("PRAGMA auto_vacuum")); + db().Close(); + ASSERT_TRUE(ignore_errors.CheckIgnoredErrors()); + } + db().set_error_callback(base::Bind(&SQLConnectionTest::RazeErrorCallback, base::Unretained(this), SQLITE_CORRUPT)); - // Open() will see SQLITE_CORRUPT due to size mismatch when - // attempting to run a pragma, and the callback will RazeAndClose(). - // Later statements will fail, including the final secure_delete, - // which will fail the Open() itself. - ASSERT_FALSE(db().Open(db_path())); - db().Close(); - - // Now empty, the open should succeed with an empty database. - EXPECT_TRUE(db().Open(db_path())); + // When the PRAGMA calls in Open() raise SQLITE_CORRUPT, the error + // callback will call RazeAndClose(). Open() will then fail and be + // retried. The second Open() on the empty database will succeed + // cleanly. + ASSERT_TRUE(db().Open(db_path())); + ASSERT_TRUE(db().Execute("PRAGMA auto_vacuum")); EXPECT_EQ(0, SqliteMasterCount(&db())); } |