rippled
Loading...
Searching...
No Matches
LedgerHashesTests.cpp
1// Auto-generated unit tests for ledger entry LedgerHashes
2
3
4#include <gtest/gtest.h>
5
6#include <protocol_autogen/TestHelpers.h>
7
8#include <xrpl/protocol/STLedgerEntry.h>
9#include <xrpl/protocol_autogen/ledger_entries/LedgerHashes.h>
10#include <xrpl/protocol_autogen/ledger_entries/Ticket.h>
11
12#include <string>
13
14namespace xrpl::ledger_entries {
15
16// 1 & 4) Set fields via builder setters, build, then read them back via
17// wrapper getters. After build(), validate() should succeed for both the
18// builder's STObject and the wrapper's SLE.
19TEST(LedgerHashesTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const firstLedgerSequenceValue = canonical_UINT32();
24 auto const lastLedgerSequenceValue = canonical_UINT32();
25 auto const hashesValue = canonical_VECTOR256();
26
27 LedgerHashesBuilder builder{
28 hashesValue
29 };
30
31 builder.setFirstLedgerSequence(firstLedgerSequenceValue);
32 builder.setLastLedgerSequence(lastLedgerSequenceValue);
33
34 builder.setLedgerIndex(index);
35 builder.setFlags(0x1u);
36
37 EXPECT_TRUE(builder.validate());
38
39 auto const entry = builder.build(index);
40
41 EXPECT_TRUE(entry.validate());
42
43 {
44 auto const& expected = hashesValue;
45 auto const actual = entry.getHashes();
46 expectEqualField(expected, actual, "sfHashes");
47 }
48
49 {
50 auto const& expected = firstLedgerSequenceValue;
51 auto const actualOpt = entry.getFirstLedgerSequence();
52 ASSERT_TRUE(actualOpt.has_value());
53 expectEqualField(expected, *actualOpt, "sfFirstLedgerSequence");
54 EXPECT_TRUE(entry.hasFirstLedgerSequence());
55 }
56
57 {
58 auto const& expected = lastLedgerSequenceValue;
59 auto const actualOpt = entry.getLastLedgerSequence();
60 ASSERT_TRUE(actualOpt.has_value());
61 expectEqualField(expected, *actualOpt, "sfLastLedgerSequence");
62 EXPECT_TRUE(entry.hasLastLedgerSequence());
63 }
64
65 EXPECT_TRUE(entry.hasLedgerIndex());
66 auto const ledgerIndex = entry.getLedgerIndex();
67 ASSERT_TRUE(ledgerIndex.has_value());
68 EXPECT_EQ(*ledgerIndex, index);
69 EXPECT_EQ(entry.getKey(), index);
70}
71
72// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
73// from that SLE, build a new wrapper, and verify all fields (and validate()).
74TEST(LedgerHashesTests, BuilderFromSleRoundTrip)
75{
76 uint256 const index{2u};
77
78 auto const firstLedgerSequenceValue = canonical_UINT32();
79 auto const lastLedgerSequenceValue = canonical_UINT32();
80 auto const hashesValue = canonical_VECTOR256();
81
83
84 sle->at(sfFirstLedgerSequence) = firstLedgerSequenceValue;
85 sle->at(sfLastLedgerSequence) = lastLedgerSequenceValue;
86 sle->at(sfHashes) = hashesValue;
87
88 LedgerHashesBuilder builderFromSle{sle};
89 EXPECT_TRUE(builderFromSle.validate());
90
91 auto const entryFromBuilder = builderFromSle.build(index);
92
93 LedgerHashes entryFromSle{sle};
94 EXPECT_TRUE(entryFromBuilder.validate());
95 EXPECT_TRUE(entryFromSle.validate());
96
97 {
98 auto const& expected = hashesValue;
99
100 auto const fromSle = entryFromSle.getHashes();
101 auto const fromBuilder = entryFromBuilder.getHashes();
102
103 expectEqualField(expected, fromSle, "sfHashes");
104 expectEqualField(expected, fromBuilder, "sfHashes");
105 }
106
107 {
108 auto const& expected = firstLedgerSequenceValue;
109
110 auto const fromSleOpt = entryFromSle.getFirstLedgerSequence();
111 auto const fromBuilderOpt = entryFromBuilder.getFirstLedgerSequence();
112
113 ASSERT_TRUE(fromSleOpt.has_value());
114 ASSERT_TRUE(fromBuilderOpt.has_value());
115
116 expectEqualField(expected, *fromSleOpt, "sfFirstLedgerSequence");
117 expectEqualField(expected, *fromBuilderOpt, "sfFirstLedgerSequence");
118 }
119
120 {
121 auto const& expected = lastLedgerSequenceValue;
122
123 auto const fromSleOpt = entryFromSle.getLastLedgerSequence();
124 auto const fromBuilderOpt = entryFromBuilder.getLastLedgerSequence();
125
126 ASSERT_TRUE(fromSleOpt.has_value());
127 ASSERT_TRUE(fromBuilderOpt.has_value());
128
129 expectEqualField(expected, *fromSleOpt, "sfLastLedgerSequence");
130 expectEqualField(expected, *fromBuilderOpt, "sfLastLedgerSequence");
131 }
132
133 EXPECT_EQ(entryFromSle.getKey(), index);
134 EXPECT_EQ(entryFromBuilder.getKey(), index);
135}
136
137// 3) Verify wrapper throws when constructed from wrong ledger entry type.
138TEST(LedgerHashesTests, WrapperThrowsOnWrongEntryType)
139{
140 uint256 const index{3u};
141
142 // Build a valid ledger entry of a different type
143 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
144 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
145 TicketBuilder wrongBuilder{
151 auto wrongEntry = wrongBuilder.build(index);
152
153 EXPECT_THROW(LedgerHashes{wrongEntry.getSle()}, std::runtime_error);
154}
155
156// 4) Verify builder throws when constructed from wrong ledger entry type.
157TEST(LedgerHashesTests, BuilderThrowsOnWrongEntryType)
158{
159 uint256 const index{4u};
160
161 // Build a valid ledger entry of a different type
162 TicketBuilder wrongBuilder{
168 auto wrongEntry = wrongBuilder.build(index);
169
170 EXPECT_THROW(LedgerHashesBuilder{wrongEntry.getSle()}, std::runtime_error);
171}
172
173// 5) Build with only required fields and verify optional fields return nullopt.
174TEST(LedgerHashesTests, OptionalFieldsReturnNullopt)
175{
176 uint256 const index{3u};
177
178 auto const hashesValue = canonical_VECTOR256();
179
180 LedgerHashesBuilder builder{
181 hashesValue
182 };
183
184 auto const entry = builder.build(index);
185
186 // Verify optional fields are not present
187 EXPECT_FALSE(entry.hasFirstLedgerSequence());
188 EXPECT_FALSE(entry.getFirstLedgerSequence().has_value());
189 EXPECT_FALSE(entry.hasLastLedgerSequence());
190 EXPECT_FALSE(entry.getLastLedgerSequence().has_value());
191}
192}
std::shared_ptr< SLE const > getSle() const
Get the underlying SLE object.
Derived & setLedgerIndex(uint256 const &value)
Set the ledger index.
Derived & setFlags(uint32_t value)
Set the flags.
Builder for LedgerHashes ledger entries.
LedgerHashesBuilder & setLastLedgerSequence(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfLastLedgerSequence (soeOPTIONAL)
LedgerHashesBuilder & setFirstLedgerSequence(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Ledger entry-specific field setters.
Ledger Entry: LedgerHashes.
static constexpr LedgerEntryType entryType
Builder for Ticket ledger entries.
Definition Ticket.h:112
T is_same_v
TEST(AccountRootTests, BuilderSettersRoundTrip)
Vector256Value canonical_VECTOR256()
void expectEqualField(T const &expected, T const &actual, char const *fieldName)