1#include <test/jtx/TestSuite.h>
2#include <test/unit_test/FileDirGuard.h>
4#include <xrpld/core/Config.h>
5#include <xrpld/core/ConfigSections.h>
7#include <xrpl/beast/unit_test/suite.h>
8#include <xrpl/beast/utility/temp_dir.h>
9#include <xrpl/server/Port.h>
11#include <boost/filesystem.hpp>
12#include <boost/format.hpp>
22 static boost::format configContentsTemplate(R
"xrpldConfig(
50#-------------------------------------------------------------------------------
55# This is primary persistent datastore for xrpld. This includes transaction
56# metadata, account states, and ledger headers. Helpful information can be
57# found on https://xrpl.org/capacity-planning.html#node-db-type
58# delete old ledgers while maintaining at least 2000. Do not require an
59# external administrative command to initiate deletion.
62path=/Users/dummy/xrpld/config/db/rocksdb
73# This needs to be an absolute directory reference, not a relative one.
74# Modify this value as required.
76/Users/dummy/xrpld/config/log/debug.log
84# Where to find some other servers speaking the Ripple protocol.
89# Turn down default logging to save disk space in the long run.
90# Valid values here are trace, debug, info, warning, error, and fatal
92{ "command": "log_level", "severity": "warning" }
94# Defaults to 1 ("yes") so that certificates will be validated. To allow the use
95# of self-signed certificates for development or internal use, set to 0 ("no").
103 std::string dbPathSection = dbPath.empty() ? "" :
"[database_path]\n" + dbPath;
105 validatorsFile.
empty() ?
"" :
"[validators_file]\n" + validatorsFile;
106 return boost::str(configContentsTemplate % dbPathSection % valFileSection);
127 path const& validatorsFile,
128 bool useCounter =
true,
134 confContents.empty() ?
configContents(dbPath.string(), validatorsFile.string())
165 return boost::filesystem::is_directory(
dataDir_);
178 using namespace boost::filesystem;
195n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7
196n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj
197n9L81uNCaPgtUJfaHh89gmdvXKAmSt5Gdsw2g1iPWaPkAHW5Nm4C
198n9KiYM9CgngLvtRCQHZwgC2gjpdaZcCcbt3VboxiNFcKuwFVujzS
199n9LdgEtkmGB9E2h3K4Vp7iGUaKuq23Zr32ehxiU8FWY7xoxbWTSA
202nHUhG1PgAG8H8myUENypM35JgfqXAKNQvRVVAFDRzJrny5eZN8d5
203nHBu9PTL9dn2GuZtdW4U2WzBwffyX9qsQCd9CNU4Z5YG3PQfViM8
204nHUPDdcdb2Y5DZAJne4c2iabFuAP3F34xZUgYQT2NH7qfkdapgnz
206[validator_list_sites]
207recommended-xrpl-validators.com
208more-xrpl-validators.net
21103E74EE14CB525AFBB9F1B7D86CD58ECC4B91452294B42AB4E78F260BD905C091D
212030775A669685BD6ABCEBD80385921C7851783D991A8055FD21D2F3966C96F1B56
214[validator_list_threshold]
229 path const& validatorsFileName,
230 bool useCounter =
true)
234 path(validatorsFileName.empty() ?
Config::validatorsFileName : validatorsFileName),
249 return absolute(
file()).string();
261 using path = boost::filesystem::path;
283 BEAST_EXPECT(c.legacy("ssl_verify") ==
"0");
287 BEAST_EXPECT(c.
legacy(
"not_in_file").empty());
288 c.
legacy(
"not_in_file",
"new_value");
289 BEAST_EXPECT(c.
legacy(
"not_in_file") ==
"new_value");
296 using namespace boost::filesystem;
297 auto const cwd = current_path();
303 for (
auto const& configFile : configFiles)
307 current_path(td.
path());
315 c.
setup(
"",
true,
false,
true);
319 "/Users/dummy/xrpld/config/log/debug.log");
323#if BOOST_OS_LINUX || BOOST_OS_MACOS
324 for (
auto const& configFile : configFiles)
329 current_path(td.
path());
339 char const* h = getenv(
"HOME");
341 char const* x = getenv(
"XDG_CONFIG_HOME");
342 setenv(
"XDG_CONFIG_HOME", tc.
path().
c_str(), 1);
354 c.
setup(
"",
true,
false,
true);
358 "/Users/dummy/xrpld/config/log/debug.log");
361 (h !=
nullptr) ? setenv(
"HOME", h, 1) : unsetenv(
"HOME");
362 (x !=
nullptr) ? setenv(
"XDG_CONFIG_HOME", x, 1) : unsetenv(
"XDG_CONFIG_HOME");
371 char const* h = getenv(
"HOME");
373 char const* x = getenv(
"XDG_CONFIG_HOME");
374 unsetenv(
"XDG_CONFIG_HOME");
390 c.
setup(
"",
true,
false,
true);
394 "/Users/dummy/xrpld/config/log/debug.log");
397 (h !=
nullptr) ? setenv(
"HOME", h, 1) : unsetenv(
"HOME");
399 setenv(
"XDG_CONFIG_HOME", x, 1);
412 using namespace boost::filesystem;
414 boost::format cc(
"[database_path]\n%1%\n");
416 auto const cwd = current_path();
417 path const dataDirRel(
"test_data_dir");
418 path const dataDirAbs(cwd / dataDirRel);
423 BEAST_EXPECT(c.
legacy(
"database_path") == dataDirAbs.string());
429 BEAST_EXPECT(c.
legacy(
"database_path") == dataDirAbs.string());
437 BEAST_EXPECT(c.
legacy(
"database_path").empty());
442 auto const cwd = current_path();
444 path const dataDirRel(
"test_data_dir");
445 path const dataDirAbs(cwd / g0.
subdir() / dataDirRel);
448 auto const& c(g.
config());
451 BEAST_EXPECT(c.legacy(
"database_path") == dataDirAbs.string());
457 auto const& c(g.
config());
461 BEAST_EXPECT(c.legacy(
"database_path") == nativeDbPath);
466 auto const& c(g.
config());
471 BEAST_EXPECT(c.legacy(
"database_path") == nativeDbPath);
483 "eyJ2YWxpZGF0aW9uX3ByaXZhdGVfa2V5IjoiOWVkNDVmODY2MjQxY2MxOGEyNzQ3Yj"
484 "U0Mzg3YzA2MjU5MDc5NzJmNGU3MTkwMjMxZmFhOTM3NDU3ZmE5ZGFmNiIsIm1hbmlm"
485 "ZXN0IjoiSkFBQUFBRnhJZTFGdHdtaW12R3RIMmlDY01KcUM5Z1ZGS2lsR2Z3MS92Q3"
486 "hIWFhMcGxjMkduTWhBa0UxYWdxWHhCd0R3RGJJRDZPTVNZdU0wRkRBbHBBZ05rOFNL"
487 "Rm43TU8yZmRrY3dSUUloQU9uZ3U5c0FLcVhZb3VKK2wyVjBXK3NBT2tWQitaUlM2UF"
488 "NobEpBZlVzWGZBaUJzVkpHZXNhYWRPSmMvYUFab2tTMXZ5bUdtVnJsSFBLV1gzWXl3"
489 "dTZpbjhIQVNRS1B1Z0JENjdrTWFSRkd2bXBBVEhsR0tKZHZERmxXUFl5NUFxRGVkRn"
490 "Y1VEphMncwaTIxZXEzTVl5d0xWSlpuRk9yN0Mwa3cyQWlUelNDakl6ZGl0UTg9In0"
495 static boost::format configTemplate(R
"xrpldConfig(
503 auto const expectedError =
504 "Cannot have both [validation_seed] "
505 "and [validator_token] config sections";
514 BEAST_EXPECT(error == expectedError);
536 BEAST_EXPECT(error.empty());
549 BEAST_EXPECT(error.empty());
564 BEAST_EXPECT(error.empty());
579 BEAST_EXPECT(error.empty());
588 using namespace boost::filesystem;
591 boost::format cc(
"[validators_file]\n%1%\n");
593 std::string const missingPath =
"/no/way/this/path/exists";
594 auto const expectedError =
595 "The file specified in [validators_file] does not exist: " + missingPath;
605 BEAST_EXPECT(error == expectedError);
610 path const invalidFile = current_path() / vtg.
subdir();
611 boost::format cc(
"[validators_file]\n%1%\n");
613 auto const expectedError =
614 "Invalid file specified in [validators_file]: " + invalidFile.string();
624 BEAST_EXPECT(error == expectedError);
631n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7
632n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj
633n9L81uNCaPgtUJfaHh89gmdvXKAmSt5Gdsw2g1iPWaPkAHW5Nm4C
636nHUhG1PgAG8H8myUENypM35JgfqXAKNQvRVVAFDRzJrny5eZN8d5
637nHBu9PTL9dn2GuZtdW4U2WzBwffyX9qsQCd9CNU4Z5YG3PQfViM8
640 BEAST_EXPECT(c.legacy("validators_file").empty());
648[validator_list_sites]
650trust-these-validators.gov
653021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801E566
655[validator_list_threshold]
661 c.section(SECTION_VALIDATOR_LIST_SITES).values()[0] == "xrpl-validators.com");
664 "trust-these-validators.gov");
668 "021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801"
671 BEAST_EXPECT(c.
section(SECTION_VALIDATOR_LIST_THRESHOLD).
values()[0] ==
"1");
678[validator_list_sites]
680trust-these-validators.gov
683021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801E566
685[validator_list_threshold]
691 c.section(SECTION_VALIDATOR_LIST_SITES).values()[0] == "xrpl-validators.com");
694 "trust-these-validators.gov");
698 "021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801"
701 BEAST_EXPECT(c.
section(SECTION_VALIDATOR_LIST_THRESHOLD).
values()[0] ==
"0");
709[validator_list_sites]
711trust-these-validators.gov
714021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801E566
716[validator_list_threshold]
720 auto const expectedError =
721 "Value in config section [validator_list_threshold] exceeds "
722 "the number of configured list keys";
732 BEAST_EXPECT(error == expectedError);
738[validator_list_sites]
740trust-these-validators.gov
743021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801E566
745[validator_list_threshold]
749 auto const expectedError =
750 "Config section [validator_list_threshold] should contain "
761 BEAST_EXPECT(error == expectedError);
767[validator_list_sites]
769trust-these-validators.gov
772021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801E566
774[validator_list_threshold]
794[validator_list_sites]
796trust-these-validators.gov
799 auto const expectedError =
"[validator_list_keys] config section is missing";
809 BEAST_EXPECT(error == expectedError);
816 boost::format cc(
"[validators_file]\n%1%\n");
834 auto const& c(rcg.
config());
835 BEAST_EXPECT(c.legacy(
"validators_file") == valFileName);
836 BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
837 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
838 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
839 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
840 BEAST_EXPECT(c.VALIDATOR_LIST_THRESHOLD == 2);
846 auto const valFilePath =
".." / vtg.
subdir() /
"validators.txt";
851 auto const& c(rcg.
config());
852 BEAST_EXPECT(c.legacy(
"validators_file") == valFilePath);
853 BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
854 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
855 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
856 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
857 BEAST_EXPECT(c.VALIDATOR_LIST_THRESHOLD == 2);
866 auto const& c(rcg.
config());
867 BEAST_EXPECT(c.legacy(
"validators_file").empty());
868 BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
869 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
870 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
871 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
872 BEAST_EXPECT(c.VALIDATOR_LIST_THRESHOLD == 2);
880 *
this, vtg.
subdir(),
"validators.txt",
false);
885 auto const& c(rcg.
config());
886 BEAST_EXPECT(c.legacy(
"validators_file") == vtg.
validatorsFile());
887 BEAST_EXPECT(c.section(SECTION_VALIDATORS).values().size() == 8);
888 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_SITES).values().size() == 2);
889 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_KEYS).values().size() == 2);
890 BEAST_EXPECT(c.section(SECTION_VALIDATOR_LIST_THRESHOLD).values().size() == 1);
891 BEAST_EXPECT(c.VALIDATOR_LIST_THRESHOLD == 2);
896 boost::format cc(R
"xrpldConfig(
901n949f75evCHwgyP4fPVgaHqNHxUVN15PsJEZ3B3HnXPcPjcZAoy7
902n9MD5h24qrQqiyBC8aeqqCWvpiBiYQ3jxSr91uiDvmrkyHRdYLUj
903n9L81uNCaPgtUJfaHh89gmdvXKAmSt5Gdsw2g1iPWaPkAHW5Nm4C
904n9KiYM9CgngLvtRCQHZwgC2gjpdaZcCcbt3VboxiNFcKuwFVujzS
905n9LdgEtkmGB9E2h3K4Vp7iGUaKuq23Zr32ehxiU8FWY7xoxbWTSA
908nHB1X37qrniVugfQcuBTAjswphC1drx7QjFFojJPZwKHHnt8kU7v
909nHUkAWDR4cB8AgPg7VXMX6et8xRTQb2KJfgv1aBEXozwrawRKgMB
911[validator_list_sites]
913trust-these-validators.gov
916021A99A537FDEBC34E4FCA03B39BEADD04299BB19E85097EC92B15A3518801E566
932 boost::format cc(R
"xrpldConfig(
936[validator_list_threshold]
942 auto const expectedError =
943 "Config section [validator_list_threshold] should contain "
955 BEAST_EXPECT(error == expectedError);
962 boost::format cc(
"[validators_file]\n%1%\n");
966 auto const expectedError =
967 "The file specified in [validators_file] does not contain a "
968 "[validators], [validator_keys] or [validator_list_keys] "
981 BEAST_EXPECT(error == expectedError);
1001 BEAST_EXPECT(!config.
quiet());
1002 BEAST_EXPECT(!config.
silent());
1005 BEAST_EXPECT(!config.
legacy(
"database_path").empty());
1014 BEAST_EXPECT(config.
quiet());
1015 BEAST_EXPECT(!config.
silent());
1018 BEAST_EXPECT(!config.
legacy(
"database_path").empty());
1027 BEAST_EXPECT(config.
quiet());
1028 BEAST_EXPECT(config.
silent());
1031 BEAST_EXPECT(!config.
legacy(
"database_path").empty());
1040 BEAST_EXPECT(config.
quiet());
1041 BEAST_EXPECT(config.
silent());
1044 BEAST_EXPECT(!config.
legacy(
"database_path").empty());
1053 BEAST_EXPECT(!config.
quiet());
1054 BEAST_EXPECT(!config.
silent());
1057 BEAST_EXPECT(config.
legacy(
"database_path").empty() == !explicitPath);
1066 BEAST_EXPECT(config.
quiet());
1067 BEAST_EXPECT(!config.
silent());
1070 BEAST_EXPECT(config.
legacy(
"database_path").empty() == !explicitPath);
1079 BEAST_EXPECT(config.
quiet());
1080 BEAST_EXPECT(config.
silent());
1083 BEAST_EXPECT(config.
legacy(
"database_path").empty() == !explicitPath);
1092 BEAST_EXPECT(config.
quiet());
1093 BEAST_EXPECT(config.
silent());
1096 BEAST_EXPECT(config.
legacy(
"database_path").empty() == !explicitPath);
1104 auto const& conf = cfg.
config();
1105 if (!BEAST_EXPECT(conf.exists(
"port_rpc")))
1107 if (!BEAST_EXPECT(conf.exists(
"port_wss_admin")))
1129 BEAST_EXPECT(
false);
1206 anotherserversansport
1207 anotherserverwithport:12
1217 2001:db8:3333:4444:5555:6666:7777:8888:12345
1218 [2001:db8:3333:4444:5555:6666:7777:8888]:1
1232 BEAST_EXPECT(cfg.
IPS[0] ==
"r.ripple.com 51235");
1234 BEAST_EXPECT(cfg.
IPS_FIXED[0] ==
"s1.ripple.com 51235");
1235 BEAST_EXPECT(cfg.
IPS_FIXED[1] ==
"s2.ripple.com 51235");
1236 BEAST_EXPECT(cfg.
IPS_FIXED[2] ==
"anotherserversansport");
1237 BEAST_EXPECT(cfg.
IPS_FIXED[3] ==
"anotherserverwithport 12");
1238 BEAST_EXPECT(cfg.
IPS_FIXED[4] ==
"1.1.1.1 1");
1239 BEAST_EXPECT(cfg.
IPS_FIXED[5] ==
"1.1.1.1 1");
1240 BEAST_EXPECT(cfg.
IPS_FIXED[6] ==
"12.34.12.123 12345");
1241 BEAST_EXPECT(cfg.
IPS_FIXED[7] ==
"12.34.12.123 12345");
1245 BEAST_EXPECT(cfg.
IPS_FIXED[9] ==
"2001:db8::");
1246 BEAST_EXPECT(cfg.
IPS_FIXED[10] ==
"::1");
1247 BEAST_EXPECT(cfg.
IPS_FIXED[11] ==
"::1:12345");
1248 BEAST_EXPECT(cfg.
IPS_FIXED[12] ==
"[::1]:12345");
1249 BEAST_EXPECT(cfg.
IPS_FIXED[13] ==
"2001:db8:3333:4444:5555:6666:7777:8888:12345");
1250 BEAST_EXPECT(cfg.
IPS_FIXED[14] ==
"[2001:db8:3333:4444:5555:6666:7777:8888]:1");
1256 struct TestCommentData
1265 {{
"password = aaaa\\#bbbb",
"password",
"aaaa#bbbb",
false},
1266 {
"password = aaaa#bbbb",
"password",
"aaaa",
true},
1267 {
"password = aaaa #bbbb",
"password",
"aaaa",
true},
1269 {
"password = #aaaa #bbbb",
"",
"password =",
true},
1270 {
"password = aaaa\\# #bbbb",
"password",
"aaaa#",
true},
1271 {
"password = aaaa\\##bbbb",
"password",
"aaaa#",
true},
1272 {
"aaaa#bbbb",
"",
"aaaa",
true},
1273 {
"aaaa\\#bbbb",
"",
"aaaa#bbbb",
false},
1274 {
"aaaa\\##bbbb",
"",
"aaaa#",
true},
1275 {
"aaaa #bbbb",
"",
"aaaa",
true},
1276 {
"1 #comment",
"",
"1",
true},
1277 {
"#whole thing is comment",
"",
"",
false},
1278 {
" #whole comment with space",
"",
"",
false}}};
1280 for (
auto const& t : tests)
1284 BEAST_EXPECT(s.had_trailing_comments() == t.had_comment);
1285 if (t.field.empty())
1287 BEAST_EXPECTS(s.legacy() == t.expect, s.legacy());
1293 BEAST_EXPECTS(field == t.expect, t.line);
1299 s.append(
"online_delete = 3000");
1301 BEAST_EXPECT(
set(od,
"online_delete", s));
1303 BEAST_EXPECTS(od == 3000, *(s.get<
std::string>(
"online_delete")));
1308 s.append(
"online_delete = 2000 #my comment on this");
1310 BEAST_EXPECT(
set(od,
"online_delete", s));
1312 BEAST_EXPECTS(od == 2000, *(s.get<
std::string>(
"online_delete")));
1319 using namespace std::string_literals;
1320 Section s{
"MySection"};
1321 s.append(
"a_string = mystring");
1322 s.append(
"positive_int = 2");
1323 s.append(
"negative_int = -3");
1324 s.append(
"bool_ish = 1");
1327 auto val_1 =
"value 1"s;
1328 BEAST_EXPECT(
set(val_1,
"a_string", s));
1329 BEAST_EXPECT(val_1 ==
"mystring");
1331 auto val_2 =
"value 2"s;
1332 BEAST_EXPECT(!
set(val_2,
"not_a_key", s));
1333 BEAST_EXPECT(val_2 ==
"value 2");
1334 BEAST_EXPECT(!
set(val_2,
"default"s,
"not_a_key", s));
1335 BEAST_EXPECT(val_2 ==
"default");
1337 auto val_3 = get<std::string>(s,
"a_string");
1338 BEAST_EXPECT(val_3 ==
"mystring");
1339 auto val_4 = get<std::string>(s,
"not_a_key");
1340 BEAST_EXPECT(val_4.empty());
1341 auto val_5 = get<std::string>(s,
"not_a_key",
"default");
1342 BEAST_EXPECT(val_5 ==
"default");
1344 auto val_6 =
"value 6"s;
1346 BEAST_EXPECT(val_6 ==
"mystring");
1348 auto val_7 =
"value 7"s;
1350 BEAST_EXPECT(val_7 ==
"value 7");
1355 BEAST_EXPECT(
set(val_1,
"positive_int", s));
1356 BEAST_EXPECT(val_1 == 2);
1359 BEAST_EXPECT(
set(val_2,
"negative_int", s));
1360 BEAST_EXPECT(val_2 == -3);
1363 BEAST_EXPECT(!
set(val_3,
"a_string", s));
1364 BEAST_EXPECT(val_3 == 3);
1366 auto val_4 = get<int>(s,
"positive_int");
1367 BEAST_EXPECT(val_4 == 2);
1368 auto val_5 = get<int>(s,
"not_a_key");
1369 BEAST_EXPECT(val_5 == 0);
1370 auto val_6 = get<int>(s,
"not_a_key", 5);
1371 BEAST_EXPECT(val_6 == 5);
1372 auto val_7 = get<int>(s,
"a_string", 6);
1373 BEAST_EXPECT(val_7 == 6);
1377 BEAST_EXPECT(val_8 == 2);
1381 BEAST_EXPECT(val_9 == 9);
1385 BEAST_EXPECT(val_10 == 10);
1390 s.get<
int>(
"a_string");
1393 catch (boost::bad_lexical_cast&)
1400 bool flag_1 =
false;
1402 BEAST_EXPECT(flag_1 ==
true);
1404 bool flag_2 =
false;
1406 BEAST_EXPECT(flag_2 ==
false);
1423 {
"seconds", 1, 15 * 60,
false},
1424 {
"minutes", 60, 14,
false},
1425 {
"minutes", 60, 15,
true},
1426 {
"hours", 3600, 10,
true},
1427 {
"days", 86400, 10,
true},
1428 {
"weeks", 604800, 2,
true},
1429 {
"months", 2592000, 1,
false},
1430 {
"years", 31536000, 1,
false}};
1433 for (
auto& [unit, sec, val, shouldPass] : units)
1437[amendment_majority_time]
1444 c.loadFromString(toLoad);
1447 BEAST_EXPECT(c.AMENDMENT_MAJORITY_TIME.count() == val * sec);
1477 c.loadFromString(
"[overlay]\nmax_unknown_time=" + value);
1478 return c.MAX_UNKNOWN_TIME;
1487 BEAST_EXPECT(!testUnknown(
"none"));
1488 BEAST_EXPECT(!testUnknown(
"0.5"));
1489 BEAST_EXPECT(!testUnknown(
"180 seconds"));
1490 BEAST_EXPECT(!testUnknown(
"9 minutes"));
1493 BEAST_EXPECT(!testUnknown(
"299"));
1502 BEAST_EXPECT(!testUnknown(
"1801"));
1504 testcase(
"overlay: diverged time");
1521 BEAST_EXPECT(!testDiverged(
"none"));
1522 BEAST_EXPECT(!testDiverged(
"0.5"));
1523 BEAST_EXPECT(!testDiverged(
"180 seconds"));
1524 BEAST_EXPECT(!testDiverged(
"9 minutes"));
1527 BEAST_EXPECT(!testDiverged(
"0"));
1528 BEAST_EXPECT(!testDiverged(
"59"));
1537 BEAST_EXPECT(!testDiverged(
"901"));
1562BEAST_DEFINE_TESTSUITE(Config, core,
xrpl);
RAII temporary directory.
std::string path() const
Get the native path for the temporary directory.
std::string file(std::string const &name) const
Get the native path for the a file.
log_os< char > log
Logging output stream.
void pass()
Record a successful test condition.
testcase_t testcase
Memberspace for declaring test cases.
bool unexcept(F &&f, String const &reason)
void fail(String const &reason, char const *file, int line)
Record a failure.
bool exists(std::string const &name) const
Returns true if a section with the given name exists.
void legacy(std::string const §ion, std::string value)
Set a value that is not a key/value pair.
Section & section(std::string const &name)
Returns the section with the given name.
void testSetup(bool explicitPath)
void run() override
Runs the suite.
void testValidatorsFile()
boost::filesystem::path path
static char const *const configLegacyName
std::optional< std::size_t > VALIDATOR_LIST_THRESHOLD
static char const *const configFileName
std::chrono::seconds MAX_DIVERGED_TIME
std::vector< std::string > IPS
void setup(std::string const &strConf, bool bQuiet, bool bSilent, bool bStandalone)
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
std::uint32_t LEDGER_HISTORY
std::vector< std::string > IPS_FIXED
static char const *const databaseDirName
std::vector< std::string > const & values() const
Returns all the values in the section.
std::vector< std::string > const & lines() const
Returns all the lines in the section.
bool expectException(Functor f, std::string const &message="")
Create a directory and remove it when it's done.
beast::unit_test::suite & test_
path const & subdir() const
auto rmDir(path const &toRm)
boost::filesystem::path path
Write a xrpld config file and remove when done.
Config const & config() const
std::string configFile() const
bool configFileExists() const
FileCfgGuard(beast::unit_test::suite &test, path subDir, path const &dbPath, path const &configFile, path const &validatorsFile, bool useCounter=true, std::string confContents="")
bool dataDirExists() const
Write a file in a directory and remove when done.
path const & file() const
Write a validators.txt file and remove when done.
std::string validatorsFile() const
bool validatorsFileExists() const
ValidatorsTxtGuard(beast::unit_test::suite &test, path subDir, path const &validatorsFileName, bool useCounter=true)
field_t< CharT, Traits, Allocator > field(std::basic_string< CharT, Traits, Allocator > const &text, int width=8, int pad=0, bool right=false)
std::string valFileContents()
std::string configContents(std::string const &dbPath, std::string const &validatorsFile)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
void parse_Port(ParsedPort &port, Section const §ion, std::ostream &log)
bool set(T &target, std::string const &name, Section const §ion)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
static std::string const & systemName()
bool get_if_exists(Section const §ion, std::string const &name, T &v)
static std::optional< Seed > validationSeed(Json::Value const ¶ms)
T regex_replace(T... args)
std::vector< boost::asio::ip::network_v4 > admin_nets_v4
std::vector< boost::asio::ip::network_v6 > admin_nets_v6