diff options
author | cpu@chromium.org <cpu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-30 23:46:17 +0000 |
---|---|---|
committer | cpu@chromium.org <cpu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-30 23:46:17 +0000 |
commit | e444c95bb327f0addaa066df4356268cf84bfb46 (patch) | |
tree | 8c07d97afc99f8c9f961b23e5dce6ce38672768e /chrome/browser/diagnostics | |
parent | c5804aa16e82c47165652c1f3e6b570a4125b12e (diff) | |
download | chromium_src-e444c95bb327f0addaa066df4356268cf84bfb46.zip chromium_src-e444c95bb327f0addaa066df4356268cf84bfb46.tar.gz chromium_src-e444c95bb327f0addaa066df4356268cf84bfb46.tar.bz2 |
Implement db corruption tests for diagnostic mode
- Uses sqlite's pragma integrity_check
- Tests the 5 main databases
BUG=27885
TEST=none
Review URL: http://codereview.chromium.org/1548005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@43143 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/diagnostics')
-rw-r--r-- | chrome/browser/diagnostics/diagnostics_model.cc | 16 | ||||
-rw-r--r-- | chrome/browser/diagnostics/sqlite_diagnostics.cc | 96 | ||||
-rw-r--r-- | chrome/browser/diagnostics/sqlite_diagnostics.h | 15 |
3 files changed, 123 insertions, 4 deletions
diff --git a/chrome/browser/diagnostics/diagnostics_model.cc b/chrome/browser/diagnostics/diagnostics_model.cc index 0fb53fc..b7a1bc3 100644 --- a/chrome/browser/diagnostics/diagnostics_model.cc +++ b/chrome/browser/diagnostics/diagnostics_model.cc @@ -14,6 +14,7 @@ #include "base/path_service.h" #include "chrome/browser/diagnostics/diagnostics_test.h" #include "chrome/browser/diagnostics/recon_diagnostics.h" +#include "chrome/browser/diagnostics/sqlite_diagnostics.h" #include "chrome/common/chrome_paths.h" namespace { @@ -86,6 +87,11 @@ class DiagnosticsModelWin : public DiagnosticsModelImpl { tests_.push_back(MakeDictonaryDirTest()); tests_.push_back(MakeInspectorDirTest()); tests_.push_back(MakeDiskSpaceTest()); + tests_.push_back(MakeSqliteWebDbTest()); + tests_.push_back(MakeSqliteCookiesDbTest()); + tests_.push_back(MakeSqliteHistoryDbTest()); + tests_.push_back(MakeSqliteArchivedHistoryDbTest()); + tests_.push_back(MakeSqliteThumbnailsDbTest()); } private: @@ -102,6 +108,11 @@ class DiagnosticsModelMac : public DiagnosticsModelImpl { tests_.push_back(MakeDictonaryDirTest()); tests_.push_back(MakeInspectorDirTest()); tests_.push_back(MakeDiskSpaceTest()); + tests_.push_back(MakeSqliteWebDbTest()); + tests_.push_back(MakeSqliteCookiesDbTest()); + tests_.push_back(MakeSqliteHistoryDbTest()); + tests_.push_back(MakeSqliteArchivedHistoryDbTest()); + tests_.push_back(MakeSqliteThumbnailsDbTest()); } private: @@ -118,6 +129,11 @@ class DiagnosticsModelPosix : public DiagnosticsModelImpl { tests_.push_back(MakeDictonaryDirTest()); tests_.push_back(MakeInspectorDirTest()); tests_.push_back(MakeDiskSpaceTest()); + tests_.push_back(MakeSqliteWebDbTest()); + tests_.push_back(MakeSqliteCookiesDbTest()); + tests_.push_back(MakeSqliteHistoryDbTest()); + tests_.push_back(MakeSqliteArchivedHistoryDbTest()); + tests_.push_back(MakeSqliteThumbnailsDbTest()); } private: diff --git a/chrome/browser/diagnostics/sqlite_diagnostics.cc b/chrome/browser/diagnostics/sqlite_diagnostics.cc index fbefc33..e0eeab3 100644 --- a/chrome/browser/diagnostics/sqlite_diagnostics.cc +++ b/chrome/browser/diagnostics/sqlite_diagnostics.cc @@ -5,9 +5,16 @@ #include "chrome/browser/diagnostics/sqlite_diagnostics.h" #include "app/sql/connection.h" +#include "app/sql/init_status.h" +#include "app/sql/statement.h" +#include "base/file_util.h" #include "base/histogram.h" #include "base/logging.h" +#include "base/path_service.h" #include "base/singleton.h" +#include "base/string_util.h" +#include "chrome/common/chrome_constants.h" +#include "chrome/common/chrome_paths.h" namespace { @@ -47,6 +54,74 @@ class BasicSqliteErrrorHandler : public sql::ErrorDelegate { } }; +struct DbTestInfo { + const char* test_name; + const FilePath::CharType* db_name; +}; + +static const DbTestInfo kTestInfo[] = { + {"Web Database", chrome::kWebDataFilename}, + {"Cookies Database", chrome::kCookieFilename}, + {"History Database", chrome::kHistoryFilename}, + {"Archived history Database", chrome::kArchivedHistoryFilename}, + {"Thumbnails Database", chrome::kThumbnailsFilename} +}; + +// Generic diagnostic test class for checking sqlite db integrity. +class SqliteIntegrityTest : public DiagnosticTest { + public: + explicit SqliteIntegrityTest(int index) + : DiagnosticTest(ASCIIToUTF16(kTestInfo[index].test_name)), + index_(index) { + } + + virtual int GetId() { return 0; } + + virtual bool ExecuteImpl(DiagnosticsModel::Observer* observer) { + FilePath path; + PathService::Get(chrome::DIR_USER_DATA, &path); + path = path.Append(FilePath::FromWStringHack(chrome::kNotSignedInProfile)); + path = path.Append(kTestInfo[index_].db_name); + if (!file_util::PathExists(path)) { + RecordFailure(ASCIIToUTF16("File not found")); + return true; + } + + int errors = 0; + { // This block scopes the lifetime of the db objects. + sql::Connection db; + db.set_exclusive_locking(); + if (!db.Open(path)) { + RecordFailure(ASCIIToUTF16("Cannot open db. Possibly corrupted")); + return true; + } + sql::Statement s(db.GetUniqueStatement("PRAGMA integrity_check;")); + if (!s) { + RecordFailure(ASCIIToUTF16("Statement failed")); + return false; + } + while (s.Step()) { + std::string result(s.ColumnString(0)); + if ("ok" != result) + ++errors; + } + } + // All done. Report to the user. + if (errors != 0) { + string16 str(ASCIIToUTF16("Database corruption detected :")); + str += IntToString16(errors) + ASCIIToUTF16(" errors"); + RecordFailure(str); + return true; + } + RecordSuccess(ASCIIToUTF16("no corruption detected")); + return true; + } + + private: + int index_; + DISALLOW_COPY_AND_ASSIGN(SqliteIntegrityTest); +}; + } // namespace sql::ErrorDelegate* GetErrorHandlerForCookieDb() { @@ -68,3 +143,24 @@ sql::ErrorDelegate* GetErrorHandlerForTextDb() { sql::ErrorDelegate* GetErrorHandlerForWebDb() { return new BasicSqliteErrrorHandler<4>(); } + +DiagnosticTest* MakeSqliteWebDbTest() { + return new SqliteIntegrityTest(0); +} + +DiagnosticTest* MakeSqliteCookiesDbTest() { + return new SqliteIntegrityTest(1); +} + +DiagnosticTest* MakeSqliteHistoryDbTest() { + return new SqliteIntegrityTest(2); +} + +DiagnosticTest* MakeSqliteArchivedHistoryDbTest() { + return new SqliteIntegrityTest(3); +} + +DiagnosticTest* MakeSqliteThumbnailsDbTest() { + return new SqliteIntegrityTest(4); +} + diff --git a/chrome/browser/diagnostics/sqlite_diagnostics.h b/chrome/browser/diagnostics/sqlite_diagnostics.h index ee1a7f1..1618a07 100644 --- a/chrome/browser/diagnostics/sqlite_diagnostics.h +++ b/chrome/browser/diagnostics/sqlite_diagnostics.h @@ -5,18 +5,25 @@ #ifndef CHROME_BROWSER_DIAGNOSTICS_SQLITE_DIAGNOSTICS_H_ #define CHROME_BROWSER_DIAGNOSTICS_SQLITE_DIAGNOSTICS_H_ +#include "chrome/browser/diagnostics/diagnostics_test.h" + namespace sql { class ErrorDelegate; } +// The following five factories create the error handlers that we use when +// issuing sqlite commands during normal browser operation. sql::ErrorDelegate* GetErrorHandlerForCookieDb(); - sql::ErrorDelegate* GetErrorHandlerForHistoryDb(); - sql::ErrorDelegate* GetErrorHandlerForThumbnailDb(); - sql::ErrorDelegate* GetErrorHandlerForTextDb(); - sql::ErrorDelegate* GetErrorHandlerForWebDb(); +// Factories for the db integrity tests we run in diagnostic mode. +DiagnosticTest* MakeSqliteWebDbTest(); +DiagnosticTest* MakeSqliteCookiesDbTest(); +DiagnosticTest* MakeSqliteHistoryDbTest(); +DiagnosticTest* MakeSqliteArchivedHistoryDbTest(); +DiagnosticTest* MakeSqliteThumbnailsDbTest(); + #endif // CHROME_BROWSER_DIAGNOSTICS_SQLITE_DIAGNOSTICS_H_ |