From b48ec50b504829d4e643accb4a25b746a7399801 Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Fri, 10 Apr 2026 17:15:01 +0100 Subject: [PATCH] tests: validate command responsiveness * tests/misc/responsive.sh: Test commands that should output immediately upon receiving input, and that there is no unecessary buffering. * cfg.mk: Avoid false failure in sc_prohibit_test_backticks. * tests/local.mk: Reference the new test. --- cfg.mk | 3 +- tests/local.mk | 1 + tests/misc/responsive.sh | 85 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100755 tests/misc/responsive.sh diff --git a/cfg.mk b/cfg.mk index aa2c86e23d..ba52ebbad1 100644 --- a/cfg.mk +++ b/cfg.mk @@ -971,8 +971,9 @@ exclude_file_name_regexp--sc_prohibit_continued_string_alpha_in_column_1 = \ ^src/(system\.h|od\.c|printf\.c|getlimits\.c)$$ _cksum = ^tests/cksum/cksum-base64\.pl$$ +_tb_misc = misc/(stdbuf|responsive) exclude_file_name_regexp--sc_prohibit_test_backticks = \ - ^tests/(local\.mk|(init|misc/stdbuf|factor/create-test)\.sh)$$|$(_cksum) + ^tests/(local\.mk|(init|$(_tb_misc)|factor/create-test)\.sh)$$|$(_cksum) # Exempt test.c, since it's nominally shared, and relatively static. exclude_file_name_regexp--sc_prohibit_operator_at_end_of_line = \ diff --git a/tests/local.mk b/tests/local.mk index 2bf49a143e..17059068be 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -184,6 +184,7 @@ all_tests = \ tests/misc/tty-eof.pl \ tests/misc/io-errors.sh \ tests/misc/read-errors.sh \ + tests/misc/responsive.sh \ tests/misc/warning-errors.sh \ tests/misc/write-errors.sh \ tests/tail/basic-seek.sh \ diff --git a/tests/misc/responsive.sh b/tests/misc/responsive.sh new file mode 100755 index 0000000000..a63b55ca1b --- /dev/null +++ b/tests/misc/responsive.sh @@ -0,0 +1,85 @@ +#!/bin/sh +# Make sure all of these programs are responsive to input + +# Copyright (C) 2026 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ stdbuf + +# stdbuf fails when the absolute top build dir name contains e.g., +# space, TAB, NL +lf=' +' +case $abs_top_builddir in + *[\\\"\#\$\&\'\`$lf\ \ ]*) + skip_ "unsafe absolute build directory name: $abs_top_builddir";; +esac + +stdbuf -oL true || skip_ 'stdbuf not supported' + +mkfifo_or_skip_ in +mkfifo_or_skip_ hold + +printf '%s' "\ +cat +cut -b1 +cut -c1 +cut -f1 +date -f - +expand +#factor TODO +fold +head -n1 +head -c1 +nl +numfmt +paste +pr +tail -n+1 +tail -c+1 +tee +tr 1 1 +unexpand +uniq +" | +sort -k 1b,1 > all_readers || framework_failure_ + +printf '%s\n' $built_programs | +sort -k 1b,1 > built_programs || framework_failure_ + +join all_readers built_programs > built_readers || framework_failure_ + +nonempty() { sleep $1; test -s out; } + +cleanup_() +{ + kill $writer_pid 2>/dev/null && wait $writer_pid + kill $reader_pid 2>/dev/null && wait $reader_pid +} + +while read reader; do + rm -f out || framework_failure_ + stdbuf -oL $reader out & reader_pid=$! + { printf '1\n'; read x in & writer_pid=$! + retry_delay_ nonempty .1 6 || + { printf 'no output from: %s\n' "$reader" >&2; fail=1; } + printf release >hold || framework_failure_ + wait $writer_pid || framework_failure_ + wait $reader_pid || fail=1 +done < built_readers + + +Exit $fail -- 2.47.3