]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tests: validate command responsiveness master
authorPádraig Brady <P@draigBrady.com>
Fri, 10 Apr 2026 16:15:01 +0000 (17:15 +0100)
committerPádraig Brady <P@draigBrady.com>
Fri, 10 Apr 2026 16:49:01 +0000 (17:49 +0100)
* 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
tests/local.mk
tests/misc/responsive.sh [new file with mode: 0755]

diff --git a/cfg.mk b/cfg.mk
index aa2c86e23d209ffa112c4459c3f86f3655b46842..ba52ebbad1b4c063e042ca369fffbf4d1f785095 100644 (file)
--- 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 = \
index 2bf49a143e0560f700ffe5969a43fed1331aa70a..17059068be4185e39a1cd153435e66997bafd6bd 100644 (file)
@@ -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 (executable)
index 0000000..a63b55c
--- /dev/null
@@ -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 <https://www.gnu.org/licenses/>.
+
+. "${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 <in >out & reader_pid=$!
+  { printf '1\n'; read x <hold || :; } >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