1#include <xrpl/nodestore/detail/codec.h>
3#include <xrpl/nodestore/NodeObject.h>
4#include <xrpl/protocol/HashPrefix.h>
6#include <gtest/gtest.h>
7#include <nudb/detail/buffer.hpp>
8#include <nudb/detail/stream.hpp>
29 using namespace nudb::detail;
34 for (
auto slot = 0uz; slot < nonEmptySlots; ++slot)
36 for (
auto byte = 0uz;
byte < kHashSize; ++byte)
38 std::size_t const offset = (slot * kHashSize) +
byte;
39 hashes[offset] =
static_cast<std::uint8_t>((offset % 255) + 1);
44 ostream os(blob.data(), blob.size());
63TEST(Codec, inner_node_full_roundtrip)
67 auto const blob = makeInnerNode(kHashCount);
69 nudb::detail::buffer compressBuf;
72 EXPECT_EQ(codecType(compressed), kTypeInnerNodeFull);
73 EXPECT_EQ(compressed.second,
sizeVarint(kTypeInnerNodeFull) + (kHashCount * kHashSize));
75 nudb::detail::buffer decompressBuf;
78 EXPECT_EQ(restored.second, blob.size());
79 EXPECT_EQ(
std::memcmp(restored.first, blob.data(), blob.size()), 0);
83TEST(Codec, inner_node_compressed_roundtrip)
85 static constexpr std::uint8_t kTypeInnerNodeCompressed = 2;
87 auto const blob = makeInnerNode(kNonEmpty);
89 nudb::detail::buffer compressBuf;
92 EXPECT_EQ(codecType(compressed), kTypeInnerNodeCompressed);
96 EXPECT_LT(compressed.second, blob.size());
98 nudb::detail::buffer decompressBuf;
101 EXPECT_EQ(restored.second, blob.size());
102 EXPECT_EQ(
std::memcmp(restored.first, blob.data(), blob.size()), 0);
106TEST(Codec, lz4_roundtrip)
110 static constexpr std::size_t kNonInnerNodeSize = 1000;
111 static constexpr std::size_t kBytePatternPeriod = 7;
115 for (
auto i = 0uz; i < blob.size(); ++i)
116 blob[i] =
static_cast<std::uint8_t>(i % kBytePatternPeriod);
118 nudb::detail::buffer compressBuf;
121 EXPECT_EQ(codecType(compressed), kTypeLz4);
123 nudb::detail::buffer decompressBuf;
126 EXPECT_EQ(restored.second, blob.size());
127 EXPECT_EQ(
std::memcmp(restored.first, blob.data(), blob.size()), 0);
132TEST(Codec, uncompressed_passthrough)
135 static constexpr auto payload = std::to_array<std::uint8_t>({0xde, 0xad, 0xbe, 0xef, 0x2a});
139 blob.insert(blob.end(), payload.begin(), payload.end());
141 nudb::detail::buffer decompressBuf;
144 EXPECT_EQ(restored.second, payload.size());
145 EXPECT_EQ(
std::memcmp(restored.first, payload.data(), payload.size()), 0);
std::pair< void const *, std::size_t > nodeobjectCompress(void const *in, std::size_t inSize, BufferFactory &&bf)
std::size_t sizeVarint(T v)
void write(nudb::detail::ostream &os, std::size_t t)
std::pair< void const *, std::size_t > nodeobjectDecompress(void const *in, std::size_t inSize, BufferFactory &&bf)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
TEST(FileUtilitiesTest, get_file_contents)
@ InnerNode
inner node in V1 tree