xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
test
rpc
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
14
namespace
xrpl
{
15
16
class
Version_test
:
public
beast::unit_test::Suite
17
{
18
void
19
testCorrectVersionNumber
()
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
44
testWrongVersionNumber
()
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\": "
+
73
std::to_string
(
74
std::max
(
rpc::kApiMaximumSupportedVersion
.value,
rpc::kApiBetaVersion
.value) +
75
1) +
76
"}"
);
77
BEAST_EXPECT(badVersion(re));
78
79
re = env.rpc(
"json"
,
"version"
, R
"({"api_version": "a"})");
80
BEAST_EXPECT(badVersion(re));
81
}
82
83
void
84
testGetAPIVersionNumber
()
85
{
86
testcase
(
"test getAPIVersionNumber function"
);
87
88
unsigned
int
const
versionIfUnspecified =
89
rpc::kApiVersionIfUnspecified
<
rpc::kApiMinimumSupportedVersion
90
?
rpc::kApiInvalidVersion
91
:
rpc::kApiVersionIfUnspecified
;
92
93
json::Value
const
jArray =
json::Value
(
json::ValueType::Array
);
94
json::Value
const
jNull =
json::Value
(
json::ValueType::Null
);
95
BEAST_EXPECT(
rpc::getAPIVersionNumber
(jArray,
false
) == versionIfUnspecified);
96
BEAST_EXPECT(
rpc::getAPIVersionNumber
(jNull,
false
) == versionIfUnspecified);
97
98
json::Value
jObject =
json::Value
(
json::ValueType::Object
);
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
124
testBatch
()
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\": "
+
144
std::to_string
(
rpc::kApiMaximumSupportedVersion
) +
"}}"
;
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
156
testBatchFail
()
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\": "
+
178
std::to_string
(
179
std::max
(
rpc::kApiMaximumSupportedVersion
.value,
rpc::kApiBetaVersion
.value) + 1) +
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
192
testConfig
()
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
214
testVersionRPCV2
()
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
240
public
:
241
void
242
run
()
override
243
{
244
testCorrectVersionNumber
();
245
testWrongVersionNumber
();
246
testGetAPIVersionNumber
();
247
testBatch
();
248
testBatchFail
();
249
testConfig
();
250
testVersionRPCV2
();
251
}
252
};
253
254
BEAST_DEFINE_TESTSUITE
(Version,
rpc
,
xrpl
);
255
256
}
// namespace xrpl
algorithm
std::string
beast::unit_test::Suite
A testsuite class.
Definition
suite.h:52
beast::unit_test::Suite::testcase
TestcaseT testcase
Memberspace for declaring test cases.
Definition
suite.h:155
json::Value
Represents a JSON value.
Definition
json_value.h:117
xrpl::Config
Definition
src/xrpld/core/Config.h:89
xrpl::Config::loadFromString
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition
xrpld/core/detail/Config.cpp:467
xrpl::Config::betaRpcApi
bool betaRpcApi
Definition
src/xrpld/core/Config.h:316
xrpl::Version_test
Definition
Version_test.cpp:17
xrpl::Version_test::testBatchFail
void testBatchFail()
Definition
Version_test.cpp:156
xrpl::Version_test::testBatch
void testBatch()
Definition
Version_test.cpp:124
xrpl::Version_test::testConfig
void testConfig()
Definition
Version_test.cpp:192
xrpl::Version_test::testGetAPIVersionNumber
void testGetAPIVersionNumber()
Definition
Version_test.cpp:84
xrpl::Version_test::testCorrectVersionNumber
void testCorrectVersionNumber()
Definition
Version_test.cpp:19
xrpl::Version_test::run
void run() override
Runs the suite.
Definition
Version_test.cpp:242
xrpl::Version_test::testWrongVersionNumber
void testWrongVersionNumber()
Definition
Version_test.cpp:44
xrpl::Version_test::testVersionRPCV2
void testVersionRPCV2()
Definition
Version_test.cpp:214
std::max
T max(T... args)
memory
json::ValueType::Array
@ Array
array value (ordered list)
Definition
json_value.h:28
json::ValueType::Object
@ Object
object value (collection of name/value pairs).
Definition
json_value.h:29
json::ValueType::Null
@ Null
'null' value
Definition
json_value.h:22
xrpl::rpc
API version numbers used in later API versions.
Definition
ApiVersion.h:36
xrpl::rpc::kApiMaximumSupportedVersion
static constexpr auto kApiMaximumSupportedVersion
Definition
ApiVersion.h:43
xrpl::rpc::kApiVersionIfUnspecified
static constexpr auto kApiVersionIfUnspecified
Definition
ApiVersion.h:44
xrpl::rpc::kApiMinimumSupportedVersion
static constexpr auto kApiMinimumSupportedVersion
Definition
ApiVersion.h:42
xrpl::rpc::getAPIVersionNumber
unsigned int getAPIVersionNumber(json::Value const &jv, bool betaEnabled)
Retrieve the api version number from the json value.
Definition
ApiVersion.h:100
xrpl::rpc::kApiBetaVersion
static constexpr auto kApiBetaVersion
Definition
ApiVersion.h:46
xrpl::rpc::kApiInvalidVersion
static constexpr auto kApiInvalidVersion
Definition
ApiVersion.h:41
xrpl::test::jtx
Definition
Oracle_test.cpp:34
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::BEAST_DEFINE_TESTSUITE
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
string
std::to_string
T to_string(T... args)
std::unique_ptr
Generated by
1.17.0