refactor: Change config section and key string literals into constants (#7095)

Co-authored-by: Bart <11445373+bthomee@users.noreply.github.com>
This commit is contained in:
Bart
2026-06-09 10:58:21 -04:00
committed by GitHub
parent c9769d1add
commit c552eb333f
83 changed files with 1262 additions and 1029 deletions

View File

@@ -2,11 +2,11 @@
#include <test/unit_test/FileDirGuard.h>
#include <xrpld/core/Config.h>
#include <xrpld/core/ConfigSections.h>
#include <xrpl/basics/BasicConfig.h>
#include <xrpl/beast/unit_test/suite.h>
#include <xrpl/beast/utility/temp_dir.h>
#include <xrpl/config/BasicConfig.h>
#include <xrpl/config/Constants.h>
#include <xrpl/protocol/SystemParameters.h> // IWYU pragma: keep
#include <xrpl/server/Port.h>
@@ -295,9 +295,9 @@ port_wss_admin
c.loadFromString(toLoad);
BEAST_EXPECT(c.legacy("ssl_verify") == "0");
BEAST_EXPECT(c.legacy(Sections::kSslVerify) == "0");
expectException(
[&c] { [[maybe_unused]] auto _ = c.legacy("server"); }); // not a single line
[&c] { [[maybe_unused]] auto _ = c.legacy(Sections::kServer); }); // not a single line
// set a legacy value
BEAST_EXPECT(c.legacy("not_in_file").empty());
@@ -329,9 +329,9 @@ port_wss_admin
// Load the config file from the current directory and verify it.
Config c;
c.setup("", true, false, true);
BEAST_EXPECT(c.section(SECTION_DEBUG_LOGFILE).values().size() == 1);
BEAST_EXPECT(c.section(Sections::kDebugLogfile).values().size() == 1);
BEAST_EXPECT(
c.section(SECTION_DEBUG_LOGFILE).values()[0] ==
c.section(Sections::kDebugLogfile).values()[0] ==
"/Users/dummy/xrpld/config/log/debug.log");
}
@@ -368,9 +368,9 @@ port_wss_admin
// Load the config file from the config directory and verify it.
Config c;
c.setup("", true, false, true);
BEAST_EXPECT(c.section(SECTION_DEBUG_LOGFILE).values().size() == 1);
BEAST_EXPECT(c.section(Sections::kDebugLogfile).values().size() == 1);
BEAST_EXPECT(
c.section(SECTION_DEBUG_LOGFILE).values()[0] ==
c.section(Sections::kDebugLogfile).values()[0] ==
"/Users/dummy/xrpld/config/log/debug.log");
// Restore the environment variables.
@@ -404,9 +404,9 @@ port_wss_admin
// Load the config file from the config directory and verify it.
Config c;
c.setup("", true, false, true);
BEAST_EXPECT(c.section(SECTION_DEBUG_LOGFILE).values().size() == 1);
BEAST_EXPECT(c.section(Sections::kDebugLogfile).values().size() == 1);
BEAST_EXPECT(
c.section(SECTION_DEBUG_LOGFILE).values()[0] ==
c.section(Sections::kDebugLogfile).values()[0] ==
"/Users/dummy/xrpld/config/log/debug.log");
// Restore the environment variables.
@@ -436,13 +436,13 @@ port_wss_admin
// Dummy test - do we get back what we put in
Config c;
c.loadFromString(boost::str(cc % dataDirAbs.string()));
BEAST_EXPECT(c.legacy("database_path") == dataDirAbs.string());
BEAST_EXPECT(c.legacy(Sections::kDatabasePath) == dataDirAbs.string());
}
{
// Rel paths should convert to abs paths
Config c;
c.loadFromString(boost::str(cc % dataDirRel.string()));
BEAST_EXPECT(c.legacy("database_path") == dataDirAbs.string());
BEAST_EXPECT(c.legacy(Sections::kDatabasePath) == dataDirAbs.string());
}
{
// No db section.
@@ -450,7 +450,7 @@ port_wss_admin
// load will not.
Config c;
c.loadFromString("");
BEAST_EXPECT(c.legacy("database_path").empty());
BEAST_EXPECT(c.legacy(Sections::kDatabasePath).empty());
}
}
{
@@ -464,7 +464,7 @@ port_wss_admin
auto const& c(g.config());
BEAST_EXPECT(g.dataDirExists());
BEAST_EXPECT(g.configFileExists());
BEAST_EXPECT(c.legacy("database_path") == dataDirAbs.string());
BEAST_EXPECT(c.legacy(Sections::kDatabasePath) == dataDirAbs.string());
}
{
// read from file relative path
@@ -474,7 +474,7 @@ port_wss_admin
std::string const nativeDbPath = absolute(path(dbPath)).string();
BEAST_EXPECT(g.dataDirExists());
BEAST_EXPECT(g.configFileExists());
BEAST_EXPECT(c.legacy("database_path") == nativeDbPath);
BEAST_EXPECT(c.legacy(Sections::kDatabasePath) == nativeDbPath);
}
{
// read from file no path
@@ -484,7 +484,7 @@ port_wss_admin
absolute(g.subdir() / path(Config::kDatabaseDirName)).string();
BEAST_EXPECT(g.dataDirExists());
BEAST_EXPECT(g.configFileExists());
BEAST_EXPECT(c.legacy("database_path") == nativeDbPath);
BEAST_EXPECT(c.legacy(Sections::kDatabasePath) == nativeDbPath);
}
}
@@ -653,8 +653,8 @@ nHUhG1PgAG8H8myUENypM35JgfqXAKNQvRVVAFDRzJrny5eZN8d5
nHBu9PTL9dn2GuZtdW4U2WzBwffyX9qsQCd9CNU4Z5YG3PQfViM8
)xrpldConfig");
c.loadFromString(toLoad);
BEAST_EXPECT(c.legacy("validators_file").empty());
BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 5);
BEAST_EXPECT(c.legacy(Sections::kValidatorsFile).empty());
BEAST_EXPECT(c.section(Sections::kValidators).values().size() == 5);
BEAST_EXPECT(c.validatorListThreshold == std::nullopt);
}
{
@@ -672,19 +672,19 @@ trust-these-validators.gov
1
)xrpldConfig");
c.loadFromString(toLoad);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 2);
BEAST_EXPECT(
c.section(SECTION_VALIDATOR_LIST_SITES).values()[0] == "xrpl-validators.com");
c.section(Sections::kValidatorListSites).values()[0] == "xrpl-validators.com");
BEAST_EXPECT(
c.section(SECTION_VALIDATOR_LIST_SITES).values()[1] ==
c.section(Sections::kValidatorListSites).values()[1] ==
"trust-these-validators.gov");
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 1);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 1);
BEAST_EXPECT(
c.section(SECTION_VALIDATOR_LIST_KEYS).values()[0] ==
c.section(Sections::kValidatorListKeys).values()[0] ==
"021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801"
"E566");
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values()[0] == "1");
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values()[0] == "1");
BEAST_EXPECT(c.validatorListThreshold == std::size_t(1));
}
{
@@ -702,19 +702,19 @@ trust-these-validators.gov
0
)xrpldConfig");
c.loadFromString(toLoad);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 2);
BEAST_EXPECT(
c.section(SECTION_VALIDATOR_LIST_SITES).values()[0] == "xrpl-validators.com");
c.section(Sections::kValidatorListSites).values()[0] == "xrpl-validators.com");
BEAST_EXPECT(
c.section(SECTION_VALIDATOR_LIST_SITES).values()[1] ==
c.section(Sections::kValidatorListSites).values()[1] ==
"trust-these-validators.gov");
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 1);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 1);
BEAST_EXPECT(
c.section(SECTION_VALIDATOR_LIST_KEYS).values()[0] ==
c.section(Sections::kValidatorListKeys).values()[0] ==
"021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801"
"E566");
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values()[0] == "0");
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values()[0] == "0");
BEAST_EXPECT(c.validatorListThreshold == std::nullopt);
}
{
@@ -831,11 +831,11 @@ trust-these-validators.gov
Config c;
boost::format cc("[validators_file]\n%1%\n");
c.loadFromString(boost::str(cc % vtg.validatorsFile()));
BEAST_EXPECT(c.legacy("validators_file") == vtg.validatorsFile());
BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.legacy(Sections::kValidatorsFile) == vtg.validatorsFile());
BEAST_EXPECT(c.section(Sections::kValidators).values().size() == 8);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.validatorListThreshold == 2);
}
{
@@ -848,11 +848,11 @@ trust-these-validators.gov
BEAST_EXPECT(vtg.validatorsFileExists());
BEAST_EXPECT(rcg.configFileExists());
auto const& c(rcg.config());
BEAST_EXPECT(c.legacy("validators_file") == valFileName);
BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.legacy(Sections::kValidatorsFile) == valFileName);
BEAST_EXPECT(c.section(Sections::kValidators).values().size() == 8);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.validatorListThreshold == 2);
}
{
@@ -865,11 +865,11 @@ trust-these-validators.gov
BEAST_EXPECT(vtg.validatorsFileExists());
BEAST_EXPECT(rcg.configFileExists());
auto const& c(rcg.config());
BEAST_EXPECT(c.legacy("validators_file") == valFilePath);
BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.legacy(Sections::kValidatorsFile) == valFilePath);
BEAST_EXPECT(c.section(Sections::kValidators).values().size() == 8);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.validatorListThreshold == 2);
}
{
@@ -880,11 +880,11 @@ trust-these-validators.gov
BEAST_EXPECT(vtg.validatorsFileExists());
BEAST_EXPECT(rcg.configFileExists());
auto const& c(rcg.config());
BEAST_EXPECT(c.legacy("validators_file").empty());
BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.legacy(Sections::kValidatorsFile).empty());
BEAST_EXPECT(c.section(Sections::kValidators).values().size() == 8);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.validatorListThreshold == 2);
}
{
@@ -899,11 +899,11 @@ trust-these-validators.gov
*this, vtg.subdir(), "", Config::kConfigFileName, vtg.validatorsFile(), false);
BEAST_EXPECT(rcg.configFileExists());
auto const& c(rcg.config());
BEAST_EXPECT(c.legacy("validators_file") == vtg.validatorsFile());
BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.legacy(Sections::kValidatorsFile) == vtg.validatorsFile());
BEAST_EXPECT(c.section(Sections::kValidators).values().size() == 8);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 2);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.validatorListThreshold == 2);
}
@@ -935,11 +935,11 @@ trust-these-validators.gov
BEAST_EXPECT(vtg.validatorsFileExists());
Config c;
c.loadFromString(boost::str(cc % vtg.validatorsFile()));
BEAST_EXPECT(c.legacy("validators_file") == vtg.validatorsFile());
BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 15);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 4);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 3);
BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
BEAST_EXPECT(c.legacy(Sections::kValidatorsFile) == vtg.validatorsFile());
BEAST_EXPECT(c.section(Sections::kValidators).values().size() == 15);
BEAST_EXPECT(c.section(Sections::kValidatorListSites).values().size() == 4);
BEAST_EXPECT(c.section(Sections::kValidatorListKeys).values().size() == 3);
BEAST_EXPECT(c.section(Sections::kValidatorListThreshold).values().size() == 1);
BEAST_EXPECT(c.validatorListThreshold == 2);
}
{
@@ -1018,7 +1018,7 @@ trust-these-validators.gov
BEAST_EXPECT(!config.silent());
BEAST_EXPECT(!config.standalone());
BEAST_EXPECT(config.ledgerHistory == 256);
BEAST_EXPECT(!config.legacy("database_path").empty());
BEAST_EXPECT(!config.legacy(Sections::kDatabasePath).empty());
}
{
Config config;
@@ -1031,7 +1031,7 @@ trust-these-validators.gov
BEAST_EXPECT(!config.silent());
BEAST_EXPECT(!config.standalone());
BEAST_EXPECT(config.ledgerHistory == 256);
BEAST_EXPECT(!config.legacy("database_path").empty());
BEAST_EXPECT(!config.legacy(Sections::kDatabasePath).empty());
}
{
Config config;
@@ -1044,7 +1044,7 @@ trust-these-validators.gov
BEAST_EXPECT(config.silent());
BEAST_EXPECT(!config.standalone());
BEAST_EXPECT(config.ledgerHistory == 256);
BEAST_EXPECT(!config.legacy("database_path").empty());
BEAST_EXPECT(!config.legacy(Sections::kDatabasePath).empty());
}
{
Config config;
@@ -1057,7 +1057,7 @@ trust-these-validators.gov
BEAST_EXPECT(config.silent());
BEAST_EXPECT(!config.standalone());
BEAST_EXPECT(config.ledgerHistory == 256);
BEAST_EXPECT(!config.legacy("database_path").empty());
BEAST_EXPECT(!config.legacy(Sections::kDatabasePath).empty());
}
{
Config config;
@@ -1070,7 +1070,7 @@ trust-these-validators.gov
BEAST_EXPECT(!config.silent());
BEAST_EXPECT(config.standalone());
BEAST_EXPECT(config.ledgerHistory == 0);
BEAST_EXPECT(config.legacy("database_path").empty() == !explicitPath);
BEAST_EXPECT(config.legacy(Sections::kDatabasePath).empty() == !explicitPath);
}
{
Config config;
@@ -1083,7 +1083,7 @@ trust-these-validators.gov
BEAST_EXPECT(!config.silent());
BEAST_EXPECT(config.standalone());
BEAST_EXPECT(config.ledgerHistory == 0);
BEAST_EXPECT(config.legacy("database_path").empty() == !explicitPath);
BEAST_EXPECT(config.legacy(Sections::kDatabasePath).empty() == !explicitPath);
}
{
Config config;
@@ -1096,7 +1096,7 @@ trust-these-validators.gov
BEAST_EXPECT(config.silent());
BEAST_EXPECT(config.standalone());
BEAST_EXPECT(config.ledgerHistory == 0);
BEAST_EXPECT(config.legacy("database_path").empty() == !explicitPath);
BEAST_EXPECT(config.legacy(Sections::kDatabasePath).empty() == !explicitPath);
}
{
Config config;
@@ -1109,7 +1109,7 @@ trust-these-validators.gov
BEAST_EXPECT(config.silent());
BEAST_EXPECT(config.standalone());
BEAST_EXPECT(config.ledgerHistory == 0);
BEAST_EXPECT(config.legacy("database_path").empty() == !explicitPath);
BEAST_EXPECT(config.legacy(Sections::kDatabasePath).empty() == !explicitPath);
}
}
@@ -1118,16 +1118,16 @@ trust-these-validators.gov
{
detail::FileCfgGuard const cfg(*this, "testPort", "", Config::kConfigFileName, "");
auto const& conf = cfg.config();
if (!BEAST_EXPECT(conf.exists("port_rpc")))
if (!BEAST_EXPECT(conf.exists(Sections::kPortRpc)))
return;
if (!BEAST_EXPECT(conf.exists("port_wss_admin")))
if (!BEAST_EXPECT(conf.exists(Sections::kPortWssAdmin)))
return;
ParsedPort rpc;
if (!unexcept([&]() { parsePort(rpc, conf["port_rpc"], log); }))
if (!unexcept([&]() { parsePort(rpc, conf[Sections::kPortRpc], log); }))
return;
BEAST_EXPECT(rpc.adminNetsV4.size() + rpc.adminNetsV6.size() == 2);
ParsedPort wss;
if (!unexcept([&]() { parsePort(wss, conf["port_wss_admin"], log); }))
if (!unexcept([&]() { parsePort(wss, conf[Sections::kPortWssAdmin], log); }))
return;
BEAST_EXPECT(wss.adminNetsV4.size() + wss.adminNetsV6.size() == 1);
}
@@ -1182,14 +1182,15 @@ r.ripple.com 51235
)");
cfg.loadFromString(toLoad);
BEAST_EXPECT(
cfg.exists("port_rpc") && cfg.section("port_rpc").lines().empty() &&
cfg.section("port_rpc").values().empty());
cfg.exists(Sections::kPortRpc) && cfg.section(Sections::kPortRpc).lines().empty() &&
cfg.section(Sections::kPortRpc).values().empty());
BEAST_EXPECT(
cfg.exists(SECTION_IPS) && cfg.section(SECTION_IPS).lines().size() == 1 &&
cfg.section(SECTION_IPS).values().size() == 1);
cfg.exists(Sections::kIps) && cfg.section(Sections::kIps).lines().size() == 1 &&
cfg.section(Sections::kIps).values().size() == 1);
BEAST_EXPECT(
cfg.exists(SECTION_IPS_FIXED) && cfg.section(SECTION_IPS_FIXED).lines().size() == 2 &&
cfg.section(SECTION_IPS_FIXED).values().size() == 2);
cfg.exists(Sections::kIpsFixed) &&
cfg.section(Sections::kIpsFixed).lines().size() == 2 &&
cfg.section(Sections::kIpsFixed).values().size() == 2);
}
void
@@ -1237,14 +1238,15 @@ r.ripple.com:51235
)");
cfg.loadFromString(toLoad);
BEAST_EXPECT(
cfg.exists("port_rpc") && cfg.section("port_rpc").lines().empty() &&
cfg.section("port_rpc").values().empty());
cfg.exists(Sections::kPortRpc) && cfg.section(Sections::kPortRpc).lines().empty() &&
cfg.section(Sections::kPortRpc).values().empty());
BEAST_EXPECT(
cfg.exists(SECTION_IPS) && cfg.section(SECTION_IPS).lines().size() == 1 &&
cfg.section(SECTION_IPS).values().size() == 1);
cfg.exists(Sections::kIps) && cfg.section(Sections::kIps).lines().size() == 1 &&
cfg.section(Sections::kIps).values().size() == 1);
BEAST_EXPECT(
cfg.exists(SECTION_IPS_FIXED) && cfg.section(SECTION_IPS_FIXED).lines().size() == 15 &&
cfg.section(SECTION_IPS_FIXED).values().size() == 15);
cfg.exists(Sections::kIpsFixed) &&
cfg.section(Sections::kIpsFixed).lines().size() == 15 &&
cfg.section(Sections::kIpsFixed).values().size() == 15);
BEAST_EXPECT(cfg.ips[0] == "r.ripple.com 51235");
BEAST_EXPECT(cfg.ipsFixed[0] == "s1.ripple.com 51235");
@@ -1335,18 +1337,18 @@ r.ripple.com:51235
Section s;
s.append("online_delete = 3000");
std::uint32_t od = 0;
BEAST_EXPECT(set(od, "online_delete", s));
BEAST_EXPECT(set(od, Keys::kOnlineDelete, s));
// NOLINTNEXTLINE(bugprone-unchecked-optional-access)
BEAST_EXPECTS(od == 3000, *(s.get<std::string>("online_delete")));
BEAST_EXPECTS(od == 3000, *(s.get<std::string>(Keys::kOnlineDelete)));
}
{
Section s;
s.append("online_delete = 2000 #my comment on this");
std::uint32_t od = 0;
BEAST_EXPECT(set(od, "online_delete", s));
BEAST_EXPECT(set(od, Keys::kOnlineDelete, s));
// NOLINTNEXTLINE(bugprone-unchecked-optional-access)
BEAST_EXPECTS(od == 2000, *(s.get<std::string>("online_delete")));
BEAST_EXPECTS(od == 2000, *(s.get<std::string>(Keys::kOnlineDelete)));
}
}