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