Have consistent warning between CLI, ENV and TOML config (#3969)

* Update CommandLineUtils.java

Signed-off-by: wcgcyx <wcgcyx@gmail.com>

Co-authored-by: Sally MacFarlane <sally.macfarlane@consensys.net>
pull/3983/head
Zhenyang Shi 2 years ago committed by GitHub
parent af6ced3020
commit e29c654ef4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      besu/src/main/java/org/hyperledger/besu/cli/util/CommandLineUtils.java
  2. 241
      besu/src/test/java/org/hyperledger/besu/cli/BesuCommandTest.java

@ -99,10 +99,16 @@ public class CommandLineUtils {
private static String getAffectedOptions( private static String getAffectedOptions(
final CommandLine commandLine, final List<String> dependentOptionsNames) { final CommandLine commandLine, final List<String> dependentOptionsNames) {
return commandLine.getCommandSpec().options().stream() return commandLine.getCommandSpec().options().stream()
.filter(option -> Arrays.stream(option.names()).anyMatch(dependentOptionsNames::contains))
.filter( .filter(
option -> option -> {
Arrays.stream(option.names()).anyMatch(dependentOptionsNames::contains) try {
&& !option.stringValues().isEmpty()) return !option.stringValues().isEmpty()
|| commandLine.getDefaultValueProvider().defaultValue(option) != null;
} catch (Exception e) {
return false;
}
})
.map(option -> option.names()[0]) .map(option -> option.names()[0])
.collect( .collect(
Collectors.collectingAndThen( Collectors.collectingAndThen(

@ -1212,6 +1212,43 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void p2pOptionsRequiresServiceToBeEnabledToml() throws IOException {
final String[] nodes = {
"6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0"
};
final Path toml =
createTempFile(
"toml",
"p2p-enabled=false\n"
+ "bootnodes=[\""
+ String.join("\",\"", VALID_ENODE_STRINGS)
+ "\"]\n"
+ "discovery-enabled=false\n"
+ "max-peers=42\n"
+ "remote-connections-max-percentage=50\n"
+ "banned-node-id=[\""
+ String.join(",", nodes)
+ "\"]\n"
+ "banned-node-ids=[\""
+ String.join(",", nodes)
+ "\"]\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall(
"--p2p-enabled",
"--discovery-enabled",
"--bootnodes",
"--max-peers",
"--banned-node-ids",
"--remote-connections-max-percentage");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void discoveryOptionValueTrueMustBeUsed() { public void discoveryOptionValueTrueMustBeUsed() {
parseCommand("--discovery-enabled", "true"); parseCommand("--discovery-enabled", "true");
@ -2073,6 +2110,31 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void rpcHttpOptionsRequiresServiceToBeEnabledToml() throws IOException {
final Path toml =
createTempFile(
"toml",
"rpc-http-api=[\"ETH\",\"NET\"]\n"
+ "rpc-http-host=\"0.0.0.0\"\n"
+ "rpc-http-port=1234\n"
+ "rpc-http-cors-origins=[\"all\"]\n"
+ "rpc-http-max-active-connections=88");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall(
"--rpc-http-enabled",
"--rpc-http-host",
"--rpc-http-port",
"--rpc-http-cors-origins",
"--rpc-http-api",
"--rpc-http-max-active-connections");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void privacyTlsOptionsRequiresTlsToBeEnabled() { public void privacyTlsOptionsRequiresTlsToBeEnabled() {
when(storageService.getByName("rocksdb-privacy")) when(storageService.getByName("rocksdb-privacy"))
@ -2099,6 +2161,38 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void privacyTlsOptionsRequiresTlsToBeEnabledToml() throws IOException {
when(storageService.getByName("rocksdb-privacy"))
.thenReturn(Optional.of(rocksDBSPrivacyStorageFactory));
final URL configFile = this.getClass().getResource("/orion_publickey.pub");
final String coinbaseStr = String.format("%040x", 1);
final Path toml =
createTempFile(
"toml",
"privacy-enabled=true\n"
+ "miner-enabled=true\n"
+ "miner-coinbase=\""
+ coinbaseStr
+ "\"\n"
+ "min-gas-price=0\n"
+ "privacy-url=\""
+ ENCLAVE_URI
+ "\"\n"
+ "privacy-public-key-file=\""
+ configFile.getPath()
+ "\"\n"
+ "privacy-tls-keystore-file=\"/Users/me/key\"");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall("--privacy-tls-enabled", "--privacy-tls-keystore-file");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void privacyTlsOptionsRequiresPrivacyToBeEnabled() { public void privacyTlsOptionsRequiresPrivacyToBeEnabled() {
parseCommand("--privacy-tls-enabled", "--privacy-tls-keystore-file", "/Users/me/key"); parseCommand("--privacy-tls-enabled", "--privacy-tls-keystore-file", "/Users/me/key");
@ -2109,6 +2203,20 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void privacyTlsOptionsRequiresPrivacyToBeEnabledToml() throws IOException {
final Path toml =
createTempFile(
"toml", "privacy-tls-enabled=true\n" + "privacy-tls-keystore-file=\"/Users/me/key\"");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall("--privacy-enabled", "--privacy-tls-enabled");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void fastSyncOptionsRequiresFastSyncModeToBeSet() { public void fastSyncOptionsRequiresFastSyncModeToBeSet() {
parseCommand("--fast-sync-min-peers", "5"); parseCommand("--fast-sync-min-peers", "5");
@ -2119,6 +2227,18 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void fastSyncOptionsRequiresFastSyncModeToBeSetToml() throws IOException {
final Path toml = createTempFile("toml", "fast-sync-min-peers=5\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall("--sync-mode", "--fast-sync-min-peers");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void rpcApisPropertyWithInvalidEntryMustDisplayError() { public void rpcApisPropertyWithInvalidEntryMustDisplayError() {
parseCommand("--rpc-http-api", "BOB"); parseCommand("--rpc-http-api", "BOB");
@ -2251,6 +2371,18 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void rpcHttpTlsRequiresRpcHttpEnabledToml() throws IOException {
final Path toml = createTempFile("toml", "rpc-http-tls-enabled=true\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall("--rpc-http-enabled", "--rpc-http-tls-enabled");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void rpcHttpTlsWithoutKeystoreReportsError() { public void rpcHttpTlsWithoutKeystoreReportsError() {
parseCommand("--rpc-http-enabled", "--rpc-http-tls-enabled"); parseCommand("--rpc-http-enabled", "--rpc-http-tls-enabled");
@ -3078,6 +3210,31 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void rpcWsOptionsRequiresServiceToBeEnabledToml() throws IOException {
final Path toml =
createTempFile(
"toml",
"rpc-ws-api=[\"ETH\", \"NET\"]\n"
+ "rpc-ws-host=\"0.0.0.0\"\n"
+ "rpc-ws-port=1234\n"
+ "rpc-ws-max-active-connections=77\n"
+ "rpc-ws-max-frame-size=65535\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall(
"--rpc-ws-enabled",
"--rpc-ws-host",
"--rpc-ws-port",
"--rpc-ws-api",
"--rpc-ws-max-active-connections",
"--rpc-ws-max-frame-size");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void rpcWsApiPropertyMustBeUsed() { public void rpcWsApiPropertyMustBeUsed() {
TestBesuCommand command = parseCommand("--rpc-ws-enabled", "--rpc-ws-api", "ETH, NET"); TestBesuCommand command = parseCommand("--rpc-ws-enabled", "--rpc-ws-api", "ETH, NET");
@ -3186,6 +3343,29 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void metricsPushOptionsRequiresPushToBeEnabledToml() throws IOException {
final Path toml =
createTempFile(
"toml",
"metrics-push-host=\"0.0.0.0\"\n"
+ "metrics-push-port=1234\n"
+ "metrics-push-interval=2\n"
+ "metrics-push-prometheus-job=\"job-name\"\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall(
"--metrics-push-enabled",
"--metrics-push-host",
"--metrics-push-port",
"--metrics-push-interval",
"--metrics-push-prometheus-job");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void metricsOptionsRequiresPullMetricsToBeEnabled() { public void metricsOptionsRequiresPullMetricsToBeEnabled() {
parseCommand("--metrics-host", "0.0.0.0", "--metrics-port", "1234"); parseCommand("--metrics-host", "0.0.0.0", "--metrics-port", "1234");
@ -3196,6 +3376,18 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void metricsOptionsRequiresPullMetricsToBeEnabledToml() throws IOException {
final Path toml = createTempFile("toml", "metrics-host=\"0.0.0.0\"\n" + "metrics-port=1234\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall("--metrics-enabled", "--metrics-host", "--metrics-port");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void metricsHostAndPortOptionMustBeUsed() { public void metricsHostAndPortOptionMustBeUsed() {
final String host = "1.2.3.4"; final String host = "1.2.3.4";
@ -3398,6 +3590,20 @@ public class BesuCommandTest extends CommandTestAbstract {
"Unable to mine with Stratum if mining is disabled. Either disable Stratum mining (remove --miner-stratum-enabled) or specify mining is enabled (--miner-enabled)"); "Unable to mine with Stratum if mining is disabled. Either disable Stratum mining (remove --miner-stratum-enabled) or specify mining is enabled (--miner-enabled)");
} }
@Test
public void stratumMiningOptionsRequiresServiceToBeEnabledToml() throws IOException {
final Path toml = createTempFile("toml", "miner-stratum-enabled=true\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall("--miner-enabled", "--miner-stratum-enabled");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8))
.startsWith(
"Unable to mine with Stratum if mining is disabled. Either disable Stratum mining (remove --miner-stratum-enabled) or specify mining is enabled (--miner-enabled)");
}
@Test @Test
public void blockProducingOptionsWarnsMinerShouldBeEnabled() { public void blockProducingOptionsWarnsMinerShouldBeEnabled() {
@ -3417,6 +3623,29 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void blockProducingOptionsWarnsMinerShouldBeEnabledToml() throws IOException {
final Address requestedCoinbase = Address.fromHexString("0000011111222223333344444");
final Path toml =
createTempFile(
"toml",
"miner-coinbase=\""
+ requestedCoinbase.toString()
+ "\"\n"
+ "min-gas-price=42\n"
+ "miner-extra-data=\"0x1122334455667788990011223344556677889900112233445566778899001122\"\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall(
"--miner-enabled", "--miner-coinbase", "--min-gas-price", "--miner-extra-data");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void blockProducingOptionsDoNotWarnWhenMergeEnabled() { public void blockProducingOptionsDoNotWarnWhenMergeEnabled() {
@ -3453,6 +3682,18 @@ public class BesuCommandTest extends CommandTestAbstract {
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty(); assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
} }
@Test
public void minGasPriceRequiresMainOptionToml() throws IOException {
final Path toml = createTempFile("toml", "min-gas-price=0\n");
parseCommand("--config-file", toml.toString());
verifyOptionsConstraintLoggerCall("--miner-enabled", "--min-gas-price");
assertThat(commandOutput.toString(UTF_8)).isEmpty();
assertThat(commandErrorOutput.toString(UTF_8)).isEmpty();
}
@Test @Test
public void miningParametersAreCaptured() { public void miningParametersAreCaptured() {
final Address requestedCoinbase = Address.fromHexString("0000011111222223333344444"); final Address requestedCoinbase = Address.fromHexString("0000011111222223333344444");

Loading…
Cancel
Save