blob: 85c7264262f01e984668ee53199b208d5c0ed251 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SQL_TEST_DRIVE_ERROR_TEST_VFS_H_
#define SQL_TEST_DRIVE_ERROR_TEST_VFS_H_
#include <vector>
#include "sql/sqlite_result_code.h"
#include "sql/test/test_vfs.h"
#include "third_party/sqlite/sqlite3.h"
namespace sql::test {
// An SQLite VFS that can simulate drive errors.
class DriveErrorTestVfs : public TestVfs {
public:
DriveErrorTestVfs();
~DriveErrorTestVfs() override;
int Open(sqlite3_vfs* vfs,
const char* full_path,
sqlite3_file* result_file,
int requested_flags,
int* granted_flags) override;
int Delete(sqlite3_vfs* vfs, const char* full_path, int sync_dir) override;
int Access(sqlite3_vfs* vfs,
const char* full_path,
int flags,
int* result) override;
int Close(sqlite3_file* file) override;
int Read(sqlite3_file* file,
void* buffer,
int size,
sqlite3_int64 offset) override;
int Write(sqlite3_file* file,
const void* buffer,
int size,
sqlite3_int64 offset) override;
int Truncate(sqlite3_file* file, sqlite3_int64 size) override;
int Sync(sqlite3_file* file, int flags) override;
int FileSize(sqlite3_file* file, sqlite3_int64* result_size) override;
int Lock(sqlite3_file* file, int mode) override;
int Unlock(sqlite3_file* file, int mode) override;
int CheckReservedLock(sqlite3_file* file, int* has_reserved_lock) override;
int FileControl(sqlite3_file* file, int opcode, void* data) override;
int ShmMap(sqlite3_file* file,
int page_index,
int page_size,
int extend_file_if_needed,
void volatile** result) override;
int ShmLock(sqlite3_file* file, int offset, int size, int flags) override;
int Fetch(sqlite3_file* file,
sqlite3_int64 offset,
int size,
void** result) override;
void set_drive_unusable(bool unusable) { drive_unusable_ = unusable; }
void set_drive_full(bool drive_full) { drive_full_ = drive_full; }
// Returns a vector of the errors produced by this `DriveErrorTestVfs`, in the
// order they were produced. Duplicate errors are preserved, allowing the
// callers to count the number of time each errors occurred. Does not include
// errors produced by the underlying VFS.
const std::vector<SqliteErrorCode>& errors_produced() const {
return errors_produced_;
}
private:
bool drive_unusable_ = false;
bool drive_full_ = false;
std::vector<SqliteErrorCode> errors_produced_;
};
} // namespace sql::test
#endif // SQL_TEST_DRIVE_ERROR_TEST_VFS_H_