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
22#include <xrpl/protocol/ApiVersion.h>
23#include <xrpl/protocol/jss.h>
24
25namespace ripple {
26
28{
29 void
31 {
32 testcase("right api_version: explicitly specified or filled by parser");
33
34 using namespace test::jtx;
35 Env env{*this};
36
37 auto isCorrectReply = [](Json::Value const& re) -> bool {
38 if (re.isMember(jss::error))
39 return false;
40 return re.isMember(jss::version);
41 };
42
43 auto jrr = env.rpc(
44 "json",
45 "version",
46 "{\"api_version\": " +
48 "}")[jss::result];
49 BEAST_EXPECT(isCorrectReply(jrr));
50
51 jrr = env.rpc("version")[jss::result];
52 BEAST_EXPECT(isCorrectReply(jrr));
53 }
54
55 void
57 {
58 testcase("wrong api_version: too low, too high, or wrong format");
59
60 using namespace test::jtx;
61 Env env{*this};
62
63 auto badVersion = [](Json::Value const& re) -> bool {
64 if (re.isMember("error_what"))
65 if (re["error_what"].isString())
66 {
67 return re["error_what"].asString().find(
68 jss::invalid_API_version.c_str()) == 0;
69 }
70 return false;
71 };
72
73 auto re = env.rpc(
74 "json",
75 "version",
76 "{\"api_version\": " +
78 BEAST_EXPECT(badVersion(re));
79
80 BEAST_EXPECT(env.app().config().BETA_RPC_API);
81 re = env.rpc(
82 "json",
83 "version",
84 "{\"api_version\": " +
88 RPC::apiBetaVersion.value) +
89 1) +
90 "}");
91 BEAST_EXPECT(badVersion(re));
92
93 re = env.rpc("json", "version", "{\"api_version\": \"a\"}");
94 BEAST_EXPECT(badVersion(re));
95 }
96
97 void
99 {
100 testcase("test getAPIVersionNumber function");
101
102 unsigned int versionIfUnspecified =
106
109 BEAST_EXPECT(
110 RPC::getAPIVersionNumber(j_array, false) == versionIfUnspecified);
111 BEAST_EXPECT(
112 RPC::getAPIVersionNumber(j_null, false) == versionIfUnspecified);
113
115 BEAST_EXPECT(
116 RPC::getAPIVersionNumber(j_object, false) == versionIfUnspecified);
117 j_object[jss::api_version] = RPC::apiVersionIfUnspecified.value;
118 BEAST_EXPECT(
119 RPC::getAPIVersionNumber(j_object, false) == versionIfUnspecified);
120
121 j_object[jss::api_version] = RPC::apiMinimumSupportedVersion.value;
122 BEAST_EXPECT(
123 RPC::getAPIVersionNumber(j_object, false) ==
125 j_object[jss::api_version] = RPC::apiMaximumSupportedVersion.value;
126 BEAST_EXPECT(
127 RPC::getAPIVersionNumber(j_object, false) ==
129
130 j_object[jss::api_version] = RPC::apiMinimumSupportedVersion - 1;
131 BEAST_EXPECT(
132 RPC::getAPIVersionNumber(j_object, false) ==
134 j_object[jss::api_version] = RPC::apiMaximumSupportedVersion + 1;
135 BEAST_EXPECT(
136 RPC::getAPIVersionNumber(j_object, false) ==
138 j_object[jss::api_version] = RPC::apiBetaVersion.value;
139 BEAST_EXPECT(
141 j_object[jss::api_version] = RPC::apiBetaVersion + 1;
142 BEAST_EXPECT(
144
145 j_object[jss::api_version] = RPC::apiInvalidVersion.value;
146 BEAST_EXPECT(
147 RPC::getAPIVersionNumber(j_object, false) ==
149 j_object[jss::api_version] = "a";
150 BEAST_EXPECT(
151 RPC::getAPIVersionNumber(j_object, false) ==
153 }
154
155 void
157 {
158 testcase("batch, all good request");
159
160 using namespace test::jtx;
161 Env env{*this};
162
163 auto const without_api_verion = std::string("{ ") +
164 "\"jsonrpc\": \"2.0\", "
165 "\"ripplerpc\": \"2.0\", "
166 "\"id\": 5, "
167 "\"method\": \"version\", "
168 "\"params\": {}}";
169 auto const with_api_verion = std::string("{ ") +
170 "\"jsonrpc\": \"2.0\", "
171 "\"ripplerpc\": \"2.0\", "
172 "\"id\": 6, "
173 "\"method\": \"version\", "
174 "\"params\": { "
175 "\"api_version\": " +
177 auto re = env.rpc(
178 "json2", '[' + without_api_verion + ", " + with_api_verion + ']');
179
180 if (!BEAST_EXPECT(re.isArray()))
181 return;
182 if (!BEAST_EXPECT(re.size() == 2))
183 return;
184 BEAST_EXPECT(
185 re[0u].isMember(jss::result) &&
186 re[0u][jss::result].isMember(jss::version));
187 BEAST_EXPECT(
188 re[1u].isMember(jss::result) &&
189 re[1u][jss::result].isMember(jss::version));
190 }
191
192 void
194 {
195 testcase("batch, with a bad request");
196
197 using namespace test::jtx;
198 Env env{*this};
199
200 BEAST_EXPECT(env.app().config().BETA_RPC_API);
201 auto const without_api_verion = std::string("{ ") +
202 "\"jsonrpc\": \"2.0\", "
203 "\"ripplerpc\": \"2.0\", "
204 "\"id\": 5, "
205 "\"method\": \"version\", "
206 "\"params\": {}}";
207 auto const with_wrong_api_verion = std::string("{ ") +
208 "\"jsonrpc\": \"2.0\", "
209 "\"ripplerpc\": \"2.0\", "
210 "\"id\": 6, "
211 "\"method\": \"version\", "
212 "\"params\": { "
213 "\"api_version\": " +
216 RPC::apiBetaVersion.value) +
217 1) +
218 "}}";
219 auto re = env.rpc(
220 "json2",
221 '[' + without_api_verion + ", " + with_wrong_api_verion + ']');
222
223 if (!BEAST_EXPECT(re.isArray()))
224 return;
225 if (!BEAST_EXPECT(re.size() == 2))
226 return;
227 BEAST_EXPECT(
228 re[0u].isMember(jss::result) &&
229 re[0u][jss::result].isMember(jss::version));
230 BEAST_EXPECT(re[1u].isMember(jss::error));
231 }
232
233 void
235 {
236 testcase("config test");
237 {
238 Config c;
239 BEAST_EXPECT(c.BETA_RPC_API == false);
240 }
241
242 {
243 Config c;
244 c.loadFromString("\n[beta_rpc_api]\n1\n");
245 BEAST_EXPECT(c.BETA_RPC_API == true);
246 }
247
248 {
249 Config c;
250 c.loadFromString("\n[beta_rpc_api]\n0\n");
251 BEAST_EXPECT(c.BETA_RPC_API == false);
252 }
253 }
254
255 void
257 {
258 testcase("test version RPC with api_version >= 2");
259
260 using namespace test::jtx;
261 Env env{*this, envconfig([](std::unique_ptr<Config> c) {
262 c->loadFromString("\n[beta_rpc_api]\n1\n");
263 return c;
264 })};
265 if (!BEAST_EXPECT(env.app().config().BETA_RPC_API == true))
266 return;
267
268 auto jrr = env.rpc(
269 "json",
270 "version",
271 "{\"api_version\": " + std::to_string(RPC::apiBetaVersion) +
272 "}")[jss::result];
273
274 if (!BEAST_EXPECT(jrr.isMember(jss::version)))
275 return;
276 if (!BEAST_EXPECT(jrr[jss::version].isMember(jss::first)) &&
277 jrr[jss::version].isMember(jss::last))
278 return;
279 BEAST_EXPECT(
280 jrr[jss::version][jss::first] ==
282 BEAST_EXPECT(jrr[jss::version][jss::last] == RPC::apiBetaVersion.value);
283 }
284
285public:
286 void
297};
298
299BEAST_DEFINE_TESTSUITE(Version, rpc, ripple);
300
301} // namespace ripple
Represents a JSON value.
Definition json_value.h:149
A testsuite class.
Definition suite.h:55
testcase_t testcase
Memberspace for declaring test cases.
Definition suite.h:155
bool BETA_RPC_API
Definition Config.h:287
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition Config.cpp:479
void run() override
Runs the suite.
T max(T... args)
@ nullValue
'null' value
Definition json_value.h:38
@ arrayValue
array value (ordered list)
Definition json_value.h:44
@ objectValue
object value (collection of name/value pairs).
Definition json_value.h:45
static constexpr auto apiMaximumSupportedVersion
Definition ApiVersion.h:62
static constexpr auto apiBetaVersion
Definition ApiVersion.h:66
static constexpr auto apiVersionIfUnspecified
Definition ApiVersion.h:63
static constexpr auto apiInvalidVersion
Definition ApiVersion.h:60
unsigned int getAPIVersionNumber(Json::Value const &jv, bool betaEnabled)
Retrieve the api version number from the json value.
Definition ApiVersion.h:123
static constexpr auto apiMinimumSupportedVersion
Definition ApiVersion.h:61
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:25
T to_string(T... args)