xrpld
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 gasLimitValue = canonical_UINT32();
31 auto const bytecodeSizeLimitValue = canonical_UINT32();
32 auto const gasPriceValue = canonical_UINT32();
33 auto const previousTxnIDValue = canonical_UINT256();
34 auto const previousTxnLgrSeqValue = canonical_UINT32();
35
36 FeeSettingsBuilder builder{
37 };
38
39 builder.setBaseFee(baseFeeValue);
40 builder.setReferenceFeeUnits(referenceFeeUnitsValue);
41 builder.setReserveBase(reserveBaseValue);
42 builder.setReserveIncrement(reserveIncrementValue);
43 builder.setBaseFeeDrops(baseFeeDropsValue);
44 builder.setReserveBaseDrops(reserveBaseDropsValue);
45 builder.setReserveIncrementDrops(reserveIncrementDropsValue);
46 builder.setGasLimit(gasLimitValue);
47 builder.setBytecodeSizeLimit(bytecodeSizeLimitValue);
48 builder.setGasPrice(gasPriceValue);
49 builder.setPreviousTxnID(previousTxnIDValue);
50 builder.setPreviousTxnLgrSeq(previousTxnLgrSeqValue);
51
52 builder.setLedgerIndex(index);
53 builder.setFlags(0x1u);
54
55 EXPECT_TRUE(builder.validate());
56
57 auto const entry = builder.build(index);
58
59 EXPECT_TRUE(entry.validate());
60
61 {
62 auto const& expected = baseFeeValue;
63 auto const actualOpt = entry.getBaseFee();
64 ASSERT_TRUE(actualOpt.has_value());
65 expectEqualField(expected, *actualOpt, "sfBaseFee");
66 EXPECT_TRUE(entry.hasBaseFee());
67 }
68
69 {
70 auto const& expected = referenceFeeUnitsValue;
71 auto const actualOpt = entry.getReferenceFeeUnits();
72 ASSERT_TRUE(actualOpt.has_value());
73 expectEqualField(expected, *actualOpt, "sfReferenceFeeUnits");
74 EXPECT_TRUE(entry.hasReferenceFeeUnits());
75 }
76
77 {
78 auto const& expected = reserveBaseValue;
79 auto const actualOpt = entry.getReserveBase();
80 ASSERT_TRUE(actualOpt.has_value());
81 expectEqualField(expected, *actualOpt, "sfReserveBase");
82 EXPECT_TRUE(entry.hasReserveBase());
83 }
84
85 {
86 auto const& expected = reserveIncrementValue;
87 auto const actualOpt = entry.getReserveIncrement();
88 ASSERT_TRUE(actualOpt.has_value());
89 expectEqualField(expected, *actualOpt, "sfReserveIncrement");
90 EXPECT_TRUE(entry.hasReserveIncrement());
91 }
92
93 {
94 auto const& expected = baseFeeDropsValue;
95 auto const actualOpt = entry.getBaseFeeDrops();
96 ASSERT_TRUE(actualOpt.has_value());
97 expectEqualField(expected, *actualOpt, "sfBaseFeeDrops");
98 EXPECT_TRUE(entry.hasBaseFeeDrops());
99 }
100
101 {
102 auto const& expected = reserveBaseDropsValue;
103 auto const actualOpt = entry.getReserveBaseDrops();
104 ASSERT_TRUE(actualOpt.has_value());
105 expectEqualField(expected, *actualOpt, "sfReserveBaseDrops");
106 EXPECT_TRUE(entry.hasReserveBaseDrops());
107 }
108
109 {
110 auto const& expected = reserveIncrementDropsValue;
111 auto const actualOpt = entry.getReserveIncrementDrops();
112 ASSERT_TRUE(actualOpt.has_value());
113 expectEqualField(expected, *actualOpt, "sfReserveIncrementDrops");
114 EXPECT_TRUE(entry.hasReserveIncrementDrops());
115 }
116
117 {
118 auto const& expected = gasLimitValue;
119 auto const actualOpt = entry.getGasLimit();
120 ASSERT_TRUE(actualOpt.has_value());
121 expectEqualField(expected, *actualOpt, "sfGasLimit");
122 EXPECT_TRUE(entry.hasGasLimit());
123 }
124
125 {
126 auto const& expected = bytecodeSizeLimitValue;
127 auto const actualOpt = entry.getBytecodeSizeLimit();
128 ASSERT_TRUE(actualOpt.has_value());
129 expectEqualField(expected, *actualOpt, "sfBytecodeSizeLimit");
130 EXPECT_TRUE(entry.hasBytecodeSizeLimit());
131 }
132
133 {
134 auto const& expected = gasPriceValue;
135 auto const actualOpt = entry.getGasPrice();
136 ASSERT_TRUE(actualOpt.has_value());
137 expectEqualField(expected, *actualOpt, "sfGasPrice");
138 EXPECT_TRUE(entry.hasGasPrice());
139 }
140
141 {
142 auto const& expected = previousTxnIDValue;
143 auto const actualOpt = entry.getPreviousTxnID();
144 ASSERT_TRUE(actualOpt.has_value());
145 expectEqualField(expected, *actualOpt, "sfPreviousTxnID");
146 EXPECT_TRUE(entry.hasPreviousTxnID());
147 }
148
149 {
150 auto const& expected = previousTxnLgrSeqValue;
151 auto const actualOpt = entry.getPreviousTxnLgrSeq();
152 ASSERT_TRUE(actualOpt.has_value());
153 expectEqualField(expected, *actualOpt, "sfPreviousTxnLgrSeq");
154 EXPECT_TRUE(entry.hasPreviousTxnLgrSeq());
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(FeeSettingsTests, BuilderFromSleRoundTrip)
167{
168 UInt256 const index{2u};
169
170 auto const baseFeeValue = canonical_UINT64();
171 auto const referenceFeeUnitsValue = canonical_UINT32();
172 auto const reserveBaseValue = canonical_UINT32();
173 auto const reserveIncrementValue = canonical_UINT32();
174 auto const baseFeeDropsValue = canonical_AMOUNT();
175 auto const reserveBaseDropsValue = canonical_AMOUNT();
176 auto const reserveIncrementDropsValue = canonical_AMOUNT();
177 auto const gasLimitValue = canonical_UINT32();
178 auto const bytecodeSizeLimitValue = canonical_UINT32();
179 auto const gasPriceValue = canonical_UINT32();
180 auto const previousTxnIDValue = canonical_UINT256();
181 auto const previousTxnLgrSeqValue = canonical_UINT32();
182
184
185 sle->at(sfBaseFee) = baseFeeValue;
186 sle->at(sfReferenceFeeUnits) = referenceFeeUnitsValue;
187 sle->at(sfReserveBase) = reserveBaseValue;
188 sle->at(sfReserveIncrement) = reserveIncrementValue;
189 sle->at(sfBaseFeeDrops) = baseFeeDropsValue;
190 sle->at(sfReserveBaseDrops) = reserveBaseDropsValue;
191 sle->at(sfReserveIncrementDrops) = reserveIncrementDropsValue;
192 sle->at(sfGasLimit) = gasLimitValue;
193 sle->at(sfBytecodeSizeLimit) = bytecodeSizeLimitValue;
194 sle->at(sfGasPrice) = gasPriceValue;
195 sle->at(sfPreviousTxnID) = previousTxnIDValue;
196 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
197
198 FeeSettingsBuilder builderFromSle{sle};
199 EXPECT_TRUE(builderFromSle.validate());
200
201 auto const entryFromBuilder = builderFromSle.build(index);
202
203 FeeSettings entryFromSle{sle};
204 EXPECT_TRUE(entryFromBuilder.validate());
205 EXPECT_TRUE(entryFromSle.validate());
206
207 {
208 auto const& expected = baseFeeValue;
209
210 auto const fromSleOpt = entryFromSle.getBaseFee();
211 auto const fromBuilderOpt = entryFromBuilder.getBaseFee();
212
213 ASSERT_TRUE(fromSleOpt.has_value());
214 ASSERT_TRUE(fromBuilderOpt.has_value());
215
216 expectEqualField(expected, *fromSleOpt, "sfBaseFee");
217 expectEqualField(expected, *fromBuilderOpt, "sfBaseFee");
218 }
219
220 {
221 auto const& expected = referenceFeeUnitsValue;
222
223 auto const fromSleOpt = entryFromSle.getReferenceFeeUnits();
224 auto const fromBuilderOpt = entryFromBuilder.getReferenceFeeUnits();
225
226 ASSERT_TRUE(fromSleOpt.has_value());
227 ASSERT_TRUE(fromBuilderOpt.has_value());
228
229 expectEqualField(expected, *fromSleOpt, "sfReferenceFeeUnits");
230 expectEqualField(expected, *fromBuilderOpt, "sfReferenceFeeUnits");
231 }
232
233 {
234 auto const& expected = reserveBaseValue;
235
236 auto const fromSleOpt = entryFromSle.getReserveBase();
237 auto const fromBuilderOpt = entryFromBuilder.getReserveBase();
238
239 ASSERT_TRUE(fromSleOpt.has_value());
240 ASSERT_TRUE(fromBuilderOpt.has_value());
241
242 expectEqualField(expected, *fromSleOpt, "sfReserveBase");
243 expectEqualField(expected, *fromBuilderOpt, "sfReserveBase");
244 }
245
246 {
247 auto const& expected = reserveIncrementValue;
248
249 auto const fromSleOpt = entryFromSle.getReserveIncrement();
250 auto const fromBuilderOpt = entryFromBuilder.getReserveIncrement();
251
252 ASSERT_TRUE(fromSleOpt.has_value());
253 ASSERT_TRUE(fromBuilderOpt.has_value());
254
255 expectEqualField(expected, *fromSleOpt, "sfReserveIncrement");
256 expectEqualField(expected, *fromBuilderOpt, "sfReserveIncrement");
257 }
258
259 {
260 auto const& expected = baseFeeDropsValue;
261
262 auto const fromSleOpt = entryFromSle.getBaseFeeDrops();
263 auto const fromBuilderOpt = entryFromBuilder.getBaseFeeDrops();
264
265 ASSERT_TRUE(fromSleOpt.has_value());
266 ASSERT_TRUE(fromBuilderOpt.has_value());
267
268 expectEqualField(expected, *fromSleOpt, "sfBaseFeeDrops");
269 expectEqualField(expected, *fromBuilderOpt, "sfBaseFeeDrops");
270 }
271
272 {
273 auto const& expected = reserveBaseDropsValue;
274
275 auto const fromSleOpt = entryFromSle.getReserveBaseDrops();
276 auto const fromBuilderOpt = entryFromBuilder.getReserveBaseDrops();
277
278 ASSERT_TRUE(fromSleOpt.has_value());
279 ASSERT_TRUE(fromBuilderOpt.has_value());
280
281 expectEqualField(expected, *fromSleOpt, "sfReserveBaseDrops");
282 expectEqualField(expected, *fromBuilderOpt, "sfReserveBaseDrops");
283 }
284
285 {
286 auto const& expected = reserveIncrementDropsValue;
287
288 auto const fromSleOpt = entryFromSle.getReserveIncrementDrops();
289 auto const fromBuilderOpt = entryFromBuilder.getReserveIncrementDrops();
290
291 ASSERT_TRUE(fromSleOpt.has_value());
292 ASSERT_TRUE(fromBuilderOpt.has_value());
293
294 expectEqualField(expected, *fromSleOpt, "sfReserveIncrementDrops");
295 expectEqualField(expected, *fromBuilderOpt, "sfReserveIncrementDrops");
296 }
297
298 {
299 auto const& expected = gasLimitValue;
300
301 auto const fromSleOpt = entryFromSle.getGasLimit();
302 auto const fromBuilderOpt = entryFromBuilder.getGasLimit();
303
304 ASSERT_TRUE(fromSleOpt.has_value());
305 ASSERT_TRUE(fromBuilderOpt.has_value());
306
307 expectEqualField(expected, *fromSleOpt, "sfGasLimit");
308 expectEqualField(expected, *fromBuilderOpt, "sfGasLimit");
309 }
310
311 {
312 auto const& expected = bytecodeSizeLimitValue;
313
314 auto const fromSleOpt = entryFromSle.getBytecodeSizeLimit();
315 auto const fromBuilderOpt = entryFromBuilder.getBytecodeSizeLimit();
316
317 ASSERT_TRUE(fromSleOpt.has_value());
318 ASSERT_TRUE(fromBuilderOpt.has_value());
319
320 expectEqualField(expected, *fromSleOpt, "sfBytecodeSizeLimit");
321 expectEqualField(expected, *fromBuilderOpt, "sfBytecodeSizeLimit");
322 }
323
324 {
325 auto const& expected = gasPriceValue;
326
327 auto const fromSleOpt = entryFromSle.getGasPrice();
328 auto const fromBuilderOpt = entryFromBuilder.getGasPrice();
329
330 ASSERT_TRUE(fromSleOpt.has_value());
331 ASSERT_TRUE(fromBuilderOpt.has_value());
332
333 expectEqualField(expected, *fromSleOpt, "sfGasPrice");
334 expectEqualField(expected, *fromBuilderOpt, "sfGasPrice");
335 }
336
337 {
338 auto const& expected = previousTxnIDValue;
339
340 auto const fromSleOpt = entryFromSle.getPreviousTxnID();
341 auto const fromBuilderOpt = entryFromBuilder.getPreviousTxnID();
342
343 ASSERT_TRUE(fromSleOpt.has_value());
344 ASSERT_TRUE(fromBuilderOpt.has_value());
345
346 expectEqualField(expected, *fromSleOpt, "sfPreviousTxnID");
347 expectEqualField(expected, *fromBuilderOpt, "sfPreviousTxnID");
348 }
349
350 {
351 auto const& expected = previousTxnLgrSeqValue;
352
353 auto const fromSleOpt = entryFromSle.getPreviousTxnLgrSeq();
354 auto const fromBuilderOpt = entryFromBuilder.getPreviousTxnLgrSeq();
355
356 ASSERT_TRUE(fromSleOpt.has_value());
357 ASSERT_TRUE(fromBuilderOpt.has_value());
358
359 expectEqualField(expected, *fromSleOpt, "sfPreviousTxnLgrSeq");
360 expectEqualField(expected, *fromBuilderOpt, "sfPreviousTxnLgrSeq");
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(FeeSettingsTests, 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(FeeSettings{wrongEntry.getSle()}, std::runtime_error);
384}
385
386// 4) Verify builder throws when constructed from wrong ledger entry type.
387TEST(FeeSettingsTests, 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(FeeSettingsBuilder{wrongEntry.getSle()}, std::runtime_error);
401}
402
403// 5) Build with only required fields and verify optional fields return nullopt.
404TEST(FeeSettingsTests, OptionalFieldsReturnNullopt)
405{
406 UInt256 const index{3u};
407
408
409 FeeSettingsBuilder builder{
410 };
411
412 auto const entry = builder.build(index);
413
414 // Verify optional fields are not present
415 EXPECT_FALSE(entry.hasBaseFee());
416 EXPECT_FALSE(entry.getBaseFee().has_value());
417 EXPECT_FALSE(entry.hasReferenceFeeUnits());
418 EXPECT_FALSE(entry.getReferenceFeeUnits().has_value());
419 EXPECT_FALSE(entry.hasReserveBase());
420 EXPECT_FALSE(entry.getReserveBase().has_value());
421 EXPECT_FALSE(entry.hasReserveIncrement());
422 EXPECT_FALSE(entry.getReserveIncrement().has_value());
423 EXPECT_FALSE(entry.hasBaseFeeDrops());
424 EXPECT_FALSE(entry.getBaseFeeDrops().has_value());
425 EXPECT_FALSE(entry.hasReserveBaseDrops());
426 EXPECT_FALSE(entry.getReserveBaseDrops().has_value());
427 EXPECT_FALSE(entry.hasReserveIncrementDrops());
428 EXPECT_FALSE(entry.getReserveIncrementDrops().has_value());
429 EXPECT_FALSE(entry.hasGasLimit());
430 EXPECT_FALSE(entry.getGasLimit().has_value());
431 EXPECT_FALSE(entry.hasBytecodeSizeLimit());
432 EXPECT_FALSE(entry.getBytecodeSizeLimit().has_value());
433 EXPECT_FALSE(entry.hasGasPrice());
434 EXPECT_FALSE(entry.getGasPrice().has_value());
435 EXPECT_FALSE(entry.hasPreviousTxnID());
436 EXPECT_FALSE(entry.getPreviousTxnID().has_value());
437 EXPECT_FALSE(entry.hasPreviousTxnLgrSeq());
438 EXPECT_FALSE(entry.getPreviousTxnLgrSeq().has_value());
439}
440}
Builder for FeeSettings ledger entries.
FeeSettingsBuilder & setReferenceFeeUnits(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfReferenceFeeUnits (SoeOptional).
FeeSettingsBuilder & setBytecodeSizeLimit(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfBytecodeSizeLimit (SoeOptional).
FeeSettingsBuilder & setPreviousTxnID(std::decay_t< typename SF_UINT256::type::value_type > const &value)
Set sfPreviousTxnID (SoeOptional).
FeeSettingsBuilder & setGasLimit(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfGasLimit (SoeOptional).
FeeSettingsBuilder & setPreviousTxnLgrSeq(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfPreviousTxnLgrSeq (SoeOptional).
FeeSettingsBuilder & setGasPrice(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfGasPrice (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).
FeeSettings build(UInt256 const &index)
Build and return the completed FeeSettings wrapper.
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
protocol_autogen::Optional< SF_AMOUNT::type::value_type > getReserveIncrementDrops() const
Get sfReserveIncrementDrops (SoeOptional).
static constexpr LedgerEntryType entryType
Definition FeeSettings.h:30
protocol_autogen::Optional< SF_UINT256::type::value_type > getPreviousTxnID() const
Get sfPreviousTxnID (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getPreviousTxnLgrSeq() const
Get sfPreviousTxnLgrSeq (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getReserveBase() const
Get sfReserveBase (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getReserveIncrement() const
Get sfReserveIncrement (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getGasLimit() const
Get sfGasLimit (SoeOptional).
protocol_autogen::Optional< SF_AMOUNT::type::value_type > getReserveBaseDrops() const
Get sfReserveBaseDrops (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getGasPrice() const
Get sfGasPrice (SoeOptional).
protocol_autogen::Optional< SF_UINT32::type::value_type > getReferenceFeeUnits() const
Get sfReferenceFeeUnits (SoeOptional).
Definition FeeSettings.h:78
protocol_autogen::Optional< SF_UINT32::type::value_type > getBytecodeSizeLimit() const
Get sfBytecodeSizeLimit (SoeOptional).
protocol_autogen::Optional< SF_AMOUNT::type::value_type > getBaseFeeDrops() const
Get sfBaseFeeDrops (SoeOptional).
protocol_autogen::Optional< SF_UINT64::type::value_type > getBaseFee() const
Get sfBaseFee (SoeOptional).
Definition FeeSettings.h:54
UInt256 const & getKey() const
Get the key (index) of this ledger entry.
bool validate() const
Validate the 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 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)