Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/bin/sh Add a basic test for $'...' quoting (roughly C ...



details:   https://anonhg.NetBSD.org/src/rev/fcbf49f6d742
branches:  trunk
changeset: 826169:fcbf49f6d742
user:      kre <kre%NetBSD.org@localhost>
date:      Fri Aug 18 21:22:30 2017 +0000

description:
Add a basic test for $'...' quoting (roughly C ctyle strings).
This test will be skipped on shells (such as /bin/sh in -current as of
the date of this commit) which do not support $'...'

While here fix a typo in a comment (there are probably more...)

diffstat:

 tests/bin/sh/t_syntax.sh |  101 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 87 insertions(+), 14 deletions(-)

diffs (149 lines):

diff -r 513d8e37c262 -r fcbf49f6d742 tests/bin/sh/t_syntax.sh
--- a/tests/bin/sh/t_syntax.sh  Fri Aug 18 14:52:19 2017 +0000
+++ b/tests/bin/sh/t_syntax.sh  Fri Aug 18 21:22:30 2017 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: t_syntax.sh,v 1.6 2017/07/26 17:50:20 kre Exp $
+# $NetBSD: t_syntax.sh,v 1.7 2017/08/18 21:22:30 kre Exp $
 #
 # Copyright (c) 2017 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -261,7 +261,7 @@
        done
 
        # inspired by pkgsrc/pkgtools/cwrappers :: libnbcompat/configure
-       # failure with (broken) sh LINENO core .. avoid recurrence
+       # failure with (broken) sh LINENO code .. avoid recurrence
        # This test would have failed.
        cat <<- 'DONE' | atf_check -s exit:0 -o inline:'/tmp\n' ${TEST_SH}
                dn=/tmp/foo
@@ -295,11 +295,83 @@
        return 0
 }
 
-atf_test_case d_redirects
-d_redirects_head() {
+atf_test_case d_cstrings
+d_cstrings_head() {
+       atf_set "descr" "Check processing of $' ' quoting (C style strings)"
+}
+d_cstrings_body() {
+       set -xv
+       unset ENV
+       if ! ${TEST_SH} -c ": \$'abc'" ||
+            test $( ${TEST_SH} -c "printf %s \$'abc'" ) != abc
+       then
+               atf_skip "\$'...' (C style quoted strings) not supported"
+       fi
+
+       # simple stuff
+       atf_check -s exit:0 -e empty -o inline:'abc\tdef\n' ${TEST_SH} -c \
+               "printf '%s\\n' \$'abc\tdef'"
+       atf_check -s exit:0 -e empty -o inline:'abc\tdef\n' ${TEST_SH} -c \
+               "printf '%s\\n' \$'abc\011def'"
+       atf_check -s exit:0 -e empty -o inline:'abc\tdef\n' ${TEST_SH} -c \
+               "printf '%s\\n' \$'abc\x09'def"
+       atf_check -s exit:0 -e empty -o inline:'abc$def\n' ${TEST_SH} -c \
+               "def=xyz; printf '%s\\n' \$'abc\$def'"
+
+       # control chars (\c) and unicode \u
+       atf_check -s exit:0 -e empty -o empty ${TEST_SH} -c \
+               "test \$'\\1-\\2-\\3' = \$'\\ca-\\cb-\\cc'"
+       atf_check -s exit:0 -e empty -o empty ${TEST_SH} -c \
+               "test \$'\\r-\\n-\\f' = \$'\\cm-\\cj-\\cl'"
+       atf_check -s exit:0 -e empty -o empty ${TEST_SH} -c \
+               "test \$'\\u0123' = \$'\\304\\243'"
+       atf_check -s exit:0 -e empty -o empty ${TEST_SH} -c \
+               "test \$'\\u0123' = \$'\\xC4\\xA3'"
+       atf_check -s exit:0 -e empty -o empty ${TEST_SH} -c \
+               "test \$'\\c\\\\' = \$'\\x1C'"
+       atf_check -s exit:0 -e empty -o empty ${TEST_SH} -c \
+               "test \$'\\c[\\c]\\c^\\c_\\c?' = \$'\\x1B\\x1D\\x1E\\x1F\\x7F'"
+
+       # all the \X sequences for a single char X (ie: not hex/octal/unicode)
+       atf_check -s exit:0 -e empty -o inline:'\n\r\t\n' \
+               ${TEST_SH} -c "printf '%s\\n' \$'\\a\\b\\e\\f\\n\\r\\t\\v'"
+#      atf_check -s exit:0 -e empty -o inline:'\7\10\33\14\12\15\11\13' \
+       atf_check -s exit:0 -e empty -o inline:'\n\r\t\n' \
+          ${TEST_SH} -c "printf '%s\\n' \$'\\cG\\cH\\x1b\\cl\\cJ\\cm\\cI\\ck'"
+       atf_check -s exit:0 -e empty -o inline:"'"'"\\\n' \
+               ${TEST_SH} -c "printf '%s\\n' \$'\\'\\\"\\\\'"
+
+       # various invalid $'...' sequences
+       atf_check -s not-exit:0 -e not-empty -o ignore ${TEST_SH} -c \
+               ": \$'\\q'"
+       atf_check -s not-exit:0 -e not-empty -o ignore ${TEST_SH} -c \
+               ": \$'\\c\\q'"
+       atf_check -s not-exit:0 -e not-empty -o ignore ${TEST_SH} -c \
+               ": \$'\\uDEFF'"
+       atf_check -s not-exit:0 -e not-empty -o ignore ${TEST_SH} -c \
+               ": \$'\\u00'"
+       atf_check -s not-exit:0 -e not-empty -o ignore ${TEST_SH} -c \
+               ": \$'\\u8'"
+       atf_check -s not-exit:0 -e not-empty -o ignore ${TEST_SH} -c \
+               ": \$'abcd"
+       atf_check -s not-exit:0 -e not-empty -o ignore ${TEST_SH} -c \
+               ": \$'abcd\\"
+
+       # anything that generates \0 ends the $'...' immediately (\u cannot)
+       atf_check -s exit:0 -e empty -o inline:'aAa' ${TEST_SH} -c \
+               "printf '%s' \$'a\\0x'\$'A\\x00X'\$'a\\c@x'"
+
+       # \newline in a $'...' is dropped (just like in "" strings)
+       atf_check -s exit:0 -e empty -o inline:'abcdef' ${TEST_SH} -c \
+               "printf '%s' \$'abc\\
+def'"
+}
+
+atf_test_case f_redirects
+f_redirects_head() {
        atf_set "descr" "Check parsing of redirect operators"
 }
-d_redirects_body() {
+f_redirects_body() {
 
        atf_check -s exit:0 -o empty -e empty ${TEST_SH} -c \
                '>/dev/null'
@@ -355,11 +427,11 @@
        return 0
 }
 
-atf_test_case f_variable_syntax
-f_variable_syntax_head() {
+atf_test_case g_variable_syntax
+g_variable_syntax_head() {
        atf_set "descr" "Check that var names of all legal forms work"
 }
-f_variable_syntax_body() {
+g_variable_syntax_body() {
        # don't test _ as a variable, it can be "unusual"
        for vname in a ab _a _9 a123 a_1_2_3 __ ___ ____ __1__ _0 \
            A AA AAA AaBb _A_a A_a_ a1_ abc_123 ab_12_cd_ef_34_99 \
@@ -453,11 +525,11 @@
 
 }
 
-atf_test_case g_var_assign
-g_var_assign_head() {
+atf_test_case h_var_assign
+h_var_assign_head() {
        atf_set "descr" "Check var assignments "
 }
-g_var_assign_body() {
+h_var_assign_body() {
        atf_check -s exit:0 -e empty -o empty ${TEST_SH} -c \
                'a=b'
        atf_check -s not-exit:0 -e not-empty -o empty ${TEST_SH} -c \
@@ -1117,9 +1189,10 @@
        atf_add_test_case a_basic_tokenisation
        atf_add_test_case b_comments
        atf_add_test_case c_line_wrapping
-       atf_add_test_case d_redirects
-       atf_add_test_case f_variable_syntax
-       atf_add_test_case g_var_assign
+       atf_add_test_case d_cstrings
+       atf_add_test_case f_redirects
+       atf_add_test_case g_variable_syntax
+       atf_add_test_case h_var_assign
        atf_add_test_case i_pipelines
        atf_add_test_case j_and_or_lists
        atf_add_test_case k_lists



Home | Main Index | Thread Index | Old Index