20 #include <ripple/basics/Blob.h>
21 #include <ripple/basics/StringUtilities.h>
22 #include <ripple/beast/unit_test.h>
23 #include <ripple/beast/utility/Journal.h>
24 #include <ripple/shamap/SHAMap.h>
25 #include <test/shamap/common.h>
26 #include <test/unit_test/SuiteJournal.h>
31 #ifndef __INTELLISENSE__
118 for (
int i = 0; i < 32; ++i)
119 vuc.
push_back(
static_cast<unsigned char>(v));
138 testcase(
"add/traverse backed");
140 testcase(
"add/traverse unbacked");
147 "092891fe4ef6cee585fdc6fda0e09eb4d386363158ec3321b8123e5a772c6ca7");
149 "436ccbac3347baa1f1e53baeef1f43334da88f1f6d70d963b833afd6dfa289fe");
151 "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6ca8");
153 "b92891fe4ef6cee585fdc6fda2e09eb4d386363158ec3321b8123e5a772c6ca8");
155 "a92891fe4ef6cee585fdc6fda0e09eb4d386363158ec3321b8123e5a772c6ca7");
173 auto i = sMap.
begin();
175 unexpected(i == e || (*i != i1),
"bad traverse");
177 unexpected(i == e || (*i != i2),
"bad traverse");
179 unexpected(i != e,
"bad traverse");
188 unexpected(i == e || (*i != i1),
"bad traverse");
190 unexpected(i == e || (*i != i3),
"bad traverse");
192 unexpected(i == e || (*i != i4),
"bad traverse");
194 unexpected(i != e,
"bad traverse");
197 testcase(
"snapshot backed");
199 testcase(
"snapshot unbacked");
204 unexpected(sMap.
getHash() != mapHash,
"bad snapshot");
205 unexpected(map2->getHash() != mapHash,
"bad snapshot");
208 BEAST_EXPECT(sMap.
compare(*map2, delta, 100));
209 BEAST_EXPECT(delta.
empty());
211 unexpected(!sMap.
delItem(sMap.
begin()->key()),
"bad mod");
213 unexpected(sMap.
getHash() == mapHash,
"bad snapshot");
214 unexpected(map2->getHash() != mapHash,
"bad snapshot");
216 BEAST_EXPECT(sMap.
compare(*map2, delta, 100));
217 BEAST_EXPECT(delta.
size() == 1);
218 BEAST_EXPECT(delta.
begin()->first == h1);
219 BEAST_EXPECT(delta.
begin()->second.first ==
nullptr);
220 BEAST_EXPECT(delta.
begin()->second.second->key() == h1);
225 testcase(
"build/tear backed");
227 testcase(
"build/tear unbacked");
230 (void)keys[0].parseHex(
231 "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
233 (void)keys[1].parseHex(
234 "b92881fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
236 (void)keys[2].parseHex(
237 "b92691fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
239 (void)keys[3].parseHex(
240 "b92791fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
242 (void)keys[4].parseHex(
243 "b91891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
245 (void)keys[5].parseHex(
246 "b99891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
248 (void)keys[6].parseHex(
249 "f22891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
251 (void)keys[7].parseHex(
252 "292891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
256 (void)hashes[0].parseHex(
257 "B7387CFEA0465759ADC718E8C42B52D2309D179B326E239EB5075C64B6281F"
259 (void)hashes[1].parseHex(
260 "FBC195A9592A54AB44010274163CB6BA95F497EC5BA0A8831845467FB2ECE2"
262 (void)hashes[2].parseHex(
263 "4E7D2684B65DFD48937FFB775E20175C43AF0C94066F7D5679F51AE756795B"
265 (void)hashes[3].parseHex(
266 "7A2F312EB203695FFD164E038E281839EEF06A1B99BFC263F3CECC6C74F93E"
268 (void)hashes[4].parseHex(
269 "395A6691A372387A703FB0F2C6D2C405DAF307D0817F8F0E207596462B0E3A"
271 (void)hashes[5].parseHex(
272 "D044C0A696DE3169CC70AE216A1564D69DE96582865796142CE7D98A84D9DD"
274 (void)hashes[6].parseHex(
275 "76DCC77C4027309B5A91AD164083264D70B77B5E43E08AEDA5EBF943611436"
277 (void)hashes[7].parseHex(
278 "DF4220E93ADC6F5569063A01B4DC79F8DB9553B6A3222ADE23DEA02BBE7230"
285 BEAST_EXPECT(map.
getHash() == beast::zero);
286 for (
int k = 0; k < keys.
size(); ++k)
294 for (
int k = keys.
size() - 1; k >= 0; --k)
297 BEAST_EXPECT(map.
delItem(keys[k]));
300 BEAST_EXPECT(map.
getHash() == beast::zero);
304 testcase(
"iterate backed");
306 testcase(
"iterate unbacked");
310 (void)keys[0].parseHex(
311 "f22891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
313 (void)keys[1].parseHex(
314 "b99891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
316 (void)keys[2].parseHex(
317 "b92891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
319 (void)keys[3].parseHex(
320 "b92881fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
322 (void)keys[4].parseHex(
323 "b92791fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
325 (void)keys[5].parseHex(
326 "b92691fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
328 (void)keys[6].parseHex(
329 "b91891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
331 (void)keys[7].parseHex(
332 "292891fe4ef6cee585fdc6fda1e09eb4d386363158ec3321b8123e5a772c6c"
339 for (
auto const& k : keys)
348 for (
auto const& k : map)
350 BEAST_EXPECT(k.key() == keys[h]);
SHAMapHash getHash() const
bool addItem(SHAMapNodeType type, SHAMapItem &&i)
void run(bool backed, beast::Journal const &journal)
void dump(bool withHashes=false) const
A namespace for easy access to logging severity values.
const_iterator begin() const
BEAST_DEFINE_TESTSUITE(cluster, overlay, ripple)
std::shared_ptr< SHAMap > snapShot(bool isMutable) const
bool operator!=(SHAMapItem const &a, SHAMapItem const &b)
Integers of any length that is a multiple of 32-bits.
uint256 const & key() const
A SHAMap is both a radix tree with a fan-out of 16 and a Merkle tree.
A generic endpoint for log messages.
bool operator==(SHAMapItem const &a, SHAMapItem const &b)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
const_iterator end() const
bool compare(SHAMap const &otherMap, Delta &differences, int maxCount) const
uint256 const & as_uint256() const
bool delItem(uint256 const &id)
static Blob IntToVUC(int v)