rippled
Loading...
Searching...
No Matches
ledger_entries/DepositPreauthTests.cpp
1// Auto-generated unit tests for ledger entry DepositPreauth
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/DepositPreauth.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(DepositPreauthTests, BuilderSettersRoundTrip)
20{
21 uint256 const index{1u};
22
23 auto const accountValue = canonical_ACCOUNT();
24 auto const authorizeValue = canonical_ACCOUNT();
25 auto const ownerNodeValue = canonical_UINT64();
26 auto const previousTxnIDValue = canonical_UINT256();
27 auto const previousTxnLgrSeqValue = canonical_UINT32();
28 auto const authorizeCredentialsValue = canonical_ARRAY();
29
31 accountValue,
32 ownerNodeValue,
33 previousTxnIDValue,
34 previousTxnLgrSeqValue
35 };
36
37 builder.setAuthorize(authorizeValue);
38 builder.setAuthorizeCredentials(authorizeCredentialsValue);
39
40 builder.setLedgerIndex(index);
41 builder.setFlags(0x1u);
42
43 EXPECT_TRUE(builder.validate());
44
45 auto const entry = builder.build(index);
46
47 EXPECT_TRUE(entry.validate());
48
49 {
50 auto const& expected = accountValue;
51 auto const actual = entry.getAccount();
52 expectEqualField(expected, actual, "sfAccount");
53 }
54
55 {
56 auto const& expected = ownerNodeValue;
57 auto const actual = entry.getOwnerNode();
58 expectEqualField(expected, actual, "sfOwnerNode");
59 }
60
61 {
62 auto const& expected = previousTxnIDValue;
63 auto const actual = entry.getPreviousTxnID();
64 expectEqualField(expected, actual, "sfPreviousTxnID");
65 }
66
67 {
68 auto const& expected = previousTxnLgrSeqValue;
69 auto const actual = entry.getPreviousTxnLgrSeq();
70 expectEqualField(expected, actual, "sfPreviousTxnLgrSeq");
71 }
72
73 {
74 auto const& expected = authorizeValue;
75 auto const actualOpt = entry.getAuthorize();
76 ASSERT_TRUE(actualOpt.has_value());
77 expectEqualField(expected, *actualOpt, "sfAuthorize");
78 EXPECT_TRUE(entry.hasAuthorize());
79 }
80
81 {
82 auto const& expected = authorizeCredentialsValue;
83 auto const actualOpt = entry.getAuthorizeCredentials();
84 ASSERT_TRUE(actualOpt.has_value());
85 expectEqualField(expected, *actualOpt, "sfAuthorizeCredentials");
86 EXPECT_TRUE(entry.hasAuthorizeCredentials());
87 }
88
89 EXPECT_TRUE(entry.hasLedgerIndex());
90 auto const ledgerIndex = entry.getLedgerIndex();
91 ASSERT_TRUE(ledgerIndex.has_value());
92 EXPECT_EQ(*ledgerIndex, index);
93 EXPECT_EQ(entry.getKey(), index);
94}
95
96// 2 & 4) Start from an SLE, set fields directly on it, construct a builder
97// from that SLE, build a new wrapper, and verify all fields (and validate()).
98TEST(DepositPreauthTests, BuilderFromSleRoundTrip)
99{
100 uint256 const index{2u};
101
102 auto const accountValue = canonical_ACCOUNT();
103 auto const authorizeValue = canonical_ACCOUNT();
104 auto const ownerNodeValue = canonical_UINT64();
105 auto const previousTxnIDValue = canonical_UINT256();
106 auto const previousTxnLgrSeqValue = canonical_UINT32();
107 auto const authorizeCredentialsValue = canonical_ARRAY();
108
110
111 sle->at(sfAccount) = accountValue;
112 sle->at(sfAuthorize) = authorizeValue;
113 sle->at(sfOwnerNode) = ownerNodeValue;
114 sle->at(sfPreviousTxnID) = previousTxnIDValue;
115 sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue;
116 sle->setFieldArray(sfAuthorizeCredentials, authorizeCredentialsValue);
117
118 DepositPreauthBuilder builderFromSle{sle};
119 EXPECT_TRUE(builderFromSle.validate());
120
121 auto const entryFromBuilder = builderFromSle.build(index);
122
123 DepositPreauth entryFromSle{sle};
124 EXPECT_TRUE(entryFromBuilder.validate());
125 EXPECT_TRUE(entryFromSle.validate());
126
127 {
128 auto const& expected = accountValue;
129
130 auto const fromSle = entryFromSle.getAccount();
131 auto const fromBuilder = entryFromBuilder.getAccount();
132
133 expectEqualField(expected, fromSle, "sfAccount");
134 expectEqualField(expected, fromBuilder, "sfAccount");
135 }
136
137 {
138 auto const& expected = ownerNodeValue;
139
140 auto const fromSle = entryFromSle.getOwnerNode();
141 auto const fromBuilder = entryFromBuilder.getOwnerNode();
142
143 expectEqualField(expected, fromSle, "sfOwnerNode");
144 expectEqualField(expected, fromBuilder, "sfOwnerNode");
145 }
146
147 {
148 auto const& expected = previousTxnIDValue;
149
150 auto const fromSle = entryFromSle.getPreviousTxnID();
151 auto const fromBuilder = entryFromBuilder.getPreviousTxnID();
152
153 expectEqualField(expected, fromSle, "sfPreviousTxnID");
154 expectEqualField(expected, fromBuilder, "sfPreviousTxnID");
155 }
156
157 {
158 auto const& expected = previousTxnLgrSeqValue;
159
160 auto const fromSle = entryFromSle.getPreviousTxnLgrSeq();
161 auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq();
162
163 expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq");
164 expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq");
165 }
166
167 {
168 auto const& expected = authorizeValue;
169
170 auto const fromSleOpt = entryFromSle.getAuthorize();
171 auto const fromBuilderOpt = entryFromBuilder.getAuthorize();
172
173 ASSERT_TRUE(fromSleOpt.has_value());
174 ASSERT_TRUE(fromBuilderOpt.has_value());
175
176 expectEqualField(expected, *fromSleOpt, "sfAuthorize");
177 expectEqualField(expected, *fromBuilderOpt, "sfAuthorize");
178 }
179
180 {
181 auto const& expected = authorizeCredentialsValue;
182
183 auto const fromSleOpt = entryFromSle.getAuthorizeCredentials();
184 auto const fromBuilderOpt = entryFromBuilder.getAuthorizeCredentials();
185
186 ASSERT_TRUE(fromSleOpt.has_value());
187 ASSERT_TRUE(fromBuilderOpt.has_value());
188
189 expectEqualField(expected, *fromSleOpt, "sfAuthorizeCredentials");
190 expectEqualField(expected, *fromBuilderOpt, "sfAuthorizeCredentials");
191 }
192
193 EXPECT_EQ(entryFromSle.getKey(), index);
194 EXPECT_EQ(entryFromBuilder.getKey(), index);
195}
196
197// 3) Verify wrapper throws when constructed from wrong ledger entry type.
198TEST(DepositPreauthTests, WrapperThrowsOnWrongEntryType)
199{
200 uint256 const index{3u};
201
202 // Build a valid ledger entry of a different type
203 // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq
204 // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq
205 TicketBuilder wrongBuilder{
211 auto wrongEntry = wrongBuilder.build(index);
212
213 EXPECT_THROW(DepositPreauth{wrongEntry.getSle()}, std::runtime_error);
214}
215
216// 4) Verify builder throws when constructed from wrong ledger entry type.
217TEST(DepositPreauthTests, BuilderThrowsOnWrongEntryType)
218{
219 uint256 const index{4u};
220
221 // Build a valid ledger entry of a different type
222 TicketBuilder wrongBuilder{
228 auto wrongEntry = wrongBuilder.build(index);
229
230 EXPECT_THROW(DepositPreauthBuilder{wrongEntry.getSle()}, std::runtime_error);
231}
232
233// 5) Build with only required fields and verify optional fields return nullopt.
234TEST(DepositPreauthTests, OptionalFieldsReturnNullopt)
235{
236 uint256 const index{3u};
237
238 auto const accountValue = canonical_ACCOUNT();
239 auto const ownerNodeValue = canonical_UINT64();
240 auto const previousTxnIDValue = canonical_UINT256();
241 auto const previousTxnLgrSeqValue = canonical_UINT32();
242
243 DepositPreauthBuilder builder{
244 accountValue,
245 ownerNodeValue,
246 previousTxnIDValue,
247 previousTxnLgrSeqValue
248 };
249
250 auto const entry = builder.build(index);
251
252 // Verify optional fields are not present
253 EXPECT_FALSE(entry.hasAuthorize());
254 EXPECT_FALSE(entry.getAuthorize().has_value());
255 EXPECT_FALSE(entry.hasAuthorizeCredentials());
256 EXPECT_FALSE(entry.getAuthorizeCredentials().has_value());
257}
258}
DepositPreauthBuilder & setAuthorizeCredentials(STArray const &value)
Set sfAuthorizeCredentials (soeOPTIONAL)
DepositPreauthBuilder & setAuthorize(std::decay_t< typename SF_ACCOUNT::type::value_type > const &value)
Set sfAuthorize (soeOPTIONAL)
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)