623a6e5f85
In a short window the fixed root layout runs out of rows and the CPU graph and per-core bars are what collapse first: the header, gauges and process table hold fixed heights, so at ~18 rows the top row is left with no drawable interior and both panes disappear entirely. Add a second layout, entered automatically once the Disks pane can no longer show even one complete disk card: - Disks is dropped — it is the pane that degrades worst when partly drawn. - Memory and Swap move side by side into the row Disks vacated. - GPU collapses to a single full-width line (utilisation and VRAM, no device name), and is omitted entirely on a host that reports no GPU. - The reclaimed rows go to the CPU panes, with the surplus above their floor shared with the bottom half so the process table still grows with the window. `--compact` pins the layout at any size. The root layout was duplicated in three places (the draw path and both input hit-testing paths), which would have drifted the moment a second layout existed. Move it into ui::layout as the single source of truth and have all three callers go through it. Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
109 lines
3.4 KiB
Rust
109 lines
3.4 KiB
Rust
//! CLI arg parsing tests for socktop (client)
|
|
use std::process::Command;
|
|
|
|
// We test the parsing by invoking the binary with --help and ensuring the help mentions short and long flags.
|
|
// Also directly test the parse_args function via a tiny helper in a doctest-like fashion using a small
|
|
// reimplementation here kept in sync with main (compile-time test).
|
|
|
|
#[test]
|
|
fn test_help_mentions_short_and_long_flags() {
|
|
let output = Command::new(env!("CARGO_BIN_EXE_socktop"))
|
|
.arg("--help")
|
|
.output()
|
|
.expect("run socktop --help");
|
|
let text = format!(
|
|
"{}{}",
|
|
String::from_utf8_lossy(&output.stdout),
|
|
String::from_utf8_lossy(&output.stderr)
|
|
);
|
|
assert!(
|
|
text.contains("--tls-ca")
|
|
&& text.contains("-t")
|
|
&& text.contains("--profile")
|
|
&& text.contains("-P"),
|
|
"help text missing expected flags (--tls-ca/-t, --profile/-P)\n{text}"
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_tlc_ca_arg_long_and_short_parsed() {
|
|
// Use --help combined with flags to avoid network and still exercise arg acceptance
|
|
let exe = env!("CARGO_BIN_EXE_socktop");
|
|
// Long form with help
|
|
let out = Command::new(exe)
|
|
.args(["--tls-ca", "/tmp/cert.pem", "--help"])
|
|
.output()
|
|
.expect("run socktop");
|
|
assert!(
|
|
out.status.success(),
|
|
"socktop --tls-ca … --help did not succeed"
|
|
);
|
|
let text = format!(
|
|
"{}{}",
|
|
String::from_utf8_lossy(&out.stdout),
|
|
String::from_utf8_lossy(&out.stderr)
|
|
);
|
|
assert!(text.contains("Usage:"));
|
|
// Short form with help
|
|
let out2 = Command::new(exe)
|
|
.args(["-t", "/tmp/cert.pem", "--help"])
|
|
.output()
|
|
.expect("run socktop");
|
|
assert!(out2.status.success(), "socktop -t … --help did not succeed");
|
|
let text2 = format!(
|
|
"{}{}",
|
|
String::from_utf8_lossy(&out2.stdout),
|
|
String::from_utf8_lossy(&out2.stderr)
|
|
);
|
|
assert!(text2.contains("Usage:"));
|
|
|
|
// Profile flags with help (should not error)
|
|
let out3 = Command::new(exe)
|
|
.args(["--profile", "dev", "--help"])
|
|
.output()
|
|
.expect("run socktop");
|
|
assert!(
|
|
out3.status.success(),
|
|
"socktop --profile dev --help did not succeed"
|
|
);
|
|
let text3 = format!(
|
|
"{}{}",
|
|
String::from_utf8_lossy(&out3.stdout),
|
|
String::from_utf8_lossy(&out3.stderr)
|
|
);
|
|
assert!(text3.contains("Usage:"));
|
|
}
|
|
|
|
#[test]
|
|
fn test_compact_flag_documented_and_accepted() {
|
|
let exe = env!("CARGO_BIN_EXE_socktop");
|
|
let out = Command::new(exe)
|
|
.args(["--compact", "--help"])
|
|
.output()
|
|
.expect("run socktop --compact --help");
|
|
assert!(
|
|
out.status.success(),
|
|
"socktop --compact --help did not succeed"
|
|
);
|
|
let text = format!(
|
|
"{}{}",
|
|
String::from_utf8_lossy(&out.stdout),
|
|
String::from_utf8_lossy(&out.stderr)
|
|
);
|
|
assert!(
|
|
text.contains("--compact"),
|
|
"help text missing --compact\n{text}"
|
|
);
|
|
|
|
// The flag must not be mistaken for the positional URL argument.
|
|
let out2 = Command::new(exe)
|
|
.args(["--compact", "--dry-run", "ws://127.0.0.1:3000/ws"])
|
|
.output()
|
|
.expect("run socktop --compact --dry-run");
|
|
assert!(
|
|
out2.status.success(),
|
|
"socktop --compact with a URL was rejected: {}",
|
|
String::from_utf8_lossy(&out2.stderr)
|
|
);
|
|
}
|