xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
tests
libxrpl
protocol_autogen
transactions
TrustSetTests.cpp
1
// Auto-generated unit tests for transaction TrustSet
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/TrustSet.h>
12
#include <xrpl/protocol_autogen/transactions/AccountSet.h>
13
14
#include <
string
>
15
16
namespace
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.
20
TEST
(TransactionsTrustSetTests, BuilderSettersRoundTrip)
21
{
22
// Generate a deterministic keypair for signing
23
auto
const
[publicKey, secretKey] =
24
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testTrustSet"
));
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
limitAmountValue =
canonical_AMOUNT
();
33
auto
const
qualityInValue =
canonical_UINT32
();
34
auto
const
qualityOutValue =
canonical_UINT32
();
35
36
TrustSetBuilder
builder{
37
accountValue,
38
sequenceValue,
39
feeValue
40
};
41
42
// Set optional fields
43
builder.
setLimitAmount
(limitAmountValue);
44
builder.
setQualityIn
(qualityInValue);
45
builder.
setQualityOut
(qualityOutValue);
46
47
auto
tx = builder.
build
(publicKey, secretKey);
48
49
std::string
reason;
50
EXPECT_TRUE(tx.validate(reason)) << reason;
51
52
// Verify signing was applied
53
EXPECT_FALSE(tx.getSigningPubKey().empty());
54
EXPECT_TRUE(tx.hasTxnSignature());
55
56
// Verify common fields
57
EXPECT_EQ(tx.getAccount(), accountValue);
58
EXPECT_EQ(tx.getSequence(), sequenceValue);
59
EXPECT_EQ(tx.getFee(), feeValue);
60
61
// Verify required fields
62
// Verify optional fields
63
{
64
auto
const
& expected = limitAmountValue;
65
auto
const
actualOpt = tx.getLimitAmount();
66
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfLimitAmount should be present"
;
67
expectEqualField
(expected, *actualOpt,
"sfLimitAmount"
);
68
EXPECT_TRUE(tx.hasLimitAmount());
69
}
70
71
{
72
auto
const
& expected = qualityInValue;
73
auto
const
actualOpt = tx.getQualityIn();
74
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfQualityIn should be present"
;
75
expectEqualField
(expected, *actualOpt,
"sfQualityIn"
);
76
EXPECT_TRUE(tx.hasQualityIn());
77
}
78
79
{
80
auto
const
& expected = qualityOutValue;
81
auto
const
actualOpt = tx.getQualityOut();
82
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfQualityOut should be present"
;
83
expectEqualField
(expected, *actualOpt,
"sfQualityOut"
);
84
EXPECT_TRUE(tx.hasQualityOut());
85
}
86
87
}
88
89
// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
90
// and verify all fields match.
91
TEST
(TransactionsTrustSetTests, BuilderFromStTxRoundTrip)
92
{
93
// Generate a deterministic keypair for signing
94
auto
const
[publicKey, secretKey] =
95
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testTrustSetFromTx"
));
96
97
// Common transaction fields
98
auto
const
accountValue =
calcAccountID
(publicKey);
99
std::uint32_t
const
sequenceValue = 2;
100
auto
const
feeValue =
canonical_AMOUNT
();
101
102
// Transaction-specific field values
103
auto
const
limitAmountValue =
canonical_AMOUNT
();
104
auto
const
qualityInValue =
canonical_UINT32
();
105
auto
const
qualityOutValue =
canonical_UINT32
();
106
107
// Build an initial transaction
108
TrustSetBuilder
initialBuilder{
109
accountValue,
110
sequenceValue,
111
feeValue
112
};
113
114
initialBuilder.
setLimitAmount
(limitAmountValue);
115
initialBuilder.
setQualityIn
(qualityInValue);
116
initialBuilder.
setQualityOut
(qualityOutValue);
117
118
auto
initialTx = initialBuilder.
build
(publicKey, secretKey);
119
120
// Create builder from existing STTx
121
TrustSetBuilder
builderFromTx{initialTx.getSTTx()};
122
123
auto
rebuiltTx = builderFromTx.
build
(publicKey, secretKey);
124
125
std::string
reason;
126
EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
127
128
// Verify common fields
129
EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
130
EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
131
EXPECT_EQ(rebuiltTx.getFee(), feeValue);
132
133
// Verify required fields
134
// Verify optional fields
135
{
136
auto
const
& expected = limitAmountValue;
137
auto
const
actualOpt = rebuiltTx.getLimitAmount();
138
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfLimitAmount should be present"
;
139
expectEqualField
(expected, *actualOpt,
"sfLimitAmount"
);
140
}
141
142
{
143
auto
const
& expected = qualityInValue;
144
auto
const
actualOpt = rebuiltTx.getQualityIn();
145
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfQualityIn should be present"
;
146
expectEqualField
(expected, *actualOpt,
"sfQualityIn"
);
147
}
148
149
{
150
auto
const
& expected = qualityOutValue;
151
auto
const
actualOpt = rebuiltTx.getQualityOut();
152
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfQualityOut should be present"
;
153
expectEqualField
(expected, *actualOpt,
"sfQualityOut"
);
154
}
155
156
}
157
158
// 3) Verify wrapper throws when constructed from wrong transaction type.
159
TEST
(TransactionsTrustSetTests, WrapperThrowsOnWrongTxType)
160
{
161
// Build a valid transaction of a different type
162
auto
const
[pk, sk] =
163
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testWrongType"
));
164
auto
const
account =
calcAccountID
(pk);
165
166
AccountSetBuilder
wrongBuilder{account, 1,
canonical_AMOUNT
()};
167
auto
wrongTx = wrongBuilder.
build
(pk, sk);
168
169
EXPECT_THROW(
TrustSet
{wrongTx.getSTTx()},
std::runtime_error
);
170
}
171
172
// 4) Verify builder throws when constructed from wrong transaction type.
173
TEST
(TransactionsTrustSetTests, BuilderThrowsOnWrongTxType)
174
{
175
// Build a valid transaction of a different type
176
auto
const
[pk, sk] =
177
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testWrongTypeBuilder"
));
178
auto
const
account =
calcAccountID
(pk);
179
180
AccountSetBuilder
wrongBuilder{account, 1,
canonical_AMOUNT
()};
181
auto
wrongTx = wrongBuilder.
build
(pk, sk);
182
183
EXPECT_THROW(
TrustSetBuilder
{wrongTx.getSTTx()},
std::runtime_error
);
184
}
185
186
// 5) Build with only required fields and verify optional fields return nullopt.
187
TEST
(TransactionsTrustSetTests, OptionalFieldsReturnNullopt)
188
{
189
// Generate a deterministic keypair for signing
190
auto
const
[publicKey, secretKey] =
191
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testTrustSetNullopt"
));
192
193
// Common transaction fields
194
auto
const
accountValue =
calcAccountID
(publicKey);
195
std::uint32_t
const
sequenceValue = 3;
196
auto
const
feeValue =
canonical_AMOUNT
();
197
198
// Transaction-specific required field values
199
200
TrustSetBuilder
builder{
201
accountValue,
202
sequenceValue,
203
feeValue
204
};
205
206
// Do NOT set optional fields
207
208
auto
tx = builder.
build
(publicKey, secretKey);
209
210
// Verify optional fields are not present
211
EXPECT_FALSE(tx.hasLimitAmount());
212
EXPECT_FALSE(tx.getLimitAmount().has_value());
213
EXPECT_FALSE(tx.hasQualityIn());
214
EXPECT_FALSE(tx.getQualityIn().has_value());
215
EXPECT_FALSE(tx.hasQualityOut());
216
EXPECT_FALSE(tx.getQualityOut().has_value());
217
}
218
219
}
std::string
xrpl::transactions::AccountSetBuilder
Builder for AccountSet transactions.
Definition
protocol_autogen/transactions/AccountSet.h:319
xrpl::transactions::AccountSetBuilder::build
AccountSet build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the AccountSet wrapper.
Definition
protocol_autogen/transactions/AccountSet.h:470
xrpl::transactions::TrustSetBuilder
Builder for TrustSet transactions.
Definition
protocol_autogen/transactions/TrustSet.h:137
xrpl::transactions::TrustSetBuilder::setQualityOut
TrustSetBuilder & setQualityOut(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfQualityOut (SoeOptional).
Definition
protocol_autogen/transactions/TrustSet.h:198
xrpl::transactions::TrustSetBuilder::setQualityIn
TrustSetBuilder & setQualityIn(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfQualityIn (SoeOptional).
Definition
protocol_autogen/transactions/TrustSet.h:187
xrpl::transactions::TrustSetBuilder::setLimitAmount
TrustSetBuilder & setLimitAmount(std::decay_t< typename SF_AMOUNT::type::value_type > const &value)
Transaction-specific field setters.
Definition
protocol_autogen/transactions/TrustSet.h:176
xrpl::transactions::TrustSetBuilder::build
TrustSet build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the TrustSet wrapper.
Definition
protocol_autogen/transactions/TrustSet.h:211
xrpl::transactions::TrustSet
Transaction: TrustSet.
Definition
protocol_autogen/transactions/TrustSet.h:30
std::uint32_t
xrpl::transactions
Definition
TransactionBase.h:15
xrpl::transactions::TEST
TEST(TransactionsAccountDeleteTests, BuilderSettersRoundTrip)
Definition
AccountDeleteTests.cpp:20
xrpl::KeyType::Secp256k1
@ Secp256k1
Definition
KeyType.h:9
xrpl::canonical_UINT32
UInt32Value canonical_UINT32()
Definition
/libxrpl/protocol_autogen/TestHelpers.h:48
xrpl::generateSeed
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.
Definition
Seed.cpp:58
xrpl::generateKeyPair
std::pair< PublicKey, SecretKey > generateKeyPair(KeyType type, Seed const &seed)
Generate a key pair deterministically.
Definition
SecretKey.cpp:338
xrpl::canonical_AMOUNT
AmountValue canonical_AMOUNT()
Definition
/libxrpl/protocol_autogen/TestHelpers.h:104
xrpl::calcAccountID
AccountID calcAccountID(PublicKey const &pk)
Definition
AccountID.cpp:149
xrpl::expectEqualField
void expectEqualField(T const &expected, T const &actual, char const *fieldName)
Definition
/libxrpl/protocol_autogen/TestHelpers.h:178
std::runtime_error
string
Generated by
1.17.0