From: oech3 <79379754+oech3@users.noreply.github.com> Date: Thu, 4 Jun 2026 11:15:40 +0000 (+0900) Subject: tests: cat: extract checks for distinct read/write errors X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a4ecf6cd2f252f94af6100c545e2c64d48f4beae;p=thirdparty%2Fcoreutils.git tests: cat: extract checks for distinct read/write errors * tests/cat/splice.sh: Move read/error distinction test to ... * tests/cat/cat-distinct-err.sh: ... here, and augment. * tests/local.mk: Reference the new file. --- diff --git a/tests/cat/cat-distinct-err.sh b/tests/cat/cat-distinct-err.sh new file mode 100755 index 0000000000..cf21be225b --- /dev/null +++ b/tests/cat/cat-distinct-err.sh @@ -0,0 +1,59 @@ +#!/bin/sh +# Test that read/write errors are distinguished + +# 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_ cat +getlimits_ +uses_strace_ + +# write error +if test -w /dev/full && test -c /dev/full; then + echo "cat: write error: $ENOSPC" >exp || framework_failure_ + echo 1 | returns_ 1 cat >/dev/full 2>err || fail=1 + compare exp err || fail=1 +fi + +# read error +if test -e /proc/self/mem && + returns_ 1 dd if=/proc/self/mem bs=1 count=1; then + echo "cat: /proc/self/mem: $EIO" >exp || framework_failure_ + returns_ 1 cat /proc/self/mem 2>err || fail=1 + compare exp err || fail=1 +fi + +# Verify splice is called multiple times, +# and doesn't just fall back after the first EINVAL. +# This also implicitly handles systems without splice at all. +strace -o splice_count -e splice cat /dev/zero | head -c1M >/dev/null +splice_count=$(grep '^splice' splice_count | wc -l) + +# Test that splice errors are diagnosed. +# Odd numbers are for input, even for output (since cat is not buffered) +if test "$splice_count" -gt 1 && + strace -o /dev/null -e inject=splice:error=EIO:when=3 true; then + for when in 3 4; do + test "$when" = 4 && efile='write error' || efile='/dev/zero' + printf 'cat: %s: %s\n' "$efile" "$EIO" > exp || framework_failure_ + returns_ 1 timeout 10 strace -o /dev/null \ + -e inject=splice:error=EIO:when=$when \ + cat /dev/zero >/dev/null 2>err || fail=1 + compare exp err || fail=1 + done +fi + +Exit $fail diff --git a/tests/cat/splice.sh b/tests/cat/splice.sh index 55b96711bb..f1636278ef 100755 --- a/tests/cat/splice.sh +++ b/tests/cat/splice.sh @@ -27,26 +27,6 @@ if timeout 10 true; then test $? = 124 || fail=1 fi -# Verify splice is called multiple times, -# and doesn't just fall back after the first EINVAL. -# This also implicitly handles systems without splice at all. -strace -o splice_count -e splice cat /dev/zero | head -c1M >/dev/null -splice_count=$(grep '^splice' splice_count | wc -l) - -# Test that splice errors are diagnosed. -# Odd numbers are for input, even for output -if test "$splice_count" -gt 1 && - strace -o /dev/null -e inject=splice:error=EIO:when=3 true; then - for when in 3 4; do - test "$when" = 4 && efile='write error' || efile='/dev/zero' - printf 'cat: %s: %s\n' "$efile" "$EIO" > exp || framework_failure_ - returns_ 1 timeout 10 strace -o /dev/null \ - -e inject=splice:error=EIO:when=$when \ - cat /dev/zero >/dev/null 2>err || fail=1 - compare exp err || fail=1 - done -fi - # Ensure we fallback to write() if there is an issue with (async) zero-copy zc_syscalls='io_uring_setup io_uring_enter io_uring_register memfd_create sendfile splice tee vmsplice' diff --git a/tests/local.mk b/tests/local.mk index 0001534acf..e2afbe134b 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -310,6 +310,7 @@ all_tests = \ tests/wc/wc-proc.sh \ tests/wc/wc-sjis.sh \ tests/wc/wc-total.sh \ + tests/cat/cat-distinct-err.sh \ tests/cat/cat-E.sh \ tests/cat/cat-proc.sh \ tests/cat/cat-buf.sh \