rippled
Loading...
Searching...
No Matches
EscrowTests.cpp
1// Auto-generated unit tests for ledger entry Escrow
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/Escrow.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(EscrowTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const accountValue = canonical_ACCOUNT();
24 auto const sequenceValue = canonical_UINT32();
25 auto const destinationValue = canonical_ACCOUNT();
26 auto const amountValue = canonical_AMOUNT();
27 auto const conditionValue = canonical_VL();
28 auto const cancelAfterValue = canonical_UINT32();
29 auto const finishAfterValue = canonical_UINT32();
30 auto const sourceTagValue = canonical_UINT32();
31 auto const destinationTagValue = canonical_UINT32();
32 auto const ownerNodeValue = canonical_UINT64();
33 auto const previousTxnIDValue = canonical_UINT256();
34 auto const previousTxnLgrSeqValue = canonical_UINT32();
35 auto const destinationNodeValue = canonical_UINT64();
36 auto const transferRateValue = canonical_UINT32();
37 auto const issuerNodeValue = canonical_UINT64();
38
39 EscrowBuilder builder{
40 accountValue,
41 destinationValue,
42 amountValue,
43 ownerNodeValue,
44 previousTxnIDValue,
45 previousTxnLgrSeqValue
46 };
47
48 builder.setSequence(sequenceValue);
49 builder.setCondition(conditionValue);
50 builder.setCancelAfter(cancelAfterValue);
51 builder.setFinishAfter(finishAfterValue);
52 builder.setSourceTag(sourceTagValue);
53 builder.setDestinationTag(destinationTagValue);
54 builder.setDestinationNode(destinationNodeValue);
55 builder.setTransferRate(transferRateValue);
56 builder.setIssuerNode(issuerNodeValue);
57
58 builder.setLedgerIndex(index);
59 builder.setFlags(0x1u);
60
61 EXPECT_TRUE(builder.validate());
62
63 auto const entry = builder.build(index);
64
65 EXPECT_TRUE(entry.validate());
66
67 {
68 auto const& expected = accountValue;
69 auto const actual = entry.getAccount();
70 expectEqualField(expected, actual, "sfAccount");
71 }
72
73 {
74 auto const& expected = destinationValue;
75 auto const actual = entry.getDestination();
76 expectEqualField(expected, actual, "sfDestination");
77 }
78
79 {
80 auto const& expected = amountValue;
81 auto const actual = entry.getAmount();
82 expectEqualField(expected, actual, "sfAmount");
83 }
84
85 {
86 auto const& expected = ownerNodeValue;
87 auto const actual = entry.getOwnerNode();
88 expectEqualField(expected, actual, "sfOwnerNode");
89 }
90
91 {
92 auto const& expected = previousTxnIDValue;
93 auto const actual = entry.getPreviousTxnID();
94 expectEqualField(expected, actual, "sfPreviousTxnID");
95 }
96
97 {
98 auto const& expected = previousTxnLgrSeqValue;
99 auto const actual = entry.getPreviousTxnLgrSeq();
100 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
101 }
102
103 {
104 auto const& expected = sequenceValue;
105 auto const actualOpt = entry.getSequence();
106 ASSERT_TRUE(actualOpt.has_value());
107 expectEqualField(expected, *actualOpt, "sfSequence");
108 EXPECT_TRUE(entry.hasSequence());
109 }
110
111 {
112 auto const& expected = conditionValue;
113 auto const actualOpt = entry.getCondition();
114 ASSERT_TRUE(actualOpt.has_value());
115 expectEqualField(expected, *actualOpt, "sfCondition");
116 EXPECT_TRUE(entry.hasCondition());
117 }
118
119 {
120 auto const& expected = cancelAfterValue;
121 auto const actualOpt = entry.getCancelAfter();
122 ASSERT_TRUE(actualOpt.has_value());
123 expectEqualField(expected, *actualOpt, "sfCancelAfter");
124 EXPECT_TRUE(entry.hasCancelAfter());
125 }
126
127 {
128 auto const& expected = finishAfterValue;
129 auto const actualOpt = entry.getFinishAfter();
130 ASSERT_TRUE(actualOpt.has_value());
131 expectEqualField(expected, *actualOpt, "sfFinishAfter");
132 EXPECT_TRUE(entry.hasFinishAfter());
133 }
134
135 {
136 auto const& expected = sourceTagValue;
137 auto const actualOpt = entry.getSourceTag();
138 ASSERT_TRUE(actualOpt.has_value());
139 expectEqualField(expected, *actualOpt, "sfSourceTag");
140 EXPECT_TRUE(entry.hasSourceTag());
141 }
142
143 {
144 auto const& expected = destinationTagValue;
145 auto const actualOpt = entry.getDestinationTag();
146 ASSERT_TRUE(actualOpt.has_value());
147 expectEqualField(expected, *actualOpt, "sfDestinationTag");
148 EXPECT_TRUE(entry.hasDestinationTag());
149 }
150
151 {
152 auto const& expected = destinationNodeValue;
153 auto const actualOpt = entry.getDestinationNode();
154 ASSERT_TRUE(actualOpt.has_value());
155 expectEqualField(expected, *actualOpt, "sfDestinationNode");
156 EXPECT_TRUE(entry.hasDestinationNode());
157 }
158
159 {
160 auto const& expected = transferRateValue;
161 auto const actualOpt = entry.getTransferRate();
162 ASSERT_TRUE(actualOpt.has_value());
163 expectEqualField(expected, *actualOpt, "sfTransferRate");
164 EXPECT_TRUE(entry.hasTransferRate());
165 }
166
167 {
168 auto const& expected = issuerNodeValue;
169 auto const actualOpt = entry.getIssuerNode();
170 ASSERT_TRUE(actualOpt.has_value());
171 expectEqualField(expected, *actualOpt, "sfIssuerNode");
172 EXPECT_TRUE(entry.hasIssuerNode());
173 }
174
175 EXPECT_TRUE(entry.hasLedgerIndex());
176 auto const ledgerIndex = entry.getLedgerIndex();
177 ASSERT_TRUE(ledgerIndex.has_value());
178 EXPECT_EQ(*ledgerIndex, index);
179 EXPECT_EQ(entry.getKey(), index);
180}
181
182// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
183// from that SLE, build a new wrapper, and verify all fields (and validate()).
184TEST(EscrowTests, BuilderFromSleRoundTrip)
185{
186 uint256 const index{2u};
187
188 auto const accountValue = canonical_ACCOUNT();
189 auto const sequenceValue = canonical_UINT32();
190 auto const destinationValue = canonical_ACCOUNT();
191 auto const amountValue = canonical_AMOUNT();
192 auto const conditionValue = canonical_VL();
193 auto const cancelAfterValue = canonical_UINT32();
194 auto const finishAfterValue = canonical_UINT32();
195 auto const sourceTagValue = canonical_UINT32();
196 auto const destinationTagValue = canonical_UINT32();
197 auto const ownerNodeValue = canonical_UINT64();
198 auto const previousTxnIDValue = canonical_UINT256();
199 auto const previousTxnLgrSeqValue = canonical_UINT32();
200 auto const destinationNodeValue = canonical_UINT64();
201 auto const transferRateValue = canonical_UINT32();
202 auto const issuerNodeValue = canonical_UINT64();
203
204 auto sle = std::make_shared<SLE>(Escrow::entryType, index);
205
206 sle->at(sfAccount) = accountValue;
207 sle->at(sfSequence) = sequenceValue;
208 sle->at(sfDestination) = destinationValue;
209 sle->at(sfAmount) = amountValue;
210 sle->at(sfCondition) = conditionValue;
211 sle->at(sfCancelAfter) = cancelAfterValue;
212 sle->at(sfFinishAfter) = finishAfterValue;
213 sle->at(sfSourceTag) = sourceTagValue;
214 sle->at(sfDestinationTag) = destinationTagValue;
215 sle->at(sfOwnerNode) = ownerNodeValue;
216 sle->at(sfPreviousTxnID) = previousTxnIDValue;
217 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
218 sle->at(sfDestinationNode) = destinationNodeValue;
219 sle->at(sfTransferRate) = transferRateValue;
220 sle->at(sfIssuerNode) = issuerNodeValue;
221
222 EscrowBuilder builderFromSle{sle};
223 EXPECT_TRUE(builderFromSle.validate());
224
225 auto const entryFromBuilder = builderFromSle.build(index);
226
227 Escrow entryFromSle{sle};
228 EXPECT_TRUE(entryFromBuilder.validate());
229 EXPECT_TRUE(entryFromSle.validate());
230
231 {
232 auto const& expected = accountValue;
233
234 auto const fromSle = entryFromSle.getAccount();
235 auto const fromBuilder = entryFromBuilder.getAccount();
236
237 expectEqualField(expected, fromSle, "sfAccount");
238 expectEqualField(expected, fromBuilder, "sfAccount");
239 }
240
241 {
242 auto const& expected = destinationValue;
243
244 auto const fromSle = entryFromSle.getDestination();
245 auto const fromBuilder = entryFromBuilder.getDestination();
246
247 expectEqualField(expected, fromSle, "sfDestination");
248 expectEqualField(expected, fromBuilder, "sfDestination");
249 }
250
251 {
252 auto const& expected = amountValue;
253
254 auto const fromSle = entryFromSle.getAmount();
255 auto const fromBuilder = entryFromBuilder.getAmount();
256
257 expectEqualField(expected, fromSle, "sfAmount");
258 expectEqualField(expected, fromBuilder, "sfAmount");
259 }
260
261 {
262 auto const& expected = ownerNodeValue;
263
264 auto const fromSle = entryFromSle.getOwnerNode();
265 auto const fromBuilder = entryFromBuilder.getOwnerNode();
266
267 expectEqualField(expected, fromSle, "sfOwnerNode");
268 expectEqualField(expected, fromBuilder, "sfOwnerNode");
269 }
270
271 {
272 auto const& expected = previousTxnIDValue;
273
274 auto const fromSle = entryFromSle.getPreviousTxnID();
275 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
276
277 expectEqualField(expected, fromSle, "sfPreviousTxnID");
278 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
279 }
280
281 {
282 auto const& expected = previousTxnLgrSeqValue;
283
284 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
285 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
286
287 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
288 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
289 }
290
291 {
292 auto const& expected = sequenceValue;
293
294 auto const fromSleOpt = entryFromSle.getSequence();
295 auto const fromBuilderOpt = entryFromBuilder.getSequence();
296
297 ASSERT_TRUE(fromSleOpt.has_value());
298 ASSERT_TRUE(fromBuilderOpt.has_value());
299
300 expectEqualField(expected, *fromSleOpt, "sfSequence");
301 expectEqualField(expected, *fromBuilderOpt, "sfSequence");
302 }
303
304 {
305 auto const& expected = conditionValue;
306
307 auto const fromSleOpt = entryFromSle.getCondition();
308 auto const fromBuilderOpt = entryFromBuilder.getCondition();
309
310 ASSERT_TRUE(fromSleOpt.has_value());
311 ASSERT_TRUE(fromBuilderOpt.has_value());
312
313 expectEqualField(expected, *fromSleOpt, "sfCondition");
314 expectEqualField(expected, *fromBuilderOpt, "sfCondition");
315 }
316
317 {
318 auto const& expected = cancelAfterValue;
319
320 auto const fromSleOpt = entryFromSle.getCancelAfter();
321 auto const fromBuilderOpt = entryFromBuilder.getCancelAfter();
322
323 ASSERT_TRUE(fromSleOpt.has_value());
324 ASSERT_TRUE(fromBuilderOpt.has_value());
325
326 expectEqualField(expected, *fromSleOpt, "sfCancelAfter");
327 expectEqualField(expected, *fromBuilderOpt, "sfCancelAfter");
328 }
329
330 {
331 auto const& expected = finishAfterValue;
332
333 auto const fromSleOpt = entryFromSle.getFinishAfter();
334 auto const fromBuilderOpt = entryFromBuilder.getFinishAfter();
335
336 ASSERT_TRUE(fromSleOpt.has_value());
337 ASSERT_TRUE(fromBuilderOpt.has_value());
338
339 expectEqualField(expected, *fromSleOpt, "sfFinishAfter");
340 expectEqualField(expected, *fromBuilderOpt, "sfFinishAfter");
341 }
342
343 {
344 auto const& expected = sourceTagValue;
345
346 auto const fromSleOpt = entryFromSle.getSourceTag();
347 auto const fromBuilderOpt = entryFromBuilder.getSourceTag();
348
349 ASSERT_TRUE(fromSleOpt.has_value());
350 ASSERT_TRUE(fromBuilderOpt.has_value());
351
352 expectEqualField(expected, *fromSleOpt, "sfSourceTag");
353 expectEqualField(expected, *fromBuilderOpt, "sfSourceTag");
354 }
355
356 {
357 auto const& expected = destinationTagValue;
358
359 auto const fromSleOpt = entryFromSle.getDestinationTag();
360 auto const fromBuilderOpt = entryFromBuilder.getDestinationTag();
361
362 ASSERT_TRUE(fromSleOpt.has_value());
363 ASSERT_TRUE(fromBuilderOpt.has_value());
364
365 expectEqualField(expected, *fromSleOpt, "sfDestinationTag");
366 expectEqualField(expected, *fromBuilderOpt, "sfDestinationTag");
367 }
368
369 {
370 auto const& expected = destinationNodeValue;
371
372 auto const fromSleOpt = entryFromSle.getDestinationNode();
373 auto const fromBuilderOpt = entryFromBuilder.getDestinationNode();
374
375 ASSERT_TRUE(fromSleOpt.has_value());
376 ASSERT_TRUE(fromBuilderOpt.has_value());
377
378 expectEqualField(expected, *fromSleOpt, "sfDestinationNode");
379 expectEqualField(expected, *fromBuilderOpt, "sfDestinationNode");
380 }
381
382 {
383 auto const& expected = transferRateValue;
384
385 auto const fromSleOpt = entryFromSle.getTransferRate();
386 auto const fromBuilderOpt = entryFromBuilder.getTransferRate();
387
388 ASSERT_TRUE(fromSleOpt.has_value());
389 ASSERT_TRUE(fromBuilderOpt.has_value());
390
391 expectEqualField(expected, *fromSleOpt, "sfTransferRate");
392 expectEqualField(expected, *fromBuilderOpt, "sfTransferRate");
393 }
394
395 {
396 auto const& expected = issuerNodeValue;
397
398 auto const fromSleOpt = entryFromSle.getIssuerNode();
399 auto const fromBuilderOpt = entryFromBuilder.getIssuerNode();
400
401 ASSERT_TRUE(fromSleOpt.has_value());
402 ASSERT_TRUE(fromBuilderOpt.has_value());
403
404 expectEqualField(expected, *fromSleOpt, "sfIssuerNode");
405 expectEqualField(expected, *fromBuilderOpt, "sfIssuerNode");
406 }
407
408 EXPECT_EQ(entryFromSle.getKey(), index);
409 EXPECT_EQ(entryFromBuilder.getKey(), index);
410}
411
412// 3) Verify wrapper throws when constructed from wrong ledger entry type.
413TEST(EscrowTests, WrapperThrowsOnWrongEntryType)
414{
415 uint256 const index{3u};
416
417 // Build a valid ledger entry of a different type
418 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
419 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
420 TicketBuilder wrongBuilder{
426 auto wrongEntry = wrongBuilder.build(index);
427
428 EXPECT_THROW(Escrow{wrongEntry.getSle()}, std::runtime_error);
429}
430
431// 4) Verify builder throws when constructed from wrong ledger entry type.
432TEST(EscrowTests, BuilderThrowsOnWrongEntryType)
433{
434 uint256 const index{4u};
435
436 // Build a valid ledger entry of a different type
437 TicketBuilder wrongBuilder{
443 auto wrongEntry = wrongBuilder.build(index);
444
445 EXPECT_THROW(EscrowBuilder{wrongEntry.getSle()}, std::runtime_error);
446}
447
448// 5) Build with only required fields and verify optional fields return nullopt.
449TEST(EscrowTests, OptionalFieldsReturnNullopt)
450{
451 uint256 const index{3u};
452
453 auto const accountValue = canonical_ACCOUNT();
454 auto const destinationValue = canonical_ACCOUNT();
455 auto const amountValue = canonical_AMOUNT();
456 auto const ownerNodeValue = canonical_UINT64();
457 auto const previousTxnIDValue = canonical_UINT256();
458 auto const previousTxnLgrSeqValue = canonical_UINT32();
459
460 EscrowBuilder builder{
461 accountValue,
462 destinationValue,
463 amountValue,
464 ownerNodeValue,
465 previousTxnIDValue,
466 previousTxnLgrSeqValue
467 };
468
469 auto const entry = builder.build(index);
470
471 // Verify optional fields are not present
472 EXPECT_FALSE(entry.hasSequence());
473 EXPECT_FALSE(entry.getSequence().has_value());
474 EXPECT_FALSE(entry.hasCondition());
475 EXPECT_FALSE(entry.getCondition().has_value());
476 EXPECT_FALSE(entry.hasCancelAfter());
477 EXPECT_FALSE(entry.getCancelAfter().has_value());
478 EXPECT_FALSE(entry.hasFinishAfter());
479 EXPECT_FALSE(entry.getFinishAfter().has_value());
480 EXPECT_FALSE(entry.hasSourceTag());
481 EXPECT_FALSE(entry.getSourceTag().has_value());
482 EXPECT_FALSE(entry.hasDestinationTag());
483 EXPECT_FALSE(entry.getDestinationTag().has_value());
484 EXPECT_FALSE(entry.hasDestinationNode());
485 EXPECT_FALSE(entry.getDestinationNode().has_value());
486 EXPECT_FALSE(entry.hasTransferRate());
487 EXPECT_FALSE(entry.getTransferRate().has_value());
488 EXPECT_FALSE(entry.hasIssuerNode());
489 EXPECT_FALSE(entry.getIssuerNode().has_value());
490}
491}
Builder for Escrow ledger entries.
Definition Escrow.h:339
EscrowBuilder & setSourceTag(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfSourceTag (soeOPTIONAL)
Definition Escrow.h:459
EscrowBuilder & setDestinationNode(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfDestinationNode (soeOPTIONAL)
Definition Escrow.h:514
EscrowBuilder & setCancelAfter(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfCancelAfter (soeOPTIONAL)
Definition Escrow.h:437
EscrowBuilder & setFinishAfter(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfFinishAfter (soeOPTIONAL)
Definition Escrow.h:448
EscrowBuilder & setCondition(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfCondition (soeOPTIONAL)
Definition Escrow.h:426
EscrowBuilder & setSequence(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfSequence (soeOPTIONAL)
Definition Escrow.h:393
EscrowBuilder & setTransferRate(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfTransferRate (soeOPTIONAL)
Definition Escrow.h:525
EscrowBuilder & setIssuerNode(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfIssuerNode (soeOPTIONAL)
Definition Escrow.h:536
EscrowBuilder & setDestinationTag(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfDestinationTag (soeOPTIONAL)
Definition Escrow.h:470
Ledger Entry: Escrow.
Definition Escrow.h:28
static constexpr LedgerEntryType entryType
Definition Escrow.h:30
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 Ticket ledger entries.
Definition Ticket.h:112
T is_same_v
TEST(AccountRootTests, BuilderSettersRoundTrip)
void expectEqualField(T const &expected, T const &actual, char const *fieldName)