xrpld
Loading...
Searching...
No Matches
Status_test.cpp
1#include <xrpld/rpc/Status.h>
2
3#include <xrpl/basics/contract.h>
4#include <xrpl/beast/unit_test/suite.h>
5#include <xrpl/json/json_value.h>
6#include <xrpl/protocol/ErrorCodes.h>
7#include <xrpl/protocol/TER.h>
8#include <xrpl/protocol/jss.h>
9
10#include <algorithm>
11#include <cstddef>
12#include <exception>
13#include <string>
14
15namespace xrpl::RPC {
16
18{
19private:
20 template <typename Type>
22 codeString(Type t)
23 {
24 return Status(t).codeString();
25 }
26
27 void
29 {
30 testcase("OK");
31 {
32 auto s = codeString(Status());
33 expect(s.empty(), "String for OK status");
34 }
35
36 {
37 auto s = codeString(Status::kOK);
38 expect(s.empty(), "String for OK status");
39 }
40
41 {
42 auto s = codeString(0);
43 expect(s.empty(), "String for 0 status");
44 }
45
46 {
47 auto s = codeString(tesSUCCESS);
48 expect(s.empty(), "String for tesSUCCESS");
49 }
50
51 {
52 auto s = codeString(RpcSuccess);
53 expect(s.empty(), "String for rpcSUCCESS");
54 }
55 }
56
57 void
59 {
60 testcase("error");
61 {
62 auto s = codeString(23);
63 expect(s == "23", s);
64 }
65
66 {
67 auto s = codeString(temBAD_AMOUNT);
68 expect(s == "temBAD_AMOUNT: Malformed: Bad amount.", s);
69 }
70
71 {
72 auto s = codeString(RpcBadSyntax);
73 expect(s == "badSyntax: Syntax error.", s);
74 }
75 }
76
77public:
78 void
79 run() override
80 {
81 testOk();
82 testError();
83 }
84};
85
86BEAST_DEFINE_TESTSUITE(codeString, rpc, RPC);
87
89{
90private:
92
93 template <typename Type>
94 void
95 fillJson(Type t)
96 {
97 value_.clear();
99 }
100
101 void
103 {
104 testcase("OK");
105 fillJson(Status());
106 expect(!value_, "Value for empty status");
107
108 fillJson(0);
109 expect(!value_, "Value for 0 status");
110
112 expect(!value_, "Value for OK status");
113
115 expect(!value_, "Value for tesSUCCESS");
116
118 expect(!value_, "Value for rpcSUCCESS");
119 }
120
121 template <typename Type>
122 void
124 std::string const& label,
125 Type status,
126 Status::Strings messages,
127 std::string const& message)
128 {
129 value_.clear();
130 fillJson(Status(status, messages));
131
132 auto prefix = label + ": ";
133 expect(bool(value_), prefix + "No value");
134
135 auto error = value_[jss::error];
136 expect(bool(error), prefix + "No error.");
137
138 auto code = error[jss::code].asInt();
139 expect(
140 status == code,
141 prefix + "Wrong status " + std::to_string(code) + " != " + std::to_string(status));
142
143 auto m = error[jss::message].asString();
144 expect(m == message, m + " != " + message);
145
146 auto d = error[jss::data];
147 size_t const s1 = d.size();
148 size_t const s2 = messages.size();
149 expect(
150 s1 == s2,
151 prefix + "Data sizes differ " + std::to_string(s1) + " != " + std::to_string(s2));
152 for (auto i = 0; i < std::min(s1, s2); ++i)
153 {
154 auto ds = d[i].asString();
155 expect(ds == messages[i], prefix + ds + " != " + messages[i]);
156 }
157 }
158
159 void
161 {
162 testcase("error");
163 expectFill("temBAD_AMOUNT", temBAD_AMOUNT, {}, "temBAD_AMOUNT: Malformed: Bad amount.");
164
166 "RpcBadSyntax",
168 {"An error.", "Another error."},
169 "badSyntax: Syntax error.");
170
171 expectFill("integer message", 23, {"Stuff."}, "23");
172 }
173
174 void
176 {
177 testcase("throw");
178 try
179 {
180 Throw<Status>(Status(temBAD_PATH, {"path=sdcdfd"}));
181 }
182 catch (Status const& s)
183 {
184 expect(s.toTER() == temBAD_PATH, "temBAD_PATH wasn't thrown");
185 auto msgs = s.messages();
186 expect(msgs.size() == 1, "Wrong number of messages");
187 expect(msgs[0] == "path=sdcdfd", msgs[0]);
188 }
189 catch (std::exception const&)
190 {
191 expect(false, "Didn't catch a Status");
192 }
193 }
194
195public:
196 void
197 run() override
198 {
199 testOk();
200 testError();
201 testThrow();
202 }
203};
204
206
207} // namespace xrpl::RPC
A testsuite class.
Definition suite.h:50
bool expect(Condition const &shouldBeTrue)
Evaluate a test condition.
Definition suite.h:223
TestcaseT testcase
Memberspace for declaring test cases.
Definition suite.h:149
Represents a JSON value.
Definition json_value.h:130
std::string codeString(Type t)
void run() override
Runs the suite.
void expectFill(std::string const &label, Type status, Status::Strings messages, std::string const &message)
void run() override
Runs the suite.
T min(T... args)
API version numbers used in later API versions.
Definition ApiVersion.h:35
BEAST_DEFINE_TESTSUITE(AccountLines, rpc, xrpl)
@ RpcSuccess
Definition ErrorCodes.h:26
@ RpcBadSyntax
Definition ErrorCodes.h:28
@ temBAD_PATH
Definition TER.h:82
@ temBAD_AMOUNT
Definition TER.h:75
@ tesSUCCESS
Definition TER.h:240
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
Definition contract.h:49
T size(T... args)
Status represents the results of an operation that might fail.
Definition Status.h:19
Strings const & messages() const
Definition Status.h:105
std::string codeString() const
Definition Status.cpp:15
std::vector< std::string > Strings
Definition Status.h:23
TER toTER() const
Returns the Status as a TER.
Definition Status.h:71
static constexpr Code kOK
Definition Status.h:25
void fillJson(json::Value &)
Fill a json::Value with an RPC 2.0 response.
Definition Status.cpp:48
T to_string(T... args)