1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-02-24 15:04:13 +00:00
cde/src/cmd/ksh93/tests/pty.sh
Martijn Dekker d3cd4cf906 Fixes to compile on Solaris variants, NetBSD, and NixOS
Solaris, Illumos distributions, and NetBSD need LDFLAGS set to link
explicitly to libm, otherwise, due to as-yet unknown reasons, the
src/lib/libdll/features/dll fails to write a valid header file and
compilation fails due to unknown identifiers such as Dllscan_t.
This commit adds the flag on those systems.

NixOS is a Linux distro that uses very different paths from the
usual Unix conventions (though it's POSIX compliant), and the
regression tests still needed a lot of tweaks to be compatible.

src/cmd/INIT/package.sh, bin/package:
- On SunOS (Solaris and illumos distros) and NetBSD, add '-lm' to
  LDFLAGS before compiling.

src/cmd/INIT/mamprobe.sh, bin/mamprobe,
src/cmd/INIT/execrate.sh, bin/execrate:
- Instead of only in /bin, /usr/bin, /sbin and /usr/sbin, search
  utilities in the path given by the OS 'getconf PATH', and use the
  user's original $PATH as a fallback.

src/cmd/ksh93/tests/*.sh:
- Miscellaneous portability fixes, mainly elimination of unportable
  hardcoded paths to commands.
- basic.sh: Remove test for 'time' keyword millisecond precision.
  It was racy and could fail depending on system and system load.
2020-08-03 09:24:16 +01:00

564 lines
14 KiB
Bash
Executable file

########################################################################
# #
# This software is part of the ast package #
# Copyright (c) 1982-2012 AT&T Intellectual Property #
# and is licensed under the #
# Eclipse Public License, Version 1.0 #
# by AT&T Intellectual Property #
# #
# A copy of the License is available at #
# http://www.eclipse.org/org/documents/epl-v10.html #
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
# #
# Information and Software Systems Research #
# AT&T Research #
# Florham Park NJ #
# #
# David Korn <dgk@research.att.com> #
# #
########################################################################
: : generated by mkptytests from "posix-sh-*-c.pty" : :
# These are tests for the interactive shell, run in a pseudoterminal utility
# called 'pty', which allows for scripting interactive sessions and which is
# installed in arch/*/bin while building. To understand these tests, first
# read the pty manual by running: arch/*/bin/pty --man
# The # err_exit # comments are to enable shtests to count the tests.
# the trickiest part of the tests is avoiding typeahead
# in the pty dialogue
function err_exit
{
print -u2 -n "\t"
print -u2 -r ${Command}[$1]: "${@:2}"
(( Errors++ ))
}
alias err_exit='err_exit $lineno'
Command=${0##*/}
integer Errors=0 lineno=1
[[ -d $tmp && -w $tmp ]] || { err\_exit "$LINENO" '$tmp not set; run this from shtests. Aborting.'; exit 1; }
whence -q pty || { err\_exit "$LINENO" "pty command not found -- tests skipped"; exit 0; }
# On FreeBSD, the stty command does not appear to work correctly on a pty pseudoterminal.
# To avoid a couple of false regressions, we have to set 'erase' and 'kill' on the real terminal.
stty_restore=$(stty -g) || { err\_exit "$LINENO" "could not save terminal state -- tests skipped"; exit 0; }
trap 'stty "$stty_restore"' EXIT # note: on ksh, the EXIT trap is also triggered for termination due to a signal
stty erase ^H kill ^X
bintrue=$(whence -p true)
x=$( $SHELL <<- \EOF
trap 'exit 0' EXIT
bintrue=$(whence -p true)
set -o monitor
{
eval $'set -o vi\npty $bintrue'
} < /dev/null & pid=$!
#sleep 1
jobs
kill $$
EOF
)
[[ $x == *Stop* ]] && err_exit 'monitor mode enabled incorrectly causes job to stop'
if [[ -o xtrace ]]
then debug=--debug=1
else debug=
fi
function tst
{
integer lineno=$1 offset
typeset text
pty $debug --dialogue --messages='/dev/fd/1' $SHELL |
while read -r text
do if [[ $text == *debug* ]]
then print -u2 -r -- "$text"
else offset=${text/*: line +([[:digit:]]):*/\1}
err_exit "${text/: line $offset:/: line $(( lineno + offset)):}"
fi
done
}
export PS1=':test-!: ' PS2='> ' PS4=': ' ENV=/./dev/null EXINIT= HISTFILE= TERM=dumb VISUAL=vi LC_ALL=C
if ! pty $bintrue < /dev/null
then err_exit pty command hangs on $bintrue -- tests skipped
exit 0
fi
# err_exit #
tst $LINENO <<"!"
L POSIX sh 026(C)
# If the User Portability Utilities Option is supported: When the
# POSIX locale is specified and a background job is suspended by a
# SIGTSTP signal then the <state> field in the output message is set to
# Stopped, Suspended, Stopped(SIGTSTP) or Suspended(SIGTSTP).
I ^\r?\n$
p :test-1:
w sleep 60 &
u [[:digit:]]\r?\n$
s 100
p :test-2:
w kill -TSTP $!
u (Stopped|Suspended)
p :test-3:
w kill -KILL $!
w wait
u (Killed|Done)
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 028(C)
# If the User Portability Utilities Option is supported: When the
# POSIX locale is specified and a background job is suspended by a
# SIGTTIN signal then the <state> field in the output message is set to
# Stopped(SIGTTIN) or Suspended(SIGTTIN).
I ^\r?\n$
p :test-1:
w sleep 60 &
u [[:digit:]]\r?\n$
s 100
p :test-2:
w kill -TTIN $!
u (Stopped|Suspended) \(SIGTTIN\)
p :test-3:
w kill -KILL $!
w wait
u (Killed|Done)
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 029(C)
# If the User Portability Utilities Option is supported: When the
# POSIX locale is specified and a background job is suspended by a
# SIGTTOU signal then the <state> field in the output message is set to
# Stopped(SIGTTOU) or Suspended(SIGTTOU).
I ^\r?\n$
p :test-1:
w sleep 60 &
u [[:digit:]]\r?\n$
s 100
p :test-2:
w kill -TTOU $!
u (Stopped|Suspended) \(SIGTTOU\)
p :test-3:
w kill -KILL $!
w wait
u (Killed|Done)
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 091(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in insert mode an entered
# character other than <newline>, erase, interrupt, kill, control-V,
# control-W, backslash \ (followed by erase or kill), end-of-file and
# <ESC> is inserted in the current command line.
c echo h
c ell
w o
u ^hello\r?\n$
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 093(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: After termination of a previous
# command, sh is entered in insert mode.
w echo hello
u ^hello\r?\n$
c echo goo
c dby
w e
u ^goodbye\r?\n$
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 094(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in insert mode an <ESC>
# switches sh into command mode.
c echo he\E
s 400
w allo
u ^hello\r?\n$
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 096(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in command mode the
# interrupt character causes sh to terminate command line editing on
# the current command line, re-issue the prompt on the next line of the
# terminal and to reset the command history so that the command that
# was interrupted is not entered in the history.
I ^\r?\n$
p :test-1:
w echo first
p :test-2:
w stty intr ^C
p :test-3:
c echo bad\E
s 400
c \cC
w echo scrambled
p :test-4:
w history
u echo first
r stty intr \^C
r echo
r history
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 097(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in insert mode a <newline>
# causes the current command line to be executed.
c echo ok\n
u ^ok\r?\n$
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 099(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in insert mode the interrupt
# character causes sh to terminate command line editing on the current
# command line, re-issue the prompt on the next line of the terminal
# and to reset the command history so that the command that was
# interrupted is not entered in the history.
I ^\r?\n$
p :test-1:
w echo first
u ^first
p :test-2:
w stty intr ^C
r
p :test-3:
c echo bad\cC
w echo last
p :test-4:
w history
u echo first
r stty intr \^C
r echo last
r history
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 100(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in insert mode the kill
# character clears all the characters from the input line.
p :test-1:
w stty kill ^X
p :test-2:
c echo bad\cX
w echo ok
u ^ok\r?\n$
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 101(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in insert mode a control-V
# causes the next character to be inserted even in the case that the
# character is a special insert mode character.
# Testing Requirements: The assertion must be tested with at least the
# following set of characters: <newline>, erase, interrupt, kill,
# control-V, control-W, end-of-file, backslash \ (followed by erase or
# kill) and <ESC>.
d 10
p :test-1:
w stty erase ^H intr ^C kill ^X
p :test-2:
w echo erase=:\cV\cH:
u ^erase=:\r?\n$
p :test-3:
w echo kill=:\cV\cX:
u ^kill=:\cX:\r?\n$
p :test-4:
w echo control-V=:\cV\cV:
u ^control-V=:\cV:\r?\n$
p :test-5:
w echo control-W:\cV\cW:
u ^control-W:\cW:\r?\n$
p :test-6:
w echo EOF=:\cV\cD:
u ^EOF=:\004:\r?\n$
p :test-7:
w echo backslash-erase=:\\\cH:
u ^backslash-erase=:\r?\n$
p :test-8:
w echo backslash-kill=:\\\cX:
u ^backslash-kill=:\cX:\r?\n$
p :test-9:
w echo ESC=:\cV\E:
u ^ESC=:\E:\r?\n$
p :test-10:
w echo interrupt=:\cV\cC:
u ^interrupt=:\cC:\r?\n$
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 104(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in insert mode an
# end-of-file at the beginning of an input line is interpreted as the
# end of input.
p :test-1:
w trap 'echo done >&2' EXIT
p :test-2:
s 100
c \cD
u ^done\r?\n$
!
# err_exit #
tst $LINENO <<"!"
L POSIX sh 111(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in command mode, # inserts
# the character # at the beginning of the command line and causes the
# line to be treated as a comment and the line is entered in the
# command history.
p :test-1:
c echo save\E
s 400
c #
p :test-2:
w history
u #echo save
r history
!
# Following test is disabled because it fails on too many systems, either intermittently
# or consistently, through no fault of ksh, because vi(1) somehow fails to write "/tmp/"
# as expected. Testing the POSIX compliance of whatever vi(1) the local system happens
# to have is outside the scope of these tests, which are supposed to be testing ksh.
# It is left here for re-enabling temporarily if related changes in ksh need testing.
: <<\end_disabled
# err_(don't count me)_exit #
TMPDIR=/tmp tst $LINENO <<"!"
L POSIX sh 137(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in command mode, then v
# invokes the vi editor to edit the current command line in a temporary
# file. When the editor exits, the commands in the temporary file are
# executed.
p :test-1:
c echo hello\E
s 400
c v
u /tmp/
c A world\E
s 400
w :wq
u ^hello world\r?\n$
!
end_disabled
# err_exit #
tst $LINENO <<"!"
L POSIX sh 251(C)
# If the User Portability Utilities Option is supported and shell
# command line editing is supported: When in command mode, then the
# command N repeats the most recent / or ? command, reversing the
# direction of the search.
p :test-1:
w echo repeat-1
u ^repeat-1\r?\n$
p :test-2:
w echo repeat-2
u ^repeat-2\r?\n$
p :test-3:
s 100
c \E
s 400
w /rep
u echo repeat-2
c n
r echo repeat-1
c N
r echo repeat-2
w dd
p :test-3:
w echo repeat-3
u ^repeat-3\r?\n$
p :test-4:
s 100
c \E
s 400
w ?rep
r echo repeat-2
c N
r echo repeat-1
c n
r echo repeat-2
c n
r echo repeat-3
!
# Following test is disabled because a bug in pty causes it to fail on too
# many operating systems. Apparently pty doesn't handle SIGTSTP correctly:
# https://github.com/att/ast/issues/375
# TODO: fix pty and re-enable this test.
: <<\end_disabled
# err_(don't count me)_exit #
whence -q less &&
TERM=vt100 tst $LINENO <<"!"
L process/terminal group exercise
w m=yes; while true; do echo $m-$m; done | less
u :$|:\E|lines
c \cZ
r Stopped
w fg
u yes-yes
!
end_disabled
# err_exit #
# Test file name completion in vi mode
mkdir "/tmp/fakehome_$$" && tst $LINENO <<!
L vi mode file name completion
# Completing a file name in vi mode that contains '~' and has a
# base name the same length as the home directory's parent directory
# shouldn't fail.
w set -o vi; HOME=/tmp/fakehome_$$; touch ~/testfile_$$
w echo ~/tes\t
u ^/tmp/fakehome_$$/testfile_$$\r?\n$
!
rm -r "/tmp/fakehome_$$"
# err_exit #
LC_ALL=C tst $LINENO <<"!"
L raw Bourne mode literal tab characters with wide characters disabled
# This gets handled by ed_read() in edit.c; it does not expand tab
# characters on the command line.
d 10
p :test-1:
w set +o vi +o emacs
p :test-2:
w true /de\tv/nu\tl\tl
r ^:test-2: true (/de\tv/nu\tl\tl|/de v/nu l l)\r\n$
p :test-3:
!
# err_exit #
LC_ALL=C.UTF-8 tst $LINENO <<"!"
L raw Bourne mode literal tab characters with wide characters enabled
# This gets handled by ed_viread() in vi.c (even though vi mode is off);
# it expands tab characters to spaces on the command line.
d 10
p :test-1:
w set +o vi +o emacs
p :test-2:
w true /de\tv/nu\tl\tl
r ^:test-2: true /de v/nu l l\r\n$
p :test-3:
!
# err_exit #
LC_ALL=C.UTF-8 tst $LINENO <<"!"
L raw Bourne mode backslash handling
# The escaping backslash feature should be disabled in the raw Bourne mode.
# This is tested with both erase and kill characters.
d 10
p :test-1:
w set +o vi +o emacs; stty erase ^H kill ^X
p :test-2:
w true string\\\\\cH\cH
r ^:test-2: true string\r\n$
p :test-3:
w true incorrect\\\cXtrue correct
r ^:test-3: true correct\r\n$
!
# err_exit #
# err_exit #
for mode in emacs vi; do
tst $LINENO << !
L escaping backslashes in $mode mode
# Backslashes should only be escaped if the previous input was a backslash.
# Other backslashes stored in the input buffer should be erased normally.
d 10
p :test-1:
w set -o $mode; stty erase ^H
p :test-2:
w true string\\\\\\\\\\cH\\cH\\cH
r ^:test-2: true string\\r\\n$
!
done
# err_exit #
tst $LINENO <<"!"
L notify job state changes
# 'set -b' should immediately notify the user about job state changes.
p :test-1:
w set -b; sleep .01 &
u Done
!
# ======
exit $((Errors<125?Errors:125))