rippled
Loading...
Searching...
No Matches
EscrowFinishTests.cpp
1// Auto-generated unit tests for transaction EscrowFinish
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/EscrowFinish.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(TransactionsEscrowFinishTests, BuilderSettersRoundTrip)
21{
22 // Generate a deterministic keypair for signing
23 auto const [publicKey, secretKey] =
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 ownerValue = canonical_ACCOUNT();
33 auto const offerSequenceValue = canonical_UINT32();
34 auto const fulfillmentValue = canonical_VL();
35 auto const conditionValue = canonical_VL();
36 auto const credentialIDsValue = canonical_VECTOR256();
37
38 EscrowFinishBuilder builder{
39 accountValue,
40 ownerValue,
41 offerSequenceValue,
42 sequenceValue,
43 feeValue
44 };
45
46 // Set optional fields
47 builder.setFulfillment(fulfillmentValue);
48 builder.setCondition(conditionValue);
49 builder.setCredentialIDs(credentialIDsValue);
50
51 auto tx = builder.build(publicKey, secretKey);
52
53 std::string reason;
54 EXPECT_TRUE(tx.validate(reason)) << reason;
55
56 // Verify signing was applied
57 EXPECT_FALSE(tx.getSigningPubKey().empty());
58 EXPECT_TRUE(tx.hasTxnSignature());
59
60 // Verify common fields
61 EXPECT_EQ(tx.getAccount(), accountValue);
62 EXPECT_EQ(tx.getSequence(), sequenceValue);
63 EXPECT_EQ(tx.getFee(), feeValue);
64
65 // Verify required fields
66 {
67 auto const& expected = ownerValue;
68 auto const actual = tx.getOwner();
69 expectEqualField(expected, actual, "sfOwner");
70 }
71
72 {
73 auto const& expected = offerSequenceValue;
74 auto const actual = tx.getOfferSequence();
75 expectEqualField(expected, actual, "sfOfferSequence");
76 }
77
78 // Verify optional fields
79 {
80 auto const& expected = fulfillmentValue;
81 auto const actualOpt = tx.getFulfillment();
82 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFulfillment should be present";
83 expectEqualField(expected, *actualOpt, "sfFulfillment");
84 EXPECT_TRUE(tx.hasFulfillment());
85 }
86
87 {
88 auto const& expected = conditionValue;
89 auto const actualOpt = tx.getCondition();
90 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfCondition should be present";
91 expectEqualField(expected, *actualOpt, "sfCondition");
92 EXPECT_TRUE(tx.hasCondition());
93 }
94
95 {
96 auto const& expected = credentialIDsValue;
97 auto const actualOpt = tx.getCredentialIDs();
98 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfCredentialIDs should be present";
99 expectEqualField(expected, *actualOpt, "sfCredentialIDs");
100 EXPECT_TRUE(tx.hasCredentialIDs());
101 }
102
103}
104
105// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
106// and verify all fields match.
107TEST(TransactionsEscrowFinishTests, BuilderFromStTxRoundTrip)
108{
109 // Generate a deterministic keypair for signing
110 auto const [publicKey, secretKey] =
111 generateKeyPair(KeyType::secp256k1, generateSeed("testEscrowFinishFromTx"));
112
113 // Common transaction fields
114 auto const accountValue = calcAccountID(publicKey);
115 std::uint32_t const sequenceValue = 2;
116 auto const feeValue = canonical_AMOUNT();
117
118 // Transaction-specific field values
119 auto const ownerValue = canonical_ACCOUNT();
120 auto const offerSequenceValue = canonical_UINT32();
121 auto const fulfillmentValue = canonical_VL();
122 auto const conditionValue = canonical_VL();
123 auto const credentialIDsValue = canonical_VECTOR256();
124
125 // Build an initial transaction
126 EscrowFinishBuilder initialBuilder{
127 accountValue,
128 ownerValue,
129 offerSequenceValue,
130 sequenceValue,
131 feeValue
132 };
133
134 initialBuilder.setFulfillment(fulfillmentValue);
135 initialBuilder.setCondition(conditionValue);
136 initialBuilder.setCredentialIDs(credentialIDsValue);
137
138 auto initialTx = initialBuilder.build(publicKey, secretKey);
139
140 // Create builder from existing STTx
141 EscrowFinishBuilder builderFromTx{initialTx.getSTTx()};
142
143 auto rebuiltTx = builderFromTx.build(publicKey, secretKey);
144
145 std::string reason;
146 EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
147
148 // Verify common fields
149 EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
150 EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
151 EXPECT_EQ(rebuiltTx.getFee(), feeValue);
152
153 // Verify required fields
154 {
155 auto const& expected = ownerValue;
156 auto const actual = rebuiltTx.getOwner();
157 expectEqualField(expected, actual, "sfOwner");
158 }
159
160 {
161 auto const& expected = offerSequenceValue;
162 auto const actual = rebuiltTx.getOfferSequence();
163 expectEqualField(expected, actual, "sfOfferSequence");
164 }
165
166 // Verify optional fields
167 {
168 auto const& expected = fulfillmentValue;
169 auto const actualOpt = rebuiltTx.getFulfillment();
170 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFulfillment should be present";
171 expectEqualField(expected, *actualOpt, "sfFulfillment");
172 }
173
174 {
175 auto const& expected = conditionValue;
176 auto const actualOpt = rebuiltTx.getCondition();
177 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfCondition should be present";
178 expectEqualField(expected, *actualOpt, "sfCondition");
179 }
180
181 {
182 auto const& expected = credentialIDsValue;
183 auto const actualOpt = rebuiltTx.getCredentialIDs();
184 ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfCredentialIDs should be present";
185 expectEqualField(expected, *actualOpt, "sfCredentialIDs");
186 }
187
188}
189
190// 3) Verify wrapper throws when constructed from wrong transaction type.
191TEST(TransactionsEscrowFinishTests, WrapperThrowsOnWrongTxType)
192{
193 // Build a valid transaction of a different type
194 auto const [pk, sk] =
196 auto const account = calcAccountID(pk);
197
198 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
199 auto wrongTx = wrongBuilder.build(pk, sk);
200
201 EXPECT_THROW(EscrowFinish{wrongTx.getSTTx()}, std::runtime_error);
202}
203
204// 4) Verify builder throws when constructed from wrong transaction type.
205TEST(TransactionsEscrowFinishTests, BuilderThrowsOnWrongTxType)
206{
207 // Build a valid transaction of a different type
208 auto const [pk, sk] =
209 generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder"));
210 auto const account = calcAccountID(pk);
211
212 AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()};
213 auto wrongTx = wrongBuilder.build(pk, sk);
214
215 EXPECT_THROW(EscrowFinishBuilder{wrongTx.getSTTx()}, std::runtime_error);
216}
217
218// 5) Build with only required fields and verify optional fields return nullopt.
219TEST(TransactionsEscrowFinishTests, OptionalFieldsReturnNullopt)
220{
221 // Generate a deterministic keypair for signing
222 auto const [publicKey, secretKey] =
223 generateKeyPair(KeyType::secp256k1, generateSeed("testEscrowFinishNullopt"));
224
225 // Common transaction fields
226 auto const accountValue = calcAccountID(publicKey);
227 std::uint32_t const sequenceValue = 3;
228 auto const feeValue = canonical_AMOUNT();
229
230 // Transaction-specific required field values
231 auto const ownerValue = canonical_ACCOUNT();
232 auto const offerSequenceValue = canonical_UINT32();
233
234 EscrowFinishBuilder builder{
235 accountValue,
236 ownerValue,
237 offerSequenceValue,
238 sequenceValue,
239 feeValue
240 };
241
242 // Do NOT set optional fields
243
244 auto tx = builder.build(publicKey, secretKey);
245
246 // Verify optional fields are not present
247 EXPECT_FALSE(tx.hasFulfillment());
248 EXPECT_FALSE(tx.getFulfillment().has_value());
249 EXPECT_FALSE(tx.hasCondition());
250 EXPECT_FALSE(tx.getCondition().has_value());
251 EXPECT_FALSE(tx.hasCredentialIDs());
252 EXPECT_FALSE(tx.getCredentialIDs().has_value());
253}
254
255}
EscrowFinish build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the EscrowFinish wrapper.
std::shared_ptr< STTx const > getSTTx() const
Get the underlying STTx object.
TEST(TransactionsAccountDeleteTests, BuilderSettersRoundTrip)
Vector256Value canonical_VECTOR256()
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition Seed.cpp:57
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)