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