Module Name: src
Committed By: kre
Date: Fri Oct 18 06:32:08 UTC 2024
Modified Files:
src/tests/bin/sh: t_fsplit.sh
Log Message:
Test field splitting as used by the read built-in.
This includes a couple of sub-tests which test for the bug from
PR bin/58749
Other aspects of read should be tested elsewhere (someday).
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/tests/bin/sh/t_fsplit.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_fsplit.sh
diff -u src/tests/bin/sh/t_fsplit.sh:1.7 src/tests/bin/sh/t_fsplit.sh:1.8
--- src/tests/bin/sh/t_fsplit.sh:1.7 Sat Jun 24 11:06:17 2017
+++ src/tests/bin/sh/t_fsplit.sh Fri Oct 18 06:32:08 2024
@@ -1,4 +1,4 @@
-# $NetBSD: t_fsplit.sh,v 1.7 2017/06/24 11:06:17 kre Exp $
+# $NetBSD: t_fsplit.sh,v 1.8 2024/10/18 06:32:08 kre Exp $
#
# Copyright (c) 2007-2016 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -51,7 +51,7 @@ check()
(*) atf_fail "Internal test error, $# args to check test ${TEST}";;
esac
- result=$( ${TEST_SH} -c "unset x; $1" )
+ result=$( ${TEST_SH} -c "unset x a b d c e f g h; $1" )
STATUS="$?"
# Remove newlines
@@ -439,6 +439,98 @@ split_arith_body() {
check 'IFS="159 "; echo 11$(( 11234567899 ))95' '11 234 678 95'
}
+atf_test_case read_split
+read_split_head() {
+ atf_set "descr" "Checks that field splitting works for the read" \
+ "built-in utility"
+}
+#
+# CAUTION: There are literal <tab> chars in the following test.
+# It is important that they be retained as is (the ones in the data
+# and results - those used for test formatting are immaterial).
+#
+read_split_body() {
+ DATA=" aaa bbb:ccc ddd+eee fff:ggg+hhh " # CAUTION: tabs!
+
+ TEST=0
+
+ check "unset IFS; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb:ccc><ddd+eee><fff:ggg+hhh><><><><>'
+
+ check "unset IFS; printf '%s\n' '${DATA}' | {
+ read x || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$x"; }' \
+ '<aaa bbb:ccc ddd+eee fff:ggg+hhh>'
+
+ check "IFS=; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ "<${DATA}><><><><><><><>"
+
+ check "IFS=' '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb:ccc><ddd+eee><fff:ggg+hhh><><><><>'
+
+ check "IFS=':'; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb><ccc ddd+eee fff><ggg+hhh ><><><><><>'
+
+ check "IFS=': '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb><ccc><ddd+eee fff><ggg+hhh ><><><>'
+
+ check "IFS=': '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb><ccc ddd+eee><fff><ggg+hhh>< ><><><>'
+
+ check "IFS='+'; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb:ccc ddd><eee fff:ggg><hhh ><><><><><>'
+
+ check "IFS=' +'; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<aaa><bbb:ccc><ddd><eee fff:ggg><hhh ><><><>'
+
+ check "IFS='+ '; printf '%s\n' '${DATA}' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '< aaa bbb:ccc ddd><eee><fff:ggg><hhh>< ><><><>'
+
+ # This tests the bug from PR bin/57849 (which existed about 2 days)
+ # It also tests that a var-assign before read does not corrupt the
+ # value of the var in the executing shell environment
+ check "IFS='+'; printf '%s\n' '${DATA}' | {
+ IFS=: read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$IFS" "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ '<+>< aaa bbb><ccc ddd+eee fff><ggg+hhh ><><><><><>'
+
+ check "IFS='+'; printf '%s\n' '${DATA}' | {
+ IFS= read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$IFS" "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ "<+><${DATA}><><><><><><><>"
+
+ # This doesn't really belong here, just tests that EOF works...
+ # (and that read sets unused vars to '', doesn't leave them unset)
+ check "unset IFS; set -u;
+ read a b c d e f g h </dev/null || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"' \
+ "FAIL:1<><><><><><><><>"
+
+ # And a similar one where EOF follows some data (which is read)
+ check "unset IFS; set -u; printf 'a b c' | {
+ read a b c d e f g h || printf 'FAIL:%d' \"\$?\" &&
+ printf '<%s>' "'"$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h"; }' \
+ "FAIL:1<a><b><c><><><><><>"
+}
+
atf_init_test_cases() {
atf_add_test_case for
atf_add_test_case default_val
@@ -449,4 +541,5 @@ atf_init_test_cases() {
atf_add_test_case ifs
atf_add_test_case var_length
atf_add_test_case split_arith
+ atf_add_test_case read_split
}