test: add CLI integration tests for reth binary (#22069)

Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
Georgios Konstantopoulos
2026-02-11 12:56:16 -05:00
committed by GitHub
parent e4cb3d3aed
commit e2a3527414
3 changed files with 112 additions and 4 deletions

View File

@@ -68,8 +68,11 @@ aquamarine.workspace = true
clap = { workspace = true, features = ["derive", "env"] }
[dev-dependencies]
alloy-node-bindings = "1.6.3"
alloy-provider = { workspace = true, features = ["reqwest"] }
backon.workspace = true
tempfile.workspace = true
tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
[features]
default = [

67
bin/reth/tests/it/main.rs Normal file
View File

@@ -0,0 +1,67 @@
#![allow(missing_docs)]
use std::process::Command;
const RETH: &str = env!("CARGO_BIN_EXE_reth");
#[test]
fn help() {
let output = Command::new(RETH).arg("--help").output().unwrap();
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(output.status.success());
assert!(stdout.contains("Usage"), "stdout: {stdout}");
assert!(stdout.contains("node"), "stdout: {stdout}");
}
#[test]
fn version() {
let output = Command::new(RETH).arg("--version").output().unwrap();
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(output.status.success());
assert!(stdout.to_lowercase().contains("reth"), "stdout: {stdout}");
}
#[test]
fn node_help() {
let output = Command::new(RETH).args(["node", "--help"]).output().unwrap();
let stdout = String::from_utf8_lossy(&output.stdout);
assert!(output.status.success());
assert!(stdout.contains("--dev"), "stdout: {stdout}");
assert!(stdout.contains("--http"), "stdout: {stdout}");
}
#[test]
fn unknown_subcommand() {
let output = Command::new(RETH).arg("definitely-not-a-cmd").output().unwrap();
assert!(!output.status.success());
}
#[test]
fn unknown_flag() {
let output = Command::new(RETH).args(["node", "--no-such-flag"]).output().unwrap();
let stderr = String::from_utf8_lossy(&output.stderr);
assert!(!output.status.success());
assert!(stderr.contains("--no-such-flag"), "stderr: {stderr}");
}
#[tokio::test]
async fn dev_node_eth_syncing() {
use alloy_node_bindings::Reth;
use alloy_provider::{Provider, ProviderBuilder};
let reth = Reth::at(RETH)
.dev()
.disable_discovery()
.args(["--max-outbound-peers", "0", "--max-inbound-peers", "0"])
.spawn();
let provider = ProviderBuilder::new().connect_http(reth.endpoint().parse().unwrap());
// give the node a moment to fully initialize
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
// eth_syncing should not fail on a dev node
let _syncing = provider.syncing().await.expect("eth_syncing failed");
}
const fn main() {}