rippled
Loading...
Searching...
No Matches
XChainAddClaimAttestationTests.cpp
1// Auto-generated unit tests for transaction XChainAddClaimAttestation
2
3
4#include <gtest/gtest.h>
5
6#include <protocol_autogen/TestHelpers.h>
7
8#include <xrpl/protocol/SecretKey.h>
9#include <xrpl/protocol/Seed.h>
10#include <xrpl/protocol/STTx.h>
11#include <xrpl/protocol_autogen/transactions/XChainAddClaimAttestation.h>
12#include <xrpl/protocol_autogen/transactions/AccountSet.h>
13
14#include <string>
15
16namespace xrpl::transactions {
17
18// 1 & 4) Set fields via builder setters, build, then read them back via
19// wrapper getters. After build(), validate() should succeed.
20TEST(TransactionsXChainAddClaimAttestationTests, BuilderSettersRoundTrip)
21{
22 // Generate a deterministic keypair for signing
23 auto const [publicKey, secretKey] =
24 generateKeyPair(KeyType::secp256k1, generateSeed("testXChainAddClaimAttestation"));
25
26 // Common transaction fields
27 auto const accountValue = calcAccountID(publicKey);
28 std::uint32_t const sequenceValue = 1;
29 auto const feeValue = canonical_AMOUNT();
30
31 // Transaction-specific field values
32 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
33 auto const attestationSignerAccountValue = canonical_ACCOUNT();
34 auto const publicKeyValue = canonical_VL();
35 auto const signatureValue = canonical_VL();
36 auto const otherChainSourceValue = canonical_ACCOUNT();
37 auto const amountValue = canonical_AMOUNT();
38 auto const attestationRewardAccountValue = canonical_ACCOUNT();
39 auto const wasLockingChainSendValue = canonical_UINT8();
40 auto const xChainClaimIDValue = canonical_UINT64();
41 auto const destinationValue = canonical_ACCOUNT();
42
44 accountValue,
45 xChainBridgeValue,
46 attestationSignerAccountValue,
47 publicKeyValue,
48 signatureValue,
49 otherChainSourceValue,
50 amountValue,
51 attestationRewardAccountValue,
52 wasLockingChainSendValue,
53 xChainClaimIDValue,
54 sequenceValue,
55 feeValue
56 };
57
58 // Set optional fields
59 builder.setDestination(destinationValue);
60
61 auto tx = builder.build(publicKey, secretKey);
62
63 std::string reason;
64 EXPECT_TRUE(tx.validate(reason)) << reason;
65
66 // Verify signing was applied
67 EXPECT_FALSE(tx.getSigningPubKey().empty());
68 EXPECT_TRUE(tx.hasTxnSignature());
69
70 // Verify common fields
71 EXPECT_EQ(tx.getAccount(), accountValue);
72 EXPECT_EQ(tx.getSequence(), sequenceValue);
73 EXPECT_EQ(tx.getFee(), feeValue);
74
75 // Verify required fields
76 {
77 auto const& expected = xChainBridgeValue;
78 auto const actual = tx.getXChainBridge();
79 expectEqualField(expected, actual, "sfXChainBridge");
80 }
81
82 {
83 auto const& expected = attestationSignerAccountValue;
84 auto const actual = tx.getAttestationSignerAccount();
85 expectEqualField(expected, actual, "sfAttestationSignerAccount");
86 }
87
88 {
89 auto const& expected = publicKeyValue;
90 auto const actual = tx.getPublicKey();
91 expectEqualField(expected, actual, "sfPublicKey");
92 }
93
94 {
95 auto const& expected = signatureValue;
96 auto const actual = tx.getSignature();
97 expectEqualField(expected, actual, "sfSignature");
98 }
99
100 {
101 auto const& expected = otherChainSourceValue;
102 auto const actual = tx.getOtherChainSource();
103 expectEqualField(expected, actual, "sfOtherChainSource");
104 }
105
106 {
107 auto const& expected = amountValue;
108 auto const actual = tx.getAmount();
109 expectEqualField(expected, actual, "sfAmount");
110 }
111
112 {
113 auto const& expected = attestationRewardAccountValue;
114 auto const actual = tx.getAttestationRewardAccount();
115 expectEqualField(expected, actual, "sfAttestationRewardAccount");
116 }
117
118 {
119 auto const& expected = wasLockingChainSendValue;
120 auto const actual = tx.getWasLockingChainSend();
121 expectEqualField(expected, actual, "sfWasLockingChainSend");
122 }
123
124 {
125 auto const& expected = xChainClaimIDValue;
126 auto const actual = tx.getXChainClaimID();
127 expectEqualField(expected, actual, "sfXChainClaimID");
128 }
129
130 // Verify optional fields
131 {
132 auto const& expected = destinationValue;
133 auto const actualOpt = tx.getDestination();
134 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfDestination should be present";
135 expectEqualField(expected, *actualOpt, "sfDestination");
136 EXPECT_TRUE(tx.hasDestination());
137 }
138
139}
140
141// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
142// and verify all fields match.
143TEST(TransactionsXChainAddClaimAttestationTests, BuilderFromStTxRoundTrip)
144{
145 // Generate a deterministic keypair for signing
146 auto const [publicKey, secretKey] =
147 generateKeyPair(KeyType::secp256k1, generateSeed("testXChainAddClaimAttestationFromTx"));
148
149 // Common transaction fields
150 auto const accountValue = calcAccountID(publicKey);
151 std::uint32_t const sequenceValue = 2;
152 auto const feeValue = canonical_AMOUNT();
153
154 // Transaction-specific field values
155 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
156 auto const attestationSignerAccountValue = canonical_ACCOUNT();
157 auto const publicKeyValue = canonical_VL();
158 auto const signatureValue = canonical_VL();
159 auto const otherChainSourceValue = canonical_ACCOUNT();
160 auto const amountValue = canonical_AMOUNT();
161 auto const attestationRewardAccountValue = canonical_ACCOUNT();
162 auto const wasLockingChainSendValue = canonical_UINT8();
163 auto const xChainClaimIDValue = canonical_UINT64();
164 auto const destinationValue = canonical_ACCOUNT();
165
166 // Build an initial transaction
168 accountValue,
169 xChainBridgeValue,
170 attestationSignerAccountValue,
171 publicKeyValue,
172 signatureValue,
173 otherChainSourceValue,
174 amountValue,
175 attestationRewardAccountValue,
176 wasLockingChainSendValue,
177 xChainClaimIDValue,
178 sequenceValue,
179 feeValue
180 };
181
182 initialBuilder.setDestination(destinationValue);
183
184 auto initialTx = initialBuilder.build(publicKey, secretKey);
185
186 // Create builder from existing STTx
187 XChainAddClaimAttestationBuilder builderFromTx{initialTx.getSTTx()};
188
189 auto rebuiltTx = builderFromTx.build(publicKey, secretKey);
190
191 std::string reason;
192 EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
193
194 // Verify common fields
195 EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
196 EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
197 EXPECT_EQ(rebuiltTx.getFee(), feeValue);
198
199 // Verify required fields
200 {
201 auto const& expected = xChainBridgeValue;
202 auto const actual = rebuiltTx.getXChainBridge();
203 expectEqualField(expected, actual, "sfXChainBridge");
204 }
205
206 {
207 auto const& expected = attestationSignerAccountValue;
208 auto const actual = rebuiltTx.getAttestationSignerAccount();
209 expectEqualField(expected, actual, "sfAttestationSignerAccount");
210 }
211
212 {
213 auto const& expected = publicKeyValue;
214 auto const actual = rebuiltTx.getPublicKey();
215 expectEqualField(expected, actual, "sfPublicKey");
216 }
217
218 {
219 auto const& expected = signatureValue;
220 auto const actual = rebuiltTx.getSignature();
221 expectEqualField(expected, actual, "sfSignature");
222 }
223
224 {
225 auto const& expected = otherChainSourceValue;
226 auto const actual = rebuiltTx.getOtherChainSource();
227 expectEqualField(expected, actual, "sfOtherChainSource");
228 }
229
230 {
231 auto const& expected = amountValue;
232 auto const actual = rebuiltTx.getAmount();
233 expectEqualField(expected, actual, "sfAmount");
234 }
235
236 {
237 auto const& expected = attestationRewardAccountValue;
238 auto const actual = rebuiltTx.getAttestationRewardAccount();
239 expectEqualField(expected, actual, "sfAttestationRewardAccount");
240 }
241
242 {
243 auto const& expected = wasLockingChainSendValue;
244 auto const actual = rebuiltTx.getWasLockingChainSend();
245 expectEqualField(expected, actual, "sfWasLockingChainSend");
246 }
247
248 {
249 auto const& expected = xChainClaimIDValue;
250 auto const actual = rebuiltTx.getXChainClaimID();
251 expectEqualField(expected, actual, "sfXChainClaimID");
252 }
253
254 // Verify optional fields
255 {
256 auto const& expected = destinationValue;
257 auto const actualOpt = rebuiltTx.getDestination();
258 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfDestination should be present";
259 expectEqualField(expected, *actualOpt, "sfDestination");
260 }
261
262}
263
264// 3) Verify wrapper throws when constructed from wrong transaction type.
265TEST(TransactionsXChainAddClaimAttestationTests, WrapperThrowsOnWrongTxType)
266{
267 // Build a valid transaction of a different type
268 auto const [pk, sk] =
270 auto const account = calcAccountID(pk);
271
272 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
273 auto wrongTx = wrongBuilder.build(pk, sk);
274
275 EXPECT_THROW(XChainAddClaimAttestation{wrongTx.getSTTx()}, std::runtime_error);
276}
277
278// 4) Verify builder throws when constructed from wrong transaction type.
279TEST(TransactionsXChainAddClaimAttestationTests, BuilderThrowsOnWrongTxType)
280{
281 // Build a valid transaction of a different type
282 auto const [pk, sk] =
283 generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder"));
284 auto const account = calcAccountID(pk);
285
286 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
287 auto wrongTx = wrongBuilder.build(pk, sk);
288
289 EXPECT_THROW(XChainAddClaimAttestationBuilder{wrongTx.getSTTx()}, std::runtime_error);
290}
291
292// 5) Build with only required fields and verify optional fields return nullopt.
293TEST(TransactionsXChainAddClaimAttestationTests, OptionalFieldsReturnNullopt)
294{
295 // Generate a deterministic keypair for signing
296 auto const [publicKey, secretKey] =
297 generateKeyPair(KeyType::secp256k1, generateSeed("testXChainAddClaimAttestationNullopt"));
298
299 // Common transaction fields
300 auto const accountValue = calcAccountID(publicKey);
301 std::uint32_t const sequenceValue = 3;
302 auto const feeValue = canonical_AMOUNT();
303
304 // Transaction-specific required field values
305 auto const xChainBridgeValue = canonical_XCHAIN_BRIDGE();
306 auto const attestationSignerAccountValue = canonical_ACCOUNT();
307 auto const publicKeyValue = canonical_VL();
308 auto const signatureValue = canonical_VL();
309 auto const otherChainSourceValue = canonical_ACCOUNT();
310 auto const amountValue = canonical_AMOUNT();
311 auto const attestationRewardAccountValue = canonical_ACCOUNT();
312 auto const wasLockingChainSendValue = canonical_UINT8();
313 auto const xChainClaimIDValue = canonical_UINT64();
314
316 accountValue,
317 xChainBridgeValue,
318 attestationSignerAccountValue,
319 publicKeyValue,
320 signatureValue,
321 otherChainSourceValue,
322 amountValue,
323 attestationRewardAccountValue,
324 wasLockingChainSendValue,
325 xChainClaimIDValue,
326 sequenceValue,
327 feeValue
328 };
329
330 // Do NOT set optional fields
331
332 auto tx = builder.build(publicKey, secretKey);
333
334 // Verify optional fields are not present
335 EXPECT_FALSE(tx.hasDestination());
336 EXPECT_FALSE(tx.getDestination().has_value());
337}
338
339}
std::shared_ptr< STTx const > getSTTx() const
Get the underlying STTx object.
Builder for XChainAddClaimAttestation transactions.
XChainAddClaimAttestation build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the XChainAddClaimAttestation wrapper.
Transaction: XChainAddClaimAttestation.
TEST(TransactionsAccountDeleteTests, BuilderSettersRoundTrip)
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition Seed.cpp:57
XChainBridgeValue canonical_XCHAIN_BRIDGE()
std::pair< PublicKey, SecretKey > generateKeyPair(KeyType type, Seed const &seed)
Generate a key pair deterministically.
AccountID calcAccountID(PublicKey const &pk)
void expectEqualField(T const &expected, T const &actual, char const *fieldName)