// 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/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
