blob: 43e787adbef34af90e8255428ec898c9401540fa [file] [log] [blame]
<?xml version="1.0" ?><!-- -*- SGML -*- -->
<package>
<comment>
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.
</comment>
<job id="run_locale_utils" prompt="no">
<?job error="false" debug="false" ?>
<runtime>
<description>
Checks locale utilities:
1. Locale utilities sanity: location, output, etc;
2. Functionality:
- (re)generation of databases;
</description>
<named helpstring="Debug output" name="d"/>
<named helpstring="Perform sanity check" name="s"/>
<named helpstring="Perform functionality check" name="f"/>
<named helpstring="Path to the locale source files"
name="i" type="string"/>
<named helpstring="Locale name" name="l" type="string"/>
<named helpstring="Output file" name="O" type="string"/>
<example>cscript run_locale_utils.wsf /s /b:..\..\..\bin\11s"
</example>
<usage>
Usage: cscript run_locale_utils.wsf [/d] [/n] [/s] [/f [/i:@NlsDir /l:@LocaleName]] [/b:@BinDir] [/O:@Out],
where
- "/d" debug;
- "/n" no cleanup;
- "/s" tests location, output;
- "/f" tests functionality; is followed by:
- "/i:@NlsDir>"
- "/l:@LocaleName>";
- "/b:@BinDir";
- "/O:@OutFile"
</usage>
</runtime>
<object id="fso" progid="Scripting.FileSystemObject"/>
<object id="WshShell" progid="WScript.Shell"/>
<script id="run_locale_utils" language="JScript">
<![CDATA[
//
// run_locale_utils script for Stdcxx library
//
var dbgout = false;
var chk_sanity = false;
var chk_func = false;
var nlsdir = "";
var locale_db = "";
var bindir = "";
var outstrm = WScript.StdOut;
var no_clean = false;
var locale = "locale.exe";
var localedef = "localedef.exe";
var TemporaryFolder = 2;
var tmpdir = fso.GetSpecialFolder(TemporaryFolder) + "\\" + fso.GetTempName();
// assertions
var assertions = 0;
var failedassertions = 0;
var run_stdout;
var run_stderr;
var WEnv = WshShell.Environment("PROCESS");
// printf the message line to the stderr
function DebugOutLine(msg)
{
if (dbgout)
WScript.StdErr.WriteLine(msg);
}
// printf the message to the stderr
function DebugOut(msg)
{
if (dbgout)
WScript.StdErr.Write(msg);
}
// execute command and set run_stdout to the cmd stdout content;
// set run_stderr to the cmd stderr content
function Run(cmd)
{
var exec = WshShell.Exec(cmd);
run_stdout = "";
run_stderr = "";
while (0 == exec.Status) {
WScript.Sleep(100);
run_stdout += exec.StdOut.ReadAll();
run_stderr += exec.StdErr.ReadAll();
}
run_stdout += exec.StdOut.ReadAll();
run_stderr += exec.StdErr.ReadAll();
return exec;
}
function Cleanup()
{
if (!no_clean && fso.FolderExists(tmpdir))
fso.DeleteFolder(tmpdir, true);
}
function Exit(code)
{
Cleanup();
WScript.Quit(code);
}
// convert number num to string with specified width
function FormatNumber(num, width)
{
var s = num.toString();
var spaces = width - s.length;
for (var i = 0; i < spaces; ++i)
s = " " + s;
return s;
}
// create folder with intermediate folders, if needed
function CreateFolder(path)
{
var res = true;
if (!fso.FolderExists(path))
{
var parent = fso.GetParentFolderName(path);
if (0 == parent.length)
return false;
res = CreateFolder(parent);
if (res)
{
try
{
fso.CreateFolder(path);
}
catch (e)
{
res = false;
}
}
}
return res;
}
var description = new run_locale_utils; // run
//////////////////////////////////////////////////////////////////////////////
// Function definitions - checking sanity
//////////////////////////////////////////////////////////////////////////////
function check_locale_help()
{
DebugOut("Checking \"locale --help\" output...");
var cmd = locale + " --help";
var exec = Run(cmd);
var xout = new Array("NAME", "SYNOPSIS", "DESCRIPTION");
for (var i = 0; i < xout.length; ++i)
{
++assertions;
if (0 > run_stdout.search(xout[i]))
{
DebugOutLine(" incorrect.");
DebugOutLine("ERROR: \"locale --help\" gives wrong output ("
+ xout[i] + ").");
++failedassertions;
return;
}
}
DebugOutLine(" correct.");
}
function check_locale_all()
{
DebugOut("Checking \"locale -a\" output...");
var cmd = locale + " -a";
var exec = Run(cmd);
var aout = run_stdout.split("\n");
for (var i = 0; i < aout.length; ++i)
{
++assertions;
var line = aout[i].replace("\r", "").replace("\n", "");
if (0 == line.length || "C" == line)
continue;
if (0 > line.search(new RegExp("[a-z]\{2\}_[A-Z]\{2\}")))
{
DebugOutLine(" incorrect.");
DebugOutLine(" Warning: Locale name " + line
+ " not matching pattern.");
++failedassertions;
return;
}
}
DebugOutLine("check completed.");
}
function check_locale_m()
{
DebugOut("Checking \"locale -m\" output...");
var cmd = locale + " -m";
var exec = Run(cmd);
var aout = run_stdout.split("\n");
for (var i = 0; i < aout.length; ++i)
{
++assertions;
var line = aout[i].replace("\r", "").replace("\n", "");
if (0 > line.search(new RegExp(".cm")))
{
DebugOutLine(" incorrect.");
DebugOutLine("ERROR: \"locale -m\" failed.");
++failedassertions;
return;
}
}
DebugOutLine(" correct.");
}
function check_locale_k()
{
DebugOut("Checking \"locale -k LC_ALL\" output...")
var cmd = locale + " -k LC_ALL";
var exec = Run(cmd);
var xout = new Array("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");
var any_failed = false;
for (var i = 0; i < xout.length; ++i)
{
++assertions;
if (0 > run_stdout.search(xout[i]))
{
// output text only for the first failure
if (!any_failed)
DebugOutLine(" incorrect.");
DebugOutLine("ERROR: \"locale -k\" gives wrong output (" +
+ xout[i] +").");
++failedassertions;
any_failed = true;
}
}
if (!any_failed)
DebugOutLine(" correct.");
}
function check_localedef_help()
{
DebugOut("Checking \"localedef --help\" output...");
var cmd = localedef + " --help";
var exec = Run(cmd);
var xout = new Array("NAME", "SYNOPSIS", "DESCRIPTION");
for (var i = 0; i < xout.length; ++i)
{
++assertions;
if (0 > run_stdout.search(xout[i]))
{
DebugOutLine(" incorrect.");
DebugOutLine("ERROR: \"localedef --help\" gives wrong output ("
+ xout[i] + ").");
++failedassertions;
return;
}
}
DebugOutLine(" correct.");
}
//////////////////////////////////////////////////////////////////////////////
// Function definitions - checking functionality
//////////////////////////////////////////////////////////////////////////////
//
// Generates one specified locale
//
function generate_locale(charmap, src, locname)
{
var err = "Cannot generate locale database - ";
// charmap - character map file used in generating the locale database
// src - source/locale definition file
// locname - locale database name
if (charmap == "")
{
outstrm.WriteLine(err + "character maps file not specified.");
Exit(1);
}
if (src == "")
{
outstrm.WriteLine(err + "source input file not specified.");
Exit(1);
}
if (locname == "")
{
outstrm.WriteLine(err + "output locale name not specified.");
Exit(1);
}
++assertions;
// Generating the database
var cmd = localedef + " -w -c -f " + charmap
+ " -i " + src + " " + locname;
DebugOutLine(cmd);
var exec = Run(cmd);
DebugOut(run_stdout);
var retcode = exec.ExitCode;
if (retcode)
{
// exit with the same status as the tool
Exit(retcode);
}
}
//
//
//
function dump_charmap(locname, outfile)
{
err="Cannot create characater set description file - "
// locname: LC_ALL value
// outfile: output file name
if (outfile == "")
{
outstrm.WriteLine(err + " - no output file specified.");
Exit(1);
}
++assertions;
// dumping charmap
var cmd = locale + " --charmap -l";
DebugOutLine("LC_ALL=" + locname + " " + cmd + " > " + outfile);
WEnv("LC_ALL") = locname;
var exec = Run(cmd);
DebugOut(run_stderr);
var dmpfile = fso.CreateTextFile(outfile, true);
if (dmpfile)
{
dmpfile.Write(run_stdout);
dmpfile.Close();
}
var retcode = exec.ExitCode;
if (retcode)
{
// exit with the same status as the tool
Exit(retcode);
}
}
//
// Dumps one locale database
//
function dump_locale(locname, dumpfile)
{
var err = "Cannot dump locale database - ";
// locname: LC_ALL value
// dumpfile: current locale dump file
if (dumpfile == "")
{
outstrm.WriteLine(err + " - no output file specified.");
Exit(1);
}
++assertions;
// Dumping locale database
var cmd = locale + " -ck -h -l LC_ALL";
DebugOutLine("LC_ALL=" + locname + " " + cmd + " > " + dumpfile);
WEnv("LC_ALL") = locname;
var exec = Run(cmd);
DebugOut(run_stderr);
var dmpfile = fso.CreateTextFile(dumpfile, true);
if (dmpfile)
{
dmpfile.Write(run_stdout);
dmpfile.Close();
}
var retcode = exec.ExitCode;
if (retcode)
{
// exit with the same status as the tool
Exit(retcode);
}
}
//
// Test one locale
//
function test_locale(nlsdir, tmpdir, fname)
{
var err = "Cannot test locale - ";
// nlsdir - nls subdirectory of the source directory tree
// tmpdir - the test (sandbox) directory
// locname - name of the locale database
if (nlsdir == "")
{
outstrm.WriteLine(err+ " - nls directory not specified.");
Exit(1);
}
if (tmpdir == "")
{
outstrm.WriteLine(err + " - temporary directory not specified.");
Exit(1);
}
if (fname == "")
{
outstrm.WriteLine(err+ " - locale database name not specified.");
Exit(1);
}
// get locale's name and encoding
var rx = new RegExp("\([^.]*\)\.\([^@]*\)\(.*\)");
var source = fname.replace(rx, "$1$3").replace("@", ".");
var charmap = fname.replace(rx, "$2");
var src_path = nlsdir + "\\src\\" + source;
var cm_path = nlsdir + "\\charmaps\\" + charmap;
var stage_1 = tmpdir + "\\stage.1";
var stage_2 = tmpdir + "\\stage.2";
var stage_3 = tmpdir + "\\stage.3";
source += ".src";
// point locale at the original source directory
DebugOutLine("RWSTD_SRC_ROOT=" + nlsdir);
WEnv("RWSTD_SRC_ROOT") = nlsdir;
// create a directory for stage 1 charmap source files
var cm_dir1 = stage_1 + "\\charmaps";
DebugOutLine("mkdir " + cm_dir1);
CreateFolder(cm_dir1);
++assertions;
var locname1 = stage_1 + "\\" + fname;
var cm_path1 = cm_dir1 + "\\" + charmap;
var src_path1 = stage_1 + "\\" + source;
// generate stage 1 locale database from the orignal sources
generate_locale(cm_path, src_path, locname1);
++assertions;
// dump the charmap and the locale data from the database
// to a pair of charmap and locale source files
dump_charmap(locname1, cm_path1);
dump_locale(locname1, src_path1);
// create a directory for stage 2 charmap source files
var cm_dir2 = stage_2 + "\\charmaps";
DebugOutLine("mkdir " + cm_dir2);
CreateFolder(cm_dir2);
++assertions;
var locname2 = stage_2 + "\\" + fname;
var cm_path2 = cm_dir2 + "\\" + charmap;
var src_path2 = stage_2 + "\\" + source;
// generate stage 2 locale database from the charmap and locale
// source files produced by locale from the stage 1 database
generate_locale(cm_path1, src_path1, locname2);
// point locale at the stage 1 directory
DebugOutLine("RWSTD_SRC_ROOT=" + stage_1);
WEnv("RWSTD_SRC_ROOT") = stage_1;
++assertions;
// dump the charmap and the locale data from the database
//to a pair of charmap and locale source files
dump_charmap(locname2, cm_path2);
dump_locale(locname2, src_path2);
++assertions;
// create a directory for stage 2 charmap source files
var cm_dir3 = stage_3 + "\\charmaps";
DebugOutLine("mkdir " + cm_dir3);
CreateFolder(cm_dir3);
++assertions;
var locname3 = stage_3 + "\\" + fname;
var cm_path3 = cm_dir3 + "\\" + charmap;
var src_path3 = stage_3 + "\\" + source;
// generate stage 3 locale database from the charmap and locale
// source files produced by locale from the stage 2 database
generate_locale(cm_path2, src_path2, locname3);
// point locale at the stage 2 directory
DebugOutLine("RWSTD_SRC_ROOT=" + stage_2);
WEnv("RWSTD_SRC_ROOT") = stage_2;
++assertions;
// dump the charmap and the locale data from the database
// to a pair of charmap and locale source files
dump_charmap(locname3, cm_path3);
dump_locale(locname3, src_path3);
++assertions;
// verify that stage 1 and stage 2 charmaps are the same
var cmd = "fc " + cm_path1 + " " + cm_path2;
DebugOutLine(cmd);
var retcode = Run(cmd).ExitCode;
if (retcode)
{
DebugOutLine("## AssertionFailed: " + cm_path1 +
" and " + cm_path2 + " differ.");
++failedassertions;
}
// verify that stage 2 and stage 3 charmaps are the same
var cmd = "fc " + cm_path2 + " " + cm_path3;
DebugOutLine(cmd);
var retcode = Run(cmd).ExitCode;
if (retcode)
{
DebugOutLine("## AssertionFailed: " + cm_path2 +
" and " + cm_path3 + " differ.");
++failedassertions;
}
// verify that stage 2 and stage 3 locale sources are the same
var cmd = "fc " + src_path2 + " " + src_path3;
DebugOutLine(cmd);
var retcode = Run(cmd).ExitCode;
if (retcode)
{
DebugOutLine("## AssertionFailed: " + src_path2 +
" and " + src_path3 + " differ.");
++failedassertions;
}
if (!no_clean)
{
// clean up
DebugOutLine("rm -rf " + stage_1 + " " + stage_2 + " " + stage_3);
if (fso.FolderExists(stage_1))
fso.DeleteFolder(stage_1, true);
if (fso.FolderExists(stage_2))
fso.DeleteFolder(stage_2, true);
if (fso.FolderExists(stage_3))
fso.DeleteFolder(stage_3, true);
}
}
//////////////////////////////////////////////////////////////////////////////
// Main code
//////////////////////////////////////////////////////////////////////////////
function run_locale_utils()
{
if (WScript.Arguments.Named.Exists("d"))
dbgout = true;
if (WScript.Arguments.Named.Exists("s"))
chk_sanity = true;
if (WScript.Arguments.Named.Exists("f"))
chk_func = true;
if (WScript.Arguments.Named.Exists("i"))
nlsdir = WScript.Arguments.Named("i");
if (WScript.Arguments.Named.Exists("l"))
locale_db = WScript.Arguments.Named("l");
if (WScript.Arguments.Named.Exists("n"))
no_clean = true;
if (WScript.Arguments.Named.Exists("b"))
{
bindir = WScript.Arguments.Named("b");
locale = bindir + "\\" + locale;
localedef = bindir + "\\" + localedef;
}
if (WScript.Arguments.Named.Exists("O"))
{
var outfile = WScript.Arguments.Named("O");
outstrm = fso.CreateTextFile(outfile, true);
if (!outstrm)
{
WScript.StdErr.WriteLine("Unable to create " + outfile + ", aborting");
WScript.Quit(2);
}
}
if (chk_sanity)
{
// checking locale sanity
check_locale_help();
check_locale_all();
check_locale_m();
check_locale_k();
check_localedef_help();
}
else if (chk_func)
{
// create the temp dir
if (!CreateFolder(tmpdir))
{
WScript.StdErr.WriteLine("Unable to create " + tmpdir + ", aborting");
WScript.Quit(1);
}
// test only one locale
test_locale(nlsdir, tmpdir, locale_db);
Cleanup();
}
else
{
// Invocation is wrong
WScript.Arguments.ShowUsage();
WScript.Quit(2);
}
if (assertions)
{
var pcnt = 100 * (assertions - failedassertions) / assertions;
pcnt = Math.floor(pcnt + 0.5);
outstrm.WriteLine("# +-----------------------+--------+--------+--------+");
outstrm.WriteLine("# | DIAGNOSTIC | ACTIVE | TOTAL |INACTIVE|");
outstrm.WriteLine("# +-----------------------+--------+--------+--------+");
outstrm.WriteLine("# | (S7) ASSERTION | " + FormatNumber(failedassertions, 6)
+ " | " + FormatNumber(assertions, 6) + " | " + FormatNumber(pcnt, 5) + "% |");
outstrm.WriteLine("# +-----------------------+--------+--------+--------+");
outstrm.WriteLine();
}
outstrm.WriteLine("## Assertions = " + assertions);
outstrm.WriteLine("## FailedAssertions = " + failedassertions);
outstrm.WriteLine();
}
]]>
</script>
</job>
</package>