xrpld
Loading...
Searching...
No Matches
RippleStateTests.cpp
1// Auto-generated unit tests for ledger entry RippleState
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/RippleState.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(RippleStateTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const balanceValue = canonical_AMOUNT();
24 auto const lowLimitValue = canonical_AMOUNT();
25 auto const highLimitValue = canonical_AMOUNT();
26 auto const previousTxnIDValue = canonical_UINT256();
27 auto const previousTxnLgrSeqValue = canonical_UINT32();
28 auto const lowNodeValue = canonical_UINT64();
29 auto const lowQualityInValue = canonical_UINT32();
30 auto const lowQualityOutValue = canonical_UINT32();
31 auto const highNodeValue = canonical_UINT64();
32 auto const highQualityInValue = canonical_UINT32();
33 auto const highQualityOutValue = canonical_UINT32();
34 auto const highSponsorValue = canonical_ACCOUNT();
35 auto const lowSponsorValue = canonical_ACCOUNT();
36
37 RippleStateBuilder builder{
38 balanceValue,
39 lowLimitValue,
40 highLimitValue,
41 previousTxnIDValue,
42 previousTxnLgrSeqValue
43 };
44
45 builder.setLowNode(lowNodeValue);
46 builder.setLowQualityIn(lowQualityInValue);
47 builder.setLowQualityOut(lowQualityOutValue);
48 builder.setHighNode(highNodeValue);
49 builder.setHighQualityIn(highQualityInValue);
50 builder.setHighQualityOut(highQualityOutValue);
51 builder.setHighSponsor(highSponsorValue);
52 builder.setLowSponsor(lowSponsorValue);
53
54 builder.setLedgerIndex(index);
55 builder.setFlags(0x1u);
56
57 EXPECT_TRUE(builder.validate());
58
59 auto const entry = builder.build(index);
60
61 EXPECT_TRUE(entry.validate());
62
63 {
64 auto const& expected = balanceValue;
65 auto const actual = entry.getBalance();
66 expectEqualField(expected, actual, "sfBalance");
67 }
68
69 {
70 auto const& expected = lowLimitValue;
71 auto const actual = entry.getLowLimit();
72 expectEqualField(expected, actual, "sfLowLimit");
73 }
74
75 {
76 auto const& expected = highLimitValue;
77 auto const actual = entry.getHighLimit();
78 expectEqualField(expected, actual, "sfHighLimit");
79 }
80
81 {
82 auto const& expected = previousTxnIDValue;
83 auto const actual = entry.getPreviousTxnID();
84 expectEqualField(expected, actual, "sfPreviousTxnID");
85 }
86
87 {
88 auto const& expected = previousTxnLgrSeqValue;
89 auto const actual = entry.getPreviousTxnLgrSeq();
90 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
91 }
92
93 {
94 auto const& expected = lowNodeValue;
95 auto const actualOpt = entry.getLowNode();
96 ASSERT_TRUE(actualOpt.has_value());
97 expectEqualField(expected, *actualOpt, "sfLowNode");
98 EXPECT_TRUE(entry.hasLowNode());
99 }
100
101 {
102 auto const& expected = lowQualityInValue;
103 auto const actualOpt = entry.getLowQualityIn();
104 ASSERT_TRUE(actualOpt.has_value());
105 expectEqualField(expected, *actualOpt, "sfLowQualityIn");
106 EXPECT_TRUE(entry.hasLowQualityIn());
107 }
108
109 {
110 auto const& expected = lowQualityOutValue;
111 auto const actualOpt = entry.getLowQualityOut();
112 ASSERT_TRUE(actualOpt.has_value());
113 expectEqualField(expected, *actualOpt, "sfLowQualityOut");
114 EXPECT_TRUE(entry.hasLowQualityOut());
115 }
116
117 {
118 auto const& expected = highNodeValue;
119 auto const actualOpt = entry.getHighNode();
120 ASSERT_TRUE(actualOpt.has_value());
121 expectEqualField(expected, *actualOpt, "sfHighNode");
122 EXPECT_TRUE(entry.hasHighNode());
123 }
124
125 {
126 auto const& expected = highQualityInValue;
127 auto const actualOpt = entry.getHighQualityIn();
128 ASSERT_TRUE(actualOpt.has_value());
129 expectEqualField(expected, *actualOpt, "sfHighQualityIn");
130 EXPECT_TRUE(entry.hasHighQualityIn());
131 }
132
133 {
134 auto const& expected = highQualityOutValue;
135 auto const actualOpt = entry.getHighQualityOut();
136 ASSERT_TRUE(actualOpt.has_value());
137 expectEqualField(expected, *actualOpt, "sfHighQualityOut");
138 EXPECT_TRUE(entry.hasHighQualityOut());
139 }
140
141 {
142 auto const& expected = highSponsorValue;
143 auto const actualOpt = entry.getHighSponsor();
144 ASSERT_TRUE(actualOpt.has_value());
145 expectEqualField(expected, *actualOpt, "sfHighSponsor");
146 EXPECT_TRUE(entry.hasHighSponsor());
147 }
148
149 {
150 auto const& expected = lowSponsorValue;
151 auto const actualOpt = entry.getLowSponsor();
152 ASSERT_TRUE(actualOpt.has_value());
153 expectEqualField(expected, *actualOpt, "sfLowSponsor");
154 EXPECT_TRUE(entry.hasLowSponsor());
155 }
156
157 EXPECT_TRUE(entry.hasLedgerIndex());
158 auto const ledgerIndex = entry.getLedgerIndex();
159 ASSERT_TRUE(ledgerIndex.has_value());
160 EXPECT_EQ(*ledgerIndex, index);
161 EXPECT_EQ(entry.getKey(), index);
162}
163
164// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
165// from that SLE, build a new wrapper, and verify all fields (and validate()).
166TEST(RippleStateTests, BuilderFromSleRoundTrip)
167{
168 uint256 const index{2u};
169
170 auto const balanceValue = canonical_AMOUNT();
171 auto const lowLimitValue = canonical_AMOUNT();
172 auto const highLimitValue = canonical_AMOUNT();
173 auto const previousTxnIDValue = canonical_UINT256();
174 auto const previousTxnLgrSeqValue = canonical_UINT32();
175 auto const lowNodeValue = canonical_UINT64();
176 auto const lowQualityInValue = canonical_UINT32();
177 auto const lowQualityOutValue = canonical_UINT32();
178 auto const highNodeValue = canonical_UINT64();
179 auto const highQualityInValue = canonical_UINT32();
180 auto const highQualityOutValue = canonical_UINT32();
181 auto const highSponsorValue = canonical_ACCOUNT();
182 auto const lowSponsorValue = canonical_ACCOUNT();
183
185
186 sle->at(sfBalance) = balanceValue;
187 sle->at(sfLowLimit) = lowLimitValue;
188 sle->at(sfHighLimit) = highLimitValue;
189 sle->at(sfPreviousTxnID) = previousTxnIDValue;
190 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
191 sle->at(sfLowNode) = lowNodeValue;
192 sle->at(sfLowQualityIn) = lowQualityInValue;
193 sle->at(sfLowQualityOut) = lowQualityOutValue;
194 sle->at(sfHighNode) = highNodeValue;
195 sle->at(sfHighQualityIn) = highQualityInValue;
196 sle->at(sfHighQualityOut) = highQualityOutValue;
197 sle->at(sfHighSponsor) = highSponsorValue;
198 sle->at(sfLowSponsor) = lowSponsorValue;
199
200 RippleStateBuilder builderFromSle{sle};
201 EXPECT_TRUE(builderFromSle.validate());
202
203 auto const entryFromBuilder = builderFromSle.build(index);
204
205 RippleState entryFromSle{sle};
206 EXPECT_TRUE(entryFromBuilder.validate());
207 EXPECT_TRUE(entryFromSle.validate());
208
209 {
210 auto const& expected = balanceValue;
211
212 auto const fromSle = entryFromSle.getBalance();
213 auto const fromBuilder = entryFromBuilder.getBalance();
214
215 expectEqualField(expected, fromSle, "sfBalance");
216 expectEqualField(expected, fromBuilder, "sfBalance");
217 }
218
219 {
220 auto const& expected = lowLimitValue;
221
222 auto const fromSle = entryFromSle.getLowLimit();
223 auto const fromBuilder = entryFromBuilder.getLowLimit();
224
225 expectEqualField(expected, fromSle, "sfLowLimit");
226 expectEqualField(expected, fromBuilder, "sfLowLimit");
227 }
228
229 {
230 auto const& expected = highLimitValue;
231
232 auto const fromSle = entryFromSle.getHighLimit();
233 auto const fromBuilder = entryFromBuilder.getHighLimit();
234
235 expectEqualField(expected, fromSle, "sfHighLimit");
236 expectEqualField(expected, fromBuilder, "sfHighLimit");
237 }
238
239 {
240 auto const& expected = previousTxnIDValue;
241
242 auto const fromSle = entryFromSle.getPreviousTxnID();
243 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
244
245 expectEqualField(expected, fromSle, "sfPreviousTxnID");
246 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
247 }
248
249 {
250 auto const& expected = previousTxnLgrSeqValue;
251
252 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
253 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
254
255 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
256 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
257 }
258
259 {
260 auto const& expected = lowNodeValue;
261
262 auto const fromSleOpt = entryFromSle.getLowNode();
263 auto const fromBuilderOpt = entryFromBuilder.getLowNode();
264
265 ASSERT_TRUE(fromSleOpt.has_value());
266 ASSERT_TRUE(fromBuilderOpt.has_value());
267
268 expectEqualField(expected, *fromSleOpt, "sfLowNode");
269 expectEqualField(expected, *fromBuilderOpt, "sfLowNode");
270 }
271
272 {
273 auto const& expected = lowQualityInValue;
274
275 auto const fromSleOpt = entryFromSle.getLowQualityIn();
276 auto const fromBuilderOpt = entryFromBuilder.getLowQualityIn();
277
278 ASSERT_TRUE(fromSleOpt.has_value());
279 ASSERT_TRUE(fromBuilderOpt.has_value());
280
281 expectEqualField(expected, *fromSleOpt, "sfLowQualityIn");
282 expectEqualField(expected, *fromBuilderOpt, "sfLowQualityIn");
283 }
284
285 {
286 auto const& expected = lowQualityOutValue;
287
288 auto const fromSleOpt = entryFromSle.getLowQualityOut();
289 auto const fromBuilderOpt = entryFromBuilder.getLowQualityOut();
290
291 ASSERT_TRUE(fromSleOpt.has_value());
292 ASSERT_TRUE(fromBuilderOpt.has_value());
293
294 expectEqualField(expected, *fromSleOpt, "sfLowQualityOut");
295 expectEqualField(expected, *fromBuilderOpt, "sfLowQualityOut");
296 }
297
298 {
299 auto const& expected = highNodeValue;
300
301 auto const fromSleOpt = entryFromSle.getHighNode();
302 auto const fromBuilderOpt = entryFromBuilder.getHighNode();
303
304 ASSERT_TRUE(fromSleOpt.has_value());
305 ASSERT_TRUE(fromBuilderOpt.has_value());
306
307 expectEqualField(expected, *fromSleOpt, "sfHighNode");
308 expectEqualField(expected, *fromBuilderOpt, "sfHighNode");
309 }
310
311 {
312 auto const& expected = highQualityInValue;
313
314 auto const fromSleOpt = entryFromSle.getHighQualityIn();
315 auto const fromBuilderOpt = entryFromBuilder.getHighQualityIn();
316
317 ASSERT_TRUE(fromSleOpt.has_value());
318 ASSERT_TRUE(fromBuilderOpt.has_value());
319
320 expectEqualField(expected, *fromSleOpt, "sfHighQualityIn");
321 expectEqualField(expected, *fromBuilderOpt, "sfHighQualityIn");
322 }
323
324 {
325 auto const& expected = highQualityOutValue;
326
327 auto const fromSleOpt = entryFromSle.getHighQualityOut();
328 auto const fromBuilderOpt = entryFromBuilder.getHighQualityOut();
329
330 ASSERT_TRUE(fromSleOpt.has_value());
331 ASSERT_TRUE(fromBuilderOpt.has_value());
332
333 expectEqualField(expected, *fromSleOpt, "sfHighQualityOut");
334 expectEqualField(expected, *fromBuilderOpt, "sfHighQualityOut");
335 }
336
337 {
338 auto const& expected = highSponsorValue;
339
340 auto const fromSleOpt = entryFromSle.getHighSponsor();
341 auto const fromBuilderOpt = entryFromBuilder.getHighSponsor();
342
343 ASSERT_TRUE(fromSleOpt.has_value());
344 ASSERT_TRUE(fromBuilderOpt.has_value());
345
346 expectEqualField(expected, *fromSleOpt, "sfHighSponsor");
347 expectEqualField(expected, *fromBuilderOpt, "sfHighSponsor");
348 }
349
350 {
351 auto const& expected = lowSponsorValue;
352
353 auto const fromSleOpt = entryFromSle.getLowSponsor();
354 auto const fromBuilderOpt = entryFromBuilder.getLowSponsor();
355
356 ASSERT_TRUE(fromSleOpt.has_value());
357 ASSERT_TRUE(fromBuilderOpt.has_value());
358
359 expectEqualField(expected, *fromSleOpt, "sfLowSponsor");
360 expectEqualField(expected, *fromBuilderOpt, "sfLowSponsor");
361 }
362
363 EXPECT_EQ(entryFromSle.getKey(), index);
364 EXPECT_EQ(entryFromBuilder.getKey(), index);
365}
366
367// 3) Verify wrapper throws when constructed from wrong ledger entry type.
368TEST(RippleStateTests, WrapperThrowsOnWrongEntryType)
369{
370 uint256 const index{3u};
371
372 // Build a valid ledger entry of a different type
373 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
374 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
375 TicketBuilder wrongBuilder{
381 auto wrongEntry = wrongBuilder.build(index);
382
383 EXPECT_THROW(RippleState{wrongEntry.getSle()}, std::runtime_error);
384}
385
386// 4) Verify builder throws when constructed from wrong ledger entry type.
387TEST(RippleStateTests, BuilderThrowsOnWrongEntryType)
388{
389 uint256 const index{4u};
390
391 // Build a valid ledger entry of a different type
392 TicketBuilder wrongBuilder{
398 auto wrongEntry = wrongBuilder.build(index);
399
400 EXPECT_THROW(RippleStateBuilder{wrongEntry.getSle()}, std::runtime_error);
401}
402
403// 5) Build with only required fields and verify optional fields return nullopt.
404TEST(RippleStateTests, OptionalFieldsReturnNullopt)
405{
406 uint256 const index{3u};
407
408 auto const balanceValue = canonical_AMOUNT();
409 auto const lowLimitValue = canonical_AMOUNT();
410 auto const highLimitValue = canonical_AMOUNT();
411 auto const previousTxnIDValue = canonical_UINT256();
412 auto const previousTxnLgrSeqValue = canonical_UINT32();
413
414 RippleStateBuilder builder{
415 balanceValue,
416 lowLimitValue,
417 highLimitValue,
418 previousTxnIDValue,
419 previousTxnLgrSeqValue
420 };
421
422 auto const entry = builder.build(index);
423
424 // Verify optional fields are not present
425 EXPECT_FALSE(entry.hasLowNode());
426 EXPECT_FALSE(entry.getLowNode().has_value());
427 EXPECT_FALSE(entry.hasLowQualityIn());
428 EXPECT_FALSE(entry.getLowQualityIn().has_value());
429 EXPECT_FALSE(entry.hasLowQualityOut());
430 EXPECT_FALSE(entry.getLowQualityOut().has_value());
431 EXPECT_FALSE(entry.hasHighNode());
432 EXPECT_FALSE(entry.getHighNode().has_value());
433 EXPECT_FALSE(entry.hasHighQualityIn());
434 EXPECT_FALSE(entry.getHighQualityIn().has_value());
435 EXPECT_FALSE(entry.hasHighQualityOut());
436 EXPECT_FALSE(entry.getHighQualityOut().has_value());
437 EXPECT_FALSE(entry.hasHighSponsor());
438 EXPECT_FALSE(entry.getHighSponsor().has_value());
439 EXPECT_FALSE(entry.hasLowSponsor());
440 EXPECT_FALSE(entry.getLowSponsor().has_value());
441}
442}
bool validate() const
Validate the ledger entry.
uint256 const & getKey() const
Get the key (index) of this ledger entry.
Derived & setLedgerIndex(uint256 const &value)
Set the ledger index.
Derived & setFlags(uint32_t value)
Set the flags.
bool validate() const
Validate the ledger entry.
Builder for RippleState ledger entries.
RippleStateBuilder & setLowQualityOut(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfLowQualityOut (SoeOptional).
RippleStateBuilder & setLowSponsor(std::decay_t< typename SF_ACCOUNT::type::value_type > const &value)
Set sfLowSponsor (SoeOptional).
RippleStateBuilder & setHighSponsor(std::decay_t< typename SF_ACCOUNT::type::value_type > const &value)
Set sfHighSponsor (SoeOptional).
RippleStateBuilder & setHighNode(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfHighNode (SoeOptional).
RippleStateBuilder & setLowNode(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfLowNode (SoeOptional).
RippleState build(uint256 const &index)
Build and return the completed RippleState wrapper.
RippleStateBuilder & setHighQualityOut(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfHighQualityOut (SoeOptional).
RippleStateBuilder & setHighQualityIn(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfHighQualityIn (SoeOptional).
RippleStateBuilder & setLowQualityIn(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfLowQualityIn (SoeOptional).
Ledger Entry: RippleState.
Definition RippleState.h:28
protocol_autogen::Optional< SF_UINT64::type::value_type > getLowNode() const
Get sfLowNode (SoeOptional).
SF_AMOUNT::type::value_type getHighLimit() const
Get sfHighLimit (SoeRequired).
Definition RippleState.h:76
static constexpr LedgerEntryType entryType
Definition RippleState.h:30
SF_AMOUNT::type::value_type getBalance() const
Get sfBalance (SoeRequired).
Definition RippleState.h:54
protocol_autogen::Optional< SF_ACCOUNT::type::value_type > getLowSponsor() const
Get sfLowSponsor (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getLowQualityIn() const
Get sfLowQualityIn (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getHighQualityOut() const
Get sfHighQualityOut (SoeOptional).
SF_UINT256::type::value_type getPreviousTxnID() const
Get sfPreviousTxnID (SoeRequired).
Definition RippleState.h:87
protocol_autogen::Optional< SF_ACCOUNT::type::value_type > getHighSponsor() const
Get sfHighSponsor (SoeOptional).
SF_UINT32::type::value_type getPreviousTxnLgrSeq() const
Get sfPreviousTxnLgrSeq (SoeRequired).
Definition RippleState.h:98
SF_AMOUNT::type::value_type getLowLimit() const
Get sfLowLimit (SoeRequired).
Definition RippleState.h:65
protocol_autogen::Optional< SF_UINT64::type::value_type > getHighNode() const
Get sfHighNode (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getLowQualityOut() const
Get sfLowQualityOut (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getHighQualityIn() const
Get sfHighQualityIn (SoeOptional).
Builder for Ticket ledger entries.
Definition Ticket.h:112
Ticket build(uint256 const &index)
Build and return the completed Ticket wrapper.
Definition Ticket.h:211
T make_shared(T... args)
TEST(AccountRootTests, BuilderSettersRoundTrip)
BaseUInt< 256 > uint256
Definition base_uint.h:580
void expectEqualField(T const &expected, T const &actual, char const *fieldName)