sqlite_result_code_unittest.cc 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "sql/sqlite_result_code.h"
  5. #include "base/test/gtest_util.h"
  6. #include "base/test/metrics/histogram_tester.h"
  7. #include "sql/sqlite_result_code_values.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. #include "third_party/sqlite/sqlite3.h"
  10. namespace sql {
  11. namespace {
  12. TEST(SqliteResultCodeTest, ToSqliteResultCode_Success) {
  13. EXPECT_EQ(SqliteResultCode::kOk, ToSqliteResultCode(SQLITE_OK));
  14. EXPECT_EQ(SqliteResultCode::kDone, ToSqliteResultCode(SQLITE_DONE));
  15. EXPECT_EQ(SqliteResultCode::kRow, ToSqliteResultCode(SQLITE_ROW));
  16. }
  17. TEST(SqliteResultCodeTest, ToSqliteResultCode_PrimaryErrorCodes) {
  18. EXPECT_EQ(SqliteResultCode::kIo, ToSqliteResultCode(SQLITE_IOERR));
  19. EXPECT_EQ(SqliteResultCode::kCorrupt, ToSqliteResultCode(SQLITE_CORRUPT));
  20. EXPECT_EQ(SqliteResultCode::kConstraint,
  21. ToSqliteResultCode(SQLITE_CONSTRAINT));
  22. }
  23. TEST(SqliteResultCodeTest, ToSqliteResultCode_ExtendedErrorCodes) {
  24. EXPECT_EQ(SqliteResultCode::kIoRead, ToSqliteResultCode(SQLITE_IOERR_READ));
  25. EXPECT_EQ(SqliteResultCode::kIoWrite, ToSqliteResultCode(SQLITE_IOERR_WRITE));
  26. EXPECT_EQ(SqliteResultCode::kCorruptIndex,
  27. ToSqliteResultCode(SQLITE_CORRUPT_INDEX));
  28. EXPECT_EQ(SqliteResultCode::kConstraintUnique,
  29. ToSqliteResultCode(SQLITE_CONSTRAINT_UNIQUE));
  30. }
  31. TEST(SqliteResultCodeTest, ToSqliteResultCode_MissingLowValue) {
  32. EXPECT_DCHECK_DEATH_WITH(ToSqliteResultCode(-65536),
  33. "Unsupported SQLite result code: -65536");
  34. }
  35. TEST(SqliteResultCodeTest, ToSqliteResultCode_MissingHighValue) {
  36. EXPECT_DCHECK_DEATH_WITH(ToSqliteResultCode(65536),
  37. "Unsupported SQLite result code: 65536");
  38. }
  39. TEST(SqliteResultCodeTest, ToSqliteResultCode_SqliteInternalError) {
  40. #if DCHECK_IS_ON()
  41. EXPECT_DCHECK_DEATH_WITH(ToSqliteResultCode(SQLITE_INTERNAL),
  42. "SQLite reported code marked for internal use: 2");
  43. #else
  44. EXPECT_EQ(SqliteResultCode::kInternal, ToSqliteResultCode(SQLITE_INTERNAL));
  45. #endif
  46. }
  47. TEST(SqliteResultCodeTest, ToSqliteResultCode_ChromeBugError) {
  48. #if DCHECK_IS_ON()
  49. EXPECT_DCHECK_DEATH_WITH(
  50. ToSqliteResultCode(SQLITE_NOTFOUND),
  51. "SQLite reported code that should never show up in Chrome: 12");
  52. #else
  53. EXPECT_EQ(SqliteResultCode::kNotFound, ToSqliteResultCode(SQLITE_NOTFOUND));
  54. #endif
  55. }
  56. TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success_Ok) {
  57. EXPECT_DCHECK_DEATH_WITH(
  58. ToSqliteErrorCode(SqliteResultCode::kOk),
  59. "ToSqliteErrorCode called with non-error result code: 0");
  60. }
  61. TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success_Done) {
  62. EXPECT_DCHECK_DEATH_WITH(
  63. ToSqliteErrorCode(SqliteResultCode::kDone),
  64. "ToSqliteErrorCode called with non-error result code: 101");
  65. }
  66. TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success_Row) {
  67. EXPECT_DCHECK_DEATH_WITH(
  68. ToSqliteErrorCode(SqliteResultCode::kRow),
  69. "ToSqliteErrorCode called with non-error result code: 100");
  70. }
  71. TEST(SqliteResultCodeTest, ToSqliteErrorCode_PrimaryErrorCodes) {
  72. EXPECT_EQ(SqliteErrorCode::kIo, ToSqliteErrorCode(SqliteResultCode::kIo));
  73. EXPECT_EQ(SqliteErrorCode::kCorrupt,
  74. ToSqliteErrorCode(SqliteResultCode::kCorrupt));
  75. EXPECT_EQ(SqliteErrorCode::kConstraint,
  76. ToSqliteErrorCode(SqliteResultCode::kConstraint));
  77. }
  78. TEST(SqliteResultCodeTest, ToSqliteErrorCode_ExtendedErrorCodes) {
  79. EXPECT_EQ(SqliteErrorCode::kIoRead,
  80. ToSqliteErrorCode(SqliteResultCode::kIoRead));
  81. EXPECT_EQ(SqliteErrorCode::kIoWrite,
  82. ToSqliteErrorCode(SqliteResultCode::kIoWrite));
  83. EXPECT_EQ(SqliteErrorCode::kCorruptIndex,
  84. ToSqliteErrorCode(SqliteResultCode::kCorruptIndex));
  85. EXPECT_EQ(SqliteErrorCode::kConstraintUnique,
  86. ToSqliteErrorCode(SqliteResultCode::kConstraintUnique));
  87. }
  88. TEST(SqliteResultCodeTest, ToSqliteErrorCode_SqliteInternalError) {
  89. #if DCHECK_IS_ON()
  90. EXPECT_DCHECK_DEATH_WITH(ToSqliteErrorCode(SqliteResultCode::kInternal),
  91. "SQLite reported code marked for internal use: 2");
  92. #else
  93. EXPECT_EQ(SqliteErrorCode::kInternal,
  94. ToSqliteErrorCode(SqliteResultCode::kInternal));
  95. #endif
  96. }
  97. TEST(SqliteResultCodeTest, ToSqliteErrorCode_ChromeBugError) {
  98. #if DCHECK_IS_ON()
  99. EXPECT_DCHECK_DEATH_WITH(
  100. ToSqliteErrorCode(SqliteResultCode::kNotFound),
  101. "SQLite reported code that should never show up in Chrome: 12");
  102. #else
  103. EXPECT_EQ(SqliteErrorCode::kNotFound,
  104. ToSqliteErrorCode(SqliteResultCode::kNotFound));
  105. #endif
  106. }
  107. TEST(SqliteResultCodeTest, ToSqliteErrorCode_Success) {
  108. EXPECT_TRUE(IsSqliteSuccessCode(SqliteResultCode::kOk));
  109. EXPECT_TRUE(IsSqliteSuccessCode(SqliteResultCode::kDone));
  110. EXPECT_TRUE(IsSqliteSuccessCode(SqliteResultCode::kRow));
  111. }
  112. TEST(SqliteResultCodeTest, IsSqliteSuccessCode_PrimaryErrorCodes) {
  113. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kIo));
  114. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kCorrupt));
  115. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kConstraint));
  116. }
  117. TEST(SqliteResultCodeTest, IsSqliteSuccessCode_ExtendedErrorCodes) {
  118. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kIoRead));
  119. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kIoWrite));
  120. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kCorruptIndex));
  121. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kConstraintUnique));
  122. }
  123. TEST(SqliteResultCodeTest, IsSqliteSuccessCode_SqliteInternalError) {
  124. #if DCHECK_IS_ON()
  125. EXPECT_DCHECK_DEATH_WITH(IsSqliteSuccessCode(SqliteResultCode::kInternal),
  126. "SQLite reported code marked for internal use: 2");
  127. #else
  128. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kInternal));
  129. #endif
  130. }
  131. TEST(SqliteResultCodeTest, IsSqliteSuccessCode_ChromeBugError) {
  132. #if DCHECK_IS_ON()
  133. EXPECT_DCHECK_DEATH_WITH(
  134. IsSqliteSuccessCode(SqliteResultCode::kNotFound),
  135. "SQLite reported code that should never show up in Chrome: 12");
  136. #else
  137. EXPECT_FALSE(IsSqliteSuccessCode(SqliteResultCode::kNotFound));
  138. #endif
  139. }
  140. TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_Success) {
  141. EXPECT_EQ(SqliteLoggedResultCode::kNoError,
  142. ToSqliteLoggedResultCode(SQLITE_OK));
  143. EXPECT_EQ(SqliteLoggedResultCode::kNoError,
  144. ToSqliteLoggedResultCode(SQLITE_DONE));
  145. EXPECT_EQ(SqliteLoggedResultCode::kNoError,
  146. ToSqliteLoggedResultCode(SQLITE_ROW));
  147. }
  148. TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_PrimaryErrorCodes) {
  149. EXPECT_EQ(SqliteLoggedResultCode::kIo,
  150. ToSqliteLoggedResultCode(SQLITE_IOERR));
  151. EXPECT_EQ(SqliteLoggedResultCode::kCorrupt,
  152. ToSqliteLoggedResultCode(SQLITE_CORRUPT));
  153. EXPECT_EQ(SqliteLoggedResultCode::kConstraint,
  154. ToSqliteLoggedResultCode(SQLITE_CONSTRAINT));
  155. }
  156. TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_ExtendedErrorCodes) {
  157. EXPECT_EQ(SqliteLoggedResultCode::kIoRead,
  158. ToSqliteLoggedResultCode(SQLITE_IOERR_READ));
  159. EXPECT_EQ(SqliteLoggedResultCode::kIoWrite,
  160. ToSqliteLoggedResultCode(SQLITE_IOERR_WRITE));
  161. EXPECT_EQ(SqliteLoggedResultCode::kCorruptIndex,
  162. ToSqliteLoggedResultCode(SQLITE_CORRUPT_INDEX));
  163. EXPECT_EQ(SqliteLoggedResultCode::kConstraintUnique,
  164. ToSqliteLoggedResultCode(SQLITE_CONSTRAINT_UNIQUE));
  165. }
  166. TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_MissingLowValue) {
  167. #if DCHECK_IS_ON()
  168. EXPECT_DCHECK_DEATH_WITH(ToSqliteLoggedResultCode(-65536),
  169. "Unsupported SQLite result code: -65536");
  170. #else
  171. EXPECT_EQ(SqliteLoggedResultCode::kUnusedChrome,
  172. ToSqliteLoggedResultCode(-65536));
  173. #endif
  174. }
  175. TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_MissingHighValue) {
  176. #if DCHECK_IS_ON()
  177. EXPECT_DCHECK_DEATH_WITH(ToSqliteLoggedResultCode(65536),
  178. "Unsupported SQLite result code: 65536");
  179. #else
  180. EXPECT_EQ(SqliteLoggedResultCode::kUnusedChrome,
  181. ToSqliteLoggedResultCode(65536));
  182. #endif
  183. }
  184. TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_SqliteInternalError) {
  185. #if DCHECK_IS_ON()
  186. EXPECT_DCHECK_DEATH_WITH(ToSqliteLoggedResultCode(SQLITE_INTERNAL),
  187. "SQLite reported code marked for internal use: 2");
  188. #else
  189. EXPECT_EQ(SqliteLoggedResultCode::kUnusedSqlite,
  190. ToSqliteLoggedResultCode(SQLITE_INTERNAL));
  191. #endif
  192. }
  193. TEST(SqliteResultCodeTest, ToSqliteLoggedResultCode_ChromeBugError) {
  194. #if DCHECK_IS_ON()
  195. EXPECT_DCHECK_DEATH_WITH(
  196. ToSqliteLoggedResultCode(SQLITE_NOTFOUND),
  197. "SQLite reported code that should never show up in Chrome: 12");
  198. #else
  199. EXPECT_EQ(SqliteLoggedResultCode::kUnusedChrome,
  200. ToSqliteLoggedResultCode(SQLITE_NOTFOUND));
  201. #endif
  202. }
  203. TEST(SqliteResultCodeTest, UmaHistogramSqliteResult_Success) {
  204. base::HistogramTester histogram_tester;
  205. UmaHistogramSqliteResult("Sql.ResultTest", SQLITE_OK);
  206. histogram_tester.ExpectTotalCount("Sql.ResultTest", 1);
  207. histogram_tester.ExpectBucketCount("Sql.ResultTest",
  208. SqliteLoggedResultCode::kNoError, 1);
  209. }
  210. TEST(SqliteResultCodeTest, UmaHistogramSqliteResult_PrimaryErrorCode) {
  211. base::HistogramTester histogram_tester;
  212. UmaHistogramSqliteResult("Sql.ResultTest", SQLITE_CORRUPT);
  213. histogram_tester.ExpectTotalCount("Sql.ResultTest", 1);
  214. histogram_tester.ExpectBucketCount("Sql.ResultTest",
  215. SqliteLoggedResultCode::kCorrupt, 1);
  216. }
  217. TEST(SqliteResultCodeTest, UmaHistogramSqliteResult_ExtendedErrorCode) {
  218. base::HistogramTester histogram_tester;
  219. UmaHistogramSqliteResult("Sql.ResultTest", SQLITE_CORRUPT_INDEX);
  220. histogram_tester.ExpectTotalCount("Sql.ResultTest", 1);
  221. histogram_tester.ExpectBucketCount("Sql.ResultTest",
  222. SqliteLoggedResultCode::kCorruptIndex, 1);
  223. }
  224. TEST(SqliteResultCodeTest, CheckMapping) {
  225. CheckSqliteLoggedResultCodeForTesting();
  226. }
  227. } // namespace
  228. } // namespace sql