rippled
Loading...
Searching...
No Matches
BridgeTests.cpp
1// Auto-generated unit tests for ledger entry Bridge
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/Bridge.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(BridgeTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const accountValue = canonical_ACCOUNT();
24 auto const signatureRewardValue = canonical_AMOUNT();
25 auto const minAccountCreateAmountValue = canonical_AMOUNT();
26 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
27 auto const xChainClaimIDValue = canonical_UINT64();
28 auto const xChainAccountCreateCountValue = canonical_UINT64();
29 auto const xChainAccountClaimCountValue = canonical_UINT64();
30 auto const ownerNodeValue = canonical_UINT64();
31 auto const previousTxnIDValue = canonical_UINT256();
32 auto const previousTxnLgrSeqValue = canonical_UINT32();
33
34 BridgeBuilder builder{
35 accountValue,
36 signatureRewardValue,
37 xChainBridgeValue,
38 xChainClaimIDValue,
39 xChainAccountCreateCountValue,
40 xChainAccountClaimCountValue,
41 ownerNodeValue,
42 previousTxnIDValue,
43 previousTxnLgrSeqValue
44 };
45
46 builder.setMinAccountCreateAmount(minAccountCreateAmountValue);
47
48 builder.setLedgerIndex(index);
49 builder.setFlags(0x1u);
50
51 EXPECT_TRUE(builder.validate());
52
53 auto const entry = builder.build(index);
54
55 EXPECT_TRUE(entry.validate());
56
57 {
58 auto const& expected = accountValue;
59 auto const actual = entry.getAccount();
60 expectEqualField(expected, actual, "sfAccount");
61 }
62
63 {
64 auto const& expected = signatureRewardValue;
65 auto const actual = entry.getSignatureReward();
66 expectEqualField(expected, actual, "sfSignatureReward");
67 }
68
69 {
70 auto const& expected = xChainBridgeValue;
71 auto const actual = entry.getXChainBridge();
72 expectEqualField(expected, actual, "sfXChainBridge");
73 }
74
75 {
76 auto const& expected = xChainClaimIDValue;
77 auto const actual = entry.getXChainClaimID();
78 expectEqualField(expected, actual, "sfXChainClaimID");
79 }
80
81 {
82 auto const& expected = xChainAccountCreateCountValue;
83 auto const actual = entry.getXChainAccountCreateCount();
84 expectEqualField(expected, actual, "sfXChainAccountCreateCount");
85 }
86
87 {
88 auto const& expected = xChainAccountClaimCountValue;
89 auto const actual = entry.getXChainAccountClaimCount();
90 expectEqualField(expected, actual, "sfXChainAccountClaimCount");
91 }
92
93 {
94 auto const& expected = ownerNodeValue;
95 auto const actual = entry.getOwnerNode();
96 expectEqualField(expected, actual, "sfOwnerNode");
97 }
98
99 {
100 auto const& expected = previousTxnIDValue;
101 auto const actual = entry.getPreviousTxnID();
102 expectEqualField(expected, actual, "sfPreviousTxnID");
103 }
104
105 {
106 auto const& expected = previousTxnLgrSeqValue;
107 auto const actual = entry.getPreviousTxnLgrSeq();
108 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
109 }
110
111 {
112 auto const& expected = minAccountCreateAmountValue;
113 auto const actualOpt = entry.getMinAccountCreateAmount();
114 ASSERT_TRUE(actualOpt.has_value());
115 expectEqualField(expected, *actualOpt, "sfMinAccountCreateAmount");
116 EXPECT_TRUE(entry.hasMinAccountCreateAmount());
117 }
118
119 EXPECT_TRUE(entry.hasLedgerIndex());
120 auto const ledgerIndex = entry.getLedgerIndex();
121 ASSERT_TRUE(ledgerIndex.has_value());
122 EXPECT_EQ(*ledgerIndex, index);
123 EXPECT_EQ(entry.getKey(), index);
124}
125
126// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
127// from that SLE, build a new wrapper, and verify all fields (and validate()).
128TEST(BridgeTests, BuilderFromSleRoundTrip)
129{
130 uint256 const index{2u};
131
132 auto const accountValue = canonical_ACCOUNT();
133 auto const signatureRewardValue = canonical_AMOUNT();
134 auto const minAccountCreateAmountValue = canonical_AMOUNT();
135 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
136 auto const xChainClaimIDValue = canonical_UINT64();
137 auto const xChainAccountCreateCountValue = canonical_UINT64();
138 auto const xChainAccountClaimCountValue = canonical_UINT64();
139 auto const ownerNodeValue = canonical_UINT64();
140 auto const previousTxnIDValue = canonical_UINT256();
141 auto const previousTxnLgrSeqValue = canonical_UINT32();
142
143 auto sle = std::make_shared<SLE>(Bridge::entryType, index);
144
145 sle->at(sfAccount) = accountValue;
146 sle->at(sfSignatureReward) = signatureRewardValue;
147 sle->at(sfMinAccountCreateAmount) = minAccountCreateAmountValue;
148 sle->at(sfXChainBridge) = xChainBridgeValue;
149 sle->at(sfXChainClaimID) = xChainClaimIDValue;
150 sle->at(sfXChainAccountCreateCount) = xChainAccountCreateCountValue;
151 sle->at(sfXChainAccountClaimCount) = xChainAccountClaimCountValue;
152 sle->at(sfOwnerNode) = ownerNodeValue;
153 sle->at(sfPreviousTxnID) = previousTxnIDValue;
154 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
155
156 BridgeBuilder builderFromSle{sle};
157 EXPECT_TRUE(builderFromSle.validate());
158
159 auto const entryFromBuilder = builderFromSle.build(index);
160
161 Bridge entryFromSle{sle};
162 EXPECT_TRUE(entryFromBuilder.validate());
163 EXPECT_TRUE(entryFromSle.validate());
164
165 {
166 auto const& expected = accountValue;
167
168 auto const fromSle = entryFromSle.getAccount();
169 auto const fromBuilder = entryFromBuilder.getAccount();
170
171 expectEqualField(expected, fromSle, "sfAccount");
172 expectEqualField(expected, fromBuilder, "sfAccount");
173 }
174
175 {
176 auto const& expected = signatureRewardValue;
177
178 auto const fromSle = entryFromSle.getSignatureReward();
179 auto const fromBuilder = entryFromBuilder.getSignatureReward();
180
181 expectEqualField(expected, fromSle, "sfSignatureReward");
182 expectEqualField(expected, fromBuilder, "sfSignatureReward");
183 }
184
185 {
186 auto const& expected = xChainBridgeValue;
187
188 auto const fromSle = entryFromSle.getXChainBridge();
189 auto const fromBuilder = entryFromBuilder.getXChainBridge();
190
191 expectEqualField(expected, fromSle, "sfXChainBridge");
192 expectEqualField(expected, fromBuilder, "sfXChainBridge");
193 }
194
195 {
196 auto const& expected = xChainClaimIDValue;
197
198 auto const fromSle = entryFromSle.getXChainClaimID();
199 auto const fromBuilder = entryFromBuilder.getXChainClaimID();
200
201 expectEqualField(expected, fromSle, "sfXChainClaimID");
202 expectEqualField(expected, fromBuilder, "sfXChainClaimID");
203 }
204
205 {
206 auto const& expected = xChainAccountCreateCountValue;
207
208 auto const fromSle = entryFromSle.getXChainAccountCreateCount();
209 auto const fromBuilder = entryFromBuilder.getXChainAccountCreateCount();
210
211 expectEqualField(expected, fromSle, "sfXChainAccountCreateCount");
212 expectEqualField(expected, fromBuilder, "sfXChainAccountCreateCount");
213 }
214
215 {
216 auto const& expected = xChainAccountClaimCountValue;
217
218 auto const fromSle = entryFromSle.getXChainAccountClaimCount();
219 auto const fromBuilder = entryFromBuilder.getXChainAccountClaimCount();
220
221 expectEqualField(expected, fromSle, "sfXChainAccountClaimCount");
222 expectEqualField(expected, fromBuilder, "sfXChainAccountClaimCount");
223 }
224
225 {
226 auto const& expected = ownerNodeValue;
227
228 auto const fromSle = entryFromSle.getOwnerNode();
229 auto const fromBuilder = entryFromBuilder.getOwnerNode();
230
231 expectEqualField(expected, fromSle, "sfOwnerNode");
232 expectEqualField(expected, fromBuilder, "sfOwnerNode");
233 }
234
235 {
236 auto const& expected = previousTxnIDValue;
237
238 auto const fromSle = entryFromSle.getPreviousTxnID();
239 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
240
241 expectEqualField(expected, fromSle, "sfPreviousTxnID");
242 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
243 }
244
245 {
246 auto const& expected = previousTxnLgrSeqValue;
247
248 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
249 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
250
251 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
252 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
253 }
254
255 {
256 auto const& expected = minAccountCreateAmountValue;
257
258 auto const fromSleOpt = entryFromSle.getMinAccountCreateAmount();
259 auto const fromBuilderOpt = entryFromBuilder.getMinAccountCreateAmount();
260
261 ASSERT_TRUE(fromSleOpt.has_value());
262 ASSERT_TRUE(fromBuilderOpt.has_value());
263
264 expectEqualField(expected, *fromSleOpt, "sfMinAccountCreateAmount");
265 expectEqualField(expected, *fromBuilderOpt, "sfMinAccountCreateAmount");
266 }
267
268 EXPECT_EQ(entryFromSle.getKey(), index);
269 EXPECT_EQ(entryFromBuilder.getKey(), index);
270}
271
272// 3) Verify wrapper throws when constructed from wrong ledger entry type.
273TEST(BridgeTests, WrapperThrowsOnWrongEntryType)
274{
275 uint256 const index{3u};
276
277 // Build a valid ledger entry of a different type
278 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
279 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
280 TicketBuilder wrongBuilder{
286 auto wrongEntry = wrongBuilder.build(index);
287
288 EXPECT_THROW(Bridge{wrongEntry.getSle()}, std::runtime_error);
289}
290
291// 4) Verify builder throws when constructed from wrong ledger entry type.
292TEST(BridgeTests, BuilderThrowsOnWrongEntryType)
293{
294 uint256 const index{4u};
295
296 // Build a valid ledger entry of a different type
297 TicketBuilder wrongBuilder{
303 auto wrongEntry = wrongBuilder.build(index);
304
305 EXPECT_THROW(BridgeBuilder{wrongEntry.getSle()}, std::runtime_error);
306}
307
308// 5) Build with only required fields and verify optional fields return nullopt.
309TEST(BridgeTests, OptionalFieldsReturnNullopt)
310{
311 uint256 const index{3u};
312
313 auto const accountValue = canonical_ACCOUNT();
314 auto const signatureRewardValue = canonical_AMOUNT();
315 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
316 auto const xChainClaimIDValue = canonical_UINT64();
317 auto const xChainAccountCreateCountValue = canonical_UINT64();
318 auto const xChainAccountClaimCountValue = canonical_UINT64();
319 auto const ownerNodeValue = canonical_UINT64();
320 auto const previousTxnIDValue = canonical_UINT256();
321 auto const previousTxnLgrSeqValue = canonical_UINT32();
322
323 BridgeBuilder builder{
324 accountValue,
325 signatureRewardValue,
326 xChainBridgeValue,
327 xChainClaimIDValue,
328 xChainAccountCreateCountValue,
329 xChainAccountClaimCountValue,
330 ownerNodeValue,
331 previousTxnIDValue,
332 previousTxnLgrSeqValue
333 };
334
335 auto const entry = builder.build(index);
336
337 // Verify optional fields are not present
338 EXPECT_FALSE(entry.hasMinAccountCreateAmount());
339 EXPECT_FALSE(entry.getMinAccountCreateAmount().has_value());
340}
341}
Builder for Bridge ledger entries.
Definition Bridge.h:180
BridgeBuilder & setMinAccountCreateAmount(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Set sfMinAccountCreateAmount (soeOPTIONAL)
Definition Bridge.h:251
Ledger Entry: Bridge.
Definition Bridge.h:28
static constexpr LedgerEntryType entryType
Definition Bridge.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)
XChainBridgeValue canonical_XCHAIN_BRIDGE()
void expectEqualField(T const &expected, T const &actual, char const *fieldName)