1#include <test/nodestore/TestBase.h>
2#include <test/unit_test/SuiteJournal.h>
4#include <xrpl/basics/ByteUtilities.h>
5#include <xrpl/basics/Number.h>
6#include <xrpl/beast/unit_test/suite.h>
7#include <xrpl/beast/utility/Journal.h>
8#include <xrpl/beast/utility/temp_dir.h>
9#include <xrpl/config/BasicConfig.h>
10#include <xrpl/config/Constants.h>
11#include <xrpl/nodestore/DummyScheduler.h>
12#include <xrpl/nodestore/Manager.h>
13#include <xrpl/nodestore/Types.h>
35 if (!blockSize.empty())
52 if (!BEAST_EXPECT(backend))
55 if (!BEAST_EXPECT(backend->getBlockSize() == expectedBlocksize))
60 if (!BEAST_EXPECT(backend->isOpen()))
91 BEAST_EXPECT(logOutput.contains(expectedMessage));
108 bool const hasWarning = logOutput.contains(
"Invalid nudb_block_size");
110 BEAST_EXPECT(hasWarning == !shouldWork);
117 testcase(
"Default block size (no nudb_block_size specified)");
133 for (
auto const& size : validSizes)
168 for (
auto const& size : invalidSizes)
183 for (
auto const& size : whitespaceInvalidSizes)
196 testcase(
"Log message verification");
224 BEAST_EXPECT(logOutput.contains(
"Invalid nudb_block_size: 5000"));
225 BEAST_EXPECT(logOutput.contains(
"Must be power of 2 between 4096 and 32768"));
248 BEAST_EXPECT(logOutput.contains(
"Invalid nudb_block_size value: invalid"));
256 testcase(
"Power of 2 validation logic");
271 for (
auto const& [size, shouldWork] : testCases)
286 BEAST_EXPECT(shouldWork);
291 BEAST_EXPECT(logOutput.contains(
"Invalid nudb_block_size"));
299 testcase(
"Both constructor variants work with custom block size");
311 BEAST_EXPECT(backend1 !=
nullptr);
324 testcase(
"Configuration parsing edge cases");
341 for (
auto const& format : validFormats)
355 bool const hasSuccessMessage = logOutput.contains(
"Using custom NuDB block size");
356 BEAST_EXPECT(hasSuccessMessage);
361 for (
auto const& format : whitespaceFormats)
388 testcase(
"Data persistence with different block sizes");
392 for (
auto const& size : blockSizes)
A generic endpoint for log messages.
RAII temporary directory.
std::string path() const
Get the native path for the temporary directory.
void fail(String const &reason, char const *file, int line)
Record a failure.
TestcaseT testcase
Memberspace for declaring test cases.
Simple NodeStore Scheduler that just performs the tasks synchronously.
virtual std::unique_ptr< Backend > makeBackend(Section const ¶meters, std::size_t burstSize, Scheduler &scheduler, beast::Journal journal)=0
Create a backend.
static Manager & instance()
Returns the instance of the manager singleton.
void testInvalidBlockSizes()
void testValidBlockSizes()
bool testBackendFunctionality(Section const ¶ms, std::size_t expectedBlocksize)
static Section createSection(std::string const &path, std::string const &blockSize="")
void testBothConstructorVariants()
void run() override
Runs the suite.
void testPowerOfTwoValidation(std::string const &size, bool shouldWork)
void testDataPersistence()
void testConfigurationParsing()
void testPowerOfTwoValidation()
void testLogMessage(Section const ¶ms, beast::Severity level, std::string const &expectedMessage)
void testDefaultBlockSize()
static bool areBatchesEqual(Batch const &lhs, Batch const &rhs)
void fetchCopyOfBatch(Backend &backend, Batch *pCopy, Batch const &batch)
static void storeBatch(Backend &backend, Batch const &batch)
static Batch createPredictableBatch(int numObjects, std::uint64_t seed)
Holds a collection of configuration values.
void set(std::string const &key, std::string const &value)
Set a key/value pair.
std::stringstream const & messages() const
Severity
Severity level / threshold of a Journal message.
BEAST_DEFINE_TESTSUITE(Backend, nodestore, xrpl)
std::vector< std::shared_ptr< NodeObject > > Batch
A batch of NodeObjects to write at once.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string to_string(BaseUInt< Bits, Tag > const &a)
constexpr auto megabytes(T value) noexcept
static constexpr auto kType
static constexpr auto kPath
static constexpr auto kNudbBlockSize