rippled
Loading...
Searching...
No Matches
SignerListTests.cpp
1// Auto-generated unit tests for ledger entry SignerList
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/SignerList.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(SignerListTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const ownerValue = canonical_ACCOUNT();
24 auto const ownerNodeValue = canonical_UINT64();
25 auto const signerQuorumValue = canonical_UINT32();
26 auto const signerEntriesValue = canonical_ARRAY();
27 auto const signerListIDValue = canonical_UINT32();
28 auto const previousTxnIDValue = canonical_UINT256();
29 auto const previousTxnLgrSeqValue = canonical_UINT32();
30
31 SignerListBuilder builder{
32 ownerNodeValue,
33 signerQuorumValue,
34 signerEntriesValue,
35 signerListIDValue,
36 previousTxnIDValue,
37 previousTxnLgrSeqValue
38 };
39
40 builder.setOwner(ownerValue);
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 = ownerNodeValue;
53 auto const actual = entry.getOwnerNode();
54 expectEqualField(expected, actual, "sfOwnerNode");
55 }
56
57 {
58 auto const& expected = signerQuorumValue;
59 auto const actual = entry.getSignerQuorum();
60 expectEqualField(expected, actual, "sfSignerQuorum");
61 }
62
63 {
64 auto const& expected = signerEntriesValue;
65 auto const actual = entry.getSignerEntries();
66 expectEqualField(expected, actual, "sfSignerEntries");
67 }
68
69 {
70 auto const& expected = signerListIDValue;
71 auto const actual = entry.getSignerListID();
72 expectEqualField(expected, actual, "sfSignerListID");
73 }
74
75 {
76 auto const& expected = previousTxnIDValue;
77 auto const actual = entry.getPreviousTxnID();
78 expectEqualField(expected, actual, "sfPreviousTxnID");
79 }
80
81 {
82 auto const& expected = previousTxnLgrSeqValue;
83 auto const actual = entry.getPreviousTxnLgrSeq();
84 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
85 }
86
87 {
88 auto const& expected = ownerValue;
89 auto const actualOpt = entry.getOwner();
90 ASSERT_TRUE(actualOpt.has_value());
91 expectEqualField(expected, *actualOpt, "sfOwner");
92 EXPECT_TRUE(entry.hasOwner());
93 }
94
95 EXPECT_TRUE(entry.hasLedgerIndex());
96 auto const ledgerIndex = entry.getLedgerIndex();
97 ASSERT_TRUE(ledgerIndex.has_value());
98 EXPECT_EQ(*ledgerIndex, index);
99 EXPECT_EQ(entry.getKey(), index);
100}
101
102// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
103// from that SLE, build a new wrapper, and verify all fields (and validate()).
104TEST(SignerListTests, BuilderFromSleRoundTrip)
105{
106 uint256 const index{2u};
107
108 auto const ownerValue = canonical_ACCOUNT();
109 auto const ownerNodeValue = canonical_UINT64();
110 auto const signerQuorumValue = canonical_UINT32();
111 auto const signerEntriesValue = canonical_ARRAY();
112 auto const signerListIDValue = canonical_UINT32();
113 auto const previousTxnIDValue = canonical_UINT256();
114 auto const previousTxnLgrSeqValue = canonical_UINT32();
115
117
118 sle->at(sfOwner) = ownerValue;
119 sle->at(sfOwnerNode) = ownerNodeValue;
120 sle->at(sfSignerQuorum) = signerQuorumValue;
121 sle->setFieldArray(sfSignerEntries, signerEntriesValue);
122 sle->at(sfSignerListID) = signerListIDValue;
123 sle->at(sfPreviousTxnID) = previousTxnIDValue;
124 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
125
126 SignerListBuilder builderFromSle{sle};
127 EXPECT_TRUE(builderFromSle.validate());
128
129 auto const entryFromBuilder = builderFromSle.build(index);
130
131 SignerList entryFromSle{sle};
132 EXPECT_TRUE(entryFromBuilder.validate());
133 EXPECT_TRUE(entryFromSle.validate());
134
135 {
136 auto const& expected = ownerNodeValue;
137
138 auto const fromSle = entryFromSle.getOwnerNode();
139 auto const fromBuilder = entryFromBuilder.getOwnerNode();
140
141 expectEqualField(expected, fromSle, "sfOwnerNode");
142 expectEqualField(expected, fromBuilder, "sfOwnerNode");
143 }
144
145 {
146 auto const& expected = signerQuorumValue;
147
148 auto const fromSle = entryFromSle.getSignerQuorum();
149 auto const fromBuilder = entryFromBuilder.getSignerQuorum();
150
151 expectEqualField(expected, fromSle, "sfSignerQuorum");
152 expectEqualField(expected, fromBuilder, "sfSignerQuorum");
153 }
154
155 {
156 auto const& expected = signerEntriesValue;
157
158 auto const fromSle = entryFromSle.getSignerEntries();
159 auto const fromBuilder = entryFromBuilder.getSignerEntries();
160
161 expectEqualField(expected, fromSle, "sfSignerEntries");
162 expectEqualField(expected, fromBuilder, "sfSignerEntries");
163 }
164
165 {
166 auto const& expected = signerListIDValue;
167
168 auto const fromSle = entryFromSle.getSignerListID();
169 auto const fromBuilder = entryFromBuilder.getSignerListID();
170
171 expectEqualField(expected, fromSle, "sfSignerListID");
172 expectEqualField(expected, fromBuilder, "sfSignerListID");
173 }
174
175 {
176 auto const& expected = previousTxnIDValue;
177
178 auto const fromSle = entryFromSle.getPreviousTxnID();
179 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
180
181 expectEqualField(expected, fromSle, "sfPreviousTxnID");
182 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
183 }
184
185 {
186 auto const& expected = previousTxnLgrSeqValue;
187
188 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
189 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
190
191 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
192 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
193 }
194
195 {
196 auto const& expected = ownerValue;
197
198 auto const fromSleOpt = entryFromSle.getOwner();
199 auto const fromBuilderOpt = entryFromBuilder.getOwner();
200
201 ASSERT_TRUE(fromSleOpt.has_value());
202 ASSERT_TRUE(fromBuilderOpt.has_value());
203
204 expectEqualField(expected, *fromSleOpt, "sfOwner");
205 expectEqualField(expected, *fromBuilderOpt, "sfOwner");
206 }
207
208 EXPECT_EQ(entryFromSle.getKey(), index);
209 EXPECT_EQ(entryFromBuilder.getKey(), index);
210}
211
212// 3) Verify wrapper throws when constructed from wrong ledger entry type.
213TEST(SignerListTests, WrapperThrowsOnWrongEntryType)
214{
215 uint256 const index{3u};
216
217 // Build a valid ledger entry of a different type
218 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
219 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
220 TicketBuilder wrongBuilder{
226 auto wrongEntry = wrongBuilder.build(index);
227
228 EXPECT_THROW(SignerList{wrongEntry.getSle()}, std::runtime_error);
229}
230
231// 4) Verify builder throws when constructed from wrong ledger entry type.
232TEST(SignerListTests, BuilderThrowsOnWrongEntryType)
233{
234 uint256 const index{4u};
235
236 // Build a valid ledger entry of a different type
237 TicketBuilder wrongBuilder{
243 auto wrongEntry = wrongBuilder.build(index);
244
245 EXPECT_THROW(SignerListBuilder{wrongEntry.getSle()}, std::runtime_error);
246}
247
248// 5) Build with only required fields and verify optional fields return nullopt.
249TEST(SignerListTests, OptionalFieldsReturnNullopt)
250{
251 uint256 const index{3u};
252
253 auto const ownerNodeValue = canonical_UINT64();
254 auto const signerQuorumValue = canonical_UINT32();
255 auto const signerEntriesValue = canonical_ARRAY();
256 auto const signerListIDValue = canonical_UINT32();
257 auto const previousTxnIDValue = canonical_UINT256();
258 auto const previousTxnLgrSeqValue = canonical_UINT32();
259
260 SignerListBuilder builder{
261 ownerNodeValue,
262 signerQuorumValue,
263 signerEntriesValue,
264 signerListIDValue,
265 previousTxnIDValue,
266 previousTxnLgrSeqValue
267 };
268
269 auto const entry = builder.build(index);
270
271 // Verify optional fields are not present
272 EXPECT_FALSE(entry.hasOwner());
273 EXPECT_FALSE(entry.getOwner().has_value());
274}
275}
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 SignerList ledger entries.
Definition SignerList.h:148
SignerListBuilder & setOwner(std::decay_t< typename SF_ACCOUNT::type::value_type > const &value)
Ledger entry-specific field setters.
Definition SignerList.h:191
Ledger Entry: SignerList.
Definition SignerList.h:28
static constexpr LedgerEntryType entryType
Definition SignerList.h:30
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)