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