#![allow(clippy::unwrap_used, clippy::expect_used)]
mod common;
use std::net::TcpListener;
use tempfile::TempDir;
const FAKE_KEY: &str = "SECRETKEY123abcXYZ";
fn refused_port() -> u16 {
let listener = TcpListener::bind("127.0.0.1:0").expect("bind ephemeral port");
let port = listener.local_addr().expect("local addr").port();
drop(listener);
port
}
#[test]
fn setup_dry_run_does_not_leak_rpc_url_on_unreachable_endpoint() {
let data_dir = TempDir::new().expect("temp data dir");
let host_port = format!("127.0.0.1:{}", refused_port());
let rpc_url = format!("http://{host_port}/v3/{FAKE_KEY}");
let output = common::decdn_command(data_dir.path())
.args(["setup", "--mbps", "100", "--region", "US", "--dry-run"])
.arg("--rpc-url")
.arg(&rpc_url)
.args([
"--capacity-bond-address",
"0x0000000000000000000000000000000000000002",
])
.arg("--data-dir")
.arg(data_dir.path())
.output()
.expect("run decdn binary");
assert!(
!output.status.success(),
"expected `setup --dry-run` to fail against an unreachable RPC"
);
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
for (name, stream) in [("stdout", &stdout), ("stderr", &stderr)] {
assert!(
!stream.contains(FAKE_KEY),
"rpc_url secret leaked on {name}: {stream}"
);
assert!(
!stream.contains(&host_port) && !stream.contains(&*rpc_url),
"rpc_url host:port leaked on {name}: {stream}"
);
}
assert!(
stderr.contains("Error:"),
"expected the sanitized `main()` error prefix.\nstderr: {stderr}"
);
assert!(
stderr.contains("minCapacityMbps") || stderr.contains("RPC"),
"sanitized error dropped the actionable context.\nstderr: {stderr}"
);
}