tests: add test for locale decimal processing
[coreutils.git] / tests / misc / tee.sh
blob313650a82b387e96ba4db4c5a5fb4eb5662c4152
1 #!/bin/sh
2 # test for basic tee functionality.
4 # Copyright (C) 2005-2019 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <https://www.gnu.org/licenses/>.
19 . "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
20 print_ver_ tee
22 echo line >sample || framework_failure_
24 # POSIX says: "Processing of at least 13 file operands shall be supported."
25 for n in 0 1 2 12 13; do
26 files=$(seq $n)
27 rm -f $files
28 tee $files <sample >out || fail=1
29 for f in out $files; do
30 compare sample $f || fail=1
31 done
32 done
34 # Ensure tee treats '-' as the name of a file, as mandated by POSIX.
35 # Between v5.3.0 and v8.23, a '-' argument caused tee to send another
36 # copy of input to standard output.
37 tee - <sample >out 2>err || fail=1
38 compare sample ./- || fail=1
39 compare sample out || fail=1
40 compare /dev/null err || fail
42 # Ensure tee exits early if no more writable outputs
43 if test -w /dev/full && test -c /dev/full; then
44 yes | returns_ 1 timeout 10 tee /dev/full 2>err >/dev/full || fail=1
45 # Ensure an error for each of the 2 outputs
46 # (and no redundant errors for stdout).
47 test $(wc -l < err) = 2 || { cat err; fail=1; }
50 # Ensure we continue with outputs that are OK
51 seq 10000 > multi_read || framework_failure_
53 returns_ 1 tee /dev/full out2 2>err >out1 <multi_read || fail=1
54 cmp multi_read out1 || fail=1
55 cmp multi_read out2 || fail=1
56 # Ensure an error for failing output
57 test $(wc -l < err) = 1 || { cat err; fail=1; }
59 returns_ 1 tee out1 out2 2>err >/dev/full <multi_read || fail=1
60 cmp multi_read out1 || fail=1
61 cmp multi_read out2 || fail=1
62 # Ensure an error for failing output
63 test $(wc -l < err) = 1 || { cat err; fail=1; }
67 # Ensure tee honors --output-error modes
68 mkfifo_or_skip_ fifo
69 read_fifo() { timeout 10 dd count=1 if=fifo of=/dev/null status=none & }
71 # Determine platform sigpipe exit status
72 read_fifo
73 yes >fifo
74 pipe_status=$?
76 # Default operation is to continue on output errors but exit silently on SIGPIPE
77 read_fifo
78 yes | returns_ $pipe_status timeout 10 tee ./e/noent 2>err >fifo || fail=1
79 test $(wc -l < err) = 1 || { cat err; fail=1; }
81 # With -p, SIGPIPE is suppressed, exit 0 for EPIPE when all outputs finished
82 read_fifo
83 yes | timeout 10 tee -p 2>err >fifo || fail=1
84 test $(wc -l < err) = 0 || { cat err; fail=1; }
86 # With --output-error=warn, exit 1 for EPIPE when all outputs finished
87 read_fifo
88 yes | returns_ 1 timeout 10 tee --output-error=warn 2>err >fifo || fail=1
89 test $(wc -l < err) = 1 || { cat err; fail=1; }
91 # With --output-error=exit, exit 1 immediately for EPIPE
92 read_fifo
93 yes | returns_ 1 timeout 10 tee --output-error=exit /dev/null 2>err >fifo \
94 || fail=1
95 test $(wc -l < err) = 1 || { cat err; fail=1; }
97 # With --output-error=exit, exit 1 immediately on output error
98 read_fifo
99 yes | returns_ 1 timeout 10 tee --output-error=exit ./e/noent 2>err >fifo \
100 || fail=1
101 test $(wc -l < err) = 1 || { cat err; fail=1; }
103 # With --output-error=exit-nopipe, exit 0 for EPIPE
104 read_fifo
105 yes | timeout 10 tee --output-error=exit-nopipe 2>err >fifo || fail=1
106 test $(wc -l < err) = 0 || { cat err; fail=1; }
108 wait
109 Exit $fail