Index: sql/test/scoped_error_ignorer.cc |
diff --git a/sql/test/scoped_error_ignorer.cc b/sql/test/scoped_error_ignorer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..80673ff6e62022b7c15062c6ff6c1e144f6a46e6 |
--- /dev/null |
+++ b/sql/test/scoped_error_ignorer.cc |
@@ -0,0 +1,60 @@ |
+// Copyright (c) 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. |
+ |
+#include "sql/test/scoped_error_ignorer.h" |
+ |
+#include "base/bind.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace sql { |
+ |
+ScopedErrorIgnorer::ScopedErrorIgnorer() |
+ : checked_(false) { |
+ callback_ = |
+ base::Bind(&ScopedErrorIgnorer::ShouldIgnore, base::Unretained(this)); |
+ Connection::SetErrorIgnorer(&callback_); |
+} |
+ |
+ScopedErrorIgnorer::~ScopedErrorIgnorer() { |
+ EXPECT_TRUE(checked_) << " Test must call CheckIgnoredErrors()"; |
+ Connection::ResetErrorIgnorer(); |
+} |
+ |
+void ScopedErrorIgnorer::IgnoreError(int err) { |
+ EXPECT_EQ(0u, ignore_errors_.count(err)) |
+ << " Error " << err << " is already ignored"; |
+ ignore_errors_.insert(err); |
+} |
+ |
+bool ScopedErrorIgnorer::CheckIgnoredErrors() { |
+ checked_ = true; |
+ return errors_ignored_ == ignore_errors_; |
+} |
+ |
+bool ScopedErrorIgnorer::ShouldIgnore(int err) { |
+ // Look for extended code. |
+ if (ignore_errors_.count(err) > 0) { |
+ // Record that the error was seen and ignore it. |
+ errors_ignored_.insert(err); |
+ return true; |
+ } |
+ |
+ // Trim extended codes and check again. |
+ int base_err = err & 0xff; |
+ if (ignore_errors_.count(base_err) > 0) { |
+ // Record that the error was seen and ignore it. |
+ errors_ignored_.insert(base_err); |
+ return true; |
+ } |
+ |
+ // Unexpected error. |
+ ADD_FAILURE() << " Unexpected SQLite error " << err; |
+ |
+ // TODO(shess): If it never makes sense to pass through an error |
+ // under the test harness, then perhaps the ignore callback |
+ // signature should be changed. |
+ return true; |
+} |
+ |
+} // namespace sql |