xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
tests
libxrpl
protocol_autogen
transactions
OracleSetTests.cpp
1
// Auto-generated unit tests for transaction OracleSet
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/OracleSet.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
(TransactionsOracleSetTests, BuilderSettersRoundTrip)
21
{
22
// Generate a deterministic keypair for signing
23
auto
const
[publicKey, secretKey] =
24
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testOracleSet"
));
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
oracleDocumentIDValue =
canonical_UINT32
();
33
auto
const
providerValue =
canonical_VL
();
34
auto
const
uRIValue =
canonical_VL
();
35
auto
const
assetClassValue =
canonical_VL
();
36
auto
const
lastUpdateTimeValue =
canonical_UINT32
();
37
auto
const
priceDataSeriesValue =
canonical_ARRAY
();
38
39
OracleSetBuilder
builder{
40
accountValue,
41
oracleDocumentIDValue,
42
lastUpdateTimeValue,
43
priceDataSeriesValue,
44
sequenceValue,
45
feeValue
46
};
47
48
// Set optional fields
49
builder.
setProvider
(providerValue);
50
builder.
setURI
(uRIValue);
51
builder.
setAssetClass
(assetClassValue);
52
53
auto
tx = builder.
build
(publicKey, secretKey);
54
55
std::string
reason;
56
EXPECT_TRUE(tx.validate(reason)) << reason;
57
58
// Verify signing was applied
59
EXPECT_FALSE(tx.getSigningPubKey().empty());
60
EXPECT_TRUE(tx.hasTxnSignature());
61
62
// Verify common fields
63
EXPECT_EQ(tx.getAccount(), accountValue);
64
EXPECT_EQ(tx.getSequence(), sequenceValue);
65
EXPECT_EQ(tx.getFee(), feeValue);
66
67
// Verify required fields
68
{
69
auto
const
& expected = oracleDocumentIDValue;
70
auto
const
actual = tx.getOracleDocumentID();
71
expectEqualField
(expected, actual,
"sfOracleDocumentID"
);
72
}
73
74
{
75
auto
const
& expected = lastUpdateTimeValue;
76
auto
const
actual = tx.getLastUpdateTime();
77
expectEqualField
(expected, actual,
"sfLastUpdateTime"
);
78
}
79
80
{
81
auto
const
& expected = priceDataSeriesValue;
82
auto
const
actual = tx.getPriceDataSeries();
83
expectEqualField
(expected, actual,
"sfPriceDataSeries"
);
84
}
85
86
// Verify optional fields
87
{
88
auto
const
& expected = providerValue;
89
auto
const
actualOpt = tx.getProvider();
90
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfProvider should be present"
;
91
expectEqualField
(expected, *actualOpt,
"sfProvider"
);
92
EXPECT_TRUE(tx.hasProvider());
93
}
94
95
{
96
auto
const
& expected = uRIValue;
97
auto
const
actualOpt = tx.getURI();
98
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfURI should be present"
;
99
expectEqualField
(expected, *actualOpt,
"sfURI"
);
100
EXPECT_TRUE(tx.hasURI());
101
}
102
103
{
104
auto
const
& expected = assetClassValue;
105
auto
const
actualOpt = tx.getAssetClass();
106
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfAssetClass should be present"
;
107
expectEqualField
(expected, *actualOpt,
"sfAssetClass"
);
108
EXPECT_TRUE(tx.hasAssetClass());
109
}
110
111
}
112
113
// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper,
114
// and verify all fields match.
115
TEST
(TransactionsOracleSetTests, BuilderFromStTxRoundTrip)
116
{
117
// Generate a deterministic keypair for signing
118
auto
const
[publicKey, secretKey] =
119
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testOracleSetFromTx"
));
120
121
// Common transaction fields
122
auto
const
accountValue =
calcAccountID
(publicKey);
123
std::uint32_t
const
sequenceValue = 2;
124
auto
const
feeValue =
canonical_AMOUNT
();
125
126
// Transaction-specific field values
127
auto
const
oracleDocumentIDValue =
canonical_UINT32
();
128
auto
const
providerValue =
canonical_VL
();
129
auto
const
uRIValue =
canonical_VL
();
130
auto
const
assetClassValue =
canonical_VL
();
131
auto
const
lastUpdateTimeValue =
canonical_UINT32
();
132
auto
const
priceDataSeriesValue =
canonical_ARRAY
();
133
134
// Build an initial transaction
135
OracleSetBuilder
initialBuilder{
136
accountValue,
137
oracleDocumentIDValue,
138
lastUpdateTimeValue,
139
priceDataSeriesValue,
140
sequenceValue,
141
feeValue
142
};
143
144
initialBuilder.
setProvider
(providerValue);
145
initialBuilder.
setURI
(uRIValue);
146
initialBuilder.
setAssetClass
(assetClassValue);
147
148
auto
initialTx = initialBuilder.
build
(publicKey, secretKey);
149
150
// Create builder from existing STTx
151
OracleSetBuilder
builderFromTx{initialTx.getSTTx()};
152
153
auto
rebuiltTx = builderFromTx.
build
(publicKey, secretKey);
154
155
std::string
reason;
156
EXPECT_TRUE(rebuiltTx.validate(reason)) << reason;
157
158
// Verify common fields
159
EXPECT_EQ(rebuiltTx.getAccount(), accountValue);
160
EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue);
161
EXPECT_EQ(rebuiltTx.getFee(), feeValue);
162
163
// Verify required fields
164
{
165
auto
const
& expected = oracleDocumentIDValue;
166
auto
const
actual = rebuiltTx.getOracleDocumentID();
167
expectEqualField
(expected, actual,
"sfOracleDocumentID"
);
168
}
169
170
{
171
auto
const
& expected = lastUpdateTimeValue;
172
auto
const
actual = rebuiltTx.getLastUpdateTime();
173
expectEqualField
(expected, actual,
"sfLastUpdateTime"
);
174
}
175
176
{
177
auto
const
& expected = priceDataSeriesValue;
178
auto
const
actual = rebuiltTx.getPriceDataSeries();
179
expectEqualField
(expected, actual,
"sfPriceDataSeries"
);
180
}
181
182
// Verify optional fields
183
{
184
auto
const
& expected = providerValue;
185
auto
const
actualOpt = rebuiltTx.getProvider();
186
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfProvider should be present"
;
187
expectEqualField
(expected, *actualOpt,
"sfProvider"
);
188
}
189
190
{
191
auto
const
& expected = uRIValue;
192
auto
const
actualOpt = rebuiltTx.getURI();
193
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfURI should be present"
;
194
expectEqualField
(expected, *actualOpt,
"sfURI"
);
195
}
196
197
{
198
auto
const
& expected = assetClassValue;
199
auto
const
actualOpt = rebuiltTx.getAssetClass();
200
ASSERT_TRUE(actualOpt.has_value()) <<
"Optional field sfAssetClass should be present"
;
201
expectEqualField
(expected, *actualOpt,
"sfAssetClass"
);
202
}
203
204
}
205
206
// 3) Verify wrapper throws when constructed from wrong transaction type.
207
TEST
(TransactionsOracleSetTests, WrapperThrowsOnWrongTxType)
208
{
209
// Build a valid transaction of a different type
210
auto
const
[pk, sk] =
211
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testWrongType"
));
212
auto
const
account =
calcAccountID
(pk);
213
214
AccountSetBuilder
wrongBuilder{account, 1,
canonical_AMOUNT
()};
215
auto
wrongTx = wrongBuilder.
build
(pk, sk);
216
217
EXPECT_THROW(
OracleSet
{wrongTx.getSTTx()},
std::runtime_error
);
218
}
219
220
// 4) Verify builder throws when constructed from wrong transaction type.
221
TEST
(TransactionsOracleSetTests, BuilderThrowsOnWrongTxType)
222
{
223
// Build a valid transaction of a different type
224
auto
const
[pk, sk] =
225
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testWrongTypeBuilder"
));
226
auto
const
account =
calcAccountID
(pk);
227
228
AccountSetBuilder
wrongBuilder{account, 1,
canonical_AMOUNT
()};
229
auto
wrongTx = wrongBuilder.
build
(pk, sk);
230
231
EXPECT_THROW(
OracleSetBuilder
{wrongTx.getSTTx()},
std::runtime_error
);
232
}
233
234
// 5) Build with only required fields and verify optional fields return nullopt.
235
TEST
(TransactionsOracleSetTests, OptionalFieldsReturnNullopt)
236
{
237
// Generate a deterministic keypair for signing
238
auto
const
[publicKey, secretKey] =
239
generateKeyPair
(
KeyType::Secp256k1
,
generateSeed
(
"testOracleSetNullopt"
));
240
241
// Common transaction fields
242
auto
const
accountValue =
calcAccountID
(publicKey);
243
std::uint32_t
const
sequenceValue = 3;
244
auto
const
feeValue =
canonical_AMOUNT
();
245
246
// Transaction-specific required field values
247
auto
const
oracleDocumentIDValue =
canonical_UINT32
();
248
auto
const
lastUpdateTimeValue =
canonical_UINT32
();
249
auto
const
priceDataSeriesValue =
canonical_ARRAY
();
250
251
OracleSetBuilder
builder{
252
accountValue,
253
oracleDocumentIDValue,
254
lastUpdateTimeValue,
255
priceDataSeriesValue,
256
sequenceValue,
257
feeValue
258
};
259
260
// Do NOT set optional fields
261
262
auto
tx = builder.
build
(publicKey, secretKey);
263
264
// Verify optional fields are not present
265
EXPECT_FALSE(tx.hasProvider());
266
EXPECT_FALSE(tx.getProvider().has_value());
267
EXPECT_FALSE(tx.hasURI());
268
EXPECT_FALSE(tx.getURI().has_value());
269
EXPECT_FALSE(tx.hasAssetClass());
270
EXPECT_FALSE(tx.getAssetClass().has_value());
271
}
272
273
}
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::OracleSetBuilder
Builder for OracleSet transactions.
Definition
protocol_autogen/transactions/OracleSet.h:170
xrpl::transactions::OracleSetBuilder::setAssetClass
OracleSetBuilder & setAssetClass(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfAssetClass (SoeOptional).
Definition
protocol_autogen/transactions/OracleSet.h:248
xrpl::transactions::OracleSetBuilder::build
OracleSet build(PublicKey const &publicKey, SecretKey const &secretKey)
Build and return the OracleSet wrapper.
Definition
protocol_autogen/transactions/OracleSet.h:283
xrpl::transactions::OracleSetBuilder::setProvider
OracleSetBuilder & setProvider(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfProvider (SoeOptional).
Definition
protocol_autogen/transactions/OracleSet.h:226
xrpl::transactions::OracleSetBuilder::setURI
OracleSetBuilder & setURI(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfURI (SoeOptional).
Definition
protocol_autogen/transactions/OracleSet.h:237
xrpl::transactions::OracleSet
Transaction: OracleSet.
Definition
protocol_autogen/transactions/OracleSet.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::canonical_VL
BlobValue canonical_VL()
Definition
/libxrpl/protocol_autogen/TestHelpers.h:139
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_ARRAY
STArray canonical_ARRAY()
Definition
/libxrpl/protocol_autogen/TestHelpers.h:155
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