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