167 auto toStr = [](
PublicKey const& publicKey) {
175 for (
auto const& val : validators)
176 expectedKeys.
insert(toStr(val.masterPublic));
180 using namespace std::chrono_literals;
185 worker.getIoContext(),
188 {{validFrom2, validUntil2}},
197 using namespace std::string_literals;
205 .append(
strHex(server->publisherPublic()));
214 auto const jrr = env.
rpc(
"server_info")[jss::result];
215 BEAST_EXPECT(jrr[jss::info][jss::validator_list][jss::expiration] ==
"unknown");
218 auto const jrr = env.
rpc(
"server_state")[jss::result];
219 BEAST_EXPECT(jrr[jss::state][jss::validator_list_expires].asInt() == 0);
222 auto const jrr = env.
rpc(
"validators")[jss::result];
224 jrr[jss::validation_quorum].
asUInt() ==
226 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
227 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
228 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
"unknown");
230 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
232 auto jp = jrr[jss::publisher_lists][0u];
233 BEAST_EXPECT(jp[jss::available] ==
false);
234 BEAST_EXPECT(jp[jss::list].
size() == 0);
235 BEAST_EXPECT(!jp.isMember(jss::seq));
236 BEAST_EXPECT(!jp.isMember(jss::expiration));
237 BEAST_EXPECT(!jp.isMember(jss::version));
238 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
240 BEAST_EXPECT(jrr[jss::signing_keys].
size() == 0);
243 auto const jrr = env.
rpc(
"validator_list_sites")[jss::result];
244 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
246 auto js = jrr[jss::validator_sites][0u];
247 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
248 BEAST_EXPECT(js[jss::uri] == siteURI);
249 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
250 BEAST_EXPECT(js[jss::last_refresh_status] ==
"invalid");
257 using namespace std::string_literals;
262 envconfig([&](std::unique_ptr<Config> cfg) {
265 .append(
strHex(server->publisherPublic()));
271 env.app().getValidatorSites().join();
274 auto const jrr = env.rpc(
"server_info")[jss::result];
275 BEAST_EXPECT(jrr[jss::info][jss::validator_list][jss::expiration] ==
"unknown");
278 auto const jrr = env.rpc(
"server_state")[jss::result];
279 BEAST_EXPECT(jrr[jss::state][jss::validator_list_expires].asInt() == 0);
282 auto const jrr = env.rpc(
"validators")[jss::result];
284 jrr[jss::validation_quorum].
asUInt() ==
286 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
287 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
288 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
"unknown");
290 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
292 auto jp = jrr[jss::publisher_lists][0u];
293 BEAST_EXPECT(jp[jss::available] ==
false);
294 BEAST_EXPECT(jp[jss::list].
size() == 0);
295 BEAST_EXPECT(!jp.isMember(jss::seq));
296 BEAST_EXPECT(!jp.isMember(jss::expiration));
297 BEAST_EXPECT(!jp.isMember(jss::version));
298 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
300 BEAST_EXPECT(jrr[jss::signing_keys].
size() == 0);
303 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
304 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
306 auto js = jrr[jss::validator_sites][0u];
307 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
308 BEAST_EXPECT(js[jss::uri] == siteURI);
309 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
310 BEAST_EXPECT(js[jss::last_refresh_status] ==
"invalid");
319 std::stringstream uri;
320 uri <<
"http://" << server->localEndpoint() <<
"/validators";
321 auto siteURI = uri.
str();
325 envconfig([&](std::unique_ptr<Config> cfg) {
328 .append(
strHex(server->publisherPublic()));
333 env.app().getValidatorSites().start();
334 env.app().getValidatorSites().join();
336 for (
auto const& val : validators)
339 env.app().getValidators().updateTrusted(
341 env.timeKeeper().now(),
343 env.app().getOverlay(),
344 env.app().getHashRouter());
347 auto const jrr = env.rpc(
"server_info")[jss::result];
349 jrr[jss::info][jss::validator_list][jss::expiration] ==
to_string(validUntil));
352 auto const jrr = env.rpc(
"server_state")[jss::result];
354 jrr[jss::state][jss::validator_list_expires].
asUInt() ==
355 validUntil.time_since_epoch().count());
358 auto const jrr = env.rpc(
"validators")[jss::result];
359 BEAST_EXPECT(jrr[jss::validation_quorum].
asUInt() == 2);
360 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
to_string(validUntil));
361 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
363 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == expectedKeys.size());
364 for (
auto const& jKey : jrr[jss::trusted_validator_keys])
366 BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
369 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
371 auto jp = jrr[jss::publisher_lists][0u];
372 BEAST_EXPECT(jp[jss::available] ==
true);
373 if (BEAST_EXPECT(jp[jss::list].
size() == 2))
376 std::set<std::string> foundKeys;
377 for (
auto const& k : jp[jss::list])
379 foundKeys.
insert(k.asString());
381 BEAST_EXPECT(foundKeys == expectedKeys);
383 BEAST_EXPECT(jp[jss::seq].
asUInt() == 1);
384 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
385 BEAST_EXPECT(jp[jss::expiration] ==
to_string(validUntil));
386 BEAST_EXPECT(jp[jss::version] == 1);
388 auto jsk = jrr[jss::signing_keys];
389 BEAST_EXPECT(jsk.size() == 2);
390 for (
auto const& val : validators)
392 BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
393 BEAST_EXPECT(jsk[toStr(val.masterPublic)] == toStr(val.signingPublic));
397 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
398 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
400 auto js = jrr[jss::validator_sites][0u];
401 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
402 BEAST_EXPECT(js[jss::uri] == siteURI);
403 BEAST_EXPECT(js[jss::last_refresh_status] ==
"accepted");
406 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
412 std::stringstream uri;
413 uri <<
"http://" << server->localEndpoint() <<
"/validators2";
414 auto siteURI = uri.
str();
418 envconfig([&](std::unique_ptr<Config> cfg) {
421 .append(
strHex(server->publisherPublic()));
426 env.app().getValidatorSites().start();
427 env.app().getValidatorSites().join();
429 for (
auto const& val : validators)
432 env.app().getValidators().updateTrusted(
434 env.timeKeeper().now(),
436 env.app().getOverlay(),
437 env.app().getHashRouter());
440 auto const jrr = env.rpc(
"server_info")[jss::result];
442 jrr[jss::info][jss::validator_list][jss::expiration] ==
to_string(validUntil2));
445 auto const jrr = env.rpc(
"server_state")[jss::result];
447 jrr[jss::state][jss::validator_list_expires].
asUInt() ==
448 validUntil2.time_since_epoch().count());
451 auto const jrr = env.rpc(
"validators")[jss::result];
452 BEAST_EXPECT(jrr[jss::validation_quorum].
asUInt() == 2);
453 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
to_string(validUntil2));
454 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
456 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == expectedKeys.size());
457 for (
auto const& jKey : jrr[jss::trusted_validator_keys])
459 BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
462 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
464 auto jp = jrr[jss::publisher_lists][0u];
465 BEAST_EXPECT(jp[jss::available] ==
true);
466 if (BEAST_EXPECT(jp[jss::list].
size() == 2))
469 std::set<std::string> foundKeys;
470 for (
auto const& k : jp[jss::list])
472 foundKeys.
insert(k.asString());
474 BEAST_EXPECT(foundKeys == expectedKeys);
476 BEAST_EXPECT(jp[jss::seq].
asUInt() == 1);
477 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
478 BEAST_EXPECT(jp[jss::expiration] ==
to_string(validUntil));
479 BEAST_EXPECT(jp[jss::version] == 2);
480 if (BEAST_EXPECT(jp.isMember(jss::remaining)) &&
481 BEAST_EXPECT(jp[jss::remaining].isArray()) &&
482 BEAST_EXPECT(jp[jss::remaining].
size() == 1))
484 auto const& r = jp[jss::remaining][0u];
485 if (BEAST_EXPECT(r[jss::list].
size() == 2))
488 std::set<std::string> foundKeys;
489 for (
auto const& k : r[jss::list])
491 foundKeys.
insert(k.asString());
493 BEAST_EXPECT(foundKeys == expectedKeys);
495 BEAST_EXPECT(r[jss::seq].
asUInt() == 2);
496 BEAST_EXPECT(r[jss::effective] ==
to_string(validFrom2));
497 BEAST_EXPECT(r[jss::expiration] ==
to_string(validUntil2));
500 auto jsk = jrr[jss::signing_keys];
501 BEAST_EXPECT(jsk.size() == 2);
502 for (
auto const& val : validators)
504 BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
505 BEAST_EXPECT(jsk[toStr(val.masterPublic)] == toStr(val.signingPublic));
509 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
510 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
512 auto js = jrr[jss::validator_sites][0u];
513 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
514 BEAST_EXPECT(js[jss::uri] == siteURI);
515 BEAST_EXPECT(js[jss::last_refresh_status] ==
"accepted");
518 BEAST_EXPECT(js.isMember(jss::last_refresh_time));