Index: sql/test/scoped_error_expecter.h |
diff --git a/sql/test/scoped_error_expecter.h b/sql/test/scoped_error_expecter.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7d11adfe09b50f60d2be8702fa7c50c2f2cb471d |
--- /dev/null |
+++ b/sql/test/scoped_error_expecter.h |
@@ -0,0 +1,76 @@ |
+// Copyright 2013 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. |
+ |
+#ifndef SQL_TEST_SCOPED_ERROR_EXPECTER_H_ |
+#define SQL_TEST_SCOPED_ERROR_EXPECTER_H_ |
+ |
+#include <set> |
+ |
+#include "base/macros.h" |
+#include "sql/connection.h" |
+ |
+// This is not strictly necessary for the operation of ScopedErrorExpecter, but |
+// the class is not useful without the SQLite error codes. |
+#include "third_party/sqlite/sqlite3.h" |
+ |
+namespace sql { |
+namespace test { |
+ |
+// sql::Connection and sql::Statement treat most SQLite errors as fatal in debug |
+// mode. The goal is to catch SQL errors before code is shipped to production. |
+// That fatal check makes it hard to write tests for error-handling code. This |
+// scoper lists errors to expect and treat as non-fatal. Errors are expected |
+// globally (on all connections). |
+// |
+// Since errors can be very context-dependent, the class is pedantic - specific |
+// errors must be expected, and every expected error must be seen. |
+// |
+// NOTE(shess): There are still fatal error cases this does not address. If |
+// your test is handling database errors and you're hitting a case not handled, |
+// contact me. |
+class ScopedErrorExpecter { |
+ public: |
+ ScopedErrorExpecter(); |
+ ~ScopedErrorExpecter(); |
+ |
+ // Add an error to expect. Extended error codes can be specified |
+ // individually, or the base code can be specified to expect errors for the |
+ // entire group (SQLITE_IOERR_* versus SQLITE_IOERR). |
+ void ExpectError(int err); |
+ |
+ // Return |true| if the all of the expected errors were encountered. Failure |
+ // to call this results in an EXPECT failure when the instance is destructed. |
+ bool SawExpectedErrors() WARN_UNUSED_RESULT; |
+ |
+ // Expose sqlite3_libversion_number() so that clients don't have to add a |
+ // dependency on third_party/sqlite. |
+ static int SQLiteLibVersionNumber() WARN_UNUSED_RESULT; |
+ |
+ private: |
+ // The target of the callback passed to Connection::SetErrorExpecter(). If |
+ // |err| matches an error passed to ExpectError(), returns |err| and returns |
Mark P
2016/06/21 04:34:11
nit: returns -> records ?
Scott Hess - ex-Googler
2016/06/21 05:55:13
Doh!
|
+ // |true|; this indicates that the enclosing test expected this error and the |
+ // caller should continue as it would in production. Otherwise returns |
+ // |false| and adds a failure to the current test. |
+ bool ErrorSeen(int err); |
+ |
+ // Callback passed to Connection::SetErrorExpecter(). |
+ Connection::ErrorExpecterCallback callback_; |
+ |
+ // Record whether SawExpectedErrors() has been called. |
+ bool checked_; |
+ |
+ // Errors to expect. |
+ std::set<int> errors_expected_; |
+ |
+ // Expected errors which have been encountered. |
+ std::set<int> errors_seen_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ScopedErrorExpecter); |
+}; |
+ |
+} // namespace test |
+} // namespace sql |
+ |
+#endif // SQL_TEST_SCOPED_ERROR_EXPECTER_H_ |