13e14f97fSRoger A. Faulkner#
23e14f97fSRoger A. Faulkner# CDDL HEADER START
33e14f97fSRoger A. Faulkner#
43e14f97fSRoger A. Faulkner# The contents of this file are subject to the terms of the
53e14f97fSRoger A. Faulkner# Common Development and Distribution License (the "License").
63e14f97fSRoger A. Faulkner# You may not use this file except in compliance with the License.
73e14f97fSRoger A. Faulkner#
83e14f97fSRoger A. Faulkner# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93e14f97fSRoger A. Faulkner# or http://www.opensolaris.org/os/licensing.
103e14f97fSRoger A. Faulkner# See the License for the specific language governing permissions
113e14f97fSRoger A. Faulkner# and limitations under the License.
123e14f97fSRoger A. Faulkner#
133e14f97fSRoger A. Faulkner# When distributing Covered Code, include this CDDL HEADER in each
143e14f97fSRoger A. Faulkner# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153e14f97fSRoger A. Faulkner# If applicable, add the following below this CDDL HEADER, with the
163e14f97fSRoger A. Faulkner# fields enclosed by brackets "[]" replaced with your own identifying
173e14f97fSRoger A. Faulkner# information: Portions Copyright [yyyy] [name of copyright owner]
183e14f97fSRoger A. Faulkner#
193e14f97fSRoger A. Faulkner# CDDL HEADER END
203e14f97fSRoger A. Faulkner#
213e14f97fSRoger A. Faulkner
223e14f97fSRoger A. Faulkner#
233e14f97fSRoger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
243e14f97fSRoger A. Faulkner#
253e14f97fSRoger A. Faulkner
263e14f97fSRoger A. Faulkner#
273e14f97fSRoger A. Faulkner# This test checks whether the AST "join" utility works with
283e14f97fSRoger A. Faulkner# multibyte characters as seperator.
293e14f97fSRoger A. Faulkner#
303e14f97fSRoger A. Faulkner# This was reported as CR #6904878 ("join -t no longer works with multibyte char separator"):
313e14f97fSRoger A. Faulkner# ------------ snip ------------
323e14f97fSRoger A. Faulkner# join doesn't handle multibyte separator correctly.
33*b30d1939SAndy Fiddaman#
343e14f97fSRoger A. Faulkner# $ echo $LANG
353e14f97fSRoger A. Faulkner# ja
363e14f97fSRoger A. Faulkner# $ od -tx1 input1
373e14f97fSRoger A. Faulkner# 0000000 66 31 a1 f7 66 32 0a
383e14f97fSRoger A. Faulkner# 0000007
39*b30d1939SAndy Fiddaman# $ od -tx1 input2
403e14f97fSRoger A. Faulkner# 0000000 74 32 a1 f7 66 31 0a
413e14f97fSRoger A. Faulkner# 0000007
423e14f97fSRoger A. Faulkner# # 0xa1 0xf7 in the file is multibyte character.
433e14f97fSRoger A. Faulkner# $ od -tx1 delim
443e14f97fSRoger A. Faulkner# 0000000 a1 f7 0a
453e14f97fSRoger A. Faulkner# 0000003
46*b30d1939SAndy Fiddaman#
473e14f97fSRoger A. Faulkner# $ /usr/bin/join -j1 1 -j2 2 -o 1.1 -t `cat delim` input1 input2
48*b30d1939SAndy Fiddaman# $
49*b30d1939SAndy Fiddaman#
503e14f97fSRoger A. Faulkner# It should output "f1".
51*b30d1939SAndy Fiddaman#
523e14f97fSRoger A. Faulkner# files are attached.
533e14f97fSRoger A. Faulkner# ------------ snip ------------
543e14f97fSRoger A. Faulkner#
553e14f97fSRoger A. Faulkner
563e14f97fSRoger A. Faulkner# test setup
573e14f97fSRoger A. Faulknerfunction err_exit
583e14f97fSRoger A. Faulkner{
593e14f97fSRoger A. Faulkner	print -u2 -n "\t"
603e14f97fSRoger A. Faulkner	print -u2 -r ${Command}[$1]: "${@:2}"
613e14f97fSRoger A. Faulkner	(( Errors < 127 && Errors++ ))
623e14f97fSRoger A. Faulkner}
633e14f97fSRoger A. Faulkneralias err_exit='err_exit $LINENO'
643e14f97fSRoger A. Faulkner
653e14f97fSRoger A. Faulknerset -o nounset
663e14f97fSRoger A. FaulknerCommand=${0##*/}
673e14f97fSRoger A. Faulknerinteger Errors=0
683e14f97fSRoger A. Faulkner
693e14f97fSRoger A. Faulknertypeset ocwd
703e14f97fSRoger A. Faulknertypeset tmpdir
713e14f97fSRoger A. Faulknertypeset out
723e14f97fSRoger A. Faulkner
733e14f97fSRoger A. Faulkner# create temporary test directory
743e14f97fSRoger A. Faulknerocwd="$PWD"
753e14f97fSRoger A. Faulknertmpdir="$(mktemp -t -d "test_sun_solaris_cr_6904878_join_-t_no_longer_works_with_multibyte_char_separator.XXXXXXXX")" || err_exit "Cannot create temporary directory"
763e14f97fSRoger A. Faulkner
773e14f97fSRoger A. Faulknercd "${tmpdir}" || { err_exit "cd ${tmpdir} failed." ; exit $((Errors)) ; }
783e14f97fSRoger A. Faulkner
793e14f97fSRoger A. Faulkner
803e14f97fSRoger A. Faulkner# run tests
813e14f97fSRoger A. Faulkner
823e14f97fSRoger A. Faulkner
833e14f97fSRoger A. Faulknerfunction test1
843e14f97fSRoger A. Faulkner{
853e14f97fSRoger A. Faulkner	typeset join_cmd="$1"
863e14f97fSRoger A. Faulkner	typeset testid
873e14f97fSRoger A. Faulkner	typeset out
883e14f97fSRoger A. Faulkner	typeset testname
893e14f97fSRoger A. Faulkner	compound saved_locale
90*b30d1939SAndy Fiddaman
913e14f97fSRoger A. Faulkner	# save locale information
923e14f97fSRoger A. Faulkner	[[ -v LC_ALL	]] && saved_locale.LC_ALL="${LC_ALL}"
933e14f97fSRoger A. Faulkner	[[ -v LC_CTYPE	]] && saved_locale.LC_CTYPE="${LC_CTYPE}"
943e14f97fSRoger A. Faulkner	[[ -v LANG	]] && saved_locale.LANG="${LANG}"
953e14f97fSRoger A. Faulkner
963e14f97fSRoger A. Faulkner	compound -r -a testcases=(
973e14f97fSRoger A. Faulkner		(
983e14f97fSRoger A. Faulkner			typeset name="ascii_simple"
993e14f97fSRoger A. Faulkner			typeset locale="C"
1003e14f97fSRoger A. Faulkner			typeset input1_format="fish 81 91\n"
1013e14f97fSRoger A. Faulkner			typeset input2_format="fish B A\n"
1023e14f97fSRoger A. Faulkner			typeset -a join_args_format=( "input1" "input2" )
1033e14f97fSRoger A. Faulkner			typeset output_format="fish 81 91 B A"
1043e14f97fSRoger A. Faulkner		)
1053e14f97fSRoger A. Faulkner		(
1063e14f97fSRoger A. Faulkner			typeset name="ja_JP.eucJP_multibyte_delimiter"
1073e14f97fSRoger A. Faulkner			typeset locale="ja_JP.eucJP"
1083e14f97fSRoger A. Faulkner			typeset input1_format="\x66\x31\xa1\xf7\x66\x32\x0a"
1093e14f97fSRoger A. Faulkner			typeset input2_format="\x74\x32\xa1\xf7\x66\x31\x0a"
1103e14f97fSRoger A. Faulkner			typeset -a join_args_format=( "-j1" "1" "-j2" "2" "-o" "1.1" "-t" "\xa1\xf7" "input1" "input2" )
1113e14f97fSRoger A. Faulkner			typeset output_format="f1"
1123e14f97fSRoger A. Faulkner		)
1133e14f97fSRoger A. Faulkner	)
1143e14f97fSRoger A. Faulkner
1153e14f97fSRoger A. Faulkner	for testid in "${!testcases[@]}" ; do
1163e14f97fSRoger A. Faulkner        	nameref tc=testcases[${testid}]
1173e14f97fSRoger A. Faulkner		testname="${join_cmd}/${tc.name}"
1183e14f97fSRoger A. Faulkner
1193e14f97fSRoger A. Faulkner		if [[ "${tc.locale}" == "<unicode>" ]] ; then
1203e14f97fSRoger A. Faulkner			if [[ "$LC_ALL" != *.UTF-8 ]] ; then
1213e14f97fSRoger A. Faulkner				export LC_ALL='en_US.UTF-8'
1223e14f97fSRoger A. Faulkner			fi
1233e14f97fSRoger A. Faulkner		else
1243e14f97fSRoger A. Faulkner			export LC_ALL="${tc.locale}"
1253e14f97fSRoger A. Faulkner		fi
126*b30d1939SAndy Fiddaman
1273e14f97fSRoger A. Faulkner		# build "join_args" array with multibyte characters in the current locale
1283e14f97fSRoger A. Faulkner		typeset -a join_args
1293e14f97fSRoger A. Faulkner		integer arg_index
1303e14f97fSRoger A. Faulkner		for arg_index in "${!tc.join_args_format[@]}" ; do
1313e14f97fSRoger A. Faulkner			join_args+=( "$( printf -- "${tc.join_args_format[arg_index]}" )" )
1323e14f97fSRoger A. Faulkner		done
133*b30d1939SAndy Fiddaman
1343e14f97fSRoger A. Faulkner		typeset output_format="$( printf -- "${tc.output_format}" )"
135*b30d1939SAndy Fiddaman
1363e14f97fSRoger A. Faulkner		#printf "args=|%q|\n" "${join_args[@]}"
137*b30d1939SAndy Fiddaman
1383e14f97fSRoger A. Faulkner		printf "${tc.input1_format}" >"input1"
1393e14f97fSRoger A. Faulkner		printf "${tc.input2_format}" >"input2"
1403e14f97fSRoger A. Faulkner
1413e14f97fSRoger A. Faulkner		out="$(${SHELL} -c "${join_cmd} \"\$@\"" dummy "${join_args[@]}" 2>&1)" || err_exit "${testname}: Command returned exit code $?"
1423e14f97fSRoger A. Faulkner		[[ "${out}" == ${output_format} ]] || err_exit "${testname}: Expected match for $(printf "%q\n" "${output_format}"), got $(printf "%q\n" "${out}")"
1433e14f97fSRoger A. Faulkner
1443e14f97fSRoger A. Faulkner		rm "input1" "input2"
145*b30d1939SAndy Fiddaman
1463e14f97fSRoger A. Faulkner		# cleanup and restore locale settings
1473e14f97fSRoger A. Faulkner		unset join_args arg_index
1483e14f97fSRoger A. Faulkner		[[ -v saved_locale.LC_ALL	]] && LC_ALL="${saved_locale.LC_ALL}" || unset LC_ALL
1493e14f97fSRoger A. Faulkner		[[ -v saved_locale.LC_CTYPE	]] && LC_CTYPE="${saved_locale.LC_CTYPE}" || unset LC_CTYPE
1503e14f97fSRoger A. Faulkner		[[ -v saved_locale.LANG		]] && LANG="${saved_locale.LANG}" || unset LANG
1513e14f97fSRoger A. Faulkner	done
1523e14f97fSRoger A. Faulkner
1533e14f97fSRoger A. Faulkner	return 0
1543e14f97fSRoger A. Faulkner}
1553e14f97fSRoger A. Faulkner
1563e14f97fSRoger A. Faulkner
1573e14f97fSRoger A. Faulknerfunction test2
1583e14f97fSRoger A. Faulkner{
1593e14f97fSRoger A. Faulkner	typeset joincmd=$1
1603e14f97fSRoger A. Faulkner	typeset testname="${joincmd}"
1613e14f97fSRoger A. Faulkner	typeset out
1623e14f97fSRoger A. Faulkner
1633e14f97fSRoger A. Faulkner	# create files
1643e14f97fSRoger A. Faulkner	printf "\x66\x31\xa1\xf7\x66\x32\x0a" >"input1"
1653e14f97fSRoger A. Faulkner	printf "\x74\x32\xa1\xf7\x66\x31\x0a" >"input2"
1663e14f97fSRoger A. Faulkner	printf "\xa1\xf7\x0a" >"delim"
1673e14f97fSRoger A. Faulkner
1683e14f97fSRoger A. Faulkner	# run test
1693e14f97fSRoger A. Faulkner	out=$( LC_ALL=ja_JP.eucJP ${SHELL} -o pipefail -o errexit -c '$1 -j1 1 -j2 2 -o 1.1 -t $(cat delim) input1 input2' dummy "${joincmd}" 2>&1 ) || err_exit "${testname}: Test failed with exit code $?"
1703e14f97fSRoger A. Faulkner	[[ "${out}" == 'f1' ]] || err_exit "${testname}: Expected 'f1', got $(printf "%q\n" "${out}")"
1713e14f97fSRoger A. Faulkner
1723e14f97fSRoger A. Faulkner	# cleanup
1733e14f97fSRoger A. Faulkner	rm "input1" "input2" "delim"
1743e14f97fSRoger A. Faulkner
1753e14f97fSRoger A. Faulkner	return 0
1763e14f97fSRoger A. Faulkner}
1773e14f97fSRoger A. Faulkner
1783e14f97fSRoger A. Faulkner#for cmd in "/usr/bin/join" "join" ; do
1793e14f97fSRoger A. Faulknerfor cmd in "join" ; do
1803e14f97fSRoger A. Faulkner	test1 "${cmd}"
1813e14f97fSRoger A. Faulkner	test2 "${cmd}"
1823e14f97fSRoger A. Faulknerdone
1833e14f97fSRoger A. Faulkner
1843e14f97fSRoger A. Faulkner
1853e14f97fSRoger A. Faulkner
1863e14f97fSRoger A. Faulknercd "${ocwd}"
1873e14f97fSRoger A. Faulknerrmdir "${tmpdir}" || err_exit "Cannot remove temporary directory ${tmpdir}".
1883e14f97fSRoger A. Faulkner
1893e14f97fSRoger A. Faulkner# tests done
1903e14f97fSRoger A. Faulknerexit $((Errors))
191