1#include <test/shamap/common.h>
2#include <test/unit_test/SuiteJournal.h>
4#include <xrpl/basics/Blob.h>
5#include <xrpl/basics/SHAMapHash.h>
6#include <xrpl/basics/Slice.h>
7#include <xrpl/basics/base_uint.h>
8#include <xrpl/basics/random.h>
9#include <xrpl/beast/unit_test/suite.h>
10#include <xrpl/beast/utility/Journal.h>
11#include <xrpl/beast/xor_shift_engine.h>
12#include <xrpl/protocol/Serializer.h>
13#include <xrpl/shamap/SHAMap.h>
14#include <xrpl/shamap/SHAMapItem.h>
15#include <xrpl/shamap/SHAMapMissingNode.h>
16#include <xrpl/shamap/SHAMapTreeNode.h>
18#include <boost/smart_ptr/intrusive_ptr.hpp>
35 boost::intrusive_ptr<SHAMapItem>
40 for (
int d = 0; d < 3; ++d)
54 for (
int i = 0; i < count; ++i)
61 log <<
"Unable to add item to map\n";
66 for (
auto const& item : items)
70 log <<
"Unable to remove item from map\n";
75 if (beforeHash != map.
getHash())
94 int const items = 10000;
95 for (
int i = 0; i < items; ++i)
109 source.
visitLeaves([&count](
auto const& item) { ++count; });
110 BEAST_EXPECT(count == items);
113 source.
walkMap(missingNodes, 2048);
114 BEAST_EXPECT(missingNodes.
empty());
136 if (nodesMissing.empty())
142 for (
auto& it : nodesMissing)
148 fail(
"", __FILE__, __LINE__);
155 fail(
"", __FILE__, __LINE__);
164 fail(
"", __FILE__, __LINE__);
bool unexpected(Condition shouldBeFalse, String const &reason)
void fail(String const &reason, char const *file, int line)
Record a failure.
LogOs< char > log
Logging output stream.
Identifies a node inside a SHAMap.
A SHAMap is both a radix tree with a fan-out of 16 and a Merkle tree.
bool addItem(SHAMapNodeType type, boost::intrusive_ptr< SHAMapItem const > item)
std::vector< std::pair< SHAMapNodeID, uint256 > > getMissingNodes(int maxNodes, SHAMapSyncFilter const *filter)
Check for nodes in the SHAMap not available.
void walkMap(std::vector< SHAMapMissingNode > &missingNodes, int maxMissing) const
bool deepCompare(SHAMap &other) const
void visitLeaves(std::function< void(boost::intrusive_ptr< SHAMapItem const > const &)> const &) const
Visit every leaf node in this SHAMap.
SHAMapAddNode addKnownNode(SHAMapNodeID const &nodeID, Slice const &rawNode, SHAMapSyncFilter const *filter)
bool getNodeFat(SHAMapNodeID const &wanted, std::vector< std::pair< SHAMapNodeID, Blob > > &data, bool fatLeaves, std::uint32_t depth) const
SHAMapAddNode addRootNode(SHAMapHash const &hash, Slice const &rootNode, SHAMapSyncFilter const *filter)
SHAMapHash getHash() const
bool delItem(uint256 const &id)
uint256 getSHA512Half() const
Slice slice() const noexcept
bool confuseMap(SHAMap &map, int count)
boost::intrusive_ptr< SHAMapItem > makeRandomAS()
void run() override
Runs the suite.
beast::xor_shift_engine eng
detail::XorShiftEngine<> xor_shift_engine
XOR-shift Generator.
Severity
Severity level / threshold of a Journal message.
BEAST_DEFINE_TESTSUITE(IntrusiveShared, basics, xrpl)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
bool randBool(Engine &engine)
Return a random boolean value.
std::enable_if_t< std::is_integral_v< Integral > &&detail::is_engine< Engine >::value, Integral > randInt(Engine &engine, Integral min, Integral max)
Return a uniformly distributed random integer.
std::enable_if_t< std::is_integral_v< Integral >, Integral > randInt()
boost::intrusive_ptr< SHAMapItem > makeShamapitem(uint256 const &tag, Slice data)
std::enable_if_t< std::is_same_v< T, char >||std::is_same_v< T, unsigned char >, Slice > makeSlice(std::array< T, N > const &a)