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