* stty: Add 101 unit tests and 16 integration tests to improve coverage
Add comprehensive test coverage for stty:
Unit tests (src/uu/stty/src/stty.rs):
- Flag struct methods and builder pattern (7 tests)
- Control character parsing and formatting (19 tests)
- All combination settings expansion (26 tests)
- Termios modification functions (13 tests)
- String-to-flag/combo/baud parsing (19 tests)
- TermiosFlag trait implementations (5 tests)
- Helper and utility functions (10 tests)
- Trait implementations (2 tests)
Integration tests (tests/by-util/test_stty.rs):
- Help and version output validation (2 tests)
- Invalid argument handling (3 tests)
- Control character overflow validation (2 tests)
- Grouped flag removal validation (1 test)
- File argument error handling (1 test)
- Conflicting print modes (1 test)
- Additional TTY-dependent tests (6 tests, ignored in CI)
Unit test coverage improved from 0% to 43.76% (207/473 lines).
Integration tests validate argument parsing and error handling.
Addresses #9061
* stty: Add essential unit tests and integration tests to improve coverage
- Added 11 essential unit tests for complex internal functions:
* Control character parsing (string_to_control_char)
* Control character formatting (control_char_to_string)
* Combination settings expansion (combo_to_flags)
* Terminal size parsing with overflow handling (parse_rows_cols)
* Sane control character defaults (get_sane_control_char)
- Added 16 integration tests for command behavior:
* Help/version output validation
* Invalid argument handling
* Control character overflow validation
* Grouped flag removal validation
* File argument error handling
* Conflicting print modes
* TTY-dependent tests (marked as ignored for CI)
Unit tests focus on complex parsing logic that's difficult to test via
integration tests. Integration tests validate actual command behavior.
Coverage improved from 0% to 43.76% (207/473 lines).
Fixes#9061
* stty: Add comprehensive unit and integration tests for error handling
- Add unit tests for parse_rows_cols() with edge cases and wraparound
- Add unit tests for string_to_baud() with platform-specific handling
- Add unit tests for string_to_combo() with all combo modes
- Add 17 integration tests for missing arguments and invalid inputs
- Enhance test_invalid_arg() with better error message assertions
- Update coverage script for improved reporting
Coverage improved from 22.26% to 23.14% regions.
* stty: Add Debug and PartialEq derives for test assertions
- Add #[derive(Debug, PartialEq)] to AllFlags enum
- Add PartialEq to Flag struct derives
- Enables assert_eq! macro usage in unit tests
* stty: Fix formatting and clippy warnings in tests
- Replace assert_eq! with assert! for boolean comparisons
- Fix line wrapping for long logical expressions
- Use inline format string syntax (e.g., {err} instead of {})
- All 25 unit tests pass
- No clippy warnings
* stty: Add inline spell-checker ignores for test strings
- Add spell-checker:ignore comments for test data (notachar, notabaud, susp)
- Add spell-checker:ignore comments for French error strings (Valeur, entier, invalide)
- Fixes cspell validation without modifying global config
* perf: gate PartialEq derive to test builds only
The PartialEq derive was being compiled into release builds even though
it's only used in test code. This caused a 3.33% performance regression
in the du_human_balanced_tree benchmark due to increased binary size
affecting CPU cache efficiency.
Changes:
- stty.rs: Gate PartialEq derive on Flag<T> with #[cfg_attr(test, derive(PartialEq))]
- flags.rs: Gate PartialEq derive on AllFlags enum with #[cfg_attr(test, derive(PartialEq))]
This eliminates the performance regression while keeping all test code
functional and unchanged.
---------
Co-authored-by: Sylvestre Ledru <sylvestre@debian.org>
* chmod:fix safe traversal/access (#9554)
* feat(chmod): use dirfd for recursive subdirectory traversal
- Update chmod recursive logic to use directory file descriptors instead of full paths for subdirectories
- Improves performance, avoids path length issues, and ensures dirfd-relative openat calls
- Add test to verify strace output shows no AT_FDCWD with multi-component paths
* test(chmod): add spell-check ignore for dirfd, subdirs, openat, FDCWD
Added a spell-checker ignore directive in the chmod test file to suppress false positives for legitimate technical terms used in Unix API calls.
* test(chmod): enforce strace requirement in recursive test, fail fast instead of skip
Previously, the test_chmod_recursive_uses_dirfd_for_subdirs test skipped gracefully if strace
was unavailable, without failing. This change enforces the strace dependency by failing the
test immediately if strace is not installed or runnable, ensuring the test runs reliably
in environments where it is expected to pass, and preventing silent skips.
* ci: install strace in Ubuntu CI jobs for debugging system calls
Add installation of strace tool on Ubuntu runners in both individual build/test and feature build/test jobs. This enables tracing system calls during execution, aiding in debugging and performance analysis within the CI/CD pipeline. Updated existing apt-get commands and added conditional steps for Linux-only installations.
* ci: Add strace installation to Ubuntu-based CI workflows
Install strace on ubuntu-latest runners across multiple jobs to enable system call tracing for testing purposes, ensuring compatibility with tests that require this debugging tool. This includes updating package lists in existing installation steps.
* chore(build): install strace and prevent apt prompts in Cross.toml pre-build
Modified the pre-build command to install strace utility for debugging and added -y flag to apt-get install to skip prompts, ensuring non-interactive builds.
* feat(build): support Alpine-based cross images in pre-build
Detect package manager (apt vs apk) to install tzdata and strace
in both Debian/Ubuntu and Alpine *-musl targets. Added fallback
warning for unsupported managers. This ensures strace is available
for targets using Alpine, which doesn't have apt-get.
* refactor(build): improve pre-build script readability by using multi-line strings
Replace escaped multi-line string with triple-quoted string for better readability in Cross.toml.
* feat(ci): install strace in WSL2 GitHub Actions workflow
Install strace utility in the WSL2 environment to support tracing system calls during testing. Minor update to Cross.toml spell-checker ignore list for consistency with change.
* ci(wsl2): install strace as root with non-interactive apt-get
Updated the WSL2 workflow step to use root shell (wsl-bash-root) for installing strace, removing sudo calls and adding DEBIAN_FRONTEND=noninteractive to prevent prompts. This improves CI reliability by ensuring direct root access and automated, interrupt-free package installation.
* ci: Move strace installation to user shell and update spell ignore
Fix WSL2 GitHub Actions workflow by installing strace as the user instead of root for better permission handling, and add "noninteractive" to the spell-checker ignore comment for consistency with the new apt-get command. This ensures the tool is available in the testing environment without unnecessary privilege escalation.
* chore: ci: remove unused strace installation from CI workflows
Remove strace package installation from multiple GitHub Actions workflow files (CICD.yml, l10n.yml, wsl2.yml). Strace was historically installed in Ubuntu jobs for debugging system calls, but it's no longer required for the tests and builds, reducing CI setup time and dependencies.
* ci: add strace installation and fix spell-checker comments in CI files
- Install strace package in CICD workflow to support safe traversal verification for utilities like rm, chmod, chown, chgrp, mv, and du, enabling syscall tracing for testing.
- Clean up spell-checker ignore comments in wsl2.yml and Cross.toml by removing misplaced flags.第二个测试产品**ci: add strace installation and fix spell-checker comments in CI files**
- Install strace package in CICD workflow to support safe traversal verification for utilities like rm, chmod, chown, chgrp, mv, and du, enabling syscall tracing for testing.
- Clean up spell-checker ignore comments in wsl2.yml and Cross.toml by removing misplaced flags.
* test: add regression guard for recursive chmod dirfd-relative traversal
Add a check in check-safe-traversal.sh to ensure recursive chmod operations use dirfd-relative openat calls instead of AT_FDCWD with multi-component paths, preventing potential race conditions. Ignore the corresponding Rust test as it is now covered by this shell script guard.
* Merge pull request #9561 from ChrisDryden/seq_benches
seq: adding large integers benchmarks
* install: do not call chown when called as root
- `pseudo` is a tool which simulates being root by intercepting calls to e.g. `geteuid` and `chown` (by using the `LD_PRELOAD` mechanism). This is used e.g. to build filesystems for embedded devices without running as root on the build machine.
- the `chown` call getting removed in this commit does not work when running with `pseudo` and using `PSEUDO_IGNORE_PATHS`: in this case, the call to `geteuid()` gets intercepted by `libpseudo.so` and returns 0, however the call to `chown()` isn't intercepted by `libpseudo.so` in case it is in a path from `PSEUDO_IGNORE_PATHS`, and will thus fail since the process is not really root
- the call to `chown()` was added in https://github.com/uutils/coreutils/pull/5735 with the intent of making the test `install-C-root.sh` pass, however it isn't required (GNU coreutils also does not call `chown` just because `install` was called as root)
Fixes https://github.com/uutils/coreutils/issues/9116
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
* du: handle `--files0-from=-` with piped in `-` (#8985)
* du: handle --files0-from=- with piped in '-'
* build-gnu.sh: remove incorrect string replacement
in tests/du/files0-from.pl
---------
Co-authored-by: Sylvestre Ledru <sylvestre@debian.org>
* perf: optimize rm prompts by reusing stat data to avoid extra syscalls
This change adds inline functions for checking file modes and refactors prompt functions to accept pre-fetched stat data. It modifies safe_remove_* functions to handle paths without parents and updates safe_remove_dir_recursive to fetch and reuse initial mode. This reduces redundant statx system calls, improving performance during recursive removals.
* feat(rm/linux): Refine interactive file removal prompts
- Add specific prompts for symlinks and empty files in 'Always' mode
- Refactor matching logic for better clarity and to match GNU rm behavior
- Improve handling of write-protected and non-terminal stdin scenarios
This enhances the user experience by providing more accurate and targeted confirmations during file removal on Linux.
* refactor(rm/linux): reformat prompt_yes! macros for improved readability
Refactored multiple call sites of the prompt_yes! macro in linux.rs to use consistent multi-line formatting, enhancing code readability and adhering to style guidelines without altering functionality. Adjusted import ordering slightly for better organization.
* refactor(src/uu/rm/src/platform/linux.rs): remove unused 'self' import from std::io
Removed the unused 'self' import from the std::io module to clean up the code and avoid potential confusion, as it was not referenced anywhere in the file. This is a minor refactoring for better maintainability.
* chore(spell-checker): update ignore list to include statx and behaviour
Add "statx" (a Linux system call name) and "behaviour" (potential spelling variant) to the spell-checker ignore comment in the rm utility's Linux platform code, preventing false positives in linting.
* fix(linux/rm): correct prompting logic for write-protected files in Interactive::Always mode
Refactor the prompt_file_with_stat function in src/uu/rm/src/platform/linux.rs to fix inconsistent prompting for Interactive::Always. Previously, it always used non-protected wording regardless of file writability. Now, it checks if the file is writable and uses appropriate messaging (simple for writable, protected for non-writable). The match logic for Interactive::Once and PromptProtected is also simplified using a triple condition for better readability and to ensure empty vs non-empty protected files are distinguished correctly, matching expected rm behavior.
* style(rm): wrap long line in prompt_file_with_stat macro for readability
Reformatted the prompt_yes! macro call across multiple lines to improve code readability and adhere to line length conventions. No functional changes.
---------
Signed-off-by: Etienne Cordonnier <ecordonnier@snap.com>
Co-authored-by: Chris Dryden <christopher.paul.dryden@gmail.com>
Co-authored-by: Etienne Cordonnier <ecordonnier@snap.com>
Co-authored-by: Daniel Hofstetter <daniel.hofstetter@42dh.com>
Co-authored-by: Sylvestre Ledru <sylvestre@debian.org>
* test: add comprehensive test coverage for tsort cycle detection and graph topologies
- Introduce new test cases for cycle loops in file inputs, including extra nodes and multiple loops
- Add tests for POSIX graph examples and linear tree graphs to validate topological sorting
- Include tests for error handling on odd token counts and multiple file inputs
- Ensures robustness and correctness of tsort implementation across various edge cases and standard scenarios
* refactor(tests): consolidate multi-line string constants to single-line literals in tsort test file
- Reformatted TSORT_LOOP_STDERR_AC and TSORT_UNEXPECTED_ARG_ERROR constants for improved code readability and consistency, with no change in string content or functionality. The multi-line format was merged into single lines to align with potential linting rules or style preferences for string literals in tests. This refactoring enhances maintainability without affecting test logic.
* feat(tsort): add hidden warn flag and reverse successor iteration order
- Added `ArgAction` import and a new hidden `-w`/`--warn` argument to the tsort command for future warning features
- Modified iteration of successor names to use `.into_iter().rev()` in the topological sorting algorithm to process nodes in reverse order, ensuring more stable and predictable output sequence
- Refactored Clap error localization in `clap_localization.rs` to use `print_prefixed_error()` method instead of direct `eprintln!` calls, improving consistency in error message formatting across the application
* fix(test): prefix uniq error messages with program name
Update expected error outputs in uniq tests to match the new format where error messages are prefixed with "uniq: ". This ensures test cases align with the updated error message formatting in the utility, providing clearer error identification by including the program name at the start of each error message. Changes affect multiple test assertions for invalid options and incompatible argument combinations.
* fix(test): update chroot error assertion to include command prefix
The expected error message now starts with "chroot: " to match the updated output format in the chroot utility. This ensures the test accurately reflects the command's behavior.
* fix(test/chroot): update error message assertion to match standardized format
Remove "chroot: " prefix from expected error output, aligning the test with the updated stderr format that omits utility name redundancy in error messages.
* fix: update uniq error messages in tests, removing 'uniq: ' prefix
Remove the 'uniq: ' prefix from expected error messages in test cases to match the updated output format of the uniq utility, ensuring tests pass with the current implementation. This change affects multiple GNU compatibility tests for invalid options and argument conflicts.
* fix(comm): update test assertion to match actual error message without 'comm: ' prefix
The stderr assertion in test_comm_arg_error was expecting an error message prefixed with "comm: ", but the actual command output does not include this prefix. This update fixes the test to align with the real behavior, ensuring the test passes correctly.
* refactor(clap_localization): replace print_prefixed_error with direct stderr output in ErrorFormatter
Replace the call to self.print_prefixed_error with direct eprintln for printing unexpected argument errors, and add an additional blank line for better formatting and readability in error messages. This change aims to simplify the output process and ensure consistent error presentation in the clap localization module.
* refactor(clap_localization): remove prefixed error printing and use direct eprintln for cleaner output
Modified error handling in clap_localization.rs to eliminate the utility name prefix by replacing self.print_prefixed_error calls with direct eprintln! invocations. This simplifies the codebase and changes error message formatting to display clap errors without the preceding util name. Removed the unused print_prefixed_error method.
* test(tests/tsort): ignore test for single input file until error message is corrected
- Added #[ignore] attribute to test_only_one_input_file to skip it during execution.
- Reason: Test likely fails due to an incorrect error message; this prevents false negatives while the message is being fixed in the tsort utility.
* feat(tsort): reject multiple input arguments with custom error
- Change FILE arg to accept zero or more inputs (appended), defaulting to "-" if none
- Add validation to error on more than one input with "extra operand" message
- Update test to expect new error format, matching GNU tsort behavior
- Unignore test_only_one_input_file after error message correction
* refactor: format TSORT_EXTRA_OPERAND_ERROR constant for readability
Split the TSORT_EXTRA_OPERAND_ERROR constant string into multiple lines
to improve code formatting and adhere to line length guidelines.
* chore: remove tests_tsort.patch from gnu-patches series
Removed the tests_tsort.patch entry as it is no longer applied, possibly due to upstream integration or obsolescence, to keep the patch series current and relevant.
* fix(tsort): simplify error message construction by removing .into() wrapper
Remove unnecessary `.into()` call when creating the extra operand error in uumain,
resulting in cleaner, more concise error handling code. This change does not alter
the program's functionality but improves code readability and reduces nesting.
* feat: internationalize error messages in tsort command
Add localized strings for 'extra operand' and 'at least one input' errors in en-US and fr-FR locales. Update code to use translate! macro for consistent error reporting across languages, improving user experience for international users.
* fix(tsort): ensure expect message is &str by calling .as_str()
The translate! macro returns a String, but expect() requires a &str. Added .as_str() to convert the translated string for correct type usage and fix compilation error.