3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# CDDL HEADER START
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# The contents of this file are subject to the terms of the
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Common Development and Distribution License (the "License").
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# You may not use this file except in compliance with the License.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# or http://www.opensolaris.org/os/licensing.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# See the License for the specific language governing permissions
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# and limitations under the License.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# When distributing Covered Code, include this CDDL HEADER in each
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# If applicable, add the following below this CDDL HEADER, with the
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# fields enclosed by brackets "[]" replaced with your own identifying
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# information: Portions Copyright [yyyy] [name of copyright owner]
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# CDDL HEADER END
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# This test checks whether the AST "join" utility works with
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# multibyte characters as seperator.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# This was reported as CR #6904878 ("join -t no longer works with multibyte char separator"):
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# ------------ snip ------------
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# join doesn't handle multibyte separator correctly.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# $ echo $LANG
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# ja
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# $ od -tx1 input1
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# 0000000 66 31 a1 f7 66 32 0a
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# 0000007
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# $ od -tx1 input2
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# 0000000 74 32 a1 f7 66 31 0a
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# 0000007
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# # 0xa1 0xf7 in the file is multibyte character.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# $ od -tx1 delim
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# 0000000 a1 f7 0a
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# 0000003
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# $ /usr/bin/join -j1 1 -j2 2 -o 1.1 -t `cat delim` input1 input2
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# $
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# It should output "f1".
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# files are attached.
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# ------------ snip ------------
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# test setup
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfunction err_exit
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner print -u2 -n "\t"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner print -u2 -r ${Command}[$1]: "${@:2}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (( Errors < 127 && Errors++ ))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkneralias err_exit='err_exit $LINENO'
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerset -o nounset
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. FaulknerCommand=${0##*/}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerinteger Errors=0
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknertypeset ocwd
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknertypeset tmpdir
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknertypeset out
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# create temporary test directory
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerocwd="$PWD"
3e14f97f673e8a630f076077de35afdd43dc1587Roger 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"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknercd "${tmpdir}" || { err_exit "cd ${tmpdir} failed." ; exit $((Errors)) ; }
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# run tests
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfunction test1
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset join_cmd="$1"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset testid
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset out
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset testname
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner compound saved_locale
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # save locale information
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -v LC_ALL ]] && saved_locale.LC_ALL="${LC_ALL}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -v LC_CTYPE ]] && saved_locale.LC_CTYPE="${LC_CTYPE}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -v LANG ]] && saved_locale.LANG="${LANG}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner compound -r -a testcases=(
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset name="ascii_simple"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset locale="C"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset input1_format="fish 81 91\n"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset input2_format="fish B A\n"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset -a join_args_format=( "input1" "input2" )
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset output_format="fish 81 91 B A"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner )
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset name="ja_JP.eucJP_multibyte_delimiter"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset locale="ja_JP.eucJP"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset input1_format="\x66\x31\xa1\xf7\x66\x32\x0a"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset input2_format="\x74\x32\xa1\xf7\x66\x31\x0a"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset -a join_args_format=( "-j1" "1" "-j2" "2" "-o" "1.1" "-t" "\xa1\xf7" "input1" "input2" )
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset output_format="f1"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner )
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner )
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner for testid in "${!testcases[@]}" ; do
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner nameref tc=testcases[${testid}]
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner testname="${join_cmd}/${tc.name}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if [[ "${tc.locale}" == "<unicode>" ]] ; then
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner if [[ "$LC_ALL" != *.UTF-8 ]] ; then
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner export LC_ALL='en_US.UTF-8'
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner fi
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner else
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner export LC_ALL="${tc.locale}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner fi
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # build "join_args" array with multibyte characters in the current locale
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset -a join_args
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner integer arg_index
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner for arg_index in "${!tc.join_args_format[@]}" ; do
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner join_args+=( "$( printf -- "${tc.join_args_format[arg_index]}" )" )
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner done
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset output_format="$( printf -- "${tc.output_format}" )"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner #printf "args=|%q|\n" "${join_args[@]}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner printf "${tc.input1_format}" >"input1"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner printf "${tc.input2_format}" >"input2"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner out="$(${SHELL} -c "${join_cmd} \"\$@\"" dummy "${join_args[@]}" 2>&1)" || err_exit "${testname}: Command returned exit code $?"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${out}" == ${output_format} ]] || err_exit "${testname}: Expected match for $(printf "%q\n" "${output_format}"), got $(printf "%q\n" "${out}")"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner rm "input1" "input2"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # cleanup and restore locale settings
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner unset join_args arg_index
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -v saved_locale.LC_ALL ]] && LC_ALL="${saved_locale.LC_ALL}" || unset LC_ALL
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -v saved_locale.LC_CTYPE ]] && LC_CTYPE="${saved_locale.LC_CTYPE}" || unset LC_CTYPE
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ -v saved_locale.LANG ]] && LANG="${saved_locale.LANG}" || unset LANG
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner done
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner return 0
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfunction test2
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner{
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset joincmd=$1
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset testname="${joincmd}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner typeset out
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # create files
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner printf "\x66\x31\xa1\xf7\x66\x32\x0a" >"input1"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner printf "\x74\x32\xa1\xf7\x66\x31\x0a" >"input2"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner printf "\xa1\xf7\x0a" >"delim"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # run test
3e14f97f673e8a630f076077de35afdd43dc1587Roger 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 $?"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner [[ "${out}" == 'f1' ]] || err_exit "${testname}: Expected 'f1', got $(printf "%q\n" "${out}")"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner # cleanup
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner rm "input1" "input2" "delim"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner return 0
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner}
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner#for cmd in "/usr/bin/join" "join" ; do
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerfor cmd in "join" ; do
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner test1 "${cmd}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner test2 "${cmd}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerdone
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknercd "${ocwd}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerrmdir "${tmpdir}" || err_exit "Cannot remove temporary directory ${tmpdir}".
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# tests done
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerexit $((Errors))