| // Copyright 2022 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "sql/sqlite_result_code.h" | |
| #include "base/dcheck_is_on.h" | |
| #include "base/test/gtest_util.h" | |
| #include "base/test/metrics/histogram_tester.h" | |
| #include "sql/sqlite_result_code_values.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| #include "third_party/sqlite/sqlite3.h" | |
| namespace sql { | |
| namespace { | |
| TEST(SqliteResultCodeTest, ToSqliteResultCode_Success) { | |
| EXPECT_EQ(SqliteResultCode::kOk, ToSqliteResultCode(SQLITE_OK)); | |
| EXPECT_EQ(SqliteResultCode::kDone, ToSqliteResultCode(SQLITE_DONE)); | |
| EXPECT_EQ(SqliteResultCode::kRow, ToSqliteResultCode(SQLITE_ROW)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteResultCode_PrimaryErrorCodes) { | |
| EXPECT_EQ(SqliteResultCode::kIo, ToSqliteResultCode(SQLITE_IOERR)); | |
| EXPECT_EQ(SqliteResultCode::kCorrupt, ToSqliteResultCode(SQLITE_CORRUPT)); | |
| EXPECT_EQ(SqliteResultCode::kConstraint, | |
| ToSqliteResultCode(SQLITE_CONSTRAINT)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteResultCode_ExtendedErrorCodes) { | |
| EXPECT_EQ(SqliteResultCode::kIoRead, ToSqliteResultCode(SQLITE_IOERR_READ)); | |
| EXPECT_EQ(SqliteResultCode::kIoWrite, ToSqliteResultCode(SQLITE_IOERR_WRITE)); | |
| EXPECT_EQ(SqliteResultCode::kCorruptIndex, | |
| ToSqliteResultCode(SQLITE_CORRUPT_INDEX)); | |
| EXPECT_EQ(SqliteResultCode::kConstraintUnique, | |
| ToSqliteResultCode(SQLITE_CONSTRAINT_UNIQUE)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteResultCode_MissingLowValue) { | |
| EXPECT_DCHECK_DEATH_WITH(ToSqliteResultCode(-65536), | |
| "Unsupported SQLite result code: -65536"); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteResultCode_MissingHighValue) { | |
| EXPECT_DCHECK_DEATH_WITH(ToSqliteResultCode(65536), | |
| "Unsupported SQLite result code: 65536"); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteResultCode_SqliteInternalError) { | |
| #if DCHECK_IS_ON() | |
| EXPECT_DCHECK_DEATH_WITH(ToSqliteResultCode(SQLITE_INTERNAL), | |
| "SQLite reported code marked for internal use: 2"); | |
| #else | |
| EXPECT_EQ(SqliteResultCode::kInternal, ToSqliteResultCode(SQLITE_INTERNAL)); | |
| #endif | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success_Ok) { | |
| EXPECT_DCHECK_DEATH_WITH( | |
| ToSqliteErrorCode(SqliteResultCode::kOk), | |
| "ToSqliteErrorCode called with non-error result code: 0"); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success_Done) { | |
| EXPECT_DCHECK_DEATH_WITH( | |
| ToSqliteErrorCode(SqliteResultCode::kDone), | |
| "ToSqliteErrorCode called with non-error result code: 101"); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success_Row) { | |
| EXPECT_DCHECK_DEATH_WITH( | |
| ToSqliteErrorCode(SqliteResultCode::kRow), | |
| "ToSqliteErrorCode called with non-error result code: 100"); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteErrorCode_PrimaryErrorCodes) { | |
| EXPECT_EQ(SqliteErrorCode::kIo, ToSqliteErrorCode(SqliteResultCode::kIo)); | |
| EXPECT_EQ(SqliteErrorCode::kCorrupt, | |
| ToSqliteErrorCode(SqliteResultCode::kCorrupt)); | |
| EXPECT_EQ(SqliteErrorCode::kConstraint, | |
| ToSqliteErrorCode(SqliteResultCode::kConstraint)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteErrorCode_ExtendedErrorCodes) { | |
| EXPECT_EQ(SqliteErrorCode::kIoRead, | |
| ToSqliteErrorCode(SqliteResultCode::kIoRead)); | |
| EXPECT_EQ(SqliteErrorCode::kIoWrite, | |
| ToSqliteErrorCode(SqliteResultCode::kIoWrite)); | |
| EXPECT_EQ(SqliteErrorCode::kCorruptIndex, | |
| ToSqliteErrorCode(SqliteResultCode::kCorruptIndex)); | |
| EXPECT_EQ(SqliteErrorCode::kConstraintUnique, | |
| ToSqliteErrorCode(SqliteResultCode::kConstraintUnique)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteErrorCode_SqliteInternalError) { | |
| #if DCHECK_IS_ON() | |
| EXPECT_DCHECK_DEATH_WITH(ToSqliteErrorCode(SqliteResultCode::kInternal), | |
| "SQLite reported code marked for internal use: 2"); | |
| #else | |
| EXPECT_EQ(SqliteErrorCode::kInternal, | |
| ToSqliteErrorCode(SqliteResultCode::kInternal)); | |
| #endif | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success) { | |
| EXPECT_TRUE(IsSqliteSuccessCode(SqliteResultCode::kOk)); | |
| EXPECT_TRUE(IsSqliteSuccessCode(SqliteResultCode::kDone)); | |
| EXPECT_TRUE(IsSqliteSuccessCode(SqliteResultCode::kRow)); | |
| } | |
| TEST(SqliteResultCodeTest, IsSqliteSuccessCode_PrimaryErrorCodes) { | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kIo)); | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kCorrupt)); | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kConstraint)); | |
| } | |
| TEST(SqliteResultCodeTest, IsSqliteSuccessCode_ExtendedErrorCodes) { | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kIoRead)); | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kIoWrite)); | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kCorruptIndex)); | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kConstraintUnique)); | |
| } | |
| TEST(SqliteResultCodeTest, IsSqliteSuccessCode_SqliteInternalError) { | |
| #if DCHECK_IS_ON() | |
| EXPECT_DCHECK_DEATH_WITH(IsSqliteSuccessCode(SqliteResultCode::kInternal), | |
| "SQLite reported code marked for internal use: 2"); | |
| #else | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kInternal)); | |
| #endif | |
| } | |
| TEST(SqliteResultCodeTest, IsSqliteSuccessCode_ChromeBugError) { | |
| #if DCHECK_IS_ON() | |
| EXPECT_DCHECK_DEATH_WITH( | |
| IsSqliteSuccessCode(SqliteResultCode::kNotFound), | |
| "SQLite reported code that should never show up in Chrome: 12"); | |
| #else | |
| EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kNotFound)); | |
| #endif | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_Success) { | |
| EXPECT_EQ(SqliteLoggedResultCode::kNoError, | |
| ToSqliteLoggedResultCode(SQLITE_OK)); | |
| EXPECT_EQ(SqliteLoggedResultCode::kNoError, | |
| ToSqliteLoggedResultCode(SQLITE_DONE)); | |
| EXPECT_EQ(SqliteLoggedResultCode::kNoError, | |
| ToSqliteLoggedResultCode(SQLITE_ROW)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_PrimaryErrorCodes) { | |
| EXPECT_EQ(SqliteLoggedResultCode::kIo, | |
| ToSqliteLoggedResultCode(SQLITE_IOERR)); | |
| EXPECT_EQ(SqliteLoggedResultCode::kCorrupt, | |
| ToSqliteLoggedResultCode(SQLITE_CORRUPT)); | |
| EXPECT_EQ(SqliteLoggedResultCode::kConstraint, | |
| ToSqliteLoggedResultCode(SQLITE_CONSTRAINT)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_ExtendedErrorCodes) { | |
| EXPECT_EQ(SqliteLoggedResultCode::kIoRead, | |
| ToSqliteLoggedResultCode(SQLITE_IOERR_READ)); | |
| EXPECT_EQ(SqliteLoggedResultCode::kIoWrite, | |
| ToSqliteLoggedResultCode(SQLITE_IOERR_WRITE)); | |
| EXPECT_EQ(SqliteLoggedResultCode::kCorruptIndex, | |
| ToSqliteLoggedResultCode(SQLITE_CORRUPT_INDEX)); | |
| EXPECT_EQ(SqliteLoggedResultCode::kConstraintUnique, | |
| ToSqliteLoggedResultCode(SQLITE_CONSTRAINT_UNIQUE)); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_MissingLowValue) { | |
| EXPECT_CHECK_DEATH_WITH(ToSqliteLoggedResultCode(-65536), | |
| "Unsupported SQLite result code: -65536"); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_MissingHighValue) { | |
| EXPECT_CHECK_DEATH_WITH(ToSqliteLoggedResultCode(65536), | |
| "Unsupported SQLite result code: 65536"); | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_SqliteInternalError) { | |
| #if DCHECK_IS_ON() | |
| EXPECT_DCHECK_DEATH_WITH(ToSqliteLoggedResultCode(SQLITE_INTERNAL), | |
| "SQLite reported code marked for internal use: 2"); | |
| #else | |
| EXPECT_EQ(SqliteLoggedResultCode::kUnusedSqlite, | |
| ToSqliteLoggedResultCode(SQLITE_INTERNAL)); | |
| #endif | |
| } | |
| TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_ChromeBugError) { | |
| #if DCHECK_IS_ON() | |
| EXPECT_DCHECK_DEATH_WITH( | |
| ToSqliteLoggedResultCode(SQLITE_NOTFOUND), | |
| "SQLite reported code that should never show up in Chrome: 12"); | |
| #else | |
| EXPECT_EQ(SqliteLoggedResultCode::kUnusedChrome, | |
| ToSqliteLoggedResultCode(SQLITE_NOTFOUND)); | |
| #endif | |
| } | |
| TEST(SqliteResultCodeTest, UmaHistogramSqliteResult_Success) { | |
| base::HistogramTester histogram_tester; | |
| UmaHistogramSqliteResult("Sql.ResultTest", SQLITE_OK); | |
| histogram_tester.ExpectTotalCount("Sql.ResultTest", 1); | |
| histogram_tester.ExpectBucketCount("Sql.ResultTest", | |
| SqliteLoggedResultCode::kNoError, 1); | |
| } | |
| TEST(SqliteResultCodeTest, UmaHistogramSqliteResult_PrimaryErrorCode) { | |
| base::HistogramTester histogram_tester; | |
| UmaHistogramSqliteResult("Sql.ResultTest", SQLITE_CORRUPT); | |
| histogram_tester.ExpectTotalCount("Sql.ResultTest", 1); | |
| histogram_tester.ExpectBucketCount("Sql.ResultTest", | |
| SqliteLoggedResultCode::kCorrupt, 1); | |
| } | |
| TEST(SqliteResultCodeTest, UmaHistogramSqliteResult_ExtendedErrorCode) { | |
| base::HistogramTester histogram_tester; | |
| UmaHistogramSqliteResult("Sql.ResultTest", SQLITE_CORRUPT_INDEX); | |
| histogram_tester.ExpectTotalCount("Sql.ResultTest", 1); | |
| histogram_tester.ExpectBucketCount("Sql.ResultTest", | |
| SqliteLoggedResultCode::kCorruptIndex, 1); | |
| } | |
| TEST(SqliteResultCodeTest, CheckMapping) { | |
| CheckSqliteLoggedResultCodeForTesting(); | |
| } | |
| } // namespace | |
| } // namespace sql |