2
# Test whether programs exit upon a single EOF from a tty.
3
# Ensure that e.g., cat exits upon a single EOF (^D) from a tty.
4
# Do the same for all programs that can read stdin,
5
# require no arguments and that write to standard output.
7
# Copyright (C) 2003-2012 Free Software Foundation, Inc.
9
# This program is free software: you can redistribute it and/or modify
10
# it under the terms of the GNU General Public License as published by
11
# the Free Software Foundation, either version 3 of the License, or
12
# (at your option) any later version.
14
# This program is distributed in the hope that it will be useful,
15
# but WITHOUT ANY WARRANTY; without even the implied warranty of
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
# GNU General Public License for more details.
19
# You should have received a copy of the GNU General Public License
20
# along with this program. If not, see <http://www.gnu.org/licenses/>.
23
(my $ME = $0) =~ s|.*/||;
25
# Some older versions of Expect.pm (e.g. 1.07) lack the log_user method,
26
# so check for that, too.
27
eval { require Expect; Expect->require_version('1.11') };
29
and CuSkip::skip "$ME: this script requires Perl's Expect package >=1.11\n";
33
my @stdin_reading_commands = qw(
64
my $stderr = 'tty-eof.err';
65
foreach my $cmd ((@stdin_reading_commands), 'cut -f2')
69
$exp->spawn("$cmd 2> $stderr")
70
or (warn "$ME: cannot run '$cmd': $!\n"), $fail=1, next;
71
# No input for cut -f2.
73
or $exp->send("a b\n");
74
$exp->send("\cD"); # This is Control-D. FIXME: what if that's not EOF?
75
$exp->expect (0, '-re', "^a b\\r?\$");
76
my $found = $exp->expect (1, '-re', "^.+\$");
77
$found and warn "F: $found: " . $exp->exp_match () . "\n";
78
$exp->expect(10, 'eof');
79
# Expect no output from cut, since we gave it no input.
80
defined $found || $cmd =~ /^cut/
81
or (warn "$ME: $cmd didn't produce expected output\n"),
83
defined $exp->exitstatus
84
or (warn "$ME: $cmd didn't exit after ^D from standard input\n"),
86
my $s = $exp->exitstatus;
88
or (warn "$ME: $cmd exited with status $s (expected 0)\n"),
92
# dd normally writes to stderr. If it exits successfully, we're done.
93
$cmd eq 'dd' && $s == 0
98
warn "$ME: $cmd wrote to stderr:\n";
106
or warn "$ME: failed to remove stderr file from $cmd, $stderr: $!\n";