build and tests: curl_10char_object_name() shell function

lib/objnames.inc provides definition of curl_10char_object_name() shell
function. The intended purpose of this function is to transliterate a
(*.c) source file name that may be longer than 10 characters, or not,
into a string with at most 10 characters which may be used as an OS/400
object name.

Test case 1221 does unit testng of this function and also verifies
that it is possible to generate distinct short object names for all
curl and libcurl *.c source file names.

lib/objnames-test.sh is the shell script used for test case 1221.

tests/runtests.pl modified to accept shell script test cases.

More details inside lib/objnames.inc and lib/objnames-test.sh
This commit is contained in:
Yang Tse 2013-01-02 20:12:15 +01:00
parent 404a95b588
commit dfe4769157
6 changed files with 352 additions and 2 deletions

View File

@ -38,7 +38,8 @@ EXTRA_DIST = Makefile.b32 Makefile.m32 Makefile.vc6 $(DSP) \
config-win32ce.h config-os400.h setup-os400.h config-symbian.h \
Makefile.Watcom config-tpf.h $(DOCS) $(VCPROJ) mk-ca-bundle.pl \
mk-ca-bundle.vbs firefox-db2pem.sh $(CMAKE_DIST) config-vxworks.h \
Makefile.vxworks config-vms.h checksrc.pl
Makefile.vxworks config-vms.h checksrc.pl objnames-test.sh \
objnames.inc
CLEANFILES = $(DSP) $(VCPROJ)

211
lib/objnames-test.sh Executable file
View File

@ -0,0 +1,211 @@
#!/bin/sh
# ***************************************************************************
# * _ _ ____ _
# * Project ___| | | | _ \| |
# * / __| | | | |_) | |
# * | (__| |_| | _ <| |___
# * \___|\___/|_| \_\_____|
# *
# * Copyright (C) 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
# *
# * This software is licensed as described in the file COPYING, which
# * you should have received as part of this distribution. The terms
# * are also available at http://curl.haxx.se/docs/copyright.html.
# *
# * You may opt to use, copy, modify, merge, publish, distribute and/or sell
# * copies of the Software, and permit persons to whom the Software is
# * furnished to do so, under the terms of the COPYING file.
# *
# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# * KIND, either express or implied.
# *
# ***************************************************************************
#
# This Bourne shell script file is used by test case 1221 to do
# unit testing of curl_10char_object_name() shell function which
# is defined in file objnames.inc and sourced by this file and
# any other shell script that may use it.
#
#
# argument validation
#
if ! test $# -eq 1; then
echo "Usage: ${0} srcdir"
exit 1
fi
if ! test -f "${1}/runtests.pl"; then
echo "${0}: Wrong srcdir"
exit 1
fi
srcdir=${1}
if ! test -f "$srcdir/../lib/objnames.inc"; then
echo "$0: Missing objnames.inc"
exit 1
fi
#
# Some variables
#
logdir=log
tstnum=1221
list_c=$logdir/${tstnum}_list_c
list_obj=$logdir/${tstnum}_list_obj
list_obj_c=$logdir/${tstnum}_list_obj_c
list_obj_uniq=$logdir/${tstnum}_list_obj_uniq
#
# Source curl_10char_object_name() function definition
#
. $srcdir/../lib/objnames.inc
#
# Some curl_10char_object_name() unit tests
#
echo 'Testing curl_10char_object_name...'
echo ""
argstr=123__678__ABC__FGH__KLM__PQRSTUV
expect=16AFKPQRST
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123__678__ABC__FGH__KLM__PQ.S.UV
expect=16AFKPQ
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123__678__ABC..FGH..KLM..PQRSTUV
expect=16ABC
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123__678_.ABC._FGH__KLM__PQRSTUV
expect=16
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123.567.90ABCDEFGHIJKLMNOPQRSTUV
expect=123
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=1234567.90A.CDEFGHIJKLMNOPQRSTUV
expect=1234567
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=1234567890.BCD.FGHIJKLMNOPQRSTUV
expect=1234567890
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=12=45-78+0AB.DE.GHIJKLMNOPQRSTUV
expect=1470AB
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=1234567890ABCDEFGHIJKLMNOPQRSTUV
expect=1234567890
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123_567_90A_CDE_GHIJKLMNOPQRSTUV
expect=159CGHIJKL
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123_567_90A_CDEFGHIJKLMNOPQRSTUV
expect=159CDEFGHI
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123_567_90ABCDEFGHIJKLMNOPQRSTUV
expect=1590ABCDEF
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=123_567890ABCDEFGHIJKLMNOPQRSTUV
expect=1567890ABC
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
argstr=1234567890ABCDEFGHIJKLMNOPQRSTUV
expect=1234567890
outstr=`curl_10char_object_name $argstr`
echo "result: $outstr expected: $expect input: $argstr"
#
# Verify that generated object name is distinct for
# all *.c source files in lib and src subdirectories.
#
ls $srcdir/../lib/*.c > $list_c
ls $srcdir/../src/*.c >> $list_c
rm -f $list_obj
for c_fname in `cat $list_c`; do
obj_name=`curl_10char_object_name $c_fname`
echo "$obj_name" >> $list_obj
done
sort -u $list_obj > $list_obj_uniq
cnt_c=`cat $list_c | wc -l`
cnt_u=`cat $list_obj_uniq | wc -l`
echo ""
echo ""
echo ""
if test $cnt_c -eq $cnt_u; then
echo "10-characters-or-less generated object names are unique."
obj_name_clash="no"
else
echo "10-characters-or-less generated object names are clashing..."
obj_name_clash="yes"
fi
if test $obj_name_clash = "yes"; then
#
# Show clashing object names and respective source file names
#
echo ""
paste $list_obj $list_c | sort > $list_obj_c
prev_match="no"
prev_line="unknown"
prev_obj_name="unknown"
while read this_line; do
obj_name=`echo "$this_line" | cut -f1`
if test "x$obj_name" = "x$prev_obj_name"; then
if test "x$prev_match" != "xyes"; then
echo "$prev_line"
echo "$this_line"
prev_match="yes"
else
echo "$this_line"
fi
else
prev_match="no"
fi
prev_line=$this_line
prev_obj_name=$obj_name
done < $list_obj_c
fi
rm -f $list_c
rm -f $list_obj
rm -f $list_obj_c
rm -f $list_obj_uniq
# end of objnames-test.sh

85
lib/objnames.inc Normal file
View File

@ -0,0 +1,85 @@
# ***************************************************************************
# * _ _ ____ _
# * Project ___| | | | _ \| |
# * / __| | | | |_) | |
# * | (__| |_| | _ <| |___
# * \___|\___/|_| \_\_____|
# *
# * Copyright (C) 2012, Daniel Stenberg, <daniel@haxx.se>, et al.
# *
# * This software is licensed as described in the file COPYING, which
# * you should have received as part of this distribution. The terms
# * are also available at http://curl.haxx.se/docs/copyright.html.
# *
# * You may opt to use, copy, modify, merge, publish, distribute and/or sell
# * copies of the Software, and permit persons to whom the Software is
# * furnished to do so, under the terms of the COPYING file.
# *
# * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# * KIND, either express or implied.
# *
# ***************************************************************************
#
# This file is sourced from curl/packages/OS400/initscript.sh and
# other Bourne shell scripts. Keep it as portable as possible.
#
#
# curl_10char_object_name
#
# This shell function accepts a single string argument with unspecified
# length representing a (*.c) source file name and returns a string which
# is a transformation of given argument.
#
# The intended purpose of this function is to transliterate a (*.c) source
# file name that may be longer than 10 characters, or not, into a string
# with at most 10 characters which may be used as an OS/400 object name.
#
# This function might not be universally usefull, nor we care about it.
#
# It is intended to be used with libcurl's (*.c) source file names, so
# dependency on libcurl's source file naming scheme is acceptable and
# good enough for its intended use. Specifically it makes use of the fact
# that libcurl's (*.c) source file names which may be longer than 10 chars
# are conformed with underscore '_' separated substrings, or separated by
# other character which does not belong to the [0-9], [a-z] or [A-Z] sets.
#
# This allows repeatable and automatic short object name generation with
# no need for a hardcoded mapping table.
#
# Transformation is done in the following way:
#
# 1) Leading directory components are removed.
# 2) Leftmost dot character and any other char following it are removed.
# 3) Lowercase characters are transliterated to uppercase.
# 4) Characters not in [A-Z] or [0-9] are transliterated to underscore '_'.
# 5) Every sequence of one or more underscores is replaced with a single one.
# 6) Five leftmost substrings which end in an underscore character are
# replaced by the first character of each substring, while retaining
# the rest of the string.
# 7) Finally the result is truncated to 10 characters.
#
# Resulting object name may be shorter than 10 characters.
#
# Test case 1221 does unit testng of this function and also verifies
# that it is possible to generate distinct short object names for all
# curl and libcurl *.c source file names.
#
curl_10char_object_name() {
echo "${1}" | \
sed -e 's:.*/::' \
-e 's:[.].*::' \
-e 'y:abcdefghijklmnopqrstuvwxyz:ABCDEFGHIJKLMNOPQRSTUVWXYZ:' \
-e 's:[^ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_]:_:g' \
-e 's:__*:_:g' \
-e 's:\([^_]\)[^_]*_\(.*\):\1\2:' \
-e 's:\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3:' \
-e 's:\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4:' \
-e 's:\([^_]\)\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4\5:' \
-e 's:\([^_]\)\([^_]\)\([^_]\)\([^_]\)\([^_]\)[^_]*_\(.*\):\1\2\3\4\5\6:' \
-e 's:^\(..........\).*:\1:'
}
# end of objectname.inc

View File

@ -78,7 +78,7 @@ test1118 test1119 test1120 test1121 test1122 test1123 test1124 test1125 \
test1126 test1127 test1128 test1129 test1130 test1131 test1132 \
test1200 test1201 test1202 test1203 test1204 test1205 test1206 test1207 \
test1208 test1209 test1210 test1211 \
test1220 \
test1220 test1221 \
test1300 test1301 test1302 test1303 test1304 test1305 \
test1306 test1307 test1308 test1309 test1310 test1311 test1312 test1313 \
test1314 test1315 test1316 test1317 test1318 test1319 test1320 test1321 \

46
tests/data/test1221 Normal file
View File

@ -0,0 +1,46 @@
<testcase>
#
# Client-side
<client>
<server>
none
</server>
<name>
10 chars object name generation testing
</name>
<command option="no-output,no-include" type="shell">
%SRCDIR/../lib/objnames-test.sh %SRCDIR
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<file1 name="log/stderr1221">
</file1>
<file2 name="log/stdout1221">
Testing curl_10char_object_name...
result: 16AFKPQRST expected: 16AFKPQRST input: 123__678__ABC__FGH__KLM__PQRSTUV
result: 16AFKPQ expected: 16AFKPQ input: 123__678__ABC__FGH__KLM__PQ.S.UV
result: 16ABC expected: 16ABC input: 123__678__ABC..FGH..KLM..PQRSTUV
result: 16 expected: 16 input: 123__678_.ABC._FGH__KLM__PQRSTUV
result: 123 expected: 123 input: 123.567.90ABCDEFGHIJKLMNOPQRSTUV
result: 1234567 expected: 1234567 input: 1234567.90A.CDEFGHIJKLMNOPQRSTUV
result: 1234567890 expected: 1234567890 input: 1234567890.BCD.FGHIJKLMNOPQRSTUV
result: 1470AB expected: 1470AB input: 12=45-78+0AB.DE.GHIJKLMNOPQRSTUV
result: 1234567890 expected: 1234567890 input: 1234567890ABCDEFGHIJKLMNOPQRSTUV
result: 159CGHIJKL expected: 159CGHIJKL input: 123_567_90A_CDE_GHIJKLMNOPQRSTUV
result: 159CDEFGHI expected: 159CDEFGHI input: 123_567_90A_CDEFGHIJKLMNOPQRSTUV
result: 1590ABCDEF expected: 1590ABCDEF input: 123_567_90ABCDEFGHIJKLMNOPQRSTUV
result: 1567890ABC expected: 1567890ABC input: 123_567890ABCDEFGHIJKLMNOPQRSTUV
result: 1234567890 expected: 1234567890 input: 1234567890ABCDEFGHIJKLMNOPQRSTUV
10-characters-or-less generated object names are unique.
</file2>
</verify>
</testcase>

View File

@ -3026,6 +3026,13 @@ sub singletest {
$tool=$CMDLINE;
$disablevalgrind=1;
}
elsif($cmdtype eq "shell") {
# run the command line prepended with "/bin/sh"
$cmdargs ="$cmd";
$CMDLINE = "/bin/sh ";
$tool=$CMDLINE;
$disablevalgrind=1;
}
elsif(!$tool) {
# run curl, add --verbose for debug information output
$cmd = "-1 ".$cmd if(exists $feature{"SSL"} && ($has_axtls));