// Copyright 2022 The Chromium Authors. All rights reserved. // 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/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, ToSqliteResultCode_ChromeBugError) { #if DCHECK_IS_ON() EXPECT_DCHECK_DEATH_WITH( ToSqliteResultCode(SQLITE_NOTFOUND), "SQLite reported code that should never show up in Chrome: 12"); #else EXPECT_EQ(SqliteResultCode::kNotFound, ToSqliteResultCode(SQLITE_NOTFOUND)); #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_ChromeBugError) { #if DCHECK_IS_ON() EXPECT_DCHECK_DEATH_WITH( ToSqliteErrorCode(SqliteResultCode::kNotFound), "SQLite reported code that should never show up in Chrome: 12"); #else EXPECT_EQ(SqliteErrorCode::kNotFound, ToSqliteErrorCode(SqliteResultCode::kNotFound)); #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) { #if DCHECK_IS_ON() EXPECT_DCHECK_DEATH_WITH(ToSqliteLoggedResultCode(-65536), "Unsupported SQLite result code: -65536"); #else EXPECT_EQ(SqliteLoggedResultCode::kUnusedChrome, ToSqliteLoggedResultCode(-65536)); #endif } TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_MissingHighValue) { #if DCHECK_IS_ON() EXPECT_DCHECK_DEATH_WITH(ToSqliteLoggedResultCode(65536), "Unsupported SQLite result code: 65536"); #else EXPECT_EQ(SqliteLoggedResultCode::kUnusedChrome, ToSqliteLoggedResultCode(65536)); #endif } 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