Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/uu/stty/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ doctest = false
clap = { workspace = true }
fluent = { workspace = true }
nix = { workspace = true, features = ["ioctl", "term"] }
rustix = { workspace = true, features = ["termios"] }
rustix = { workspace = true, features = ["fs", "termios"] }
uucore = { workspace = true, features = ["parser"] }

[build-dependencies]
Expand Down
46 changes: 43 additions & 3 deletions tests/by-util/test_stty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -866,13 +866,53 @@ fn test_saved_state_valid_formats() {
let (path, _controller, _replica) = pty_path();
let (_at, ts) = at_and_ts!();

// Generate valid saved state from the actual terminal
let saved = unwrap_or_return!(expected_result(&ts, &["-g", "--file", &path])).stdout_move_str();
// Generate valid saved state from the actual terminal with our own stty,
// so the test doesn't depend on the system stty
let saved = ts
.ucmd()
.args(&["-g", "--file", &path])
.succeeds()
.stdout_move_str();
let saved = saved.trim();

// Change a setting so that restoring the saved state has something to undo
ts.ucmd()
.args(&["--file", &path, "-echo"])
.succeeds()
.no_output();
// Compare the iflag:oflag:cflag:lflag fields only. The control characters
// after them include slots the terminal does not store, which can read back
// differently (seen on musl).
let flags = |state: &str| {
state
.trim()
.split(':')
.take(4)
.collect::<Vec<_>>()
.join(":")
};
let changed = ts
.ucmd()
.args(&["-g", "--file", &path])
.succeeds()
.stdout_move_str();
assert_ne!(
flags(&changed),
flags(saved),
"-echo should change the saved state"
);

let result = ts.ucmd().args(&["--file", &path, saved]).run();

result.success().no_stderr();
result.success().no_output();

// Restoring the state brings the terminal back to it
let restored = ts
.ucmd()
.args(&["-g", "--file", &path])
.succeeds()
.stdout_move_str();
assert_eq!(flags(&restored), flags(saved));

let exp_result = unwrap_or_return!(expected_result(&ts, &["--file", &path, saved]));
let normalized_stderr = normalize_stderr(result.stderr_str());
Expand Down
Loading