5#include <boost/test/unit_test.hpp>
25inline std::ostream&
operator<<(std::ostream& os,
const std::pair<const SerializeData, SerializeData>& kv)
27 std::span key{kv.first}, value{kv.second};
28 os <<
"(\"" << std::string_view{
reinterpret_cast<const char*
>(key.data()), key.size()} <<
"\", \""
29 << std::string_view{
reinterpret_cast<const char*
>(value.data()), value.size()} <<
"\")";
35inline std::span<const std::byte>
StringBytes(std::string_view str)
37 return std::as_bytes(std::span{str});
58 BOOST_CHECK_EQUAL_COLLECTIONS(actual.begin(), actual.end(), expected.begin(), expected.end());
65 std::vector<std::unique_ptr<WalletDatabase>> dbs;
79 std::vector<std::string> prefixes = {
"",
"FIRST",
"SECOND",
"P\xfe\xff",
"P\xff\x01",
"\xff\xff"};
81 std::unique_ptr<DatabaseBatch>
handler =
Assert(database)->MakeBatch();
83 for (
unsigned int i = 0; i < 10; i++) {
84 for (
const auto&
prefix : prefixes) {
90 for (
const auto&
prefix : prefixes) {
93 std::unique_ptr<DatabaseCursor> cursor =
handler->GetNewPrefixCursor(s_prefix);
96 for (
int i = 0; i < 10; i++) {
100 std::string key_back;
102 key >> key_back >> i_back;
105 unsigned int value_back;
124 const MockableData::value_type
133 std::unique_ptr<DatabaseBatch> batch = database->MakeBatch();
136 for (
const auto& [
k, v] : {e, p, ps, f, fs, ff, ffs}) {
137 batch->Write(std::span{
k}, std::span{v});
156 std::unique_ptr<DatabaseBatch> batch = database->MakeBatch();
157 std::string key =
"key";
158 std::string value =
"value";
159 std::string value2 =
"value_2";
166 std::string read_value;
176 const std::string key =
"key";
177 const std::string key2 =
"key2";
178 const std::string value =
"value";
179 const std::string value2 =
"value_2";
180 auto make_key = [](std::string type, std::string id) {
return std::make_pair(type,
id); };
187 std::unique_ptr<DatabaseBatch> batch = database->MakeBatch();
191 BOOST_CHECK(batch->Write(make_key(key, value), value));
192 BOOST_CHECK(batch->Write(make_key(key, value2), value2));
193 BOOST_CHECK(batch->Write(make_key(key2, value), value));
194 BOOST_CHECK(batch->Write(make_key(value, key), value));
202 BOOST_CHECK(!batch->Exists(make_key(key, value2)));
232 std::unique_ptr<SQLiteDatabase> database =
MakeSQLiteDatabase(m_path_root /
"sqlite", options, status, error);
234 std::string key =
"key";
235 std::string value =
"value";
237 std::unique_ptr<SQLiteBatch> batch = std::make_unique<SQLiteBatch>(*database);
242 batch->SetExecHandler(std::make_unique<DbExecBlocker>(std::set<std::string>{
"ROLLBACK TRANSACTION"}));
251 std::string key2 =
"key2";
252 std::unique_ptr<SQLiteBatch> batch2 = std::make_unique<SQLiteBatch>(*database);
260 std::string key =
"key";
261 std::string value =
"value";
262 std::string value2 =
"value_2";
267 const auto& database =
MakeSQLiteDatabase(m_path_root /
"sqlite", options, status, error);
269 std::unique_ptr<DatabaseBatch>
handler =
Assert(database)->MakeBatch();
278 std::unique_ptr<DatabaseBatch> handler2 =
Assert(database)->MakeBatch();
289 std::string read_value;
#define Assert(val)
Identity function.
Double ended buffer combining vector and stream-like interfaces.
const_iterator begin() const
const_iterator end() const
A class representing a BerkeleyDB file from which we can only read records.
RAII class that provides access to a WalletDatabase.
virtual std::unique_ptr< DatabaseCursor > GetNewPrefixCursor(std::span< const std::byte > prefix)=0
SQliteExecHandler m_base_exec
DbExecBlocker(std::set< std::string > blocked_statements)
int Exec(SQLiteDatabase &database, const std::string &statement) override
std::set< std::string > m_blocked_statements
An instance of this class represents one SQLite3 database.
Class responsible for executing SQL statements in SQLite databases.
virtual int Exec(SQLiteDatabase &database, const std::string &statement)
An instance of this class represents one database.
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
std::ostream & operator<<(std::ostream &os, const std::pair< const SerializeData, SerializeData > &kv)
static SerializeData StringData(std::string_view str)
std::unique_ptr< SQLiteDatabase > MakeSQLiteDatabase(const fs::path &path, const DatabaseOptions &options, DatabaseStatus &status, bilingual_str &error)
std::unique_ptr< WalletDatabase > CreateMockableWalletDatabase(MockableData records)
BOOST_AUTO_TEST_CASE(bnb_test)
static std::vector< std::unique_ptr< WalletDatabase > > TestDatabases(const fs::path &path_root)
static void CheckPrefix(DatabaseBatch &batch, std::span< const std::byte > prefix, MockableData expected)
std::span< const std::byte > StringBytes(std::string_view str)
std::map< SerializeData, SerializeData, std::less<> > MockableData
constexpr int TEST_SQLITE_ERROR
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
bool(* handler)(const std::any &context, HTTPRequest *req, const std::string &strReq)
std::vector< std::byte, zero_after_free_allocator< std::byte > > SerializeData
Byte-vector that clears its contents before deletion.