1#include <test/shamap/common.h>
2#include <test/unit_test/SuiteJournal.h>
4#include <xrpl/basics/Blob.h>
5#include <xrpl/basics/Buffer.h>
6#include <xrpl/beast/unit_test.h>
7#include <xrpl/beast/utility/Journal.h>
8#include <xrpl/shamap/SHAMap.h>
13#ifndef __INTELLISENSE__
124 constexpr uint256 h1(
"092891fe4ef6cee585fdc6fda0e09eb4d386363158ec3321b8123e5a772c6ca7");
125 constexpr uint256 h2(
"436ccbac3347baa1f1e53baeef1f43334da88f1f6d70d963b833afd6dfa289fe");
126 constexpr uint256 h3(
"b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6ca8");
127 constexpr uint256 h4(
"b92891fe4ef6cee585fdc6fda2e09eb4d386363158ec3321b8123e5a772c6ca8");
128 constexpr uint256 h5(
"a92891fe4ef6cee585fdc6fda0e09eb4d386363158ec3321b8123e5a772c6ca7");
146 auto i = sMap.
begin();
148 unexpected(i == e || (*i != *i1),
"bad traverse");
150 unexpected(i == e || (*i != *i2),
"bad traverse");
161 unexpected(i == e || (*i != *i1),
"bad traverse");
163 unexpected(i == e || (*i != *i3),
"bad traverse");
165 unexpected(i == e || (*i != *i4),
"bad traverse");
182 unexpected(map2->getHash() != mapHash,
"bad snapshot");
185 BEAST_EXPECT(sMap.
compare(*map2, delta, 100));
186 BEAST_EXPECT(delta.
empty());
191 unexpected(map2->getHash() != mapHash,
"bad snapshot");
193 BEAST_EXPECT(sMap.
compare(*map2, delta, 100));
194 BEAST_EXPECT(delta.
size() == 1);
195 BEAST_EXPECT(delta.
begin()->first == h1);
196 BEAST_EXPECT(delta.
begin()->second.first ==
nullptr);
197 BEAST_EXPECT(delta.
begin()->second.second->key() == h1);
212 "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
215 "b92881fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
218 "b92691fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
221 "b92791fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
224 "b91891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
227 "b99891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
230 "f22891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
233 "292891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
238 "B7387CFEA0465759ADC718E8C42B52D2309D179B326E239EB5075C"
241 "FBC195A9592A54AB44010274163CB6BA95F497EC5BA0A883184546"
244 "4E7D2684B65DFD48937FFB775E20175C43AF0C94066F7D5679F51A"
247 "7A2F312EB203695FFD164E038E281839EEF06A1B99BFC263F3CECC"
250 "395A6691A372387A703FB0F2C6D2C405DAF307D0817F8F0E207596"
253 "D044C0A696DE3169CC70AE216A1564D69DE96582865796142CE7D9"
256 "76DCC77C4027309B5A91AD164083264D70B77B5E43E08AEDA5EBF9"
259 "DF4220E93ADC6F5569063A01B4DC79F8DB9553B6A3222ADE23DEA0"
266 BEAST_EXPECT(map.
getHash() == beast::zero);
267 for (
int k = 0; k < keys.size(); ++k)
274 for (
int k = keys.size() - 1; k >= 0; --k)
277 BEAST_EXPECT(map.
delItem(keys[k]));
280 BEAST_EXPECT(map.
getHash() == beast::zero);
295 "f22891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
298 "b99891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
301 "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
304 "b92881fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
307 "b92791fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
310 "b92691fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
313 "b91891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
316 "292891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e"
323 for (
auto const& k : keys)
330 for (
auto const& k : map)
332 BEAST_EXPECT(k.key() == keys[h]);
354 for (
unsigned char c = 1; c < 100; ++c)
361 auto root = map.getHash().as_uint256();
362 auto path = map.getProofPath(k);
366 BEAST_EXPECT(map.verifyProofPath(
root, k, *path));
370 path->insert(path->begin(), path->front());
371 BEAST_EXPECT(!map.verifyProofPath(
root, k, *path));
374 BEAST_EXPECT(!map.getProofPath(wrongKey));
380 goodPath = std::move(*path);
385 BEAST_EXPECT(map.verifyProofPath(rootHash, key, goodPath));
388 BEAST_EXPECT(!map.verifyProofPath(rootHash, key, badPath));
392 BEAST_EXPECT(!map.verifyProofPath(rootHash, key, badPath));
396 BEAST_EXPECT(!map.verifyProofPath(rootHash, key, badPath));
400 badPath.
front().back()--;
401 BEAST_EXPECT(!map.verifyProofPath(rootHash, key, badPath));
406 BEAST_EXPECT(!map.verifyProofPath(rootHash, key, badPath));
411BEAST_DEFINE_TESTSUITE(SHAMapPathProof, shamap,
xrpl);
A generic endpoint for log messages.
bool unexpected(Condition shouldBeFalse, String const &reason)
testcase_t testcase
Memberspace for declaring test cases.
Like std::vector<char> but better.
std::size_t size() const noexcept
Returns the number of bytes in the buffer.
std::uint8_t const * data() const noexcept
Return a pointer to beginning of the storage.
uint256 const & as_uint256() const
uint256 const & key() const
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)
const_iterator end() const
const_iterator begin() const
void dump(bool withHashes=false) const
bool compare(SHAMap const &otherMap, Delta &differences, int maxCount) const
std::shared_ptr< SHAMap > snapShot(bool isMutable) const
SHAMapHash getHash() const
bool delItem(uint256 const &id)
An immutable linear range of bytes.
static constexpr std::size_t size()
void run() override
Runs the suite.
static Buffer IntToVUC(int v)
void run() override
Runs the suite.
void run(bool backed, beast::Journal const &journal)
T emplace_back(T... args)
A namespace for easy access to logging severity values.
bool operator==(SHAMapItem const &a, SHAMapItem const &b)
bool operator!=(SHAMapItem const &a, SHAMapItem const &b)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
boost::intrusive_ptr< SHAMapItem > make_shamapitem(uint256 const &tag, Slice data)
Number root(Number f, unsigned d)