rippled
Loading...
Searching...
No Matches
Version_test.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2012-2017 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <test/jtx.h>
21#include <xrpld/rpc/detail/RPCHelpers.h>
22#include <xrpl/protocol/jss.h>
23
24namespace ripple {
25
27{
28 void
30 {
31 testcase("right api_version: explicitly specified or filled by parser");
32
33 using namespace test::jtx;
34 Env env{*this};
35
36 auto isCorrectReply = [](Json::Value const& re) -> bool {
37 if (re.isMember(jss::error))
38 return false;
39 return re.isMember(jss::version);
40 };
41
42 auto jrr = env.rpc(
43 "json",
44 "version",
45 "{\"api_version\": " +
47 "}")[jss::result];
48 BEAST_EXPECT(isCorrectReply(jrr));
49
50 jrr = env.rpc("version")[jss::result];
51 BEAST_EXPECT(isCorrectReply(jrr));
52 }
53
54 void
56 {
57 testcase("wrong api_version: too low, too high, or wrong format");
58
59 using namespace test::jtx;
60 Env env{*this};
61
62 auto badVersion = [](Json::Value const& re) -> bool {
63 if (re.isMember("error_what"))
64 if (re["error_what"].isString())
65 {
66 return re["error_what"].asString().find(
67 jss::invalid_API_version.c_str()) == 0;
68 }
69 return false;
70 };
71
72 auto re = env.rpc(
73 "json",
74 "version",
75 "{\"api_version\": " +
77 BEAST_EXPECT(badVersion(re));
78
79 BEAST_EXPECT(env.app().config().BETA_RPC_API);
80 re = env.rpc(
81 "json",
82 "version",
83 "{\"api_version\": " +
87 RPC::apiBetaVersion.value) +
88 1) +
89 "}");
90 BEAST_EXPECT(badVersion(re));
91
92 re = env.rpc("json", "version", "{\"api_version\": \"a\"}");
93 BEAST_EXPECT(badVersion(re));
94 }
95
96 void
98 {
99 testcase("test getAPIVersionNumber function");
100
101 unsigned int versionIfUnspecified =
105
108 BEAST_EXPECT(
109 RPC::getAPIVersionNumber(j_array, false) == versionIfUnspecified);
110 BEAST_EXPECT(
111 RPC::getAPIVersionNumber(j_null, false) == versionIfUnspecified);
112
114 BEAST_EXPECT(
115 RPC::getAPIVersionNumber(j_object, false) == versionIfUnspecified);
116 j_object[jss::api_version] = RPC::apiVersionIfUnspecified.value;
117 BEAST_EXPECT(
118 RPC::getAPIVersionNumber(j_object, false) == versionIfUnspecified);
119
120 j_object[jss::api_version] = RPC::apiMinimumSupportedVersion.value;
121 BEAST_EXPECT(
122 RPC::getAPIVersionNumber(j_object, false) ==
124 j_object[jss::api_version] = RPC::apiMaximumSupportedVersion.value;
125 BEAST_EXPECT(
126 RPC::getAPIVersionNumber(j_object, false) ==
128
129 j_object[jss::api_version] = RPC::apiMinimumSupportedVersion - 1;
130 BEAST_EXPECT(
131 RPC::getAPIVersionNumber(j_object, false) ==
133 j_object[jss::api_version] = RPC::apiMaximumSupportedVersion + 1;
134 BEAST_EXPECT(
135 RPC::getAPIVersionNumber(j_object, false) ==
137 j_object[jss::api_version] = RPC::apiBetaVersion.value;
138 BEAST_EXPECT(
140 j_object[jss::api_version] = RPC::apiBetaVersion + 1;
141 BEAST_EXPECT(
143
144 j_object[jss::api_version] = RPC::apiInvalidVersion.value;
145 BEAST_EXPECT(
146 RPC::getAPIVersionNumber(j_object, false) ==
148 j_object[jss::api_version] = "a";
149 BEAST_EXPECT(
150 RPC::getAPIVersionNumber(j_object, false) ==
152 }
153
154 void
156 {
157 testcase("batch, all good request");
158
159 using namespace test::jtx;
160 Env env{*this};
161
162 auto const without_api_verion = std::string("{ ") +
163 "\"jsonrpc\": \"2.0\", "
164 "\"ripplerpc\": \"2.0\", "
165 "\"id\": 5, "
166 "\"method\": \"version\", "
167 "\"params\": {}}";
168 auto const with_api_verion = std::string("{ ") +
169 "\"jsonrpc\": \"2.0\", "
170 "\"ripplerpc\": \"2.0\", "
171 "\"id\": 6, "
172 "\"method\": \"version\", "
173 "\"params\": { "
174 "\"api_version\": " +
176 auto re = env.rpc(
177 "json2", '[' + without_api_verion + ", " + with_api_verion + ']');
178
179 if (!BEAST_EXPECT(re.isArray()))
180 return;
181 if (!BEAST_EXPECT(re.size() == 2))
182 return;
183 BEAST_EXPECT(
184 re[0u].isMember(jss::result) &&
185 re[0u][jss::result].isMember(jss::version));
186 BEAST_EXPECT(
187 re[1u].isMember(jss::result) &&
188 re[1u][jss::result].isMember(jss::version));
189 }
190
191 void
193 {
194 testcase("batch, with a bad request");
195
196 using namespace test::jtx;
197 Env env{*this};
198
199 BEAST_EXPECT(env.app().config().BETA_RPC_API);
200 auto const without_api_verion = std::string("{ ") +
201 "\"jsonrpc\": \"2.0\", "
202 "\"ripplerpc\": \"2.0\", "
203 "\"id\": 5, "
204 "\"method\": \"version\", "
205 "\"params\": {}}";
206 auto const with_wrong_api_verion = std::string("{ ") +
207 "\"jsonrpc\": \"2.0\", "
208 "\"ripplerpc\": \"2.0\", "
209 "\"id\": 6, "
210 "\"method\": \"version\", "
211 "\"params\": { "
212 "\"api_version\": " +
215 RPC::apiBetaVersion.value) +
216 1) +
217 "}}";
218 auto re = env.rpc(
219 "json2",
220 '[' + without_api_verion + ", " + with_wrong_api_verion + ']');
221
222 if (!BEAST_EXPECT(re.isArray()))
223 return;
224 if (!BEAST_EXPECT(re.size() == 2))
225 return;
226 BEAST_EXPECT(
227 re[0u].isMember(jss::result) &&
228 re[0u][jss::result].isMember(jss::version));
229 BEAST_EXPECT(re[1u].isMember(jss::error));
230 }
231
232 void
234 {
235 testcase("config test");
236 {
237 Config c;
238 BEAST_EXPECT(c.BETA_RPC_API == false);
239 }
240
241 {
242 Config c;
243 c.loadFromString("\n[beta_rpc_api]\n1\n");
244 BEAST_EXPECT(c.BETA_RPC_API == true);
245 }
246
247 {
248 Config c;
249 c.loadFromString("\n[beta_rpc_api]\n0\n");
250 BEAST_EXPECT(c.BETA_RPC_API == false);
251 }
252 }
253
254 void
256 {
257 testcase("test version RPC with api_version >= 2");
258
259 using namespace test::jtx;
260 Env env{*this, envconfig([](std::unique_ptr<Config> c) {
261 c->loadFromString("\n[beta_rpc_api]\n1\n");
262 return c;
263 })};
264 if (!BEAST_EXPECT(env.app().config().BETA_RPC_API == true))
265 return;
266
267 auto jrr = env.rpc(
268 "json",
269 "version",
270 "{\"api_version\": " + std::to_string(RPC::apiBetaVersion) +
271 "}")[jss::result];
272
273 if (!BEAST_EXPECT(jrr.isMember(jss::version)))
274 return;
275 if (!BEAST_EXPECT(jrr[jss::version].isMember(jss::first)) &&
276 jrr[jss::version].isMember(jss::last))
277 return;
278 BEAST_EXPECT(
279 jrr[jss::version][jss::first] ==
281 BEAST_EXPECT(jrr[jss::version][jss::last] == RPC::apiBetaVersion.value);
282 }
283
284public:
285 void
286 run() override
287 {
291 testBatch();
293 testConfig();
295 }
296};
297
298BEAST_DEFINE_TESTSUITE(Version, rpc, ripple);
299
300} // namespace ripple
Represents a JSON value.
Definition: json_value.h:147
A testsuite class.
Definition: suite.h:53
testcase_t testcase
Memberspace for declaring test cases.
Definition: suite.h:153
bool BETA_RPC_API
Definition: Config.h:295
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition: Config.cpp:476
void run() override
Runs the suite.
T max(T... args)
@ nullValue
'null' value
Definition: json_value.h:36
@ arrayValue
array value (ordered list)
Definition: json_value.h:42
@ objectValue
object value (collection of name/value pairs).
Definition: json_value.h:43
unsigned int getAPIVersionNumber(Json::Value const &jv, bool betaEnabled)
Retrieve the api version number from the json value.
static constexpr auto apiMaximumSupportedVersion
Definition: ApiVersion.h:58
static constexpr auto apiBetaVersion
Definition: ApiVersion.h:62
static constexpr auto apiVersionIfUnspecified
Definition: ApiVersion.h:59
static constexpr auto apiInvalidVersion
Definition: ApiVersion.h:56
static constexpr auto apiMinimumSupportedVersion
Definition: ApiVersion.h:57
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
T to_string(T... args)