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/Sign.h>
27 #include <ripple/protocol/jss.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");
73 jrr[jss::info].isMember(jss::validator_list) ==
isAdmin);
78 auto const jrr = env.rpc(
"server_state")[jss::result];
79 BEAST_EXPECT(jrr[jss::status] ==
"success");
81 jrr[jss::state].isMember(jss::validator_list_expires) ==
90 using namespace test::jtx;
93 "n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7",
94 "n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj"};
98 for (
auto const& key : keys)
99 cfg->section(SECTION_VALIDATORS).append(key);
106 auto const jrr = env.rpc(
"server_info")[jss::result];
108 jrr[jss::info][jss::validator_list][jss::expiration] ==
112 auto const jrr = env.rpc(
"server_state")[jss::result];
114 jrr[jss::state][jss::validator_list_expires].asUInt() ==
119 auto const jrr = env.rpc(
"validators")[jss::result];
120 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
"never");
121 BEAST_EXPECT(jrr[jss::validation_quorum].asUInt() == keys.
size());
123 jrr[jss::trusted_validator_keys].size() == keys.
size());
124 BEAST_EXPECT(jrr[jss::publisher_lists].size() == 0);
125 BEAST_EXPECT(jrr[jss::local_static_keys].size() == keys.
size());
126 for (
auto const& jKey : jrr[jss::local_static_keys])
128 BEAST_EXPECT(keys.
count(jKey.asString()) == 1);
130 BEAST_EXPECT(jrr[jss::signing_keys].size() == 0);
134 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
135 BEAST_EXPECT(jrr[jss::validator_sites].size() == 0);
139 auto const jrr = env.rpc(
"validators")[jss::result];
140 BEAST_EXPECT(jrr[jss::NegativeUNL].isNull());
149 env.app().validators().setNegativeUNL(disabledKeys);
151 auto const jrr = env.rpc(
"validators")[jss::result];
152 auto& jrrnUnl = jrr[jss::NegativeUNL];
153 auto jrrnUnlSize = jrrnUnl.size();
154 BEAST_EXPECT(jrrnUnlSize == 2);
157 auto parsedKey = parseBase58<PublicKey>(
159 BEAST_EXPECT(parsedKey);
162 disabledKeys.
find(*parsedKey) != disabledKeys.
end());
165 disabledKeys.
clear();
166 env.app().validators().setNegativeUNL(disabledKeys);
167 auto const jrrUpdated = env.rpc(
"validators")[jss::result];
168 BEAST_EXPECT(jrrUpdated[jss::NegativeUNL].isNull());
175 using namespace test::jtx;
177 auto toStr = [](
PublicKey const& publicKey) {
186 for (
auto const& val : validators)
187 expectedKeys.
insert(toStr(val.masterPublic));
191 using namespace std::chrono_literals;
196 worker.get_io_service(),
199 {{validFrom2, validUntil2}},
208 using namespace std::string_literals;
215 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
216 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
217 .append(
strHex(server->publisherPublic()));
222 env.app().validatorSites().start();
223 env.app().validatorSites().join();
226 auto const jrr = env.rpc(
"server_info")[jss::result];
228 jrr[jss::info][jss::validator_list][jss::expiration] ==
232 auto const jrr = env.rpc(
"server_state")[jss::result];
234 jrr[jss::state][jss::validator_list_expires].asInt() == 0);
237 auto const jrr = env.rpc(
"validators")[jss::result];
239 jrr[jss::validation_quorum].asUInt() ==
241 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
242 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
244 jrr[jss::validator_list][jss::expiration] ==
"unknown");
246 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
248 auto jp = jrr[jss::publisher_lists][0u];
249 BEAST_EXPECT(jp[jss::available] ==
false);
250 BEAST_EXPECT(jp[jss::list].
size() == 0);
251 BEAST_EXPECT(!jp.isMember(jss::seq));
252 BEAST_EXPECT(!jp.isMember(jss::expiration));
253 BEAST_EXPECT(!jp.isMember(jss::version));
255 jp[jss::pubkey_publisher] ==
256 strHex(server->publisherPublic()));
258 BEAST_EXPECT(jrr[jss::signing_keys].
size() == 0);
261 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
262 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
264 auto js = jrr[jss::validator_sites][0u];
265 BEAST_EXPECT(js[jss::refresh_interval_min].asUInt() == 5);
266 BEAST_EXPECT(js[jss::uri] == siteURI);
267 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
268 BEAST_EXPECT(js[jss::last_refresh_status] ==
"invalid");
275 using namespace std::string_literals;
282 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
283 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
284 .append(
strHex(server->publisherPublic()));
289 env.app().validatorSites().start();
290 env.app().validatorSites().join();
293 auto const jrr = env.rpc(
"server_info")[jss::result];
295 jrr[jss::info][jss::validator_list][jss::expiration] ==
299 auto const jrr = env.rpc(
"server_state")[jss::result];
301 jrr[jss::state][jss::validator_list_expires].asInt() == 0);
304 auto const jrr = env.rpc(
"validators")[jss::result];
306 jrr[jss::validation_quorum].asUInt() ==
308 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
309 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
311 jrr[jss::validator_list][jss::expiration] ==
"unknown");
313 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
315 auto jp = jrr[jss::publisher_lists][0u];
316 BEAST_EXPECT(jp[jss::available] ==
false);
317 BEAST_EXPECT(jp[jss::list].
size() == 0);
318 BEAST_EXPECT(!jp.isMember(jss::seq));
319 BEAST_EXPECT(!jp.isMember(jss::expiration));
320 BEAST_EXPECT(!jp.isMember(jss::version));
322 jp[jss::pubkey_publisher] ==
323 strHex(server->publisherPublic()));
325 BEAST_EXPECT(jrr[jss::signing_keys].
size() == 0);
328 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
329 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
331 auto js = jrr[jss::validator_sites][0u];
332 BEAST_EXPECT(js[jss::refresh_interval_min].asUInt() == 5);
333 BEAST_EXPECT(js[jss::uri] == siteURI);
334 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
335 BEAST_EXPECT(js[jss::last_refresh_status] ==
"invalid");
345 uri <<
"http://" << server->local_endpoint() <<
"/validators";
346 auto siteURI = uri.
str();
351 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
352 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
353 .append(
strHex(server->publisherPublic()));
358 env.app().validatorSites().start();
359 env.app().validatorSites().join();
360 hash_set<NodeID> startKeys;
361 for (
auto const& val : validators)
362 startKeys.insert(
calcNodeID(val.masterPublic));
364 env.app().validators().updateTrusted(
366 env.timeKeeper().now(),
369 env.app().getHashRouter());
372 auto const jrr = env.rpc(
"server_info")[jss::result];
374 jrr[jss::info][jss::validator_list][jss::expiration] ==
378 auto const jrr = env.rpc(
"server_state")[jss::result];
380 jrr[jss::state][jss::validator_list_expires].asUInt() ==
381 validUntil.time_since_epoch().count());
384 auto const jrr = env.rpc(
"validators")[jss::result];
385 BEAST_EXPECT(jrr[jss::validation_quorum].asUInt() == 2);
387 jrr[jss::validator_list][jss::expiration] ==
389 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
392 jrr[jss::trusted_validator_keys].
size() ==
393 expectedKeys.size());
394 for (
auto const& jKey : jrr[jss::trusted_validator_keys])
396 BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
399 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
401 auto jp = jrr[jss::publisher_lists][0u];
402 BEAST_EXPECT(jp[jss::available] ==
true);
403 if (BEAST_EXPECT(jp[jss::list].
size() == 2))
407 for (
auto const& k : jp[jss::list])
409 foundKeys.
insert(k.asString());
411 BEAST_EXPECT(foundKeys == expectedKeys);
413 BEAST_EXPECT(jp[jss::seq].asUInt() == 1);
415 jp[jss::pubkey_publisher] ==
416 strHex(server->publisherPublic()));
417 BEAST_EXPECT(jp[jss::expiration] ==
to_string(validUntil));
418 BEAST_EXPECT(jp[jss::version] == 1);
420 auto jsk = jrr[jss::signing_keys];
421 BEAST_EXPECT(jsk.size() == 2);
422 for (
auto const& val : validators)
424 BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
426 jsk[toStr(val.masterPublic)] ==
427 toStr(val.signingPublic));
431 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
432 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
434 auto js = jrr[jss::validator_sites][0u];
435 BEAST_EXPECT(js[jss::refresh_interval_min].asUInt() == 5);
436 BEAST_EXPECT(js[jss::uri] == siteURI);
437 BEAST_EXPECT(js[jss::last_refresh_status] ==
"accepted");
440 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
447 uri <<
"http://" << server->local_endpoint() <<
"/validators2";
448 auto siteURI = uri.
str();
453 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
454 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
455 .append(
strHex(server->publisherPublic()));
460 env.app().validatorSites().start();
461 env.app().validatorSites().join();
462 hash_set<NodeID> startKeys;
463 for (
auto const& val : validators)
464 startKeys.insert(
calcNodeID(val.masterPublic));
466 env.app().validators().updateTrusted(
468 env.timeKeeper().now(),
471 env.app().getHashRouter());
474 auto const jrr = env.rpc(
"server_info")[jss::result];
476 jrr[jss::info][jss::validator_list][jss::expiration] ==
480 auto const jrr = env.rpc(
"server_state")[jss::result];
482 jrr[jss::state][jss::validator_list_expires].asUInt() ==
483 validUntil2.time_since_epoch().count());
486 auto const jrr = env.rpc(
"validators")[jss::result];
487 BEAST_EXPECT(jrr[jss::validation_quorum].asUInt() == 2);
489 jrr[jss::validator_list][jss::expiration] ==
491 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
494 jrr[jss::trusted_validator_keys].
size() ==
495 expectedKeys.size());
496 for (
auto const& jKey : jrr[jss::trusted_validator_keys])
498 BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
501 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
503 auto jp = jrr[jss::publisher_lists][0u];
504 BEAST_EXPECT(jp[jss::available] ==
true);
505 if (BEAST_EXPECT(jp[jss::list].
size() == 2))
509 for (
auto const& k : jp[jss::list])
511 foundKeys.
insert(k.asString());
513 BEAST_EXPECT(foundKeys == expectedKeys);
515 BEAST_EXPECT(jp[jss::seq].asUInt() == 1);
517 jp[jss::pubkey_publisher] ==
518 strHex(server->publisherPublic()));
519 BEAST_EXPECT(jp[jss::expiration] ==
to_string(validUntil));
520 BEAST_EXPECT(jp[jss::version] == 2);
521 if (BEAST_EXPECT(jp.isMember(jss::remaining)) &&
522 BEAST_EXPECT(jp[jss::remaining].isArray()) &&
523 BEAST_EXPECT(jp[jss::remaining].
size() == 1))
525 auto const& r = jp[jss::remaining][0u];
526 if (BEAST_EXPECT(r[jss::list].
size() == 2))
530 for (
auto const& k : r[jss::list])
532 foundKeys.
insert(k.asString());
534 BEAST_EXPECT(foundKeys == expectedKeys);
536 BEAST_EXPECT(r[jss::seq].asUInt() == 2);
538 r[jss::effective] ==
to_string(validFrom2));
540 r[jss::expiration] ==
to_string(validUntil2));
543 auto jsk = jrr[jss::signing_keys];
544 BEAST_EXPECT(jsk.size() == 2);
545 for (
auto const& val : validators)
547 BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
549 jsk[toStr(val.masterPublic)] ==
550 toStr(val.signingPublic));
554 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
555 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
557 auto js = jrr[jss::validator_sites][0u];
558 BEAST_EXPECT(js[jss::refresh_interval_min].asUInt() == 5);
559 BEAST_EXPECT(js[jss::uri] == siteURI);
560 BEAST_EXPECT(js[jss::last_refresh_status] ==
"accepted");
563 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
572 using namespace test::jtx;
574 auto result = env.
rpc(
"validation_create");
576 result.isMember(jss::result) &&
577 result[jss::result][jss::status] ==
"success");
580 "BAWL MAN JADE MOON DOVE GEM SON NOW HAD ADEN GLOW TIRE");
582 result.isMember(jss::result) &&
583 result[jss::result][jss::status] ==
"success");