| Index: sql/connection_unittest.cc
|
| diff --git a/sql/connection_unittest.cc b/sql/connection_unittest.cc
|
| index d933a6dab6e6d7cb9a3aca7c88a5d6e26f17daba..7e9d41ea5c7dbe114985d944aa7961a3c85eb3a5 100644
|
| --- a/sql/connection_unittest.cc
|
| +++ b/sql/connection_unittest.cc
|
| @@ -136,7 +136,6 @@ class ScopedCommitHook {
|
| };
|
|
|
| } // namespace test
|
| -} // namespace sql
|
|
|
| namespace {
|
|
|
| @@ -210,6 +209,29 @@ class ScopedUmaskSetter {
|
| };
|
| #endif
|
|
|
| +// SQLite function to adjust mock time by |argv[0]| milliseconds.
|
| +void sqlite_adjust_millis(sql::test::ScopedMockTimeSource* time_mock,
|
| + sqlite3_context* context,
|
| + int argc, sqlite3_value** argv) {
|
| + int64 milliseconds = argc > 0 ? sqlite3_value_int64(argv[0]) : 1000;
|
| + time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds));
|
| + sqlite3_result_int64(context, milliseconds);
|
| +}
|
| +
|
| +// Adjust mock time by |milliseconds| on commit.
|
| +int adjust_commit_hook(sql::test::ScopedMockTimeSource* time_mock,
|
| + int64 milliseconds) {
|
| + time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds));
|
| + return SQLITE_OK;
|
| +}
|
| +
|
| +const char kCommitTime[] = "Sqlite.CommitTime.Test";
|
| +const char kAutoCommitTime[] = "Sqlite.AutoCommitTime.Test";
|
| +const char kUpdateTime[] = "Sqlite.UpdateTime.Test";
|
| +const char kQueryTime[] = "Sqlite.QueryTime.Test";
|
| +
|
| +} // namespace
|
| +
|
| class SQLConnectionTest : public sql::SQLTestBase {
|
| public:
|
| void SetUp() override {
|
| @@ -1147,27 +1169,6 @@ TEST_F(SQLConnectionTest, EventsStatement) {
|
| }
|
| }
|
|
|
| -// SQLite function to adjust mock time by |argv[0]| milliseconds.
|
| -void sqlite_adjust_millis(sql::test::ScopedMockTimeSource* time_mock,
|
| - sqlite3_context* context,
|
| - int argc, sqlite3_value** argv) {
|
| - int64 milliseconds = argc > 0 ? sqlite3_value_int64(argv[0]) : 1000;
|
| - time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds));
|
| - sqlite3_result_int64(context, milliseconds);
|
| -}
|
| -
|
| -// Adjust mock time by |milliseconds| on commit.
|
| -int adjust_commit_hook(sql::test::ScopedMockTimeSource* time_mock,
|
| - int64 milliseconds) {
|
| - time_mock->adjust(base::TimeDelta::FromMilliseconds(milliseconds));
|
| - return SQLITE_OK;
|
| -}
|
| -
|
| -const char kCommitTime[] = "Sqlite.CommitTime.Test";
|
| -const char kAutoCommitTime[] = "Sqlite.AutoCommitTime.Test";
|
| -const char kUpdateTime[] = "Sqlite.UpdateTime.Test";
|
| -const char kQueryTime[] = "Sqlite.QueryTime.Test";
|
| -
|
| // Read-only query allocates time to QueryTime, but not others.
|
| TEST_F(SQLConnectionTest, TimeQuery) {
|
| // Re-open with histogram tag. Use an in-memory database to minimize variance
|
| @@ -1387,4 +1388,77 @@ TEST_F(SQLConnectionTest, OnMemoryDump) {
|
| EXPECT_GE(pmd.allocator_dumps().size(), 1u);
|
| }
|
|
|
| -} // namespace
|
| +// Test that the functions to collect diagnostic data run to completion, without
|
| +// worrying too much about what they generate (since that will change).
|
| +TEST_F(SQLConnectionTest, CollectDiagnosticInfo) {
|
| + // NOTE(shess): Mojo doesn't support everything CollectCorruptionInfo() uses,
|
| + // but it's not really clear if adding support would be useful.
|
| +#if !defined(MOJO_APPTEST_IMPL)
|
| + const std::string corruption_info = db().CollectCorruptionInfo();
|
| + EXPECT_NE(std::string::npos, corruption_info.find("SQLITE_CORRUPT"));
|
| + EXPECT_NE(std::string::npos, corruption_info.find("integrity_check"));
|
| +#endif
|
| +
|
| + // A statement to see in the results.
|
| + const char* kSimpleSql = "SELECT 'mountain'";
|
| + Statement s(db().GetCachedStatement(SQL_FROM_HERE, kSimpleSql));
|
| +
|
| + // Error includes the statement.
|
| + const std::string readonly_info = db().CollectErrorInfo(SQLITE_READONLY, &s);
|
| + EXPECT_NE(std::string::npos, readonly_info.find(kSimpleSql));
|
| +
|
| + // Some other error doesn't include the statment.
|
| + // TODO(shess): This is weak.
|
| + const std::string full_info = db().CollectErrorInfo(SQLITE_FULL, NULL);
|
| + EXPECT_EQ(std::string::npos, full_info.find(kSimpleSql));
|
| +
|
| + // A table to see in the SQLITE_ERROR results.
|
| + EXPECT_TRUE(db().Execute("CREATE TABLE volcano (x)"));
|
| +
|
| + // Version info to see in the SQLITE_ERROR results.
|
| + sql::MetaTable meta_table;
|
| + ASSERT_TRUE(meta_table.Init(&db(), 4, 4));
|
| +
|
| + const std::string error_info = db().CollectErrorInfo(SQLITE_ERROR, &s);
|
| + EXPECT_NE(std::string::npos, error_info.find(kSimpleSql));
|
| + EXPECT_NE(std::string::npos, error_info.find("volcano"));
|
| + EXPECT_NE(std::string::npos, error_info.find("version: 4"));
|
| +}
|
| +
|
| +#if !defined(MOJO_APPTEST_IMPL)
|
| +TEST_F(SQLConnectionTest, RegisterIntentToUpload) {
|
| + base::FilePath breadcrumb_path(
|
| + db_path().DirName().Append(FILE_PATH_LITERAL("sqlite-diag")));
|
| +
|
| + // No stale diagnostic store.
|
| + ASSERT_TRUE(!base::PathExists(breadcrumb_path));
|
| +
|
| + // The histogram tag is required to enable diagnostic features.
|
| + EXPECT_FALSE(db().RegisterIntentToUpload());
|
| + EXPECT_TRUE(!base::PathExists(breadcrumb_path));
|
| +
|
| + db().Close();
|
| + db().set_histogram_tag("Test");
|
| + ASSERT_TRUE(db().Open(db_path()));
|
| +
|
| + // Should signal upload only once.
|
| + EXPECT_TRUE(db().RegisterIntentToUpload());
|
| + EXPECT_TRUE(base::PathExists(breadcrumb_path));
|
| + EXPECT_FALSE(db().RegisterIntentToUpload());
|
| +
|
| + // Changing the histogram tag should allow new upload to succeed.
|
| + db().Close();
|
| + db().set_histogram_tag("NewTest");
|
| + ASSERT_TRUE(db().Open(db_path()));
|
| + EXPECT_TRUE(db().RegisterIntentToUpload());
|
| + EXPECT_FALSE(db().RegisterIntentToUpload());
|
| +
|
| + // Old tag is still prevented.
|
| + db().Close();
|
| + db().set_histogram_tag("Test");
|
| + ASSERT_TRUE(db().Open(db_path()));
|
| + EXPECT_FALSE(db().RegisterIntentToUpload());
|
| +}
|
| +#endif // !defined(MOJO_APPTEST_IMPL)
|
| +
|
| +} // namespace sql
|
|
|