150 using namespace test::jtx;
152 auto toStr = [](
PublicKey const& publicKey) {
160 for (
auto const& val : validators)
161 expectedKeys.
insert(toStr(val.masterPublic));
165 using namespace std::chrono_literals;
170 worker.get_io_context(),
173 {{validFrom2, validUntil2}},
182 using namespace std::string_literals;
188 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
189 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
190 .append(
strHex(server->publisherPublic()));
196 env.app().getValidatorSites().join();
199 auto const jrr = env.rpc(
"server_info")[jss::result];
200 BEAST_EXPECT(jrr[jss::info][jss::validator_list][jss::expiration] ==
"unknown");
203 auto const jrr = env.rpc(
"server_state")[jss::result];
204 BEAST_EXPECT(jrr[jss::state][jss::validator_list_expires].asInt() == 0);
207 auto const jrr = env.rpc(
"validators")[jss::result];
209 jrr[jss::validation_quorum].
asUInt() ==
211 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
212 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
213 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
"unknown");
215 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
217 auto jp = jrr[jss::publisher_lists][0u];
218 BEAST_EXPECT(jp[jss::available] ==
false);
219 BEAST_EXPECT(jp[jss::list].
size() == 0);
220 BEAST_EXPECT(!jp.isMember(jss::seq));
221 BEAST_EXPECT(!jp.isMember(jss::expiration));
222 BEAST_EXPECT(!jp.isMember(jss::version));
223 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
225 BEAST_EXPECT(jrr[jss::signing_keys].
size() == 0);
228 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
229 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
231 auto js = jrr[jss::validator_sites][0u];
232 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
233 BEAST_EXPECT(js[jss::uri] == siteURI);
234 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
235 BEAST_EXPECT(js[jss::last_refresh_status] ==
"invalid");
242 using namespace std::string_literals;
248 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
249 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
250 .append(
strHex(server->publisherPublic()));
255 env.app().getValidatorSites().start();
256 env.app().getValidatorSites().join();
259 auto const jrr = env.rpc(
"server_info")[jss::result];
260 BEAST_EXPECT(jrr[jss::info][jss::validator_list][jss::expiration] ==
"unknown");
263 auto const jrr = env.rpc(
"server_state")[jss::result];
264 BEAST_EXPECT(jrr[jss::state][jss::validator_list_expires].asInt() == 0);
267 auto const jrr = env.rpc(
"validators")[jss::result];
269 jrr[jss::validation_quorum].
asUInt() ==
271 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
272 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
273 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
"unknown");
275 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
277 auto jp = jrr[jss::publisher_lists][0u];
278 BEAST_EXPECT(jp[jss::available] ==
false);
279 BEAST_EXPECT(jp[jss::list].
size() == 0);
280 BEAST_EXPECT(!jp.isMember(jss::seq));
281 BEAST_EXPECT(!jp.isMember(jss::expiration));
282 BEAST_EXPECT(!jp.isMember(jss::version));
283 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
285 BEAST_EXPECT(jrr[jss::signing_keys].
size() == 0);
288 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
289 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
291 auto js = jrr[jss::validator_sites][0u];
292 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
293 BEAST_EXPECT(js[jss::uri] == siteURI);
294 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
295 BEAST_EXPECT(js[jss::last_refresh_status] ==
"invalid");
305 uri <<
"http://" << server->local_endpoint() <<
"/validators";
306 auto siteURI = uri.
str();
311 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
312 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
313 .append(
strHex(server->publisherPublic()));
318 env.app().getValidatorSites().start();
319 env.app().getValidatorSites().join();
320 hash_set<NodeID> startKeys;
321 for (
auto const& val : validators)
322 startKeys.insert(
calcNodeID(val.masterPublic));
324 env.app().getValidators().updateTrusted(
326 env.timeKeeper().now(),
328 env.app().getOverlay(),
329 env.app().getHashRouter());
332 auto const jrr = env.rpc(
"server_info")[jss::result];
334 jrr[jss::info][jss::validator_list][jss::expiration] ==
to_string(validUntil));
337 auto const jrr = env.rpc(
"server_state")[jss::result];
339 jrr[jss::state][jss::validator_list_expires].
asUInt() ==
340 validUntil.time_since_epoch().count());
343 auto const jrr = env.rpc(
"validators")[jss::result];
344 BEAST_EXPECT(jrr[jss::validation_quorum].
asUInt() == 2);
345 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
to_string(validUntil));
346 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
348 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == expectedKeys.size());
349 for (
auto const& jKey : jrr[jss::trusted_validator_keys])
351 BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
354 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
356 auto jp = jrr[jss::publisher_lists][0u];
357 BEAST_EXPECT(jp[jss::available] ==
true);
358 if (BEAST_EXPECT(jp[jss::list].
size() == 2))
362 for (
auto const& k : jp[jss::list])
364 foundKeys.
insert(k.asString());
366 BEAST_EXPECT(foundKeys == expectedKeys);
368 BEAST_EXPECT(jp[jss::seq].
asUInt() == 1);
369 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
370 BEAST_EXPECT(jp[jss::expiration] ==
to_string(validUntil));
371 BEAST_EXPECT(jp[jss::version] == 1);
373 auto jsk = jrr[jss::signing_keys];
374 BEAST_EXPECT(jsk.size() == 2);
375 for (
auto const& val : validators)
377 BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
378 BEAST_EXPECT(jsk[toStr(val.masterPublic)] == toStr(val.signingPublic));
382 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
383 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
385 auto js = jrr[jss::validator_sites][0u];
386 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
387 BEAST_EXPECT(js[jss::uri] == siteURI);
388 BEAST_EXPECT(js[jss::last_refresh_status] ==
"accepted");
391 BEAST_EXPECT(js.isMember(jss::last_refresh_time));
398 uri <<
"http://" << server->local_endpoint() <<
"/validators2";
399 auto siteURI = uri.
str();
404 cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
405 cfg->section(SECTION_VALIDATOR_LIST_KEYS)
406 .append(
strHex(server->publisherPublic()));
411 env.app().getValidatorSites().start();
412 env.app().getValidatorSites().join();
413 hash_set<NodeID> startKeys;
414 for (
auto const& val : validators)
415 startKeys.insert(
calcNodeID(val.masterPublic));
417 env.app().getValidators().updateTrusted(
419 env.timeKeeper().now(),
421 env.app().getOverlay(),
422 env.app().getHashRouter());
425 auto const jrr = env.rpc(
"server_info")[jss::result];
427 jrr[jss::info][jss::validator_list][jss::expiration] ==
to_string(validUntil2));
430 auto const jrr = env.rpc(
"server_state")[jss::result];
432 jrr[jss::state][jss::validator_list_expires].
asUInt() ==
433 validUntil2.time_since_epoch().count());
436 auto const jrr = env.rpc(
"validators")[jss::result];
437 BEAST_EXPECT(jrr[jss::validation_quorum].
asUInt() == 2);
438 BEAST_EXPECT(jrr[jss::validator_list][jss::expiration] ==
to_string(validUntil2));
439 BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
441 BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == expectedKeys.size());
442 for (
auto const& jKey : jrr[jss::trusted_validator_keys])
444 BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
447 if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
449 auto jp = jrr[jss::publisher_lists][0u];
450 BEAST_EXPECT(jp[jss::available] ==
true);
451 if (BEAST_EXPECT(jp[jss::list].
size() == 2))
455 for (
auto const& k : jp[jss::list])
457 foundKeys.
insert(k.asString());
459 BEAST_EXPECT(foundKeys == expectedKeys);
461 BEAST_EXPECT(jp[jss::seq].
asUInt() == 1);
462 BEAST_EXPECT(jp[jss::pubkey_publisher] ==
strHex(server->publisherPublic()));
463 BEAST_EXPECT(jp[jss::expiration] ==
to_string(validUntil));
464 BEAST_EXPECT(jp[jss::version] == 2);
465 if (BEAST_EXPECT(jp.isMember(jss::remaining)) &&
466 BEAST_EXPECT(jp[jss::remaining].isArray()) &&
467 BEAST_EXPECT(jp[jss::remaining].
size() == 1))
469 auto const& r = jp[jss::remaining][0u];
470 if (BEAST_EXPECT(r[jss::list].
size() == 2))
474 for (
auto const& k : r[jss::list])
476 foundKeys.
insert(k.asString());
478 BEAST_EXPECT(foundKeys == expectedKeys);
480 BEAST_EXPECT(r[jss::seq].
asUInt() == 2);
481 BEAST_EXPECT(r[jss::effective] ==
to_string(validFrom2));
482 BEAST_EXPECT(r[jss::expiration] ==
to_string(validUntil2));
485 auto jsk = jrr[jss::signing_keys];
486 BEAST_EXPECT(jsk.size() == 2);
487 for (
auto const& val : validators)
489 BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
490 BEAST_EXPECT(jsk[toStr(val.masterPublic)] == toStr(val.signingPublic));
494 auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
495 if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
497 auto js = jrr[jss::validator_sites][0u];
498 BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
499 BEAST_EXPECT(js[jss::uri] == siteURI);
500 BEAST_EXPECT(js[jss::last_refresh_status] ==
"accepted");
503 BEAST_EXPECT(js.isMember(jss::last_refresh_time));