blob: 7e07cf126d2caef4bb3e93fb66dec55e0ce37a64 [file] [log] [blame]
// 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.
#include "sql/test/scoped_error_ignorer.h"
#include "base/bind.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace sql {
// static
int ScopedErrorIgnorer::SQLiteLibVersionNumber() {
return sqlite3_libversion_number();
}
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