157        using namespace test::jtx;
 
  159        auto toStr = [](
PublicKey const& publicKey) {
 
  168        for (
auto const& val : validators)
 
  169            expectedKeys.
insert(toStr(val.masterPublic));
 
  173        using namespace std::chrono_literals;
 
  178            worker.get_io_context(),
 
  181            {{validFrom2, validUntil2}},
 
  190            using namespace std::string_literals;
 
  197                    cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
 
  198                    cfg->section(SECTION_VALIDATOR_LIST_KEYS)
 
  199                        .append(
strHex(server->publisherPublic()));
 
  205            env.app().validatorSites().join();
 
  208                auto const jrr = env.rpc(
"server_info")[jss::result];
 
  210                    jrr[jss::info][jss::validator_list][jss::expiration] ==
 
  214                auto const jrr = env.rpc(
"server_state")[jss::result];
 
  216                    jrr[jss::state][jss::validator_list_expires].asInt() == 0);
 
  219                auto const jrr = env.rpc(
"validators")[jss::result];
 
  221                    jrr[jss::validation_quorum].
asUInt() ==
 
  223                BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
 
  224                BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
 
  226                    jrr[jss::validator_list][jss::expiration] == 
"unknown");
 
  228                if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
 
  230                    auto jp = jrr[jss::publisher_lists][0u];
 
  231                    BEAST_EXPECT(jp[jss::available] == 
false);
 
  232                    BEAST_EXPECT(jp[jss::list].
size() == 0);
 
  233                    BEAST_EXPECT(!jp.isMember(jss::seq));
 
  234                    BEAST_EXPECT(!jp.isMember(jss::expiration));
 
  235                    BEAST_EXPECT(!jp.isMember(jss::version));
 
  237                        jp[jss::pubkey_publisher] ==
 
  238                        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;
 
  264                    cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
 
  265                    cfg->section(SECTION_VALIDATOR_LIST_KEYS)
 
  266                        .append(
strHex(server->publisherPublic()));
 
  271            env.app().validatorSites().start();
 
  272            env.app().validatorSites().join();
 
  275                auto const jrr = env.rpc(
"server_info")[jss::result];
 
  277                    jrr[jss::info][jss::validator_list][jss::expiration] ==
 
  281                auto const jrr = env.rpc(
"server_state")[jss::result];
 
  283                    jrr[jss::state][jss::validator_list_expires].asInt() == 0);
 
  286                auto const jrr = env.rpc(
"validators")[jss::result];
 
  288                    jrr[jss::validation_quorum].
asUInt() ==
 
  290                BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
 
  291                BEAST_EXPECT(jrr[jss::trusted_validator_keys].
size() == 0);
 
  293                    jrr[jss::validator_list][jss::expiration] == 
"unknown");
 
  295                if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
 
  297                    auto jp = jrr[jss::publisher_lists][0u];
 
  298                    BEAST_EXPECT(jp[jss::available] == 
false);
 
  299                    BEAST_EXPECT(jp[jss::list].
size() == 0);
 
  300                    BEAST_EXPECT(!jp.isMember(jss::seq));
 
  301                    BEAST_EXPECT(!jp.isMember(jss::expiration));
 
  302                    BEAST_EXPECT(!jp.isMember(jss::version));
 
  304                        jp[jss::pubkey_publisher] ==
 
  305                        strHex(server->publisherPublic()));
 
  307                BEAST_EXPECT(jrr[jss::signing_keys].
size() == 0);
 
  310                auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
 
  311                if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
 
  313                    auto js = jrr[jss::validator_sites][0u];
 
  314                    BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
 
  315                    BEAST_EXPECT(js[jss::uri] == siteURI);
 
  316                    BEAST_EXPECT(js.isMember(jss::last_refresh_time));
 
  317                    BEAST_EXPECT(js[jss::last_refresh_status] == 
"invalid");
 
  327            uri << 
"http://" << server->local_endpoint() << 
"/validators";
 
  328            auto siteURI = uri.
str();
 
  333                    cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
 
  334                    cfg->section(SECTION_VALIDATOR_LIST_KEYS)
 
  335                        .append(
strHex(server->publisherPublic()));
 
  340            env.app().validatorSites().start();
 
  341            env.app().validatorSites().join();
 
  342            hash_set<NodeID> startKeys;
 
  343            for (
auto const& val : validators)
 
  344                startKeys.insert(
calcNodeID(val.masterPublic));
 
  346            env.app().validators().updateTrusted(
 
  348                env.timeKeeper().now(),
 
  351                env.app().getHashRouter());
 
  354                auto const jrr = env.rpc(
"server_info")[jss::result];
 
  356                    jrr[jss::info][jss::validator_list][jss::expiration] ==
 
  360                auto const jrr = env.rpc(
"server_state")[jss::result];
 
  362                    jrr[jss::state][jss::validator_list_expires].
asUInt() ==
 
  363                    validUntil.time_since_epoch().count());
 
  366                auto const jrr = env.rpc(
"validators")[jss::result];
 
  367                BEAST_EXPECT(jrr[jss::validation_quorum].
asUInt() == 2);
 
  369                    jrr[jss::validator_list][jss::expiration] ==
 
  371                BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
 
  374                    jrr[jss::trusted_validator_keys].
size() ==
 
  375                    expectedKeys.size());
 
  376                for (
auto const& jKey : jrr[jss::trusted_validator_keys])
 
  378                    BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
 
  381                if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
 
  383                    auto jp = jrr[jss::publisher_lists][0u];
 
  384                    BEAST_EXPECT(jp[jss::available] == 
true);
 
  385                    if (BEAST_EXPECT(jp[jss::list].
size() == 2))
 
  389                        for (
auto const& k : jp[jss::list])
 
  391                            foundKeys.
insert(k.asString());
 
  393                        BEAST_EXPECT(foundKeys == expectedKeys);
 
  395                    BEAST_EXPECT(jp[jss::seq].
asUInt() == 1);
 
  397                        jp[jss::pubkey_publisher] ==
 
  398                        strHex(server->publisherPublic()));
 
  399                    BEAST_EXPECT(jp[jss::expiration] == 
to_string(validUntil));
 
  400                    BEAST_EXPECT(jp[jss::version] == 1);
 
  402                auto jsk = jrr[jss::signing_keys];
 
  403                BEAST_EXPECT(jsk.size() == 2);
 
  404                for (
auto const& val : validators)
 
  406                    BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
 
  408                        jsk[toStr(val.masterPublic)] ==
 
  409                        toStr(val.signingPublic));
 
  413                auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
 
  414                if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
 
  416                    auto js = jrr[jss::validator_sites][0u];
 
  417                    BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
 
  418                    BEAST_EXPECT(js[jss::uri] == siteURI);
 
  419                    BEAST_EXPECT(js[jss::last_refresh_status] == 
"accepted");
 
  422                    BEAST_EXPECT(js.isMember(jss::last_refresh_time));
 
  429            uri << 
"http://" << server->local_endpoint() << 
"/validators2";
 
  430            auto siteURI = uri.
str();
 
  435                    cfg->section(SECTION_VALIDATOR_LIST_SITES).append(siteURI);
 
  436                    cfg->section(SECTION_VALIDATOR_LIST_KEYS)
 
  437                        .append(
strHex(server->publisherPublic()));
 
  442            env.app().validatorSites().start();
 
  443            env.app().validatorSites().join();
 
  444            hash_set<NodeID> startKeys;
 
  445            for (
auto const& val : validators)
 
  446                startKeys.insert(
calcNodeID(val.masterPublic));
 
  448            env.app().validators().updateTrusted(
 
  450                env.timeKeeper().now(),
 
  453                env.app().getHashRouter());
 
  456                auto const jrr = env.rpc(
"server_info")[jss::result];
 
  458                    jrr[jss::info][jss::validator_list][jss::expiration] ==
 
  462                auto const jrr = env.rpc(
"server_state")[jss::result];
 
  464                    jrr[jss::state][jss::validator_list_expires].
asUInt() ==
 
  465                    validUntil2.time_since_epoch().count());
 
  468                auto const jrr = env.rpc(
"validators")[jss::result];
 
  469                BEAST_EXPECT(jrr[jss::validation_quorum].
asUInt() == 2);
 
  471                    jrr[jss::validator_list][jss::expiration] ==
 
  473                BEAST_EXPECT(jrr[jss::local_static_keys].
size() == 0);
 
  476                    jrr[jss::trusted_validator_keys].
size() ==
 
  477                    expectedKeys.size());
 
  478                for (
auto const& jKey : jrr[jss::trusted_validator_keys])
 
  480                    BEAST_EXPECT(expectedKeys.count(jKey.asString()) == 1);
 
  483                if (BEAST_EXPECT(jrr[jss::publisher_lists].
size() == 1))
 
  485                    auto jp = jrr[jss::publisher_lists][0u];
 
  486                    BEAST_EXPECT(jp[jss::available] == 
true);
 
  487                    if (BEAST_EXPECT(jp[jss::list].
size() == 2))
 
  491                        for (
auto const& k : jp[jss::list])
 
  493                            foundKeys.
insert(k.asString());
 
  495                        BEAST_EXPECT(foundKeys == expectedKeys);
 
  497                    BEAST_EXPECT(jp[jss::seq].
asUInt() == 1);
 
  499                        jp[jss::pubkey_publisher] ==
 
  500                        strHex(server->publisherPublic()));
 
  501                    BEAST_EXPECT(jp[jss::expiration] == 
to_string(validUntil));
 
  502                    BEAST_EXPECT(jp[jss::version] == 2);
 
  503                    if (BEAST_EXPECT(jp.isMember(jss::remaining)) &&
 
  504                        BEAST_EXPECT(jp[jss::remaining].isArray()) &&
 
  505                        BEAST_EXPECT(jp[jss::remaining].
size() == 1))
 
  507                        auto const& r = jp[jss::remaining][0u];
 
  508                        if (BEAST_EXPECT(r[jss::list].
size() == 2))
 
  512                            for (
auto const& k : r[jss::list])
 
  514                                foundKeys.
insert(k.asString());
 
  516                            BEAST_EXPECT(foundKeys == expectedKeys);
 
  518                        BEAST_EXPECT(r[jss::seq].
asUInt() == 2);
 
  520                            r[jss::effective] == 
to_string(validFrom2));
 
  522                            r[jss::expiration] == 
to_string(validUntil2));
 
  525                auto jsk = jrr[jss::signing_keys];
 
  526                BEAST_EXPECT(jsk.size() == 2);
 
  527                for (
auto const& val : validators)
 
  529                    BEAST_EXPECT(jsk.isMember(toStr(val.masterPublic)));
 
  531                        jsk[toStr(val.masterPublic)] ==
 
  532                        toStr(val.signingPublic));
 
  536                auto const jrr = env.rpc(
"validator_list_sites")[jss::result];
 
  537                if (BEAST_EXPECT(jrr[jss::validator_sites].
size() == 1))
 
  539                    auto js = jrr[jss::validator_sites][0u];
 
  540                    BEAST_EXPECT(js[jss::refresh_interval_min].
asUInt() == 5);
 
  541                    BEAST_EXPECT(js[jss::uri] == siteURI);
 
  542                    BEAST_EXPECT(js[jss::last_refresh_status] == 
"accepted");
 
  545                    BEAST_EXPECT(js.isMember(jss::last_refresh_time));