Module Name:    src
Committed By:   christos
Date:           Sat Mar 12 14:58:03 UTC 2016

Modified Files:
        src/tests/bin/sh: t_varquote.sh

Log Message:
Implement TEST_SH for this test, add a test or two, and also some
commentary to explain some of the weirdness of shell quoting. (from kre@)


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/bin/sh/t_varquote.sh

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/bin/sh/t_varquote.sh
diff -u src/tests/bin/sh/t_varquote.sh:1.3 src/tests/bin/sh/t_varquote.sh:1.4
--- src/tests/bin/sh/t_varquote.sh:1.3	Fri Feb 19 08:48:28 2016
+++ src/tests/bin/sh/t_varquote.sh	Sat Mar 12 09:58:03 2016
@@ -1,4 +1,4 @@
-# $NetBSD: t_varquote.sh,v 1.3 2016/02/19 13:48:28 christos Exp $
+# $NetBSD: t_varquote.sh,v 1.4 2016/03/12 14:58:03 christos Exp $
 #
 # Copyright (c) 2007 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -24,6 +24,8 @@
 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 # POSSIBILITY OF SUCH DAMAGE.
 #
+# the implementation of "sh" to test
+: ${TEST_SH:="/bin/sh"}
 
 # Variable quoting test.
 
@@ -39,30 +41,70 @@ all_head() {
 	atf_set "descr" "Basic checks for variable quoting"
 }
 all_body() {
-	foo='${a:-foo}'
-	check "$foo" '${a:-foo}'
 
-	foo="${a:-foo}"
-	check "$foo" "foo"
+	cat <<-'EOF' > script.sh
+		T=0
+		check() {
+			T=$((${T} + 1))
+
+			if [ "$1" != "$2" ]
+			then
+				printf '%s\n' "T${T}: expected [$2], found [$1]"
+				exit 1
+			fi
+		}
+
+								#1
+		foo='${a:-foo}'
+		check "$foo" '${a:-foo}'
+								#2
+		foo="${a:-foo}"
+		check "$foo" "foo"
+								#3
+		foo=${a:-"'{}'"}	
+		check "$foo" "'{}'"
+								#4
+		foo=${a:-${b:-"'{}'"}}
+		check "$foo" "'{}'"
+								#5
+		#    ${   }   The ' are inside ".." so are literal (not quotes).
+		foo="${a-'}'}"
+		check "$foo" "''}"
+								#6
+		# The rules for quoting in ${var-word} expressions are somewhat
+		# weird, in the following there is not one quoted string being
+		# assigned to foo (with internally quoted sub-strings), rather
+		# it is a mixed quoted/unquoted string, with parts that are
+		# quoted, separated by 2 unquoted sections...
+		#    qqqqqqqqqq uuuuuuuuuu qq uuuu qqqq
+		foo="${a:-${b:-"${c:-${d:-"x}"}}y}"}}z}"
+		#   "                                z*"
+		#    ${a:-                          }
+		#         ${b:-                    }
+		#              "                y*"
+		#               ${c:-          }
+		#                    ${d:-    }
+		#                         "x*"
+		check "$foo" "x}y}z}"
+								#7
+		# And believe it or not, this is the one that gives
+		# most problems, with 3 different observed outputs...
+		#    qqqqq  qq  q		is one interpretation
+		#    qqqqq QQQQ q		is another (most common)
+		#			(the third is syntax error...)
+		foo="${a:-"'{}'"}"
+		check "$foo" "'{}'"
 
-	foo=${a:-"'{}'"}
-	check "$foo" "'{}'"
+	EOF
 
-	foo=${a:-${b:-"'{}'"}}
-	check "$foo" "'{}'"
-
-	foo="${a:-"'{}'"}"
-	check "$foo" "'{}'"
-
-	foo="${a:-${b:-"${c:-${d:-"x}"}}y}"}}z}"
-	#   "                                z*"
-	#    ${a:-                          }
-	#         ${b:-                    }
-	#              "                y*"
-	#               ${c:-          }
-	#                    ${d:-    }
-	#                         "x*"
-	check "$foo" "x}y}z}"
+	OUT=$( ${TEST_SH} script.sh 2>&1 )
+	if  [ $? -ne 0 ]
+	then
+		atf_fail "${OUT}"
+	elif [ -n "${OUT}" ]
+	then
+		atf_fail "script.sh unexpectedly said: ${OUT}"
+	fi
 }
 
 atf_test_case nested_quotes_multiword
@@ -72,7 +114,7 @@ nested_quotes_multiword_head() {
 }
 nested_quotes_multiword_body() {
 	atf_check -s eq:0 -o match:"first-word second-word" -e empty \
-	    /bin/sh -c 'echo "${foo:="first-word"} second-word"'
+	    ${TEST_SH} -c 'echo "${foo:="first-word"} second-word"'
 }
 
 atf_test_case default_assignment_with_arith
@@ -81,7 +123,8 @@ default_assignment_with_arith_head() {
 	    "string works (PR bin/50827)"
 }
 default_assignment_with_arith_body() {
-	atf_check -s eq:0 -o empty -e empty /bin/sh -c ': "${x=$((1))}"'
+	atf_check -s eq:0 -o empty -e empty ${TEST_SH} -c ': "${x=$((1))}"'
+	atf_check -s eq:0 -o match:1 -e empty ${TEST_SH} -c 'echo "${x=$((1))}"'
 
 }
 

Reply via email to