rippled
Loading...
Searching...
No Matches
VaultTests.cpp
1// Auto-generated unit tests for ledger entry Vault
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/Vault.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(VaultTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const previousTxnIDValue = canonical_UINT256();
24 auto const previousTxnLgrSeqValue = canonical_UINT32();
25 auto const sequenceValue = canonical_UINT32();
26 auto const ownerNodeValue = canonical_UINT64();
27 auto const ownerValue = canonical_ACCOUNT();
28 auto const accountValue = canonical_ACCOUNT();
29 auto const dataValue = canonical_VL();
30 auto const assetValue = canonical_ISSUE();
31 auto const assetsTotalValue = canonical_NUMBER();
32 auto const assetsAvailableValue = canonical_NUMBER();
33 auto const assetsMaximumValue = canonical_NUMBER();
34 auto const lossUnrealizedValue = canonical_NUMBER();
35 auto const shareMPTIDValue = canonical_UINT192();
36 auto const withdrawalPolicyValue = canonical_UINT8();
37 auto const scaleValue = canonical_UINT8();
38
39 VaultBuilder builder{
40 previousTxnIDValue,
41 previousTxnLgrSeqValue,
42 sequenceValue,
43 ownerNodeValue,
44 ownerValue,
45 accountValue,
46 assetValue,
47 shareMPTIDValue,
48 withdrawalPolicyValue
49 };
50
51 builder.setData(dataValue);
52 builder.setAssetsTotal(assetsTotalValue);
53 builder.setAssetsAvailable(assetsAvailableValue);
54 builder.setAssetsMaximum(assetsMaximumValue);
55 builder.setLossUnrealized(lossUnrealizedValue);
56 builder.setScale(scaleValue);
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 = previousTxnIDValue;
69 auto const actual = entry.getPreviousTxnID();
70 expectEqualField(expected, actual, "sfPreviousTxnID");
71 }
72
73 {
74 auto const& expected = previousTxnLgrSeqValue;
75 auto const actual = entry.getPreviousTxnLgrSeq();
76 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
77 }
78
79 {
80 auto const& expected = sequenceValue;
81 auto const actual = entry.getSequence();
82 expectEqualField(expected, actual, "sfSequence");
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 = ownerValue;
93 auto const actual = entry.getOwner();
94 expectEqualField(expected, actual, "sfOwner");
95 }
96
97 {
98 auto const& expected = accountValue;
99 auto const actual = entry.getAccount();
100 expectEqualField(expected, actual, "sfAccount");
101 }
102
103 {
104 auto const& expected = assetValue;
105 auto const actual = entry.getAsset();
106 expectEqualField(expected, actual, "sfAsset");
107 }
108
109 {
110 auto const& expected = shareMPTIDValue;
111 auto const actual = entry.getShareMPTID();
112 expectEqualField(expected, actual, "sfShareMPTID");
113 }
114
115 {
116 auto const& expected = withdrawalPolicyValue;
117 auto const actual = entry.getWithdrawalPolicy();
118 expectEqualField(expected, actual, "sfWithdrawalPolicy");
119 }
120
121 {
122 auto const& expected = dataValue;
123 auto const actualOpt = entry.getData();
124 ASSERT_TRUE(actualOpt.has_value());
125 expectEqualField(expected, *actualOpt, "sfData");
126 EXPECT_TRUE(entry.hasData());
127 }
128
129 {
130 auto const& expected = assetsTotalValue;
131 auto const actualOpt = entry.getAssetsTotal();
132 ASSERT_TRUE(actualOpt.has_value());
133 expectEqualField(expected, *actualOpt, "sfAssetsTotal");
134 EXPECT_TRUE(entry.hasAssetsTotal());
135 }
136
137 {
138 auto const& expected = assetsAvailableValue;
139 auto const actualOpt = entry.getAssetsAvailable();
140 ASSERT_TRUE(actualOpt.has_value());
141 expectEqualField(expected, *actualOpt, "sfAssetsAvailable");
142 EXPECT_TRUE(entry.hasAssetsAvailable());
143 }
144
145 {
146 auto const& expected = assetsMaximumValue;
147 auto const actualOpt = entry.getAssetsMaximum();
148 ASSERT_TRUE(actualOpt.has_value());
149 expectEqualField(expected, *actualOpt, "sfAssetsMaximum");
150 EXPECT_TRUE(entry.hasAssetsMaximum());
151 }
152
153 {
154 auto const& expected = lossUnrealizedValue;
155 auto const actualOpt = entry.getLossUnrealized();
156 ASSERT_TRUE(actualOpt.has_value());
157 expectEqualField(expected, *actualOpt, "sfLossUnrealized");
158 EXPECT_TRUE(entry.hasLossUnrealized());
159 }
160
161 {
162 auto const& expected = scaleValue;
163 auto const actualOpt = entry.getScale();
164 ASSERT_TRUE(actualOpt.has_value());
165 expectEqualField(expected, *actualOpt, "sfScale");
166 EXPECT_TRUE(entry.hasScale());
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(VaultTests, BuilderFromSleRoundTrip)
179{
180 uint256 const index{2u};
181
182 auto const previousTxnIDValue = canonical_UINT256();
183 auto const previousTxnLgrSeqValue = canonical_UINT32();
184 auto const sequenceValue = canonical_UINT32();
185 auto const ownerNodeValue = canonical_UINT64();
186 auto const ownerValue = canonical_ACCOUNT();
187 auto const accountValue = canonical_ACCOUNT();
188 auto const dataValue = canonical_VL();
189 auto const assetValue = canonical_ISSUE();
190 auto const assetsTotalValue = canonical_NUMBER();
191 auto const assetsAvailableValue = canonical_NUMBER();
192 auto const assetsMaximumValue = canonical_NUMBER();
193 auto const lossUnrealizedValue = canonical_NUMBER();
194 auto const shareMPTIDValue = canonical_UINT192();
195 auto const withdrawalPolicyValue = canonical_UINT8();
196 auto const scaleValue = canonical_UINT8();
197
198 auto sle = std::make_shared<SLE>(Vault::entryType, index);
199
200 sle->at(sfPreviousTxnID) = previousTxnIDValue;
201 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
202 sle->at(sfSequence) = sequenceValue;
203 sle->at(sfOwnerNode) = ownerNodeValue;
204 sle->at(sfOwner) = ownerValue;
205 sle->at(sfAccount) = accountValue;
206 sle->at(sfData) = dataValue;
207 sle->at(sfAsset) = STIssue(sfAsset, assetValue);
208 sle->at(sfAssetsTotal) = assetsTotalValue;
209 sle->at(sfAssetsAvailable) = assetsAvailableValue;
210 sle->at(sfAssetsMaximum) = assetsMaximumValue;
211 sle->at(sfLossUnrealized) = lossUnrealizedValue;
212 sle->at(sfShareMPTID) = shareMPTIDValue;
213 sle->at(sfWithdrawalPolicy) = withdrawalPolicyValue;
214 sle->at(sfScale) = scaleValue;
215
216 VaultBuilder builderFromSle{sle};
217 EXPECT_TRUE(builderFromSle.validate());
218
219 auto const entryFromBuilder = builderFromSle.build(index);
220
221 Vault entryFromSle{sle};
222 EXPECT_TRUE(entryFromBuilder.validate());
223 EXPECT_TRUE(entryFromSle.validate());
224
225 {
226 auto const& expected = previousTxnIDValue;
227
228 auto const fromSle = entryFromSle.getPreviousTxnID();
229 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
230
231 expectEqualField(expected, fromSle, "sfPreviousTxnID");
232 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
233 }
234
235 {
236 auto const& expected = previousTxnLgrSeqValue;
237
238 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
239 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
240
241 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
242 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
243 }
244
245 {
246 auto const& expected = sequenceValue;
247
248 auto const fromSle = entryFromSle.getSequence();
249 auto const fromBuilder = entryFromBuilder.getSequence();
250
251 expectEqualField(expected, fromSle, "sfSequence");
252 expectEqualField(expected, fromBuilder, "sfSequence");
253 }
254
255 {
256 auto const& expected = ownerNodeValue;
257
258 auto const fromSle = entryFromSle.getOwnerNode();
259 auto const fromBuilder = entryFromBuilder.getOwnerNode();
260
261 expectEqualField(expected, fromSle, "sfOwnerNode");
262 expectEqualField(expected, fromBuilder, "sfOwnerNode");
263 }
264
265 {
266 auto const& expected = ownerValue;
267
268 auto const fromSle = entryFromSle.getOwner();
269 auto const fromBuilder = entryFromBuilder.getOwner();
270
271 expectEqualField(expected, fromSle, "sfOwner");
272 expectEqualField(expected, fromBuilder, "sfOwner");
273 }
274
275 {
276 auto const& expected = accountValue;
277
278 auto const fromSle = entryFromSle.getAccount();
279 auto const fromBuilder = entryFromBuilder.getAccount();
280
281 expectEqualField(expected, fromSle, "sfAccount");
282 expectEqualField(expected, fromBuilder, "sfAccount");
283 }
284
285 {
286 auto const& expected = assetValue;
287
288 auto const fromSle = entryFromSle.getAsset();
289 auto const fromBuilder = entryFromBuilder.getAsset();
290
291 expectEqualField(expected, fromSle, "sfAsset");
292 expectEqualField(expected, fromBuilder, "sfAsset");
293 }
294
295 {
296 auto const& expected = shareMPTIDValue;
297
298 auto const fromSle = entryFromSle.getShareMPTID();
299 auto const fromBuilder = entryFromBuilder.getShareMPTID();
300
301 expectEqualField(expected, fromSle, "sfShareMPTID");
302 expectEqualField(expected, fromBuilder, "sfShareMPTID");
303 }
304
305 {
306 auto const& expected = withdrawalPolicyValue;
307
308 auto const fromSle = entryFromSle.getWithdrawalPolicy();
309 auto const fromBuilder = entryFromBuilder.getWithdrawalPolicy();
310
311 expectEqualField(expected, fromSle, "sfWithdrawalPolicy");
312 expectEqualField(expected, fromBuilder, "sfWithdrawalPolicy");
313 }
314
315 {
316 auto const& expected = dataValue;
317
318 auto const fromSleOpt = entryFromSle.getData();
319 auto const fromBuilderOpt = entryFromBuilder.getData();
320
321 ASSERT_TRUE(fromSleOpt.has_value());
322 ASSERT_TRUE(fromBuilderOpt.has_value());
323
324 expectEqualField(expected, *fromSleOpt, "sfData");
325 expectEqualField(expected, *fromBuilderOpt, "sfData");
326 }
327
328 {
329 auto const& expected = assetsTotalValue;
330
331 auto const fromSleOpt = entryFromSle.getAssetsTotal();
332 auto const fromBuilderOpt = entryFromBuilder.getAssetsTotal();
333
334 ASSERT_TRUE(fromSleOpt.has_value());
335 ASSERT_TRUE(fromBuilderOpt.has_value());
336
337 expectEqualField(expected, *fromSleOpt, "sfAssetsTotal");
338 expectEqualField(expected, *fromBuilderOpt, "sfAssetsTotal");
339 }
340
341 {
342 auto const& expected = assetsAvailableValue;
343
344 auto const fromSleOpt = entryFromSle.getAssetsAvailable();
345 auto const fromBuilderOpt = entryFromBuilder.getAssetsAvailable();
346
347 ASSERT_TRUE(fromSleOpt.has_value());
348 ASSERT_TRUE(fromBuilderOpt.has_value());
349
350 expectEqualField(expected, *fromSleOpt, "sfAssetsAvailable");
351 expectEqualField(expected, *fromBuilderOpt, "sfAssetsAvailable");
352 }
353
354 {
355 auto const& expected = assetsMaximumValue;
356
357 auto const fromSleOpt = entryFromSle.getAssetsMaximum();
358 auto const fromBuilderOpt = entryFromBuilder.getAssetsMaximum();
359
360 ASSERT_TRUE(fromSleOpt.has_value());
361 ASSERT_TRUE(fromBuilderOpt.has_value());
362
363 expectEqualField(expected, *fromSleOpt, "sfAssetsMaximum");
364 expectEqualField(expected, *fromBuilderOpt, "sfAssetsMaximum");
365 }
366
367 {
368 auto const& expected = lossUnrealizedValue;
369
370 auto const fromSleOpt = entryFromSle.getLossUnrealized();
371 auto const fromBuilderOpt = entryFromBuilder.getLossUnrealized();
372
373 ASSERT_TRUE(fromSleOpt.has_value());
374 ASSERT_TRUE(fromBuilderOpt.has_value());
375
376 expectEqualField(expected, *fromSleOpt, "sfLossUnrealized");
377 expectEqualField(expected, *fromBuilderOpt, "sfLossUnrealized");
378 }
379
380 {
381 auto const& expected = scaleValue;
382
383 auto const fromSleOpt = entryFromSle.getScale();
384 auto const fromBuilderOpt = entryFromBuilder.getScale();
385
386 ASSERT_TRUE(fromSleOpt.has_value());
387 ASSERT_TRUE(fromBuilderOpt.has_value());
388
389 expectEqualField(expected, *fromSleOpt, "sfScale");
390 expectEqualField(expected, *fromBuilderOpt, "sfScale");
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(VaultTests, 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(Vault{wrongEntry.getSle()}, std::runtime_error);
414}
415
416// 4) Verify builder throws when constructed from wrong ledger entry type.
417TEST(VaultTests, 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(VaultBuilder{wrongEntry.getSle()}, std::runtime_error);
431}
432
433// 5) Build with only required fields and verify optional fields return nullopt.
434TEST(VaultTests, OptionalFieldsReturnNullopt)
435{
436 uint256 const index{3u};
437
438 auto const previousTxnIDValue = canonical_UINT256();
439 auto const previousTxnLgrSeqValue = canonical_UINT32();
440 auto const sequenceValue = canonical_UINT32();
441 auto const ownerNodeValue = canonical_UINT64();
442 auto const ownerValue = canonical_ACCOUNT();
443 auto const accountValue = canonical_ACCOUNT();
444 auto const assetValue = canonical_ISSUE();
445 auto const shareMPTIDValue = canonical_UINT192();
446 auto const withdrawalPolicyValue = canonical_UINT8();
447
448 VaultBuilder builder{
449 previousTxnIDValue,
450 previousTxnLgrSeqValue,
451 sequenceValue,
452 ownerNodeValue,
453 ownerValue,
454 accountValue,
455 assetValue,
456 shareMPTIDValue,
457 withdrawalPolicyValue
458 };
459
460 auto const entry = builder.build(index);
461
462 // Verify optional fields are not present
463 EXPECT_FALSE(entry.hasData());
464 EXPECT_FALSE(entry.getData().has_value());
465 EXPECT_FALSE(entry.hasAssetsTotal());
466 EXPECT_FALSE(entry.getAssetsTotal().has_value());
467 EXPECT_FALSE(entry.hasAssetsAvailable());
468 EXPECT_FALSE(entry.getAssetsAvailable().has_value());
469 EXPECT_FALSE(entry.hasAssetsMaximum());
470 EXPECT_FALSE(entry.getAssetsMaximum().has_value());
471 EXPECT_FALSE(entry.hasLossUnrealized());
472 EXPECT_FALSE(entry.getLossUnrealized().has_value());
473 EXPECT_FALSE(entry.hasScale());
474 EXPECT_FALSE(entry.getScale().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 Ticket ledger entries.
Definition Ticket.h:112
Builder for Vault ledger entries.
Definition Vault.h:300
VaultBuilder & setAssetsAvailable(std::decay_t< typename SF_NUMBER::type::value_type > const &value)
Set sfAssetsAvailable (soeDEFAULT)
Definition Vault.h:448
VaultBuilder & setScale(std::decay_t< typename SF_UINT8::type::value_type > const &value)
Set sfScale (soeDEFAULT)
Definition Vault.h:503
VaultBuilder & setAssetsTotal(std::decay_t< typename SF_NUMBER::type::value_type > const &value)
Set sfAssetsTotal (soeDEFAULT)
Definition Vault.h:437
VaultBuilder & setLossUnrealized(std::decay_t< typename SF_NUMBER::type::value_type > const &value)
Set sfLossUnrealized (soeDEFAULT)
Definition Vault.h:470
VaultBuilder & setData(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfData (soeOPTIONAL)
Definition Vault.h:415
VaultBuilder & setAssetsMaximum(std::decay_t< typename SF_NUMBER::type::value_type > const &value)
Set sfAssetsMaximum (soeDEFAULT)
Definition Vault.h:459
Ledger Entry: Vault.
Definition Vault.h:28
static constexpr LedgerEntryType entryType
Definition Vault.h:30
T is_same_v
TEST(AccountRootTests, BuilderSettersRoundTrip)
void expectEqualField(T const &expected, T const &actual, char const *fieldName)