22#include <xrpld/app/misc/NetworkOPs.h>
23#include <xrpld/core/ConfigSections.h>
25#include <xrpl/beast/unit_test.h>
26#include <xrpl/protocol/jss.h>
28#include <boost/format.hpp>
34namespace validator_data {
36 "nHBt9fsb4849WmZiCds4r5TXyBeQjqnH5kzPtqgMAQMgi39YZRPa";
39 "eyJ2YWxpZGF0aW9uX3NlY3JldF9rZXkiOiI5ZWQ0NWY4NjYyNDFjYzE4YTI3NDdiNT\n"
40 "QzODdjMDYyNTkwNzk3MmY0ZTcxOTAyMzFmYWE5Mzc0NTdmYTlkYWY2IiwibWFuaWZl\n"
41 "c3QiOiJKQUFBQUFGeEllMUZ0d21pbXZHdEgyaUNjTUpxQzlnVkZLaWxHZncxL3ZDeE\n"
42 "hYWExwbGMyR25NaEFrRTFhZ3FYeEJ3RHdEYklENk9NU1l1TTBGREFscEFnTms4U0tG\n"
43 "bjdNTzJmZGtjd1JRSWhBT25ndTlzQUtxWFlvdUorbDJWMFcrc0FPa1ZCK1pSUzZQU2\n"
44 "hsSkFmVXNYZkFpQnNWSkdlc2FhZE9KYy9hQVpva1MxdnltR21WcmxIUEtXWDNZeXd1\n"
45 "NmluOEhBU1FLUHVnQkQ2N2tNYVJGR3ZtcEFUSGxHS0pkdkRGbFdQWXk1QXFEZWRGdj\n"
46 "VUSmEydzBpMjFlcTNNWXl3TFZKWm5GT3I3QzBrdzJBaVR6U0NqSXpkaXRROD0ifQ==\n";
55 auto p = std::make_unique<Config>();
56 boost::format toLoad(R
"rippleConfig(
74 p->loadFromString(boost::str(
87 using namespace test::jtx;
91 auto const serverinfo = env.
rpc(
"server_info");
92 BEAST_EXPECT(serverinfo.isMember(jss::result));
93 auto const& result = serverinfo[jss::result];
94 BEAST_EXPECT(!result.isMember(jss::error));
95 BEAST_EXPECT(result[jss::status] ==
"success");
96 BEAST_EXPECT(result.isMember(jss::info));
97 auto const& info = result[jss::info];
98 BEAST_EXPECT(info.isMember(jss::build_version));
100 if (info.isMember(jss::git))
102 auto const& git = info[jss::git];
104 git.isMember(jss::hash) || git.isMember(jss::branch));
106 !git.isMember(jss::hash) ||
107 (git[jss::hash].isString() &&
108 git[jss::hash].asString().size() == 40));
110 !git.isMember(jss::branch) ||
111 (git[jss::branch].isString() &&
112 git[jss::branch].asString().size() != 0));
123 auto const& ports = result[jss::ports];
124 BEAST_EXPECT(ports.isArray() && ports.size() == 0);
126 BEAST_EXPECT(!result.isMember(jss::git));
133 auto const rpc_port = config[
"port_rpc"].get<
unsigned int>(
"port");
134 auto const grpc_port =
135 config[SECTION_PORT_GRPC].get<
unsigned int>(
"port");
136 auto const ws_port = config[
"port_ws"].get<
unsigned int>(
"port");
137 BEAST_EXPECT(grpc_port);
138 BEAST_EXPECT(rpc_port);
139 BEAST_EXPECT(ws_port);
141 auto const result = env.
rpc(
"server_info");
142 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
143 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
144 BEAST_EXPECT(result[jss::result].isMember(jss::info));
146 result[jss::result][jss::info][jss::pubkey_validator] ==
149 auto const& ports = result[jss::result][jss::info][jss::ports];
150 BEAST_EXPECT(ports.isArray() && ports.size() == 3);
151 for (
auto const& port : ports)
153 auto const& proto = port[jss::protocol];
154 BEAST_EXPECT(proto.isArray());
155 auto const p = port[jss::port].asUInt();
156 BEAST_EXPECT(p == rpc_port || p == ws_port || p == grpc_port);
159 BEAST_EXPECT(proto.size() == 1);
160 BEAST_EXPECT(proto[0u].asString() ==
"grpc");
164 BEAST_EXPECT(proto.size() == 2);
165 BEAST_EXPECT(proto[0u].asString() ==
"http");
166 BEAST_EXPECT(proto[1u].asString() ==
"ws2");
170 BEAST_EXPECT(proto.size() == 1);
171 BEAST_EXPECT(proto[0u].asString() ==
"ws");
182 using namespace test::jtx;
186 auto const result = env.
rpc(
"server_definitions");
187 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
188 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
189 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
190 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
192 result[jss::result].isMember(jss::TRANSACTION_RESULTS));
193 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
194 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
195 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
201 auto const firstField = result[jss::result][jss::FIELDS][0u];
202 BEAST_EXPECT(firstField[0u].asString() ==
"Generic");
204 firstField[1][jss::isSerialized].asBool() ==
false);
206 firstField[1][jss::isSigningField].asBool() ==
false);
207 BEAST_EXPECT(firstField[1][jss::isVLEncoded].asBool() ==
false);
208 BEAST_EXPECT(firstField[1][jss::nth].asUInt() == 0);
209 BEAST_EXPECT(firstField[1][jss::type].asString() ==
"Unknown");
213 result[jss::result][jss::LEDGER_ENTRY_TYPES][
"AccountRoot"]
216 result[jss::result][jss::TRANSACTION_RESULTS][
"tecDIR_FULL"]
219 result[jss::result][jss::TRANSACTION_TYPES][
"Payment"]
222 result[jss::result][jss::TYPES][
"AccountID"].asUInt() == 8);
227 for (
auto& field : result[jss::result][jss::FIELDS])
229 if (field[0u].asString() == name)
236 BEAST_EXPECT(fieldExists(
"Generic"));
237 BEAST_EXPECT(fieldExists(
"Invalid"));
238 BEAST_EXPECT(fieldExists(
"ObjectEndMarker"));
239 BEAST_EXPECT(fieldExists(
"ArrayEndMarker"));
240 BEAST_EXPECT(fieldExists(
"taker_gets_funded"));
241 BEAST_EXPECT(fieldExists(
"taker_pays_funded"));
242 BEAST_EXPECT(fieldExists(
"hash"));
243 BEAST_EXPECT(fieldExists(
"index"));
248 auto const types = result[jss::result][jss::TYPES];
249 BEAST_EXPECT(types[
"Hash128"].asUInt() == 4);
250 BEAST_EXPECT(types[
"Hash160"].asUInt() == 17);
251 BEAST_EXPECT(types[
"Hash192"].asUInt() == 21);
252 BEAST_EXPECT(types[
"Hash256"].asUInt() == 5);
253 BEAST_EXPECT(types[
"Hash384"].asUInt() == 22);
254 BEAST_EXPECT(types[
"Hash512"].asUInt() == 23);
261 auto const firstResult = env.
rpc(
"server_definitions");
262 auto const hash = firstResult[jss::result][jss::hash].
asString();
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));
272 !result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
274 !result[jss::result].isMember(jss::TRANSACTION_RESULTS));
275 BEAST_EXPECT(!result[jss::result].isMember(jss::TRANSACTION_TYPES));
276 BEAST_EXPECT(!result[jss::result].isMember(jss::TYPES));
277 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
284 "54296160385A27154BFA70A239DD8E8FD4CC2DB7BA32D970BA3A5B132CF749"
286 auto const hashParam =
290 env.
rpc(
"json",
"server_definitions", hashParam);
291 BEAST_EXPECT(!result[jss::result].isMember(jss::error));
292 BEAST_EXPECT(result[jss::result][jss::status] ==
"success");
293 BEAST_EXPECT(result[jss::result].isMember(jss::FIELDS));
294 BEAST_EXPECT(result[jss::result].isMember(jss::LEDGER_ENTRY_TYPES));
296 result[jss::result].isMember(jss::TRANSACTION_RESULTS));
297 BEAST_EXPECT(result[jss::result].isMember(jss::TRANSACTION_TYPES));
298 BEAST_EXPECT(result[jss::result].isMember(jss::TYPES));
299 BEAST_EXPECT(result[jss::result].isMember(jss::hash));
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.
Set the expected result code for a JTx The test will fail if the code doesn't match.
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.