summaryrefslogtreecommitdiff
path: root/unit-tests/var-op-shell.mk
diff options
context:
space:
mode:
Diffstat (limited to 'unit-tests/var-op-shell.mk')
-rw-r--r--unit-tests/var-op-shell.mk81
1 files changed, 78 insertions, 3 deletions
diff --git a/unit-tests/var-op-shell.mk b/unit-tests/var-op-shell.mk
index 83580a89e6c2..7b52513e1131 100644
--- a/unit-tests/var-op-shell.mk
+++ b/unit-tests/var-op-shell.mk
@@ -1,9 +1,84 @@
-# $NetBSD: var-op-shell.mk,v 1.2 2020/08/16 14:25:16 rillig Exp $
+# $NetBSD: var-op-shell.mk,v 1.3 2020/11/09 20:39:46 rillig Exp $
#
# Tests for the != variable assignment operator, which runs its right-hand
# side through the shell.
-# TODO: Implementation
+# The variable OUTPUT gets the output from running the shell command.
+OUTPUT!= echo "success"'ful'
+.if ${OUTPUT} != "successful"
+. error
+.endif
+
+# Since 2014-08-20, the output of the shell command may be empty.
+#
+# On 1996-05-29, when the '!=' assignment operator and Cmd_Exec were added,
+# an empty output produced the error message "Couldn't read shell's output
+# for \"%s\"".
+#
+# The error message is still there but reserved for technical errors.
+# It may be possible to trigger the error message by killing the shell after
+# reading part of its output.
+OUTPUT!= true
+.if ${OUTPUT} != ""
+. error
+.endif
+
+# The output of a shell command that failed is processed nevertheless.
+# TODO: Make this an error in lint mode.
+OUTPUT!= echo "failed"; false
+.if ${OUTPUT} != "failed"
+. error
+.endif
+
+# A command with empty output may fail as well.
+OUTPUT!= false
+.if ${OUTPUT} != ""
+. error
+.endif
+
+# In the output of the command, each newline is replaced with a space.
+# Except for the very last one, which is discarded.
+OUTPUT!= echo "line 1"; echo "line 2"
+.if ${OUTPUT} != "line 1 line 2"
+. error
+.endif
+
+# A failing command in the middle results in the exit status 0, which in the
+# end means that the whole sequence of commands succeeded.
+OUTPUT!= echo "before"; false; echo "after"
+.if ${OUTPUT} != "before after"
+. error
+.endif
+
+# NB: The signal number must be numeric since some shells (which ones?) don't
+# accept symbolic signal names. 14 is typically SIGALRM.
+#
+# XXX: The number of the signal is not mentioned in the warning since that
+# would have been difficult to implement; currently the errfmt is a format
+# string containing a single %s conversion.
+OUTPUT!= kill -14 $$$$
+.if ${OUTPUT} != ""
+. error
+.endif
+
+# A nonexistent command produces a non-zero exit status.
+OUTPUT!= /bin/no/such/command
+.if ${OUTPUT} != ""
+. error
+.endif
+
+# The output from the shell's stderr is not captured, it just passes through.
+OUTPUT!= echo "stdout"; echo "stderr" 1>&2
+.if ${OUTPUT} != "stdout"
+. error
+.endif
+
+# The 8 dollar signs end up as 4 dollar signs when expanded. The shell sees
+# the command "echo '$$$$'". The 4 dollar signs are stored in OUTPUT, and
+# when that variable is expanded, they expand to 2 dollar signs.
+OUTPUT!= echo '$$$$$$$$'
+.if ${OUTPUT} != "\$\$"
+. error
+.endif
all:
- @:;