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