21#include <xrpld/app/misc/NetworkOPs.h>
22#include <xrpld/core/ConfigSections.h>
23#include <xrpl/beast/unit_test.h>
24#include <xrpl/protocol/jss.h>
26#include <boost/format.hpp>
32namespace validator_data {
34 "nHBt9fsb4849WmZiCds4r5TXyBeQjqnH5kzPtqgMAQMgi39YZRPa";
37 "eyJ2YWxpZGF0aW9uX3NlY3JldF9rZXkiOiI5ZWQ0NWY4NjYyNDFjYzE4YTI3NDdiNT\n"
38 "QzODdjMDYyNTkwNzk3MmY0ZTcxOTAyMzFmYWE5Mzc0NTdmYTlkYWY2IiwibWFuaWZl\n"
39 "c3QiOiJKQUFBQUFGeEllMUZ0d21pbXZHdEgyaUNjTUpxQzlnVkZLaWxHZncxL3ZDeE\n"
40 "hYWExwbGMyR25NaEFrRTFhZ3FYeEJ3RHdEYklENk9NU1l1TTBGREFscEFnTms4U0tG\n"
41 "bjdNTzJmZGtjd1JRSWhBT25ndTlzQUtxWFlvdUorbDJWMFcrc0FPa1ZCK1pSUzZQU2\n"
42 "hsSkFmVXNYZkFpQnNWSkdlc2FhZE9KYy9hQVpva1MxdnltR21WcmxIUEtXWDNZeXd1\n"
43 "NmluOEhBU1FLUHVnQkQ2N2tNYVJGR3ZtcEFUSGxHS0pkdkRGbFdQWXk1QXFEZWRGdj\n"
44 "VUSmEydzBpMjFlcTNNWXl3TFZKWm5GT3I3QzBrdzJBaVR6U0NqSXpkaXRROD0ifQ==\n";
53 auto p = std::make_unique<Config>();
54 boost::format toLoad(R
"rippleConfig(
72 p->loadFromString(boost::str(
85 using namespace test::jtx;
89 auto const serverinfo = env.
rpc(
"server_info");
90 BEAST_EXPECT(serverinfo.isMember(jss::result));
91 auto const& result = serverinfo[jss::result];
92 BEAST_EXPECT(!result.isMember(jss::error));
93 BEAST_EXPECT(result[jss::status] ==
"success");
94 BEAST_EXPECT(result.isMember(jss::info));
95 auto const& info = result[jss::info];
96 BEAST_EXPECT(info.isMember(jss::build_version));
98 if (info.isMember(jss::git))
100 auto const& git = info[jss::git];
102 git.isMember(jss::hash) || git.isMember(jss::branch));
104 !git.isMember(jss::hash) ||
105 (git[jss::hash].isString() &&
106 git[jss::hash].asString().size() == 40));
108 !git.isMember(jss::branch) ||
109 (git[jss::branch].isString() &&
110 git[jss::branch].asString().size() != 0));
121 auto const& ports = result[jss::ports];
122 BEAST_EXPECT(ports.isArray() && ports.size() == 0);
124 BEAST_EXPECT(!result.isMember(jss::git));
131 auto const rpc_port = config[
"port_rpc"].get<
unsigned int>(
"port");
132 auto const grpc_port =
133 config[SECTION_PORT_GRPC].get<
unsigned int>(
"port");
134 auto const ws_port = config[
"port_ws"].get<
unsigned int>(
"port");
135 BEAST_EXPECT(grpc_port);
136 BEAST_EXPECT(rpc_port);
137 BEAST_EXPECT(ws_port);
139 auto const result = env.
rpc(
"server_info");
140 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
141 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
142 BEAST_EXPECT(result[jss::result].isMember(jss::info));
144 result[jss::result][jss::info][jss::pubkey_validator] ==
147 auto const& ports = result[jss::result][jss::info][jss::ports];
148 BEAST_EXPECT(ports.isArray() && ports.size() == 3);
149 for (
auto const& port : ports)
151 auto const& proto = port[jss::protocol];
152 BEAST_EXPECT(proto.isArray());
153 auto const p = port[jss::port].asUInt();
154 BEAST_EXPECT(p == rpc_port || p == ws_port || p == grpc_port);
157 BEAST_EXPECT(proto.size() == 1);
158 BEAST_EXPECT(proto[0u].asString() ==
"grpc");
162 BEAST_EXPECT(proto.size() == 2);
163 BEAST_EXPECT(proto[0u].asString() ==
"http");
164 BEAST_EXPECT(proto[1u].asString() ==
"ws2");
168 BEAST_EXPECT(proto.size() == 1);
169 BEAST_EXPECT(proto[0u].asString() ==
"ws");
180 using namespace test::jtx;
184 auto const result = env.
rpc(
"server_definitions");
185 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
186 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
187 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
188 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
190 result[jss::result].isMember(jss::TRANSACTION_RESULTS));
191 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
192 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
193 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
199 auto const firstField = result[jss::result][jss::FIELDS][0u];
200 BEAST_EXPECT(firstField[0u].asString() ==
"Generic");
202 firstField[1][jss::isSerialized].asBool() ==
false);
204 firstField[1][jss::isSigningField].asBool() ==
false);
205 BEAST_EXPECT(firstField[1][jss::isVLEncoded].asBool() ==
false);
206 BEAST_EXPECT(firstField[1][jss::nth].asUInt() == 0);
207 BEAST_EXPECT(firstField[1][jss::type].asString() ==
"Unknown");
211 result[jss::result][jss::LEDGER_ENTRY_TYPES][
"AccountRoot"]
214 result[jss::result][jss::TRANSACTION_RESULTS][
"tecDIR_FULL"]
217 result[jss::result][jss::TRANSACTION_TYPES][
"Payment"]
220 result[jss::result][jss::TYPES][
"AccountID"].asUInt() == 8);
225 for (
auto& field : result[jss::result][jss::FIELDS])
227 if (field[0u].asString() == name)
234 BEAST_EXPECT(fieldExists(
"Generic"));
235 BEAST_EXPECT(fieldExists(
"Invalid"));
236 BEAST_EXPECT(fieldExists(
"ObjectEndMarker"));
237 BEAST_EXPECT(fieldExists(
"ArrayEndMarker"));
238 BEAST_EXPECT(fieldExists(
"taker_gets_funded"));
239 BEAST_EXPECT(fieldExists(
"taker_pays_funded"));
240 BEAST_EXPECT(fieldExists(
"hash"));
241 BEAST_EXPECT(fieldExists(
"index"));
246 auto const types = result[jss::result][jss::TYPES];
247 BEAST_EXPECT(types[
"Hash128"].asUInt() == 4);
248 BEAST_EXPECT(types[
"Hash160"].asUInt() == 17);
249 BEAST_EXPECT(types[
"Hash192"].asUInt() == 21);
250 BEAST_EXPECT(types[
"Hash256"].asUInt() == 5);
251 BEAST_EXPECT(types[
"Hash384"].asUInt() == 22);
252 BEAST_EXPECT(types[
"Hash512"].asUInt() == 23);
259 auto const firstResult = env.
rpc(
"server_definitions");
260 auto const hash = firstResult[jss::result][jss::hash].
asString();
261 auto const hashParam =
265 env.
rpc(
"json",
"server_definitions", hashParam);
266 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
267 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
268 BEAST_EXPECT(!result[jss::result].isMember(jss::FIELDS));
270 !result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
272 !result[jss::result].isMember(jss::TRANSACTION_RESULTS));
273 BEAST_EXPECT(!result[jss::result].isMember(jss::TRANSACTION_TYPES));
274 BEAST_EXPECT(!result[jss::result].isMember(jss::TYPES));
275 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
282 "54296160385A27154BFA70A239DD8E8FD4CC2DB7BA32D970BA3A5B132CF749"
284 auto const hashParam =
288 env.
rpc(
"json",
"server_definitions", hashParam);
289 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
290 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
291 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
292 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
294 result[jss::result].isMember(jss::TRANSACTION_RESULTS));
295 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
296 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
297 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
309BEAST_DEFINE_TESTSUITE(ServerInfo, app,
ripple);
std::string asString() const
Returns the unquoted string value.
testcase_t testcase
Memberspace for declaring test cases.
virtual Config & config()=0
virtual NetworkOPs & getOPs()=0
virtual Json::Value getServerInfo(bool human, bool admin, bool counters)=0
void run() override
Runs the suite.
static std::unique_ptr< Config > makeValidatorConfig()
void testServerDefinitions()
A transaction testing environment.
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
static auto const public_key
void setupConfigForUnitTests(Config &config)
initializes a config object for use with jtx::Env
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.