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 result = env.
rpc(
"server_info");
90 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
91 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
92 BEAST_EXPECT(result[jss::result].isMember(jss::info));
102 auto const& ports = result[jss::ports];
103 BEAST_EXPECT(ports.isArray() && ports.size() == 0);
110 auto const rpc_port = config[
"port_rpc"].get<
unsigned int>(
"port");
111 auto const grpc_port =
112 config[SECTION_PORT_GRPC].get<
unsigned int>(
"port");
113 auto const ws_port = config[
"port_ws"].get<
unsigned int>(
"port");
114 BEAST_EXPECT(grpc_port);
115 BEAST_EXPECT(rpc_port);
116 BEAST_EXPECT(ws_port);
118 auto const result = env.
rpc(
"server_info");
119 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
120 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
121 BEAST_EXPECT(result[jss::result].isMember(jss::info));
123 result[jss::result][jss::info][jss::pubkey_validator] ==
126 auto const& ports = result[jss::result][jss::info][jss::ports];
127 BEAST_EXPECT(ports.isArray() && ports.size() == 3);
128 for (
auto const& port : ports)
130 auto const& proto = port[jss::protocol];
131 BEAST_EXPECT(proto.isArray());
132 auto const p = port[jss::port].asUInt();
133 BEAST_EXPECT(p == rpc_port || p == ws_port || p == grpc_port);
136 BEAST_EXPECT(proto.size() == 1);
137 BEAST_EXPECT(proto[0u].asString() ==
"grpc");
141 BEAST_EXPECT(proto.size() == 2);
142 BEAST_EXPECT(proto[0u].asString() ==
"http");
143 BEAST_EXPECT(proto[1u].asString() ==
"ws2");
147 BEAST_EXPECT(proto.size() == 1);
148 BEAST_EXPECT(proto[0u].asString() ==
"ws");
159 using namespace test::jtx;
163 auto const result = env.
rpc(
"server_definitions");
164 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
165 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
166 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
167 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
169 result[jss::result].isMember(jss::TRANSACTION_RESULTS));
170 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
171 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
172 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
178 auto const firstField = result[jss::result][jss::FIELDS][0u];
179 BEAST_EXPECT(firstField[0u].asString() ==
"Generic");
181 firstField[1][jss::isSerialized].asBool() ==
false);
183 firstField[1][jss::isSigningField].asBool() ==
false);
184 BEAST_EXPECT(firstField[1][jss::isVLEncoded].asBool() ==
false);
185 BEAST_EXPECT(firstField[1][jss::nth].asUInt() == 0);
186 BEAST_EXPECT(firstField[1][jss::type].asString() ==
"Unknown");
190 result[jss::result][jss::LEDGER_ENTRY_TYPES][
"AccountRoot"]
193 result[jss::result][jss::TRANSACTION_RESULTS][
"tecDIR_FULL"]
196 result[jss::result][jss::TRANSACTION_TYPES][
"Payment"]
199 result[jss::result][jss::TYPES][
"AccountID"].asUInt() == 8);
204 for (
auto& field : result[jss::result][jss::FIELDS])
206 if (field[0u].asString() == name)
213 BEAST_EXPECT(fieldExists(
"Generic"));
214 BEAST_EXPECT(fieldExists(
"Invalid"));
215 BEAST_EXPECT(fieldExists(
"ObjectEndMarker"));
216 BEAST_EXPECT(fieldExists(
"ArrayEndMarker"));
217 BEAST_EXPECT(fieldExists(
"taker_gets_funded"));
218 BEAST_EXPECT(fieldExists(
"taker_pays_funded"));
219 BEAST_EXPECT(fieldExists(
"hash"));
220 BEAST_EXPECT(fieldExists(
"index"));
225 auto const types = result[jss::result][jss::TYPES];
226 BEAST_EXPECT(types[
"Hash128"].asUInt() == 4);
227 BEAST_EXPECT(types[
"Hash160"].asUInt() == 17);
228 BEAST_EXPECT(types[
"Hash192"].asUInt() == 21);
229 BEAST_EXPECT(types[
"Hash256"].asUInt() == 5);
230 BEAST_EXPECT(types[
"Hash384"].asUInt() == 22);
231 BEAST_EXPECT(types[
"Hash512"].asUInt() == 23);
238 auto const firstResult = env.
rpc(
"server_definitions");
239 auto const hash = firstResult[jss::result][jss::hash].
asString();
240 auto const hashParam =
244 env.
rpc(
"json",
"server_definitions", hashParam);
245 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
246 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
247 BEAST_EXPECT(!result[jss::result].isMember(jss::FIELDS));
249 !result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
251 !result[jss::result].isMember(jss::TRANSACTION_RESULTS));
252 BEAST_EXPECT(!result[jss::result].isMember(jss::TRANSACTION_TYPES));
253 BEAST_EXPECT(!result[jss::result].isMember(jss::TYPES));
254 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
261 "54296160385A27154BFA70A239DD8E8FD4CC2DB7BA32D970BA3A5B132CF749"
263 auto const hashParam =
267 env.
rpc(
"json",
"server_definitions", hashParam);
268 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
269 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
270 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
271 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
273 result[jss::result].isMember(jss::TRANSACTION_RESULTS));
274 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
275 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
276 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
288BEAST_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.