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 xrpl {
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\": " + std::to_string(RPC::apiMaximumSupportedVersion) +
28 "}")[jss::result];
29 BEAST_EXPECT(isCorrectReply(jrr));
30
31 jrr = env.rpc("version")[jss::result];
32 BEAST_EXPECT(isCorrectReply(jrr));
33 }
34
35 void
37 {
38 testcase("wrong api_version: too low, too high, or wrong format");
39
40 using namespace test::jtx;
41 Env env{*this};
42
43 auto badVersion = [](Json::Value const& re) -> bool {
44 if (re.isMember("error_what"))
45 {
46 if (re["error_what"].isString())
47 {
48 return re["error_what"].asString().find(jss::invalid_API_version.c_str()) == 0;
49 }
50 }
51 return false;
52 };
53
54 auto re = env.rpc(
55 "json",
56 "version",
57 "{\"api_version\": " + std::to_string(RPC::apiMinimumSupportedVersion - 1) + "}");
58 BEAST_EXPECT(badVersion(re));
59
60 BEAST_EXPECT(env.app().config().BETA_RPC_API);
61 re = env.rpc(
62 "json",
63 "version",
64 "{\"api_version\": " +
67 1) +
68 "}");
69 BEAST_EXPECT(badVersion(re));
70
71 re = env.rpc("json", "version", "{\"api_version\": \"a\"}");
72 BEAST_EXPECT(badVersion(re));
73 }
74
75 void
77 {
78 testcase("test getAPIVersionNumber function");
79
80 unsigned int const versionIfUnspecified =
84
87 BEAST_EXPECT(RPC::getAPIVersionNumber(j_array, false) == versionIfUnspecified);
88 BEAST_EXPECT(RPC::getAPIVersionNumber(j_null, false) == versionIfUnspecified);
89
91 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == versionIfUnspecified);
92 j_object[jss::api_version] = RPC::apiVersionIfUnspecified.value;
93 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == versionIfUnspecified);
94
95 j_object[jss::api_version] = RPC::apiMinimumSupportedVersion.value;
96 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == RPC::apiMinimumSupportedVersion);
97 j_object[jss::api_version] = RPC::apiMaximumSupportedVersion.value;
98 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == RPC::apiMaximumSupportedVersion);
99
100 j_object[jss::api_version] = RPC::apiMinimumSupportedVersion - 1;
101 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == RPC::apiInvalidVersion);
102 j_object[jss::api_version] = RPC::apiMaximumSupportedVersion + 1;
103 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == RPC::apiInvalidVersion);
104 j_object[jss::api_version] = RPC::apiBetaVersion.value;
105 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, true) == RPC::apiBetaVersion);
106 j_object[jss::api_version] = RPC::apiBetaVersion + 1;
107 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, true) == RPC::apiInvalidVersion);
108
109 j_object[jss::api_version] = RPC::apiInvalidVersion.value;
110 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == RPC::apiInvalidVersion);
111 j_object[jss::api_version] = "a";
112 BEAST_EXPECT(RPC::getAPIVersionNumber(j_object, false) == RPC::apiInvalidVersion);
113 }
114
115 void
117 {
118 testcase("batch, all good request");
119
120 using namespace test::jtx;
121 Env env{*this};
122
123 auto const without_api_verion = std::string("{ ") +
124 "\"jsonrpc\": \"2.0\", "
125 "\"ripplerpc\": \"2.0\", "
126 "\"id\": 5, "
127 "\"method\": \"version\", "
128 "\"params\": {}}";
129 auto const with_api_verion = std::string("{ ") +
130 "\"jsonrpc\": \"2.0\", "
131 "\"ripplerpc\": \"2.0\", "
132 "\"id\": 6, "
133 "\"method\": \"version\", "
134 "\"params\": { "
135 "\"api_version\": " +
137 auto re = env.rpc("json2", '[' + without_api_verion + ", " + with_api_verion + ']');
138
139 if (!BEAST_EXPECT(re.isArray()))
140 return;
141 if (!BEAST_EXPECT(re.size() == 2))
142 return;
143 BEAST_EXPECT(re[0u].isMember(jss::result) && re[0u][jss::result].isMember(jss::version));
144 BEAST_EXPECT(re[1u].isMember(jss::result) && re[1u][jss::result].isMember(jss::version));
145 }
146
147 void
149 {
150 testcase("batch, with a bad request");
151
152 using namespace test::jtx;
153 Env env{*this};
154
155 BEAST_EXPECT(env.app().config().BETA_RPC_API);
156 auto const without_api_verion = std::string("{ ") +
157 "\"jsonrpc\": \"2.0\", "
158 "\"ripplerpc\": \"2.0\", "
159 "\"id\": 5, "
160 "\"method\": \"version\", "
161 "\"params\": {}}";
162 auto const with_wrong_api_verion =
163 std::string("{ ") +
164 "\"jsonrpc\": \"2.0\", "
165 "\"ripplerpc\": \"2.0\", "
166 "\"id\": 6, "
167 "\"method\": \"version\", "
168 "\"params\": { "
169 "\"api_version\": " +
172 "}}";
173 auto re = env.rpc("json2", '[' + without_api_verion + ", " + with_wrong_api_verion + ']');
174
175 if (!BEAST_EXPECT(re.isArray()))
176 return;
177 if (!BEAST_EXPECT(re.size() == 2))
178 return;
179 BEAST_EXPECT(re[0u].isMember(jss::result) && re[0u][jss::result].isMember(jss::version));
180 BEAST_EXPECT(re[1u].isMember(jss::error));
181 }
182
183 void
185 {
186 testcase("config test");
187 {
188 Config const c;
189 BEAST_EXPECT(c.BETA_RPC_API == false);
190 }
191
192 {
193 Config c;
194 c.loadFromString("\n[beta_rpc_api]\n1\n");
195 BEAST_EXPECT(c.BETA_RPC_API == true);
196 }
197
198 {
199 Config c;
200 c.loadFromString("\n[beta_rpc_api]\n0\n");
201 BEAST_EXPECT(c.BETA_RPC_API == false);
202 }
203 }
204
205 void
207 {
208 testcase("test version RPC with api_version >= 2");
209
210 using namespace test::jtx;
211 Env env{*this, envconfig([](std::unique_ptr<Config> c) {
212 c->loadFromString("\n[beta_rpc_api]\n1\n");
213 return c;
214 })};
215 if (!BEAST_EXPECT(env.app().config().BETA_RPC_API == true))
216 return;
217
218 auto jrr = env.rpc(
219 "json",
220 "version",
221 "{\"api_version\": " + std::to_string(RPC::apiBetaVersion) + "}")[jss::result];
222
223 if (!BEAST_EXPECT(jrr.isMember(jss::version)))
224 return;
225 if (!BEAST_EXPECT(jrr[jss::version].isMember(jss::first)) &&
226 jrr[jss::version].isMember(jss::last))
227 return;
228 BEAST_EXPECT(jrr[jss::version][jss::first] == RPC::apiMinimumSupportedVersion.value);
229 BEAST_EXPECT(jrr[jss::version][jss::last] == RPC::apiBetaVersion.value);
230 }
231
232public:
233 void
244};
245
246BEAST_DEFINE_TESTSUITE(Version, rpc, xrpl);
247
248} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
A testsuite class.
Definition suite.h:51
testcase_t testcase
Memberspace for declaring test cases.
Definition suite.h:150
bool BETA_RPC_API
Definition Config.h:272
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition Config.cpp:452
void testCorrectVersionNumber()
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 apiBetaVersion
Definition ApiVersion.h:45
static constexpr auto apiInvalidVersion
Definition ApiVersion.h:40
static constexpr auto apiMinimumSupportedVersion
Definition ApiVersion.h:41
static constexpr auto apiMaximumSupportedVersion
Definition ApiVersion.h:42
unsigned int getAPIVersionNumber(Json::Value const &jv, bool betaEnabled)
Retrieve the api version number from the json value.
Definition ApiVersion.h:99
static constexpr auto apiVersionIfUnspecified
Definition ApiVersion.h:43
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
T to_string(T... args)