20 #include <ripple/app/main/BasicApp.h>
21 #include <ripple/app/misc/ValidatorSite.h>
22 #include <ripple/basics/base64.h>
23 #include <ripple/beast/unit_test.h>
24 #include <ripple/core/ConfigSections.h>
25 #include <ripple/json/json_value.h>
26 #include <ripple/protocol/jss.h>
27 #include <ripple/protocol/Sign.h>
29 #include <test/jtx/TrustedPublisherServer.h>
45 using namespace test::jtx;
47 for (
bool const isAdmin : {
true,
false})
49 for (
std::string cmd : {
"validators",
"validator_list_sites"})
52 auto const jrr = env.rpc(cmd)[jss::result];
55 BEAST_EXPECT(!jrr.isMember(jss::error));
56 BEAST_EXPECT(jrr[jss::status] ==
"success");
64 BEAST_EXPECT(jrr.isNull());
70 auto const jrr = env.rpc(
"server_info")[jss::result];
71 BEAST_EXPECT(jrr[jss::status] ==
"success");
72 BEAST_EXPECT(jrr[jss::info].isMember(
73 jss::validator_list) ==
isAdmin);
78 auto const jrr = env.rpc(
"server_state")[jss::result];
79 BEAST_EXPECT(jrr[jss::status] ==
"success");
80 BEAST_EXPECT(jrr[jss::state].isMember(
81 jss::validator_list_expires) ==
isAdmin);
89 using namespace test::jtx;
92 "n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7",
93 "n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj"};
97 for (
auto const& key : keys)
98 cfg->section(SECTION_VALIDATORS).append(key);
105 auto const jrr = env.rpc(
"server_info")[jss::result];
107 jrr[jss::info][jss::validator_list][jss::expiration] ==
111 auto const jrr = env.rpc(
"server_state")[jss::result];
113 jrr[jss::state][jss::validator_list_expires].asUInt() ==
118 auto const jrr = env.rpc(
"validators")[jss::result];
119 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
"never");
120 BEAST_EXPECT(jrr[jss::validation_quorum].asUInt() == keys.
size());
121 BEAST_EXPECT(jrr[jss::trusted_validator_keys].size() == keys.
size());
122 BEAST_EXPECT(jrr[jss::publisher_lists].size() == 0);
123 BEAST_EXPECT(jrr[jss::local_static_keys].size() == keys.
size());
124 for (
auto const& jKey : jrr[jss::local_static_keys])
126 BEAST_EXPECT(keys.
count(jKey.asString())== 1);
128 BEAST_EXPECT(jrr[jss::signing_keys].size() == 0);
132 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
133 BEAST_EXPECT(jrr[jss::validator_sites].size() == 0);
140 using namespace test::jtx;
142 auto toStr = [](
PublicKey const& publicKey) {
151 for (
auto const& val : validators)
152 expectedKeys.
insert(toStr(val.masterPublic));
160 using namespace std::chrono_literals;
174 using namespace std::string_literals;
181 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
182 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
183 .append(
strHex(server.publisherPublic()));
188 env.app().validatorSites().start();
189 env.app().validatorSites().join();
192 auto const jrr = env.rpc(
"server_info")[jss::result];
194 jrr[jss::info][jss::validator_list][jss::expiration] ==
198 auto const jrr = env.rpc(
"server_state")[jss::result];
200 jrr[jss::state][jss::validator_list_expires].asInt() == 0);
203 auto const jrr = env.rpc(
"validators")[jss::result];
204 BEAST_EXPECT(jrr[jss::validation_quorum].asUInt() ==
206 BEAST_EXPECT(jrr[jss::local_static_keys].size() == 0);
207 BEAST_EXPECT(jrr[jss::trusted_validator_keys].size() == 0);
209 jrr[jss::validator_list][jss::expiration] ==
"unknown");
211 if (BEAST_EXPECT(jrr[jss::publisher_lists].size() == 1))
213 auto jp = jrr[jss::publisher_lists][0u];
214 BEAST_EXPECT(jp[jss::available] ==
false);
215 BEAST_EXPECT(jp[jss::list].size() == 0);
216 BEAST_EXPECT(!jp.isMember(jss::seq));
217 BEAST_EXPECT(!jp.isMember(jss::expiration));
218 BEAST_EXPECT(!jp.isMember(jss::version));
220 jp[jss::pubkey_publisher] ==
strHex(server.publisherPublic()));
222 BEAST_EXPECT(jrr[jss::signing_keys].size() == 0);
225 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
226 if (BEAST_EXPECT(jrr[jss::validator_sites].size() == 1))
228 auto js = jrr[jss::validator_sites][0u];
229 BEAST_EXPECT(js[jss::refresh_interval_min].asUInt() == 5);
230 BEAST_EXPECT(js[jss::uri] == siteURI);
231 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
232 BEAST_EXPECT(js[jss::last_refresh_status] ==
"invalid");
242 uri <<
"http://" << server.local_endpoint() <<
"/validators";
243 auto siteURI = uri.
str();
248 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
249 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
250 .append(
strHex(server.publisherPublic()));
255 env.app().validatorSites().start();
256 env.app().validatorSites().join();
258 for (
auto const& val : validators)
261 env.app().validators().updateTrusted(startKeys);
264 auto const jrr = env.rpc(
"server_info")[jss::result];
266 jrr[jss::info][jss::validator_list][jss::expiration] ==
270 auto const jrr = env.rpc(
"server_state")[jss::result];
272 jrr[jss::state][jss::validator_list_expires].asUInt() ==
276 auto const jrr = env.rpc(
"validators")[jss::result];
277 BEAST_EXPECT(jrr[jss::validation_quorum].asUInt() == 2);
279 jrr[jss::validator_list][jss::expiration] ==
281 BEAST_EXPECT(jrr[jss::local_static_keys].size() == 0);
283 BEAST_EXPECT(jrr[jss::trusted_validator_keys].size() ==
284 expectedKeys.
size());
285 for (
auto const& jKey : jrr[jss::trusted_validator_keys])
287 BEAST_EXPECT(expectedKeys.
count(jKey.asString()) == 1);
290 if (BEAST_EXPECT(jrr[jss::publisher_lists].size() == 1))
292 auto jp = jrr[jss::publisher_lists][0u];
293 BEAST_EXPECT(jp[jss::available] ==
true);
294 if (BEAST_EXPECT(jp[jss::list].size() == 2))
298 for (
auto const& k : jp[jss::list])
300 foundKeys.
insert(k.asString());
302 BEAST_EXPECT(foundKeys == expectedKeys);
304 BEAST_EXPECT(jp[jss::seq].asUInt() == 1);
306 jp[jss::pubkey_publisher] ==
strHex(server.publisherPublic()));
308 BEAST_EXPECT(jp[jss::version] == 1);
310 auto jsk = jrr[jss::signing_keys];
311 BEAST_EXPECT(jsk.size() == 2);
312 for (
auto const& val : validators)
314 BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
316 jsk[toStr(val.masterPublic)] ==
317 toStr(val.signingPublic));
321 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
322 if (BEAST_EXPECT(jrr[jss::validator_sites].size() == 1))
324 auto js = jrr[jss::validator_sites][0u];
325 BEAST_EXPECT(js[jss::refresh_interval_min].asUInt() == 5);
326 BEAST_EXPECT(js[jss::uri] == siteURI);
327 BEAST_EXPECT(js[jss::last_refresh_status] ==
"accepted");
330 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
339 using namespace test::jtx;
341 auto result = env.
rpc(
"validation_create");
342 BEAST_EXPECT(result.isMember(jss::result) &&
343 result[jss::result][jss::status] ==
"success");
344 result = env.rpc(
"validation_create",
345 "BAWL MAN JADE MOON DOVE GEM SON NOW HAD ADEN GLOW TIRE");
346 BEAST_EXPECT(result.isMember(jss::result) &&
347 result[jss::result][jss::status] ==
"success");