rippled
Loading...
Searching...
No Matches
CredentialTests.cpp
1// Auto-generated unit tests for ledger entry Credential
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/Credential.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(CredentialTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const subjectValue = canonical_ACCOUNT();
24 auto const issuerValue = canonical_ACCOUNT();
25 auto const credentialTypeValue = canonical_VL();
26 auto const expirationValue = canonical_UINT32();
27 auto const uRIValue = canonical_VL();
28 auto const issuerNodeValue = canonical_UINT64();
29 auto const subjectNodeValue = canonical_UINT64();
30 auto const previousTxnIDValue = canonical_UINT256();
31 auto const previousTxnLgrSeqValue = canonical_UINT32();
32
33 CredentialBuilder builder{
34 subjectValue,
35 issuerValue,
36 credentialTypeValue,
37 issuerNodeValue,
38 previousTxnIDValue,
39 previousTxnLgrSeqValue
40 };
41
42 builder.setExpiration(expirationValue);
43 builder.setURI(uRIValue);
44 builder.setSubjectNode(subjectNodeValue);
45
46 builder.setLedgerIndex(index);
47 builder.setFlags(0x1u);
48
49 EXPECT_TRUE(builder.validate());
50
51 auto const entry = builder.build(index);
52
53 EXPECT_TRUE(entry.validate());
54
55 {
56 auto const& expected = subjectValue;
57 auto const actual = entry.getSubject();
58 expectEqualField(expected, actual, "sfSubject");
59 }
60
61 {
62 auto const& expected = issuerValue;
63 auto const actual = entry.getIssuer();
64 expectEqualField(expected, actual, "sfIssuer");
65 }
66
67 {
68 auto const& expected = credentialTypeValue;
69 auto const actual = entry.getCredentialType();
70 expectEqualField(expected, actual, "sfCredentialType");
71 }
72
73 {
74 auto const& expected = issuerNodeValue;
75 auto const actual = entry.getIssuerNode();
76 expectEqualField(expected, actual, "sfIssuerNode");
77 }
78
79 {
80 auto const& expected = previousTxnIDValue;
81 auto const actual = entry.getPreviousTxnID();
82 expectEqualField(expected, actual, "sfPreviousTxnID");
83 }
84
85 {
86 auto const& expected = previousTxnLgrSeqValue;
87 auto const actual = entry.getPreviousTxnLgrSeq();
88 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
89 }
90
91 {
92 auto const& expected = expirationValue;
93 auto const actualOpt = entry.getExpiration();
94 ASSERT_TRUE(actualOpt.has_value());
95 expectEqualField(expected, *actualOpt, "sfExpiration");
96 EXPECT_TRUE(entry.hasExpiration());
97 }
98
99 {
100 auto const& expected = uRIValue;
101 auto const actualOpt = entry.getURI();
102 ASSERT_TRUE(actualOpt.has_value());
103 expectEqualField(expected, *actualOpt, "sfURI");
104 EXPECT_TRUE(entry.hasURI());
105 }
106
107 {
108 auto const& expected = subjectNodeValue;
109 auto const actualOpt = entry.getSubjectNode();
110 ASSERT_TRUE(actualOpt.has_value());
111 expectEqualField(expected, *actualOpt, "sfSubjectNode");
112 EXPECT_TRUE(entry.hasSubjectNode());
113 }
114
115 EXPECT_TRUE(entry.hasLedgerIndex());
116 auto const ledgerIndex = entry.getLedgerIndex();
117 ASSERT_TRUE(ledgerIndex.has_value());
118 EXPECT_EQ(*ledgerIndex, index);
119 EXPECT_EQ(entry.getKey(), index);
120}
121
122// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
123// from that SLE, build a new wrapper, and verify all fields (and validate()).
124TEST(CredentialTests, BuilderFromSleRoundTrip)
125{
126 uint256 const index{2u};
127
128 auto const subjectValue = canonical_ACCOUNT();
129 auto const issuerValue = canonical_ACCOUNT();
130 auto const credentialTypeValue = canonical_VL();
131 auto const expirationValue = canonical_UINT32();
132 auto const uRIValue = canonical_VL();
133 auto const issuerNodeValue = canonical_UINT64();
134 auto const subjectNodeValue = canonical_UINT64();
135 auto const previousTxnIDValue = canonical_UINT256();
136 auto const previousTxnLgrSeqValue = canonical_UINT32();
137
139
140 sle->at(sfSubject) = subjectValue;
141 sle->at(sfIssuer) = issuerValue;
142 sle->at(sfCredentialType) = credentialTypeValue;
143 sle->at(sfExpiration) = expirationValue;
144 sle->at(sfURI) = uRIValue;
145 sle->at(sfIssuerNode) = issuerNodeValue;
146 sle->at(sfSubjectNode) = subjectNodeValue;
147 sle->at(sfPreviousTxnID) = previousTxnIDValue;
148 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
149
150 CredentialBuilder builderFromSle{sle};
151 EXPECT_TRUE(builderFromSle.validate());
152
153 auto const entryFromBuilder = builderFromSle.build(index);
154
155 Credential entryFromSle{sle};
156 EXPECT_TRUE(entryFromBuilder.validate());
157 EXPECT_TRUE(entryFromSle.validate());
158
159 {
160 auto const& expected = subjectValue;
161
162 auto const fromSle = entryFromSle.getSubject();
163 auto const fromBuilder = entryFromBuilder.getSubject();
164
165 expectEqualField(expected, fromSle, "sfSubject");
166 expectEqualField(expected, fromBuilder, "sfSubject");
167 }
168
169 {
170 auto const& expected = issuerValue;
171
172 auto const fromSle = entryFromSle.getIssuer();
173 auto const fromBuilder = entryFromBuilder.getIssuer();
174
175 expectEqualField(expected, fromSle, "sfIssuer");
176 expectEqualField(expected, fromBuilder, "sfIssuer");
177 }
178
179 {
180 auto const& expected = credentialTypeValue;
181
182 auto const fromSle = entryFromSle.getCredentialType();
183 auto const fromBuilder = entryFromBuilder.getCredentialType();
184
185 expectEqualField(expected, fromSle, "sfCredentialType");
186 expectEqualField(expected, fromBuilder, "sfCredentialType");
187 }
188
189 {
190 auto const& expected = issuerNodeValue;
191
192 auto const fromSle = entryFromSle.getIssuerNode();
193 auto const fromBuilder = entryFromBuilder.getIssuerNode();
194
195 expectEqualField(expected, fromSle, "sfIssuerNode");
196 expectEqualField(expected, fromBuilder, "sfIssuerNode");
197 }
198
199 {
200 auto const& expected = previousTxnIDValue;
201
202 auto const fromSle = entryFromSle.getPreviousTxnID();
203 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
204
205 expectEqualField(expected, fromSle, "sfPreviousTxnID");
206 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
207 }
208
209 {
210 auto const& expected = previousTxnLgrSeqValue;
211
212 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
213 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
214
215 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
216 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
217 }
218
219 {
220 auto const& expected = expirationValue;
221
222 auto const fromSleOpt = entryFromSle.getExpiration();
223 auto const fromBuilderOpt = entryFromBuilder.getExpiration();
224
225 ASSERT_TRUE(fromSleOpt.has_value());
226 ASSERT_TRUE(fromBuilderOpt.has_value());
227
228 expectEqualField(expected, *fromSleOpt, "sfExpiration");
229 expectEqualField(expected, *fromBuilderOpt, "sfExpiration");
230 }
231
232 {
233 auto const& expected = uRIValue;
234
235 auto const fromSleOpt = entryFromSle.getURI();
236 auto const fromBuilderOpt = entryFromBuilder.getURI();
237
238 ASSERT_TRUE(fromSleOpt.has_value());
239 ASSERT_TRUE(fromBuilderOpt.has_value());
240
241 expectEqualField(expected, *fromSleOpt, "sfURI");
242 expectEqualField(expected, *fromBuilderOpt, "sfURI");
243 }
244
245 {
246 auto const& expected = subjectNodeValue;
247
248 auto const fromSleOpt = entryFromSle.getSubjectNode();
249 auto const fromBuilderOpt = entryFromBuilder.getSubjectNode();
250
251 ASSERT_TRUE(fromSleOpt.has_value());
252 ASSERT_TRUE(fromBuilderOpt.has_value());
253
254 expectEqualField(expected, *fromSleOpt, "sfSubjectNode");
255 expectEqualField(expected, *fromBuilderOpt, "sfSubjectNode");
256 }
257
258 EXPECT_EQ(entryFromSle.getKey(), index);
259 EXPECT_EQ(entryFromBuilder.getKey(), index);
260}
261
262// 3) Verify wrapper throws when constructed from wrong ledger entry type.
263TEST(CredentialTests, WrapperThrowsOnWrongEntryType)
264{
265 uint256 const index{3u};
266
267 // Build a valid ledger entry of a different type
268 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
269 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
270 TicketBuilder wrongBuilder{
276 auto wrongEntry = wrongBuilder.build(index);
277
278 EXPECT_THROW(Credential{wrongEntry.getSle()}, std::runtime_error);
279}
280
281// 4) Verify builder throws when constructed from wrong ledger entry type.
282TEST(CredentialTests, BuilderThrowsOnWrongEntryType)
283{
284 uint256 const index{4u};
285
286 // Build a valid ledger entry of a different type
287 TicketBuilder wrongBuilder{
293 auto wrongEntry = wrongBuilder.build(index);
294
295 EXPECT_THROW(CredentialBuilder{wrongEntry.getSle()}, std::runtime_error);
296}
297
298// 5) Build with only required fields and verify optional fields return nullopt.
299TEST(CredentialTests, OptionalFieldsReturnNullopt)
300{
301 uint256 const index{3u};
302
303 auto const subjectValue = canonical_ACCOUNT();
304 auto const issuerValue = canonical_ACCOUNT();
305 auto const credentialTypeValue = canonical_VL();
306 auto const issuerNodeValue = canonical_UINT64();
307 auto const previousTxnIDValue = canonical_UINT256();
308 auto const previousTxnLgrSeqValue = canonical_UINT32();
309
310 CredentialBuilder builder{
311 subjectValue,
312 issuerValue,
313 credentialTypeValue,
314 issuerNodeValue,
315 previousTxnIDValue,
316 previousTxnLgrSeqValue
317 };
318
319 auto const entry = builder.build(index);
320
321 // Verify optional fields are not present
322 EXPECT_FALSE(entry.hasExpiration());
323 EXPECT_FALSE(entry.getExpiration().has_value());
324 EXPECT_FALSE(entry.hasURI());
325 EXPECT_FALSE(entry.getURI().has_value());
326 EXPECT_FALSE(entry.hasSubjectNode());
327 EXPECT_FALSE(entry.getSubjectNode().has_value());
328}
329}
Builder for Credential ledger entries.
Definition Credential.h:195
CredentialBuilder & setURI(std::decay_t< typename SF_VL::type::value_type > const &value)
Set sfURI (soeOPTIONAL)
Definition Credential.h:282
CredentialBuilder & setSubjectNode(std::decay_t< typename SF_UINT64::type::value_type > const &value)
Set sfSubjectNode (soeOPTIONAL)
Definition Credential.h:304
CredentialBuilder & setExpiration(std::decay_t< typename SF_UINT32::type::value_type > const &value)
Set sfExpiration (soeOPTIONAL)
Definition Credential.h:271
Ledger Entry: Credential.
Definition Credential.h:28
static constexpr LedgerEntryType entryType
Definition Credential.h:30
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.
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)