xrpld
Loading...
Searching...
No Matches
Version_test.cpp
1
2#include <test/jtx/Env.h>
3#include <test/jtx/envconfig.h>
4
5#include <xrpl/beast/unit_test/suite.h>
6#include <xrpl/json/json_value.h>
7#include <xrpl/protocol/ApiVersion.h>
8#include <xrpl/protocol/jss.h>
9
10#include <algorithm>
11#include <memory>
12#include <string>
13
14namespace xrpl {
15
17{
18 void
20 {
21 testcase("right api_version: explicitly specified or filled by parser");
22
23 using namespace test::jtx;
24 Env env{*this};
25
26 auto isCorrectReply = [](json::Value const& re) -> bool {
27 if (re.isMember(jss::error))
28 return false;
29 return re.isMember(jss::version);
30 };
31
32 auto jrr = env.rpc(
33 "json",
34 "version",
35 "{\"api_version\": " + std::to_string(RPC::kApiMaximumSupportedVersion) +
36 "}")[jss::result];
37 BEAST_EXPECT(isCorrectReply(jrr));
38
39 jrr = env.rpc("version")[jss::result];
40 BEAST_EXPECT(isCorrectReply(jrr));
41 }
42
43 void
45 {
46 testcase("wrong api_version: too low, too high, or wrong format");
47
48 using namespace test::jtx;
49 Env env{*this};
50
51 auto badVersion = [](json::Value const& re) -> bool {
52 if (re.isMember("error_what"))
53 {
54 if (re["error_what"].isString())
55 {
56 return re["error_what"].asString().starts_with(jss::invalid_API_version.cStr());
57 }
58 }
59 return false;
60 };
61
62 auto re = env.rpc(
63 "json",
64 "version",
65 "{\"api_version\": " + std::to_string(RPC::kApiMinimumSupportedVersion - 1) + "}");
66 BEAST_EXPECT(badVersion(re));
67
68 BEAST_EXPECT(env.app().config().betaRpcApi);
69 re = env.rpc(
70 "json",
71 "version",
72 "{\"api_version\": " +
75 1) +
76 "}");
77 BEAST_EXPECT(badVersion(re));
78
79 re = env.rpc("json", "version", "{\"api_version\": \"a\"}");
80 BEAST_EXPECT(badVersion(re));
81 }
82
83 void
85 {
86 testcase("test getAPIVersionNumber function");
87
88 unsigned int const versionIfUnspecified =
92
95 BEAST_EXPECT(RPC::getAPIVersionNumber(jArray, false) == versionIfUnspecified);
96 BEAST_EXPECT(RPC::getAPIVersionNumber(jNull, false) == versionIfUnspecified);
97
99 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == versionIfUnspecified);
100 jObject[jss::api_version] = RPC::kApiVersionIfUnspecified.value;
101 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == versionIfUnspecified);
102
103 jObject[jss::api_version] = RPC::kApiMinimumSupportedVersion.value;
104 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == RPC::kApiMinimumSupportedVersion);
105 jObject[jss::api_version] = RPC::kApiMaximumSupportedVersion.value;
106 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == RPC::kApiMaximumSupportedVersion);
107
108 jObject[jss::api_version] = RPC::kApiMinimumSupportedVersion - 1;
109 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == RPC::kApiInvalidVersion);
110 jObject[jss::api_version] = RPC::kApiMaximumSupportedVersion + 1;
111 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == RPC::kApiInvalidVersion);
112 jObject[jss::api_version] = RPC::kApiBetaVersion.value;
113 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, true) == RPC::kApiBetaVersion);
114 jObject[jss::api_version] = RPC::kApiBetaVersion + 1;
115 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, true) == RPC::kApiInvalidVersion);
116
117 jObject[jss::api_version] = RPC::kApiInvalidVersion.value;
118 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == RPC::kApiInvalidVersion);
119 jObject[jss::api_version] = "a";
120 BEAST_EXPECT(RPC::getAPIVersionNumber(jObject, false) == RPC::kApiInvalidVersion);
121 }
122
123 void
125 {
126 testcase("batch, all good request");
127
128 using namespace test::jtx;
129 Env env{*this};
130
131 auto const withoutApiVerion = std::string("{ ") +
132 "\"jsonrpc\": \"2.0\", "
133 "\"ripplerpc\": \"2.0\", "
134 "\"id\": 5, "
135 "\"method\": \"version\", "
136 "\"params\": {}}";
137 auto const withApiVerion = std::string("{ ") +
138 "\"jsonrpc\": \"2.0\", "
139 "\"ripplerpc\": \"2.0\", "
140 "\"id\": 6, "
141 "\"method\": \"version\", "
142 "\"params\": { "
143 "\"api_version\": " +
145 auto re = env.rpc("json2", '[' + withoutApiVerion + ", " + withApiVerion + ']');
146
147 if (!BEAST_EXPECT(re.isArray()))
148 return;
149 if (!BEAST_EXPECT(re.size() == 2))
150 return;
151 BEAST_EXPECT(re[0u].isMember(jss::result) && re[0u][jss::result].isMember(jss::version));
152 BEAST_EXPECT(re[1u].isMember(jss::result) && re[1u][jss::result].isMember(jss::version));
153 }
154
155 void
157 {
158 testcase("batch, with a bad request");
159
160 using namespace test::jtx;
161 Env env{*this};
162
163 BEAST_EXPECT(env.app().config().betaRpcApi);
164 auto const withoutApiVerion = std::string("{ ") +
165 "\"jsonrpc\": \"2.0\", "
166 "\"ripplerpc\": \"2.0\", "
167 "\"id\": 5, "
168 "\"method\": \"version\", "
169 "\"params\": {}}";
170 auto const withWrongApiVerion =
171 std::string("{ ") +
172 "\"jsonrpc\": \"2.0\", "
173 "\"ripplerpc\": \"2.0\", "
174 "\"id\": 6, "
175 "\"method\": \"version\", "
176 "\"params\": { "
177 "\"api_version\": " +
180 "}}";
181 auto re = env.rpc("json2", '[' + withoutApiVerion + ", " + withWrongApiVerion + ']');
182
183 if (!BEAST_EXPECT(re.isArray()))
184 return;
185 if (!BEAST_EXPECT(re.size() == 2))
186 return;
187 BEAST_EXPECT(re[0u].isMember(jss::result) && re[0u][jss::result].isMember(jss::version));
188 BEAST_EXPECT(re[1u].isMember(jss::error));
189 }
190
191 void
193 {
194 testcase("config test");
195 {
196 Config const c;
197 BEAST_EXPECT(c.betaRpcApi == false);
198 }
199
200 {
201 Config c;
202 c.loadFromString("\n[beta_rpc_api]\n1\n");
203 BEAST_EXPECT(c.betaRpcApi == true);
204 }
205
206 {
207 Config c;
208 c.loadFromString("\n[beta_rpc_api]\n0\n");
209 BEAST_EXPECT(c.betaRpcApi == false);
210 }
211 }
212
213 void
215 {
216 testcase("test version RPC with api_version >= 2");
217
218 using namespace test::jtx;
219 Env env{*this, envconfig([](std::unique_ptr<Config> c) {
220 c->loadFromString("\n[beta_rpc_api]\n1\n");
221 return c;
222 })};
223 if (!BEAST_EXPECT(env.app().config().betaRpcApi == true))
224 return;
225
226 auto jrr = env.rpc(
227 "json",
228 "version",
229 "{\"api_version\": " + std::to_string(RPC::kApiBetaVersion) + "}")[jss::result];
230
231 if (!BEAST_EXPECT(jrr.isMember(jss::version)))
232 return;
233 if (!BEAST_EXPECT(jrr[jss::version].isMember(jss::first)) &&
234 jrr[jss::version].isMember(jss::last))
235 return;
236 BEAST_EXPECT(jrr[jss::version][jss::first] == RPC::kApiMinimumSupportedVersion.value);
237 BEAST_EXPECT(jrr[jss::version][jss::last] == RPC::kApiBetaVersion.value);
238 }
239
240public:
241 void
252};
253
255
256} // namespace xrpl
A testsuite class.
Definition suite.h:50
TestcaseT testcase
Memberspace for declaring test cases.
Definition suite.h:149
Represents a JSON value.
Definition json_value.h:130
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition Config.cpp:473
bool betaRpcApi
Definition Config.h:272
void testCorrectVersionNumber()
void run() override
Runs the suite.
T max(T... args)
@ Array
array value (ordered list)
Definition json_value.h:25
@ Object
object value (collection of name/value pairs).
Definition json_value.h:26
@ Null
'null' value
Definition json_value.h:19
static constexpr auto kApiInvalidVersion
Definition ApiVersion.h:40
static constexpr auto kApiMinimumSupportedVersion
Definition ApiVersion.h:41
static constexpr auto kApiVersionIfUnspecified
Definition ApiVersion.h:43
static constexpr auto kApiBetaVersion
Definition ApiVersion.h:45
unsigned int getAPIVersionNumber(json::Value const &jv, bool betaEnabled)
Retrieve the api version number from the json value.
Definition ApiVersion.h:99
static constexpr auto kApiMaximumSupportedVersion
Definition ApiVersion.h:42
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
T to_string(T... args)