xrpld
Loading...
Searching...
No Matches
STAccount_test.cpp
1#include <xrpl/basics/strHex.h>
2#include <xrpl/beast/unit_test/suite.h>
3#include <xrpl/protocol/AccountID.h>
4#include <xrpl/protocol/SField.h>
5#include <xrpl/protocol/STAccount.h>
6#include <xrpl/protocol/Serializer.h>
7
8#include <cstdint>
9#include <stdexcept>
10
11namespace xrpl {
12
14{
15 void
17 {
18 {
19 // Test default constructor.
20 STAccount const defaultAcct;
21 BEAST_EXPECT(defaultAcct.getSType() == STI_ACCOUNT);
22 BEAST_EXPECT(defaultAcct.getText().empty());
23 BEAST_EXPECT(defaultAcct.isDefault() == true);
24 BEAST_EXPECT(defaultAcct.value() == AccountID{});
25 {
26#ifdef NDEBUG // Qualified because the serialization asserts in a debug build.
27 Serializer s;
28 defaultAcct.add(s); // Asserts in debug build
29 BEAST_EXPECT(s.size() == 1);
30 BEAST_EXPECT(strHex(s) == "00");
31 SerialIter sit(s.slice());
32 STAccount const deserializedDefault(sit, sfAccount);
33 BEAST_EXPECT(deserializedDefault.isEquivalent(defaultAcct));
34#endif // NDEBUG
35 }
36 {
37 // Construct a deserialized default STAccount.
38 Serializer s;
39 s.addVL(nullptr, 0);
40 SerialIter sit(s.slice());
41 STAccount const deserializedDefault(sit, sfAccount);
42 BEAST_EXPECT(deserializedDefault.isEquivalent(defaultAcct));
43 }
44
45 // Test constructor from SField.
46 STAccount const sfAcct{sfAccount};
47 BEAST_EXPECT(sfAcct.getSType() == STI_ACCOUNT);
48 BEAST_EXPECT(sfAcct.getText().empty());
49 BEAST_EXPECT(sfAcct.isDefault());
50 BEAST_EXPECT(sfAcct.value() == AccountID{});
51 BEAST_EXPECT(sfAcct.isEquivalent(defaultAcct));
52 {
53 Serializer s;
54 sfAcct.add(s);
55 BEAST_EXPECT(s.size() == 1);
56 BEAST_EXPECT(strHex(s) == "00");
57 SerialIter sit(s.slice());
58 STAccount const deserializedSf(sit, sfAccount);
59 BEAST_EXPECT(deserializedSf.isEquivalent(sfAcct));
60 }
61
62 // Test constructor from SField and AccountID.
63 STAccount const zeroAcct{sfAccount, AccountID{}};
64 BEAST_EXPECT(zeroAcct.getText() == "rrrrrrrrrrrrrrrrrrrrrhoLvTp");
65 BEAST_EXPECT(!zeroAcct.isDefault());
66 BEAST_EXPECT(zeroAcct.value() == AccountID{0});
67 BEAST_EXPECT(!zeroAcct.isEquivalent(defaultAcct));
68 BEAST_EXPECT(!zeroAcct.isEquivalent(sfAcct));
69 {
70 Serializer s;
71 zeroAcct.add(s);
72 BEAST_EXPECT(s.size() == 21);
73 BEAST_EXPECT(strHex(s) == "140000000000000000000000000000000000000000");
74 SerialIter sit(s.slice());
75 STAccount const deserializedZero(sit, sfAccount);
76 BEAST_EXPECT(deserializedZero.isEquivalent(zeroAcct));
77 }
78 {
79 // Construct from a VL that is not exactly 160 bits.
80 Serializer s;
81 std::uint8_t const bits128[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
82 s.addVL(bits128, sizeof(bits128));
83 SerialIter sit(s.slice());
84 try
85 {
86 // Constructing an STAccount with a bad size should throw.
87 STAccount const deserializedBadSize(sit, sfAccount);
88 }
89 catch (std::runtime_error const& ex)
90 {
91 BEAST_EXPECT(ex.what() == std::string("Invalid STAccount size"));
92 }
93 }
94
95 // Interestingly, equal values but different types are equivalent!
96 STAccount const regKey{sfRegularKey, AccountID{}};
97 BEAST_EXPECT(regKey.isEquivalent(zeroAcct));
98
99 // Test assignment.
100 STAccount assignAcct;
101 BEAST_EXPECT(assignAcct.isEquivalent(defaultAcct));
102 BEAST_EXPECT(assignAcct.isDefault());
103 assignAcct = AccountID{};
104 BEAST_EXPECT(!assignAcct.isEquivalent(defaultAcct));
105 BEAST_EXPECT(assignAcct.isEquivalent(zeroAcct));
106 BEAST_EXPECT(!assignAcct.isDefault());
107 }
108 }
109
110 void
112 {
113 auto const s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh";
114 if (auto const parsed = parseBase58<AccountID>(s); BEAST_EXPECT(parsed))
115 {
116 BEAST_EXPECT(toBase58(*parsed) == s); // NOLINT(bugprone-unchecked-optional-access)
117 }
118
119 {
120 auto const s = "âabcd1rNxp4h8apvRis6mJf9Sh8C6iRxfrDWNâabcdAVâ\xc2\x80\xc2\x8f";
121 BEAST_EXPECT(!parseBase58<AccountID>(s));
122 }
123 }
124
125 void
126 run() override
127 {
130 }
131};
132
134
135} // namespace xrpl
A testsuite class.
Definition suite.h:50
bool isDefault() const override
Definition STAccount.cpp:92
bool isEquivalent(STBase const &t) const override
Definition STAccount.cpp:85
void add(Serializer &s) const override
Definition STAccount.cpp:72
SerializedTypeID getSType() const override
Definition STAccount.cpp:66
std::string getText() const override
Definition STAccount.cpp:98
AccountID const & value() const noexcept
Definition STAccount.h:72
int addVL(Blob const &vector)
Slice slice() const noexcept
Definition Serializer.h:44
std::size_t size() const noexcept
Definition Serializer.h:50
T empty(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
std::string strHex(FwdIt begin, FwdIt end)
Definition strHex.h:10
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition AccountID.cpp:93
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition AccountID.h:28
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
void run() override
Runs the suite.
T what(T... args)