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