rippled
Loading...
Searching...
No Matches
FeeSettingsTests.cpp
1// Auto-generated unit tests for ledger entry FeeSettings
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/FeeSettings.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(FeeSettingsTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const baseFeeValue = canonical_UINT64();
24 auto const referenceFeeUnitsValue = canonical_UINT32();
25 auto const reserveBaseValue = canonical_UINT32();
26 auto const reserveIncrementValue = canonical_UINT32();
27 auto const baseFeeDropsValue = canonical_AMOUNT();
28 auto const reserveBaseDropsValue = canonical_AMOUNT();
29 auto const reserveIncrementDropsValue = canonical_AMOUNT();
30 auto const previousTxnIDValue = canonical_UINT256();
31 auto const previousTxnLgrSeqValue = canonical_UINT32();
32
33 FeeSettingsBuilder builder{
34 };
35
36 builder.setBaseFee(baseFeeValue);
37 builder.setReferenceFeeUnits(referenceFeeUnitsValue);
38 builder.setReserveBase(reserveBaseValue);
39 builder.setReserveIncrement(reserveIncrementValue);
40 builder.setBaseFeeDrops(baseFeeDropsValue);
41 builder.setReserveBaseDrops(reserveBaseDropsValue);
42 builder.setReserveIncrementDrops(reserveIncrementDropsValue);
43 builder.setPreviousTxnID(previousTxnIDValue);
44 builder.setPreviousTxnLgrSeq(previousTxnLgrSeqValue);
45
46 builder.setLedgerIndex(index);
47 builder.setFlags(0x1u);
48
49 EXPECT_TRUE(builder.validate());
50
51 auto const entry = builder.build(index);
52
53 EXPECT_TRUE(entry.validate());
54
55 {
56 auto const& expected = baseFeeValue;
57 auto const actualOpt = entry.getBaseFee();
58 ASSERT_TRUE(actualOpt.has_value());
59 expectEqualField(expected, *actualOpt, "sfBaseFee");
60 EXPECT_TRUE(entry.hasBaseFee());
61 }
62
63 {
64 auto const& expected = referenceFeeUnitsValue;
65 auto const actualOpt = entry.getReferenceFeeUnits();
66 ASSERT_TRUE(actualOpt.has_value());
67 expectEqualField(expected, *actualOpt, "sfReferenceFeeUnits");
68 EXPECT_TRUE(entry.hasReferenceFeeUnits());
69 }
70
71 {
72 auto const& expected = reserveBaseValue;
73 auto const actualOpt = entry.getReserveBase();
74 ASSERT_TRUE(actualOpt.has_value());
75 expectEqualField(expected, *actualOpt, "sfReserveBase");
76 EXPECT_TRUE(entry.hasReserveBase());
77 }
78
79 {
80 auto const& expected = reserveIncrementValue;
81 auto const actualOpt = entry.getReserveIncrement();
82 ASSERT_TRUE(actualOpt.has_value());
83 expectEqualField(expected, *actualOpt, "sfReserveIncrement");
84 EXPECT_TRUE(entry.hasReserveIncrement());
85 }
86
87 {
88 auto const& expected = baseFeeDropsValue;
89 auto const actualOpt = entry.getBaseFeeDrops();
90 ASSERT_TRUE(actualOpt.has_value());
91 expectEqualField(expected, *actualOpt, "sfBaseFeeDrops");
92 EXPECT_TRUE(entry.hasBaseFeeDrops());
93 }
94
95 {
96 auto const& expected = reserveBaseDropsValue;
97 auto const actualOpt = entry.getReserveBaseDrops();
98 ASSERT_TRUE(actualOpt.has_value());
99 expectEqualField(expected, *actualOpt, "sfReserveBaseDrops");
100 EXPECT_TRUE(entry.hasReserveBaseDrops());
101 }
102
103 {
104 auto const& expected = reserveIncrementDropsValue;
105 auto const actualOpt = entry.getReserveIncrementDrops();
106 ASSERT_TRUE(actualOpt.has_value());
107 expectEqualField(expected, *actualOpt, "sfReserveIncrementDrops");
108 EXPECT_TRUE(entry.hasReserveIncrementDrops());
109 }
110
111 {
112 auto const& expected = previousTxnIDValue;
113 auto const actualOpt = entry.getPreviousTxnID();
114 ASSERT_TRUE(actualOpt.has_value());
115 expectEqualField(expected, *actualOpt, "sfPreviousTxnID");
116 EXPECT_TRUE(entry.hasPreviousTxnID());
117 }
118
119 {
120 auto const& expected = previousTxnLgrSeqValue;
121 auto const actualOpt = entry.getPreviousTxnLgrSeq();
122 ASSERT_TRUE(actualOpt.has_value());
123 expectEqualField(expected, *actualOpt, "sfPreviousTxnLgrSeq");
124 EXPECT_TRUE(entry.hasPreviousTxnLgrSeq());
125 }
126
127 EXPECT_TRUE(entry.hasLedgerIndex());
128 auto const ledgerIndex = entry.getLedgerIndex();
129 ASSERT_TRUE(ledgerIndex.has_value());
130 EXPECT_EQ(*ledgerIndex, index);
131 EXPECT_EQ(entry.getKey(), index);
132}
133
134// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
135// from that SLE, build a new wrapper, and verify all fields (and validate()).
136TEST(FeeSettingsTests, BuilderFromSleRoundTrip)
137{
138 uint256 const index{2u};
139
140 auto const baseFeeValue = canonical_UINT64();
141 auto const referenceFeeUnitsValue = canonical_UINT32();
142 auto const reserveBaseValue = canonical_UINT32();
143 auto const reserveIncrementValue = canonical_UINT32();
144 auto const baseFeeDropsValue = canonical_AMOUNT();
145 auto const reserveBaseDropsValue = canonical_AMOUNT();
146 auto const reserveIncrementDropsValue = canonical_AMOUNT();
147 auto const previousTxnIDValue = canonical_UINT256();
148 auto const previousTxnLgrSeqValue = canonical_UINT32();
149
151
152 sle->at(sfBaseFee) = baseFeeValue;
153 sle->at(sfReferenceFeeUnits) = referenceFeeUnitsValue;
154 sle->at(sfReserveBase) = reserveBaseValue;
155 sle->at(sfReserveIncrement) = reserveIncrementValue;
156 sle->at(sfBaseFeeDrops) = baseFeeDropsValue;
157 sle->at(sfReserveBaseDrops) = reserveBaseDropsValue;
158 sle->at(sfReserveIncrementDrops) = reserveIncrementDropsValue;
159 sle->at(sfPreviousTxnID) = previousTxnIDValue;
160 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
161
162 FeeSettingsBuilder builderFromSle{sle};
163 EXPECT_TRUE(builderFromSle.validate());
164
165 auto const entryFromBuilder = builderFromSle.build(index);
166
167 FeeSettings entryFromSle{sle};
168 EXPECT_TRUE(entryFromBuilder.validate());
169 EXPECT_TRUE(entryFromSle.validate());
170
171 {
172 auto const& expected = baseFeeValue;
173
174 auto const fromSleOpt = entryFromSle.getBaseFee();
175 auto const fromBuilderOpt = entryFromBuilder.getBaseFee();
176
177 ASSERT_TRUE(fromSleOpt.has_value());
178 ASSERT_TRUE(fromBuilderOpt.has_value());
179
180 expectEqualField(expected, *fromSleOpt, "sfBaseFee");
181 expectEqualField(expected, *fromBuilderOpt, "sfBaseFee");
182 }
183
184 {
185 auto const& expected = referenceFeeUnitsValue;
186
187 auto const fromSleOpt = entryFromSle.getReferenceFeeUnits();
188 auto const fromBuilderOpt = entryFromBuilder.getReferenceFeeUnits();
189
190 ASSERT_TRUE(fromSleOpt.has_value());
191 ASSERT_TRUE(fromBuilderOpt.has_value());
192
193 expectEqualField(expected, *fromSleOpt, "sfReferenceFeeUnits");
194 expectEqualField(expected, *fromBuilderOpt, "sfReferenceFeeUnits");
195 }
196
197 {
198 auto const& expected = reserveBaseValue;
199
200 auto const fromSleOpt = entryFromSle.getReserveBase();
201 auto const fromBuilderOpt = entryFromBuilder.getReserveBase();
202
203 ASSERT_TRUE(fromSleOpt.has_value());
204 ASSERT_TRUE(fromBuilderOpt.has_value());
205
206 expectEqualField(expected, *fromSleOpt, "sfReserveBase");
207 expectEqualField(expected, *fromBuilderOpt, "sfReserveBase");
208 }
209
210 {
211 auto const& expected = reserveIncrementValue;
212
213 auto const fromSleOpt = entryFromSle.getReserveIncrement();
214 auto const fromBuilderOpt = entryFromBuilder.getReserveIncrement();
215
216 ASSERT_TRUE(fromSleOpt.has_value());
217 ASSERT_TRUE(fromBuilderOpt.has_value());
218
219 expectEqualField(expected, *fromSleOpt, "sfReserveIncrement");
220 expectEqualField(expected, *fromBuilderOpt, "sfReserveIncrement");
221 }
222
223 {
224 auto const& expected = baseFeeDropsValue;
225
226 auto const fromSleOpt = entryFromSle.getBaseFeeDrops();
227 auto const fromBuilderOpt = entryFromBuilder.getBaseFeeDrops();
228
229 ASSERT_TRUE(fromSleOpt.has_value());
230 ASSERT_TRUE(fromBuilderOpt.has_value());
231
232 expectEqualField(expected, *fromSleOpt, "sfBaseFeeDrops");
233 expectEqualField(expected, *fromBuilderOpt, "sfBaseFeeDrops");
234 }
235
236 {
237 auto const& expected = reserveBaseDropsValue;
238
239 auto const fromSleOpt = entryFromSle.getReserveBaseDrops();
240 auto const fromBuilderOpt = entryFromBuilder.getReserveBaseDrops();
241
242 ASSERT_TRUE(fromSleOpt.has_value());
243 ASSERT_TRUE(fromBuilderOpt.has_value());
244
245 expectEqualField(expected, *fromSleOpt, "sfReserveBaseDrops");
246 expectEqualField(expected, *fromBuilderOpt, "sfReserveBaseDrops");
247 }
248
249 {
250 auto const& expected = reserveIncrementDropsValue;
251
252 auto const fromSleOpt = entryFromSle.getReserveIncrementDrops();
253 auto const fromBuilderOpt = entryFromBuilder.getReserveIncrementDrops();
254
255 ASSERT_TRUE(fromSleOpt.has_value());
256 ASSERT_TRUE(fromBuilderOpt.has_value());
257
258 expectEqualField(expected, *fromSleOpt, "sfReserveIncrementDrops");
259 expectEqualField(expected, *fromBuilderOpt, "sfReserveIncrementDrops");
260 }
261
262 {
263 auto const& expected = previousTxnIDValue;
264
265 auto const fromSleOpt = entryFromSle.getPreviousTxnID();
266 auto const fromBuilderOpt = entryFromBuilder.getPreviousTxnID();
267
268 ASSERT_TRUE(fromSleOpt.has_value());
269 ASSERT_TRUE(fromBuilderOpt.has_value());
270
271 expectEqualField(expected, *fromSleOpt, "sfPreviousTxnID");
272 expectEqualField(expected, *fromBuilderOpt, "sfPreviousTxnID");
273 }
274
275 {
276 auto const& expected = previousTxnLgrSeqValue;
277
278 auto const fromSleOpt = entryFromSle.getPreviousTxnLgrSeq();
279 auto const fromBuilderOpt = entryFromBuilder.getPreviousTxnLgrSeq();
280
281 ASSERT_TRUE(fromSleOpt.has_value());
282 ASSERT_TRUE(fromBuilderOpt.has_value());
283
284 expectEqualField(expected, *fromSleOpt, "sfPreviousTxnLgrSeq");
285 expectEqualField(expected, *fromBuilderOpt, "sfPreviousTxnLgrSeq");
286 }
287
288 EXPECT_EQ(entryFromSle.getKey(), index);
289 EXPECT_EQ(entryFromBuilder.getKey(), index);
290}
291
292// 3) Verify wrapper throws when constructed from wrong ledger entry type.
293TEST(FeeSettingsTests, WrapperThrowsOnWrongEntryType)
294{
295 uint256 const index{3u};
296
297 // Build a valid ledger entry of a different type
298 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
299 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
300 TicketBuilder wrongBuilder{
306 auto wrongEntry = wrongBuilder.build(index);
307
308 EXPECT_THROW(FeeSettings{wrongEntry.getSle()}, std::runtime_error);
309}
310
311// 4) Verify builder throws when constructed from wrong ledger entry type.
312TEST(FeeSettingsTests, BuilderThrowsOnWrongEntryType)
313{
314 uint256 const index{4u};
315
316 // Build a valid ledger entry of a different type
317 TicketBuilder wrongBuilder{
323 auto wrongEntry = wrongBuilder.build(index);
324
325 EXPECT_THROW(FeeSettingsBuilder{wrongEntry.getSle()}, std::runtime_error);
326}
327
328// 5) Build with only required fields and verify optional fields return nullopt.
329TEST(FeeSettingsTests, OptionalFieldsReturnNullopt)
330{
331 uint256 const index{3u};
332
333
334 FeeSettingsBuilder builder{
335 };
336
337 auto const entry = builder.build(index);
338
339 // Verify optional fields are not present
340 EXPECT_FALSE(entry.hasBaseFee());
341 EXPECT_FALSE(entry.getBaseFee().has_value());
342 EXPECT_FALSE(entry.hasReferenceFeeUnits());
343 EXPECT_FALSE(entry.getReferenceFeeUnits().has_value());
344 EXPECT_FALSE(entry.hasReserveBase());
345 EXPECT_FALSE(entry.getReserveBase().has_value());
346 EXPECT_FALSE(entry.hasReserveIncrement());
347 EXPECT_FALSE(entry.getReserveIncrement().has_value());
348 EXPECT_FALSE(entry.hasBaseFeeDrops());
349 EXPECT_FALSE(entry.getBaseFeeDrops().has_value());
350 EXPECT_FALSE(entry.hasReserveBaseDrops());
351 EXPECT_FALSE(entry.getReserveBaseDrops().has_value());
352 EXPECT_FALSE(entry.hasReserveIncrementDrops());
353 EXPECT_FALSE(entry.getReserveIncrementDrops().has_value());
354 EXPECT_FALSE(entry.hasPreviousTxnID());
355 EXPECT_FALSE(entry.getPreviousTxnID().has_value());
356 EXPECT_FALSE(entry.hasPreviousTxnLgrSeq());
357 EXPECT_FALSE(entry.getPreviousTxnLgrSeq().has_value());
358}
359}
Builder for FeeSettings ledger entries.
FeeSettingsBuilder & setReferenceFeeUnits(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfReferenceFeeUnits (soeOPTIONAL)
FeeSettingsBuilder & setPreviousTxnID(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Set sfPreviousTxnID (soeOPTIONAL)
FeeSettingsBuilder & setPreviousTxnLgrSeq(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfPreviousTxnLgrSeq (soeOPTIONAL)
FeeSettingsBuilder & setReserveBaseDrops(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfReserveBaseDrops (soeOPTIONAL)
FeeSettingsBuilder & setReserveBase(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfReserveBase (soeOPTIONAL)
FeeSettingsBuilder & setBaseFee(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Ledger entry-specific field setters.
FeeSettingsBuilder & setBaseFeeDrops(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfBaseFeeDrops (soeOPTIONAL)
FeeSettingsBuilder & setReserveIncrement(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfReserveIncrement (soeOPTIONAL)
FeeSettingsBuilder & setReserveIncrementDrops(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfReserveIncrementDrops (soeOPTIONAL)
Ledger Entry: FeeSettings.
Definition FeeSettings.h:28
static constexpr LedgerEntryType entryType
Definition FeeSettings.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)