1*12068SRoger.Faulkner@Oracle.COM# 2*12068SRoger.Faulkner@Oracle.COM# CDDL HEADER START 3*12068SRoger.Faulkner@Oracle.COM# 4*12068SRoger.Faulkner@Oracle.COM# The contents of this file are subject to the terms of the 5*12068SRoger.Faulkner@Oracle.COM# Common Development and Distribution License (the "License"). 6*12068SRoger.Faulkner@Oracle.COM# You may not use this file except in compliance with the License. 7*12068SRoger.Faulkner@Oracle.COM# 8*12068SRoger.Faulkner@Oracle.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*12068SRoger.Faulkner@Oracle.COM# or http://www.opensolaris.org/os/licensing. 10*12068SRoger.Faulkner@Oracle.COM# See the License for the specific language governing permissions 11*12068SRoger.Faulkner@Oracle.COM# and limitations under the License. 12*12068SRoger.Faulkner@Oracle.COM# 13*12068SRoger.Faulkner@Oracle.COM# When distributing Covered Code, include this CDDL HEADER in each 14*12068SRoger.Faulkner@Oracle.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*12068SRoger.Faulkner@Oracle.COM# If applicable, add the following below this CDDL HEADER, with the 16*12068SRoger.Faulkner@Oracle.COM# fields enclosed by brackets "[]" replaced with your own identifying 17*12068SRoger.Faulkner@Oracle.COM# information: Portions Copyright [yyyy] [name of copyright owner] 18*12068SRoger.Faulkner@Oracle.COM# 19*12068SRoger.Faulkner@Oracle.COM# CDDL HEADER END 20*12068SRoger.Faulkner@Oracle.COM# 21*12068SRoger.Faulkner@Oracle.COM 22*12068SRoger.Faulkner@Oracle.COM# 23*12068SRoger.Faulkner@Oracle.COM# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24*12068SRoger.Faulkner@Oracle.COM# 25*12068SRoger.Faulkner@Oracle.COM 26*12068SRoger.Faulkner@Oracle.COM# 27*12068SRoger.Faulkner@Oracle.COM# This test module contains misc l10n tests 28*12068SRoger.Faulkner@Oracle.COM# 29*12068SRoger.Faulkner@Oracle.COM# 30*12068SRoger.Faulkner@Oracle.COM 31*12068SRoger.Faulkner@Oracle.COM# test setup 32*12068SRoger.Faulkner@Oracle.COMfunction err_exit 33*12068SRoger.Faulkner@Oracle.COM{ 34*12068SRoger.Faulkner@Oracle.COM print -u2 -n "\t" 35*12068SRoger.Faulkner@Oracle.COM print -u2 -r ${Command}[$1]: "${@:2}" 36*12068SRoger.Faulkner@Oracle.COM (( Errors < 127 && Errors++ )) 37*12068SRoger.Faulkner@Oracle.COM} 38*12068SRoger.Faulkner@Oracle.COMalias err_exit='err_exit $LINENO' 39*12068SRoger.Faulkner@Oracle.COM 40*12068SRoger.Faulkner@Oracle.COMset -o nounset 41*12068SRoger.Faulkner@Oracle.COMCommand=${0##*/} 42*12068SRoger.Faulkner@Oracle.COMinteger Errors=0 43*12068SRoger.Faulkner@Oracle.COM 44*12068SRoger.Faulkner@Oracle.COMtypeset ocwd 45*12068SRoger.Faulkner@Oracle.COMtypeset tmpdir 46*12068SRoger.Faulkner@Oracle.COM 47*12068SRoger.Faulkner@Oracle.COM# create temporary test directory 48*12068SRoger.Faulkner@Oracle.COMocwd="$PWD" 49*12068SRoger.Faulkner@Oracle.COMtmpdir="$(mktemp -t -d "test_sun_solaris_locale_misc.XXXXXXXX")" || err_exit "Cannot create temporary directory" 50*12068SRoger.Faulkner@Oracle.COM 51*12068SRoger.Faulkner@Oracle.COMcd "${tmpdir}" || { err_exit "cd ${tmpdir} failed." ; exit $((Errors)) ; } 52*12068SRoger.Faulkner@Oracle.COM 53*12068SRoger.Faulkner@Oracle.COM# 54*12068SRoger.Faulkner@Oracle.COM# utility functions 55*12068SRoger.Faulkner@Oracle.COM# 56*12068SRoger.Faulkner@Oracle.COM 57*12068SRoger.Faulkner@Oracle.COMfunction string_has_multibyte_characters 58*12068SRoger.Faulkner@Oracle.COM{ 59*12068SRoger.Faulkner@Oracle.COM typeset str="$1" 60*12068SRoger.Faulkner@Oracle.COM integer bytecount 61*12068SRoger.Faulkner@Oracle.COM integer mbcharactercount 62*12068SRoger.Faulkner@Oracle.COM 63*12068SRoger.Faulkner@Oracle.COM (( mbcharactercount=$(LC_ALL="en_US.UTF-8" wc -C <<<"${str}") )) 64*12068SRoger.Faulkner@Oracle.COM (( bytecount=$(wc -c <<<"${str}") )) 65*12068SRoger.Faulkner@Oracle.COM 66*12068SRoger.Faulkner@Oracle.COM (( bytecount != mbcharactercount )) && return 0 67*12068SRoger.Faulkner@Oracle.COM return 1 68*12068SRoger.Faulkner@Oracle.COM} 69*12068SRoger.Faulkner@Oracle.COM 70*12068SRoger.Faulkner@Oracle.COM# 71*12068SRoger.Faulkner@Oracle.COM# test functions 72*12068SRoger.Faulkner@Oracle.COM# 73*12068SRoger.Faulkner@Oracle.COM 74*12068SRoger.Faulkner@Oracle.COM# test whether LC_ALL correctly overrides LC_MESSAGES in the choice of the system message 75*12068SRoger.Faulkner@Oracle.COM# catalog 76*12068SRoger.Faulkner@Oracle.COM# 1. This test assumes that the machine has ko_KR.UTF-8 + matching message catalogs installed 77*12068SRoger.Faulkner@Oracle.COM# 2. We run this test in a |fork()|'ed subshell to isolate it from the other tests 78*12068SRoger.Faulkner@Oracle.COMfunction test_lc_all_override1 79*12068SRoger.Faulkner@Oracle.COM{ 80*12068SRoger.Faulkner@Oracle.COM typeset out 81*12068SRoger.Faulkner@Oracle.COM 82*12068SRoger.Faulkner@Oracle.COM ( 83*12068SRoger.Faulkner@Oracle.COM ulimit -c 0 # force ksh93 to |fork()| for this subshell 84*12068SRoger.Faulkner@Oracle.COM 85*12068SRoger.Faulkner@Oracle.COM unset ${!LC_*} LANG 86*12068SRoger.Faulkner@Oracle.COM #export LANG=en_US.UTF-8 87*12068SRoger.Faulkner@Oracle.COM export LC_ALL="en_US.UTF-8" 88*12068SRoger.Faulkner@Oracle.COM 89*12068SRoger.Faulkner@Oracle.COM integer ch_val 90*12068SRoger.Faulkner@Oracle.COM integer korean_count=0 91*12068SRoger.Faulkner@Oracle.COM ${SHELL} -c 'LC_MESSAGES=C ${SHELL} -c "cd no_dir_llkk ; export LC_ALL="ko_KR.UTF-8" ; cd "no_dir_ooo" ; true"' >"out" 2>&1 || err_exit "Test shell failed with non-zero exit code $?" 92*12068SRoger.Faulkner@Oracle.COM 93*12068SRoger.Faulkner@Oracle.COM while read -N1 c ; do 94*12068SRoger.Faulkner@Oracle.COM (( ch_val='${c} )) 95*12068SRoger.Faulkner@Oracle.COM 96*12068SRoger.Faulkner@Oracle.COM (( ch_val >= 0xac00 && ch_val <= 0xdfff )) && (( korean_count++ )) 97*12068SRoger.Faulkner@Oracle.COM done <"out" 98*12068SRoger.Faulkner@Oracle.COM 99*12068SRoger.Faulkner@Oracle.COM # Solaris 11/B110 returns 13 characters for this test 100*12068SRoger.Faulkner@Oracle.COM (( korean_count >= 10 )) || err_exit "Expected at least 10 korean characters, got ${korean_count}" 101*12068SRoger.Faulkner@Oracle.COM 102*12068SRoger.Faulkner@Oracle.COM rm "out" 103*12068SRoger.Faulkner@Oracle.COM 104*12068SRoger.Faulkner@Oracle.COM exit $((Errors)) 105*12068SRoger.Faulkner@Oracle.COM ) 106*12068SRoger.Faulkner@Oracle.COM (( Errors += $? )) 107*12068SRoger.Faulkner@Oracle.COM return 0 108*12068SRoger.Faulkner@Oracle.COM} 109*12068SRoger.Faulkner@Oracle.COM 110*12068SRoger.Faulkner@Oracle.COM# test whether the shell internally selects the correct message catalogs 111*12068SRoger.Faulkner@Oracle.COM# when the value of LC_* or LANG is restored to a "previous" value (e.g. 112*12068SRoger.Faulkner@Oracle.COM# subshell, function) or gets "reset" (e.g. unset) 113*12068SRoger.Faulkner@Oracle.COMfunction test_lc_l10n_scope1 114*12068SRoger.Faulkner@Oracle.COM{ 115*12068SRoger.Faulkner@Oracle.COM compound -r -a testgroups=( 116*12068SRoger.Faulkner@Oracle.COM ( 117*12068SRoger.Faulkner@Oracle.COM name="subshell" 118*12068SRoger.Faulkner@Oracle.COM typeset -a tests=( 119*12068SRoger.Faulkner@Oracle.COM 'LC_ALL="C" ; cd "nosuchdir2" ; (LC_ALL="ja_JP.UTF-8" ; cd "nosuchdir2") ; cd "nosuchdir2" ; true' 120*12068SRoger.Faulkner@Oracle.COM 'LC_MESSAGES="C" ; cd "nosuchdir2" ; (LC_MESSAGES="ja_JP.UTF-8" ; cd "nosuchdir2") ; cd "nosuchdir2" ; true' 121*12068SRoger.Faulkner@Oracle.COM 'LANG="C" ; cd "nosuchdir2" ; (LANG="ja_JP.UTF-8" ; cd "nosuchdir2") ; cd "nosuchdir2" ; true' 122*12068SRoger.Faulkner@Oracle.COM ) 123*12068SRoger.Faulkner@Oracle.COM ) 124*12068SRoger.Faulkner@Oracle.COM ( 125*12068SRoger.Faulkner@Oracle.COM name="unset" 126*12068SRoger.Faulkner@Oracle.COM typeset -a tests=( 127*12068SRoger.Faulkner@Oracle.COM 'LC_ALL="C" ; cd "nosuchdir2" ; LC_ALL="ja_JP.UTF-8" ; cd "nosuchdir2" ; unset LC_ALL ; cd "nosuchdir2" ; true' 128*12068SRoger.Faulkner@Oracle.COM 'LC_MESSAGES="C" ; cd "nosuchdir2" ; LC_MESSAGES="ja_JP.UTF-8" ; cd "nosuchdir2" ; unset LC_MESSAGES ; cd "nosuchdir2" ; true' 129*12068SRoger.Faulkner@Oracle.COM 'LANG="C" ; cd "nosuchdir2" ; LANG="ja_JP.UTF-8" ; cd "nosuchdir2" ; unset LANG ; cd "nosuchdir2" ; true' 130*12068SRoger.Faulkner@Oracle.COM ) 131*12068SRoger.Faulkner@Oracle.COM ) 132*12068SRoger.Faulkner@Oracle.COM ( 133*12068SRoger.Faulkner@Oracle.COM name="empty LC_xxx" 134*12068SRoger.Faulkner@Oracle.COM typeset -a tests=( 135*12068SRoger.Faulkner@Oracle.COM 'LC_ALL="C" ; cd "nosuchdir2" ; LC_ALL="ja_JP.UTF-8" ; cd "nosuchdir2" ; LC_ALL="" ; cd "nosuchdir2" ; true' 136*12068SRoger.Faulkner@Oracle.COM 'LC_MESSAGES="C" ; cd "nosuchdir2" ; LC_MESSAGES="ja_JP.UTF-8" ; cd "nosuchdir2" ; LC_MESSAGES="" ; cd "nosuchdir2" ; true' 137*12068SRoger.Faulkner@Oracle.COM 'LANG="C" ; cd "nosuchdir2" ; LANG="ja_JP.UTF-8" ; cd "nosuchdir2" ; LANG="" ; cd "nosuchdir2" ; true' 138*12068SRoger.Faulkner@Oracle.COM ) 139*12068SRoger.Faulkner@Oracle.COM ) 140*12068SRoger.Faulkner@Oracle.COM ( 141*12068SRoger.Faulkner@Oracle.COM name="function" 142*12068SRoger.Faulkner@Oracle.COM typeset -a tests=( 143*12068SRoger.Faulkner@Oracle.COM 'LC_ALL="C" ; cd "nosuchdir2" ; function x { typeset LC_ALL="ja_JP.UTF-8" ; cd "nosuchdir2" ; } ; x ; cd "nosuchdir2" ; true' 144*12068SRoger.Faulkner@Oracle.COM 'LC_MESSAGES="C" ; cd "nosuchdir2" ; function x { typeset LC_MESSAGES="ja_JP.UTF-8" ; cd "nosuchdir2" ; } ; x ; cd "nosuchdir2" ; true' 145*12068SRoger.Faulkner@Oracle.COM 'LANG="C" ; cd "nosuchdir2" ; function x { typeset LANG="ja_JP.UTF-8" ; cd "nosuchdir2" ; } ; x ; cd "nosuchdir2" ; true' 146*12068SRoger.Faulkner@Oracle.COM ) 147*12068SRoger.Faulkner@Oracle.COM ) 148*12068SRoger.Faulkner@Oracle.COM ) 149*12068SRoger.Faulkner@Oracle.COM 150*12068SRoger.Faulkner@Oracle.COM 151*12068SRoger.Faulkner@Oracle.COM typeset tgi ti out2 152*12068SRoger.Faulkner@Oracle.COM 153*12068SRoger.Faulkner@Oracle.COM for tgi in "${!testgroups[@]}" ; do 154*12068SRoger.Faulkner@Oracle.COM nameref tg=testgroups[${tgi}] 155*12068SRoger.Faulkner@Oracle.COM 156*12068SRoger.Faulkner@Oracle.COM for ti in "${!tg.tests[@]}" ; do 157*12068SRoger.Faulkner@Oracle.COM nameref ts=tg.tests[${ti}] 158*12068SRoger.Faulkner@Oracle.COM 159*12068SRoger.Faulkner@Oracle.COM ${SHELL} -c "unset LANG \${!LC_*} ; ${SHELL} -c \"${ts}\"" >out 2>&1 || err_exit "test returned non-zero exit code $?" 160*12068SRoger.Faulkner@Oracle.COM out2="${ 161*12068SRoger.Faulkner@Oracle.COM while read -r line ; do 162*12068SRoger.Faulkner@Oracle.COM string_has_multibyte_characters "${line}" && print -n "A" || print -n "_" 163*12068SRoger.Faulkner@Oracle.COM done <"out" 164*12068SRoger.Faulkner@Oracle.COM print "" 165*12068SRoger.Faulkner@Oracle.COM }" 166*12068SRoger.Faulkner@Oracle.COM if [[ "${out2}" != '_A_' ]] ; then 167*12068SRoger.Faulkner@Oracle.COM err_exit "test '${tg.name}'/'$ts' failed: Expected '_A_', got '${out2}'" 168*12068SRoger.Faulkner@Oracle.COM #cat out 169*12068SRoger.Faulkner@Oracle.COM fi 170*12068SRoger.Faulkner@Oracle.COM done 171*12068SRoger.Faulkner@Oracle.COM done 172*12068SRoger.Faulkner@Oracle.COM 173*12068SRoger.Faulkner@Oracle.COM rm "out" 174*12068SRoger.Faulkner@Oracle.COM 175*12068SRoger.Faulkner@Oracle.COM return 0 176*12068SRoger.Faulkner@Oracle.COM} 177*12068SRoger.Faulkner@Oracle.COM 178*12068SRoger.Faulkner@Oracle.COM 179*12068SRoger.Faulkner@Oracle.COM# run tests 180*12068SRoger.Faulkner@Oracle.COMtest_lc_all_override1 181*12068SRoger.Faulkner@Oracle.COMtest_lc_l10n_scope1 182*12068SRoger.Faulkner@Oracle.COM 183*12068SRoger.Faulkner@Oracle.COM 184*12068SRoger.Faulkner@Oracle.COMcd "${ocwd}" 185*12068SRoger.Faulkner@Oracle.COMrmdir "${tmpdir}" || err_exit "Cannot remove temporary directory ${tmpdir}". 186*12068SRoger.Faulkner@Oracle.COM 187*12068SRoger.Faulkner@Oracle.COM# tests done 188*12068SRoger.Faulkner@Oracle.COMexit $((Errors)) 189