blob: 408078a769bac54c1fd490a1d15c251aa0f5aab7 [file] [log] [blame]
#!/bin/sh
#
# $Id$
#
##############################################################################
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed
# with this work for additional information regarding copyright
# ownership. The ASF licenses this file to you under the Apache
# License, Version 2.0 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
#
# Copyright 1999-2007 Rogue Wave Software, Inc.
#
##############################################################################
#
# NAME
# run_locale_utils.sh
#
# SYNOPSIS
# run_locale_utils.sh
#
# DESCRIPTION
# Exercise the locale utilities:
# 1. Locale utilities sanity: location, output, etc;
# 2. Functionality:
# - (re)generation of databases;
#
# OPTIONS:
# - "-d" debug
# - "-n" no cleanup
# - "-s" tests location, output
# - "-f" tests functionality; is followed by:
# - "-i <nlsdir>"
# - "-l <locale name>"
#
##############################################################################
OSNAME=`uname`
if [ "$OSNAME" = "OSF1" -a "$BIN_SH" != "xpg4" ]; then
# make getopts work on Tru64 by setting the BIN_SH variable
# and re-executing self with the same command line arguments
BIN_SH=xpg4
export BIN_SH
exec $0 $*
elif [ "$OSNAME" = "AIX" -a -z "$BASH_VERSION" ]; then
# use an alternate shell to work around a bug (?) in the AIX system
# shell that prevents it from trapping SIGHUP (and invoking the signal
# handler)
if [ -x /bin/bash ]; then
exec /bin/bash $0 $*
fi
fi
locale="./locale"
localedef="./localedef"
output ()
{
if test -z "$outfile"; then
echo "$*" 2>/dev/null
else
echo "$*" >> $outfile
fi;
}
debug_output ()
{
if test ! -z "$dbgout"; then
echo "$*" >> $dbgout 2>/dev/null
fi;
}
##############################################################################
# Function definitions - checking sanity
##############################################################################
check_locale_help ()
{
debug_output "Checking \"locale --help\" output..."
loc_h_out=`${locale} --help 2>/dev/null`
loc_h_xout="NAME SYNOPSIS DESCRIPTION"
loc_h_regexp="locale - get locale-specific information"
for it in $loc_h_xout; do
assertions=`expr $assertions + 1`
if test -z "`echo $loc_h_out | grep $it`"; then
debug_output " incorrect."
debug_output "ERROR: \"locale --help\" gives wrong output ($it)."
debug_output ""
failedassertions=`expr $failedassertions + 1`
fi;
done
debug_output "...ok"
}
check_locale_all()
{
debug_output "Checking \"locale -a\" output..."
loc_a_out=`${locale} -a 2>/dev/null`
loc_a_regexp="[a-z]\{2\}_[A-Z]\{2\}"
for it in $loc_a_out; do
assertions=`expr $assertions + 1`
test "$it" = "C" && continue;
if test -z "`echo $it | grep -e \"$loc_a_regexp\"`"; then
debug_output "incorrect."
debug_output "Warning: Locale name \"$it\" not matching pattern."
failedassertions=`expr $failedassertions + 1`
fi;
done
debug_output "...ok"
}
check_locale_m()
{
debug_output "Checking \"locale -m\" output..."
any_failed=0
loc_m_out=`${locale} -m 2>/dev/null`
any_failed=$?
for it in $loc_m_out; do
assertions=`expr $assertions + 1`
if test -z "`echo $it | grep .cm`" ; then
any_failed=1
debug_output " incorrect."
debug_output "ERROR: \"locale -m\" failed."
debug_output
failedassertions=`expr $failedassertions + 1`
fi;
done;
if [ $any_failed -eq 0 ]; then
debug_output "...ok"
fi
}
check_locale_k()
{
debug_output "Checking \"locale -k LC_ALL\" output..."
loc_k_out=`${locale} -k LC_ALL 2>/dev/null`
loc_k_xout="upper lower space print \
cntrl alpha digit punct \
graph xdigit toupper tolower \
abday day abmon mon \
am_pm d_t_fmt d_fmt t_fmt t_fmt_ampm \
int_curr_symbol currency_symbol mon_decimal_point \
mon_thousands_sep mon_grouping positive_sign negative_sign \
int_frac_digits frac_digits p_cs_precedes p_sep_by_space \
n_cs_precedes n_sep_by_space p_sign_posn n_sign_posn \
decimal_point thousands_sep grouping"
any_failed=0
for it in $loc_k_xout; do
assertions=`expr $assertions + 1`;
if test -z "`echo $loc_k_out | grep $it`"; then
# output text only for the first failure
[ $any_failed -eq 0 ] && debug_output " incorrect."
debug_output "ERROR: \"locale -k\" gives wrong output ($it)."
debug_output
failedassertions=`expr $failedassertions + 1`
any_failed=1
fi;
done
if [ $any_failed -eq 0 ]; then
debug_output "...ok"
fi
}
check_localedef_help()
{
debug_output "Checking \"localedef --help\" output..."
locdef_h_out=`${localedef} --help 2>/dev/null`
locdef_h_xout="NAME SYNOPSIS DESCRIPTION"
locdef_h_regexp="localedef - generate a locale environment"
for it in $locdef_h_xout; do
assertions=`expr $assertions + 1`;
if test -z "`echo $locdef_h_out | grep $it`"; then
debug_output " incorrect."
debug_output "ERROR: \"localedef --help\" gives wrong output ($it)."
debug_output
failedassertions=`expr $failedassertions + 1`
fi;
done
debug_output "...ok"
}
##############################################################################
# Function definitions - checking functionality
##############################################################################
#
# Generates one specified locale
#
generate_locale()
{
err="Cannot generate locale database - "
# 1 - character map file used in generating the locale database
# 2 - source/locale definition file
# 3 - locale database name
if [ "$1" = "" ]; then
output "$err character maps file not specified."
exit 1;
fi
if [ "$2" = "" ]; then
output "$err source input file not specified."
exit 1;
fi
if [ "$3" = "" ]; then
output "$err output locale name not specified."
exit 1;
fi
assertions=`expr $assertions + 1`
# Generating the database
debug_output "${localedef} -w -c -f $1 -i $2 $3 >${dbgout:-/dev/null} 2>&1"
${localedef} -w -c -f $1 -i $2 $3 >${dbgout:-/dev/null} 2>&1
retcode=$?
if [ $retcode -ne 0 ]; then
# exit with the same status as the tool
exit $retcode
fi
}
#
#
#
dump_charmap()
{
err="Cannot create characater set description file - "
# $1: LC_ALL value
# $2: output file name
assertions=`expr $assertions + 1`
# dumping charmap
output "LC_ALL=$1 ${locale} --charmap -l >$2 2>${dbgout:-/dev/null}"
LC_ALL=$1 ${locale} --charmap -l > $2 2>${dbgout:-/dev/null}
retcode=$?
if [ $retcode -ne 0 ]; then
# exit with the same status as the tool
exit $retcode
fi
}
#
# Dumps one locale database
#
dump_locale ()
{
err="Cannot dump locale database - "
# $1: LC_ALL value
# $2: current locale dump file
if [ "$2" = "" ]; then
output "$err - no output file specified."
exit 1
fi
assertions=`expr $assertions + 1`
# dumping locale database
output "LC_ALL=$1 ${locale} -ck -h -l LC_ALL >$2 2>${dbgout:-/dev/null}"
LC_ALL=$1 ${locale} -ck -h -l LC_ALL > $2 2>${dbgout:-/dev/null}
retcode=$?
if [ $retcode -ne 0 ]; then
# exit with the same status as the tool
exit $retcode
fi
}
#
# Test one locale
#
test_locale()
{
err="Cannot test locale - "
# $1 - nls subdirectory of the source directory tree
# $2 - the test (sandbox) directory
# $3 - name of the locale database
if [ "$1" = "" ]; then
output "$err - nls directory not specified."
exit 1
fi
if [ "$2" = "" ]; then
output "$err - temporary directory not specified."
exit 1
fi
if [ "$3" = "" ]; then
output "$err - locale database name not specified."
exit 1
fi
nlsdir=$1
tmpdir=$2
fname=$3
# get the name of the locale and the character map
source=`echo $fname | sed "s:\([^.]*\)\.\([^@]*\)\(.*\):\1\3:;y:@:.:"`;
charmap=`echo $fname | sed "s:\([^.]*\)\.\([^@]*\)\(.*\):\2:"`;
src_path=$nlsdir/src/$source
cm_path=$nlsdir/charmaps/$charmap
stage_1=$tmpdir/stage.1
stage_2=$tmpdir/stage.2
stage_3=$tmpdir/stage.3
# point locale at the original source directory
debug_output "RWSTD_SRC_ROOT="$nlsdir
RWSTD_SRC_ROOT=$nlsdir
debug_output "export RWSTD_SRC_ROOT"
export RWSTD_SRC_ROOT
# create a directory for stage 1 charmap source files
debug_output "mkdir -p $stage_1/charmaps"
mkdir -p $stage_1/charmaps
assertions=`expr $assertions + 1`
## generate stage 1 locale database from the orignal sources
generate_locale $cm_path $src_path $stage_1/$fname
if [ $? -ne 0 ]; then
failedassertions=`expr $failedassertions + 1`
return;
fi
# set necessary environment variables
# debug_output "LC_ALL=$fname"
# LC_ALL=$fname
# debug_output "export LC_ALL"
# export LC_ALL
# debug_output "LANG=$fname"
# LANG=$fname
# debug_output "export LANG"
# export LANG
assertions=`expr $assertions + 1`
# dump the charmap and the locale data from the database
# to a pair of charmap and locale source files
dump_charmap $stage_1/$fname $stage_1/charmaps/$charmap
dump_locale $stage_1/$fname $stage_1/$source.src
if [ -z "$no_clean" ]; then
# remove stage 1 locale to free up disk space but keep
# the text dumps for later processing
debug_output "rm $stage_1/$fname"
rm $stage_1/$fname
fi
# create a directory for stage 2 charmap source files
debug_output "mkdir -p $stage_2/charmaps"
mkdir -p $stage_2/charmaps
assertions=`expr $assertions + 1`
# generate stage 2 locale database from the charmap and locale
# source files produced by locale from the stage 1 database
generate_locale $stage_1/charmaps/$charmap \
$stage_1/$source.src \
$stage_2/$fname
if [ $? -ne 0 ]; then
failedassertions=`expr $failedassertions + 1`
return;
fi
# point locale at the stage 1 directory
debug_output "RWSTD_SRC_ROOT=$stage_1"
RWSTD_SRC_ROOT=$stage_1
debug_output "export RWSTD_SRC_ROOT"
export RWSTD_SRC_ROOT
assertions=`expr $assertions + 1`
# dump the charmap and the locale data from the database
# to a pair of charmap and locale source files
dump_charmap $stage_2/$fname $stage_2/charmaps/$charmap
dump_locale $stage_2/$fname $stage_2/$source.src
if [ -z "$no_clean" ]; then
# remove stage 2 locale to free up disk space but keep
# the text dumps for later processing
debug_output "rm $stage_2/$fname"
rm $stage_2/$fname
fi
assertions=`expr $assertions + 1`
# create a directory for stage 2 charmap source files
debug_output "mkdir -p $stage_3/charmaps"
mkdir -p $stage_3/charmaps
# generate stage 3 locale database from the charmap and locale
# source files produced by locale from the stage 2 database
generate_locale $stage_2/charmaps/$charmap \
$stage_2/$source.src \
$stage_3/$fname
if [ $? -ne 0 ]; then
failedassertions=`expr $failedassertions + 1`
return;
fi
# point locale at the stage 2 directory
debug_output "RWSTD_SRC_ROOT=$stage_2"
RWSTD_SRC_ROOT=$stage_2
debug_output "export RWSTD_SRC_ROOT"
export RWSTD_SRC_ROOT
assertions=`expr $assertions + 1`
# dump the charmap and the locale data from the database
# to a pair of charmap and locale source files
dump_charmap $stage_3/$fname $stage_3/charmaps/$charmap
dump_locale $stage_3/$fname $stage_3/$source.src
if [ -z "$no_clean" ]; then
# remove stage 3 locale to free up disk space but keep
# the text dumps for later processing
debug_output "rm $stage_3/$fname"
rm $stage_3/$fname
fi
assertions=`expr $assertions + 1`
# verify that stage 1 and stage 2 charmaps are the same
debug_output "diff $stage_1/charmaps/$charmap " \
"$stage_2/charmaps/$charmap >/dev/null"
diff $stage_1/charmaps/$charmap $stage_2/charmaps/$charmap >/dev/null
if [ $? -ne 0 ]; then
debug_output "## AssertionFailed: $stage_1/charmaps/$charmap " \
"and $stage_2/charmaps/$charmap differ."
failedassertions=`expr $failedassertions + 1`
fi
# verify that stage 2 and stage 3 charmaps are the same
debug_output "diff $stage_2/charmaps/$charmap " \
"$stage_3/charmaps/$charmap >/dev/null"
diff $stage_2/charmaps/$charmap $stage_3/charmaps/$charmap >/dev/null
if [ $? -ne 0 ]; then
debug_output "## AssertionFailed: $stage_2/charmaps/$charmap " \
"and $stage_3/charmaps/$charmap differ."
failedassertions=`expr $failedassertions + 1`
fi
# verify that stage 2 and stage 3 locale sources are the same
debug_output "diff $stage_2/$source.src " \
"$stage_3/$source.src >/dev/null"
diff $stage_2/$source.src $stage_3/$source.src >/dev/null
if [ $? -ne 0 ]; then
debug_output "## AssertionFailed: $stage_2/$source.src " \
"and $stage_3/$source.src differ."
failedassertions=`expr $failedassertions + 1`
fi
if [ -z "$no_clean" ]; then
# clean up
debug_output "rm -rf $stage_1 $stage_2 $stage_3"
rm -rf $stage_1 $stage_2 $stage_3
fi
}
#
# cleanup/signal handler
#
cleanup ()
{
if [ -z "$no_clean" ]; then
# clean up
debug_output "rm -rf $tmpdir"
rm -rf $tmpdir
fi
exit
}
##############################################################################
# Main code
##############################################################################
## assertions
assertions=0
failedassertions=0
## main functions
debug=no
chk_sanity=no
chk_func=no
## directories
bindir=""
nlsdir=""
locdir=""
## Get the options from the command line
while getopts ":nsfdb:i:l:O:L:M:C:D:" opt_name; do
case $opt_name in
d) dbgout="/dev/tty";;
s) chk_sanity=yes;;
f) chk_func=yes;;
b) bindir=$OPTARG;;
i) nlsdir=$OPTARG;;
l) locale_db=$OPTARG;;
n) no_clean=yes;;
O) outfile=$OPTARG;;
L);; ## ignored
M);; ## ignored
C);; ## ignored
D);; ## ignored
*) echo "Unimplemented option : -$opt_name" >&2;
exit 1;;
esac;
done
## set temporary (working) directory
if [ -z "$TMP" ]; then
TMP="/tmp";
export TMP;
fi
tmpdir=$TMP/${locale_db:-unnamed-locale}.$$
## Actual test
if [ "$chk_sanity" = "yes" ]; then
## checking locale sanity
check_locale_help
check_locale_all
check_locale_m
check_locale_k
check_localedef_help
elif [ "$chk_func" = "yes" ]; then
## create the temp dir
mkdir $tmpdir
if [ $? -ne 0 ]; then
echo "$0: Unable to create $tmpdir, aborting" >&2
exit 1
fi
# clean up temporary files on signal or exit
trap cleanup HUP INT QUIT TERM EXIT
# test only one locale
test_locale $nlsdir $tmpdir $locale_db;
else
## Invocation is wrong
echo "$0: Usage : " >&2
echo "script -s -b <bindir> ## checking sanity" >&2
echo "script -f -i <nlsdir> -l <locale name> ## check functionality" >&2
exit 2
fi
pcnt=`expr 100 \* \( $assertions - $failedassertions \) / $assertions`
output "# +-----------------------+--------+--------+--------+"
output "# | DIAGNOSTIC | ACTIVE | TOTAL |INACTIVE|"
output "# +-----------------------+--------+--------+--------+"
if test -z "$outfile"; then
printf "# | (S7) ASSERTION | %6d | %6d | %5d%% |\n" \
$failedassertions $assertions $pcnt
else
printf "# | (S7) ASSERTION | %6d | %6d | %5d%% |\n" \
$failedassertions $assertions $pcnt >> $outfile
fi
output "# +-----------------------+--------+--------+--------+"
output
output "## Assertions = "$assertions
output "## FailedAssertions = "$failedassertions
output