xrpld
Loading...
Searching...
No Matches
TestBase.h
1#pragma once
2
3#include <xrpl/basics/Blob.h>
4#include <xrpl/basics/base_uint.h>
5#include <xrpl/basics/random.h>
6#include <xrpl/beast/utility/rngfill.h>
7#include <xrpl/beast/xor_shift_engine.h>
8#include <xrpl/nodestore/Backend.h>
9#include <xrpl/nodestore/Database.h>
10#include <xrpl/nodestore/NodeObject.h>
11#include <xrpl/nodestore/Types.h>
12
13#include <gtest/gtest.h>
14
15#include <algorithm>
16#include <cstddef>
17#include <cstdint>
18#include <memory>
19#include <string>
20#include <utility>
21
22namespace xrpl::node_store {
23
26constexpr int kNumObjectsToTest = 2000;
27constexpr int kNumObjects = 2000;
29
31{
32 bool
34 const noexcept
35 {
36 return lhs->getHash() < rhs->getHash();
37 }
38};
39
40[[nodiscard]] inline bool
42{
43 return (lhs->getType() == rhs->getType()) && (lhs->getHash() == rhs->getHash()) &&
44 (lhs->getData() == rhs->getData());
45}
46
47[[nodiscard]] inline Batch
49{
50 Batch batch;
51 batch.reserve(numObjects);
52
54
55 for (auto i = 0uz; i < numObjects; ++i)
56 {
57 NodeObjectType const type = [&] {
58 switch (randInt(rng, 3))
59 {
60 case 0:
62 case 1:
64 case 2:
66 case 3:
67 default:
69 }
70 }();
71
72 uint256 hash;
73 beast::rngfill(hash.begin(), hash.size(), rng);
74
76 beast::rngfill(blob.data(), blob.size(), rng);
77
78 batch.emplace_back(NodeObject::createObject(type, std::move(blob), hash));
79 }
80
81 return batch;
82}
83
84inline void
85storeBatch(Backend& backend, Batch const& batch)
86{
87 for (auto const& obj : batch)
88 backend.store(obj);
89}
90
91[[nodiscard]] inline Batch
92fetchCopyOfBatch(Backend& backend, Batch const& batch)
93{
94 Batch copy;
95 copy.reserve(batch.size());
96
97 for (auto i = 0uz; i < batch.size(); ++i)
98 {
99 SCOPED_TRACE("fetchCopyOfBatch index=" + std::to_string(i));
101 Status const status = backend.fetch(batch[i]->getHash(), &object);
102 EXPECT_EQ(status, Status::Ok);
103 if (status == Status::Ok)
104 {
105 EXPECT_NE(object, nullptr);
106 copy.emplace_back(object);
107 }
108 }
109 return copy;
110}
111
112inline void
113fetchMissing(Backend& backend, Batch const& batch)
114{
115 for (auto i = 0uz; i < batch.size(); ++i)
116 {
117 SCOPED_TRACE("fetchMissing index=" + std::to_string(i));
119 Status const status = backend.fetch(batch[i]->getHash(), &object);
120 EXPECT_EQ(status, Status::NotFound);
121 }
122}
123
124inline void
125storeBatch(Database& db, Batch const& batch)
126{
127 for (auto const& obj : batch)
128 {
129 Blob data(obj->getData());
130 db.store(obj->getType(), std::move(data), obj->getHash(), db.earliestLedgerSeq());
131 }
132}
133
134[[nodiscard]] inline Batch
136{
137 Batch copy;
138 copy.reserve(batch.size());
139
140 for (auto const& obj : batch)
141 {
142 std::shared_ptr<NodeObject> const result = db.fetchNodeObject(obj->getHash(), 0);
143 if (result != nullptr)
144 copy.emplace_back(result);
145 }
146 return copy;
147}
148
149inline void
150fetchMissing(Database& db, Batch const& batch)
151{
152 for (auto i = 0uz; i < batch.size(); ++i)
153 {
154 SCOPED_TRACE("fetchMissing(Database) index=" + std::to_string(i));
155 EXPECT_EQ(db.fetchNodeObject(batch[i]->getHash(), 0), nullptr);
156 }
157}
158
159} // namespace xrpl::node_store
160
161namespace xrpl {
162
163[[nodiscard]] inline bool
165{
166 return std::ranges::equal(lhs, rhs, node_store::isSame);
167}
168
169} // namespace xrpl
iterator begin()
Definition base_uint.h:128
static constexpr std::size_t size()
Definition base_uint.h:548
static std::shared_ptr< NodeObject > createObject(NodeObjectType type, Blob &&data, uint256 const &hash)
Create an object from fields.
A backend used for the NodeStore.
Definition Backend.h:29
virtual void store(std::shared_ptr< NodeObject > const &object)=0
Store a single object.
virtual Status fetch(uint256 const &hash, std::shared_ptr< NodeObject > *pObject)=0
Fetch a single object.
Persistency layer for NodeObject.
Definition Database.h:45
std::uint32_t earliestLedgerSeq() const noexcept
Definition Database.h:222
virtual void store(NodeObjectType type, Blob &&data, uint256 const &hash, std::uint32_t ledgerSeq)=0
Store the object.
std::shared_ptr< NodeObject > fetchNodeObject(uint256 const &hash, std::uint32_t ledgerSeq=0, FetchType fetchType=FetchType::Synchronous, bool duplicate=false)
Fetch a node object.
T data(T... args)
T emplace_back(T... args)
T equal(T... args)
detail::XorShiftEngine<> xor_shift_engine
XOR-shift Generator.
void rngfill(void *const buffer, std::size_t const bytes, Generator &g)
Definition rngfill.h:11
constexpr std::size_t kMinPayloadBytes
Definition TestBase.h:24
constexpr std::uint64_t kSeedValue
Definition TestBase.h:28
constexpr std::size_t kMaxPayloadBytes
Definition TestBase.h:25
bool isSame(std::shared_ptr< NodeObject > const &lhs, std::shared_ptr< NodeObject > const &rhs)
Definition TestBase.h:41
std::vector< std::shared_ptr< NodeObject > > Batch
A batch of NodeObjects to write at once.
Batch createPredictableBatch(std::size_t numObjects, std::uint64_t seed)
Definition TestBase.h:48
constexpr int kNumObjects
Definition TestBase.h:27
void storeBatch(Backend &backend, Batch const &batch)
Definition TestBase.h:85
Status
Return codes from Backend operations.
constexpr int kNumObjectsToTest
Definition TestBase.h:26
void fetchMissing(Backend &backend, Batch const &batch)
Definition TestBase.h:113
Batch fetchCopyOfBatch(Backend &backend, Batch const &batch)
Definition TestBase.h:92
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
constexpr bool operator==(BaseUInt< Bits, Tag > const &lhs, BaseUInt< Bits, Tag > const &rhs)
Definition base_uint.h:606
NodeObjectType
The types of node objects.
Definition NodeObject.h:18
std::vector< unsigned char > Blob
Storage for linear binary data.
Definition Blob.h:11
BaseUInt< 256 > uint256
Definition base_uint.h:580
T reserve(T... args)
T size(T... args)
bool operator()(std::shared_ptr< NodeObject > const &lhs, std::shared_ptr< NodeObject > const &rhs) const noexcept
Definition TestBase.h:33
T to_string(T... args)