blob: 0eeaf45c828ac53b5605d75b7925479ad5f2f738 [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.
#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(), records |err| and returns
// |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_