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