diff options
Diffstat (limited to 'contrib/idn/idnkit-1.0-src/lib/tests')
31 files changed, 10081 insertions, 0 deletions
diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/Makefile.in b/contrib/idn/idnkit-1.0-src/lib/tests/Makefile.in new file mode 100644 index 00000000..ef73d032 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/Makefile.in @@ -0,0 +1,304 @@ +# $Id: Makefile.in,v 1.1.1.1 2003/06/04 00:26:46 marka Exp $ +# Copyright (c) 2000, 2002 Japan Network Information Center. +# All rights reserved. +# +# By using this file, you agree to the terms and conditions set forth bellow. +# +# LICENSE TERMS AND CONDITIONS +# +# The following License Terms and Conditions apply, unless a different +# license is obtained from Japan Network Information Center ("JPNIC"), +# a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, +# Chiyoda-ku, Tokyo 101-0047, Japan. +# +# 1. Use, Modification and Redistribution (including distribution of any +# modified or derived work) in source and/or binary forms is permitted +# under this License Terms and Conditions. +# +# 2. Redistribution of source code must retain the copyright notices as they +# appear in each source code file, this License Terms and Conditions. +# +# 3. Redistribution in binary form must reproduce the Copyright Notice, +# this License Terms and Conditions, in the documentation and/or other +# materials provided with the distribution. For the purposes of binary +# distribution the "Copyright Notice" refers to the following language: +# "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." +# +# 4. The name of JPNIC may not be used to endorse or promote products +# derived from this Software without specific prior written approval of +# JPNIC. +# +# 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +.SUFFIXES: +.SUFFIXES: .tsy .c + +top_builddir = ../.. + +srcdir = @srcdir@ +VPATH = @srcdir@ + +CC = @CC@ +SHELL = @SHELL@ +LIBTOOL = @LIBTOOL@ + +ICONVINC = @ICONVINC@ +ICONVLIB = @ICONVLIB@ +IDNLIB = ../libidntest.la +IDNLITELIB = ../libidntestlite.la + +INCS = -I. -I$(srcdir) -I$(srcdir)/../../include -I../../include $(ICONVINC) +DEFS = + +CFLAGS = $(INCS) $(DEFS) @CPPFLAGS@ @CFLAGS@ +LDFLAGS = @LDFLAGS@ +TSYFLAGS = + +PERL = @PERL@ + +COMMONSRCS = testsuite.c testutil.c setenv.c +COMMONOBJS = testsuite.lo testutil.lo setenv.lo +BUILTSRCS = api.c api-init1.c api-init2.c api-init3.c \ + api-init4-1.c api-init4-2.c api-init4-3.c \ + api-init5-1.c api-init5-2.c api-init5-3.c \ + res.c resconf.c mapselector.c checker.c converter.c mapper.c \ + normalizer.c delimitermap.c ucs4.c nameprep.c \ + testconfig.h + +TESTS = api-test \ + api-init1-test \ + api-init2-test \ + api-init3-test \ + api-init4-1-test \ + api-init4-2-test \ + api-init4-3-test \ + api-init5-1-test \ + api-init5-2-test \ + api-init5-3-test \ + res-test \ + resconf-test \ + mapselector-test \ + converter-test \ + checker-test \ + mapper-test \ + normalizer-test \ + delimitermap-test \ + ucs4-test \ + nameprep-test + +LITETESTS = apilite-test \ + reslite-test \ + resconflite-test \ + converterlite-test + +.tsy.c: + rm -f $@ $@.tmp + $(PERL) $(srcdir)/testygen -o $@ $(TSYFLAGS) $< + $(PERL) $(srcdir)/utffilter $@ > $@.tmp + mv -f $@.tmp $@ + +all: + +install: + +clean: + rm -f *.o *.lo *.tmp core *.core *~ + rm -f $(TESTS) $(LITETESTS) $(BUILTSRCS) + rm -f test.conf testalias.conf test.map + rm -f iconvchk + rm -fr .libs/ + +distclean: clean + rm -f Makefile + +@LITEONLY_TRUE@test check: test-lite +@LITEONLY_FALSE@test check: test-nolite + +test-lite: $(LITETESTS) + @for i in $(LITETESTS); do \ + echo "Run test program: $$i"; \ + ./$$i; \ + echo; \ + done + +test-nolite: $(TESTS) $(LITETESTS) iconvchk + @./iconvchk + @for i in $(TESTS) $(LITETESTS); do \ + echo "Run test program: $$i"; \ + ./$$i; \ + echo; \ + done + +api-test: api.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api.lo: api.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api.c + +apilite-test: apilite.lo $(IDNLITELIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + apilite.lo $(COMMONOBJS) $(IDNLITELIB) +apilite.lo: api.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -DWITHOUT_ICONV -o $@ \ + -c api.c + +api-init1-test: api-init1.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init1.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init1.lo: api-init1.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init1.c + +api-init2-test: api-init2.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init2.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init2.lo: api-init2.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init2.c + +api-init3-test: api-init3.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init3.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init3.lo: api-init3.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init3.c + +api-init4-1-test: api-init4-1.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init4-1.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init4-1.lo: api-init4-1.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init4-1.c + +api-init4-2-test: api-init4-2.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init4-2.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init4-2.lo: api-init4-2.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init4-2.c + +api-init4-3-test: api-init4-3.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init4-3.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init4-3.lo: api-init4-3.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init4-3.c + +api-init5-1-test: api-init5-1.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init5-1.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init5-1.lo: api-init5-1.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init5-1.c + +api-init5-2-test: api-init5-2.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init5-2.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init5-2.lo: api-init5-2.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init5-2.c + +api-init5-3-test: api-init5-3.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + api-init5-3.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +api-init5-3.lo: api-init5-3.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c api-init5-3.c + +res-test: res.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + res.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +res.lo: res.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c res.c + +reslite-test: reslite.lo $(IDNLITELIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + reslite.lo $(COMMONOBJS) $(IDNLITELIB) +reslite.lo: res.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -DWITHOUT_ICONV -o $@ \ + -c res.c + +resconf-test: resconf.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + resconf.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +resconf.lo: resconf.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c resconf.c + +resconflite-test: resconflite.lo $(IDNLITELIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + resconflite.lo $(COMMONOBJS) $(IDNLITELIB) +resconflite.lo: resconf.c testconfig.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -DWITHOUT_ICONV -o $@ \ + -c resconf.c + +mapselector-test: mapselector.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + mapselector.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +mapselector.lo: mapselector.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c mapselector.c + +converter-test: converter.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + converter.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +converter.lo: converter.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c converter.c + +converterlite-test: converterlite.lo $(IDNLITELIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + converterlite.lo $(COMMONOBJS) $(IDNLITELIB) +converterlite.lo: converter.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -DWITHOUT_ICONV -o $@ \ + -c converter.c + +checker-test: checker.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + checker.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +checker.lo: checker.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c checker.c + +mapper-test: mapper.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + mapper.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +mapper.lo: mapper.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c mapper.c + +normalizer-test: normalizer.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + normalizer.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +normalizer.lo: normalizer.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c normalizer.c + +delimitermap-test: delimitermap.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + delimitermap.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +delimitermap.lo: delimitermap.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c delimitermap.c + +ucs4-test: ucs4.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + ucs4.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +ucs4.lo: ucs4.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c ucs4.c + +nameprep-test: nameprep.lo $(IDNLIB) $(COMMONOBJS) + $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ \ + nameprep.lo $(COMMONOBJS) $(IDNLIB) $(ICONVLIB) +nameprep.lo: nameprep.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c nameprep.c + +testsuite.lo: testsuite.c testsuite.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -o $@ -c $(srcdir)/testsuite.c +testutil.lo: testutil.c testutil.h + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -o $@ -c $(srcdir)/testutil.c +setenv.lo: setenv.c + $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -o $@ -c $(srcdir)/setenv.c + +testconfig.h: ../../include/config.h + rm -f testconfig.h + sed -n -e '/HAVE_SETENV/p' -e '/HAVE_UNSETENV/p' \ + ../../include/config.h > testconfig.h + +iconvchk: iconvchk.c codeset.h + $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o $@ \ + $(srcdir)/iconvchk.c $(IDNLIB) $(ICONVLIB) diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init1.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init1.tsy new file mode 100644 index 00000000..202db154 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init1.tsy @@ -0,0 +1,113 @@ +#ifndef lint +static char *rcsid = "$Id: api-init1.tsy,v 1.1.1.1 2003/06/04 00:26:46 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "codeset.h" +#include "setenv.h" +#include "testutil.h" + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: nameinit(0) +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_nameinit(0); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_ENCODE_APP, "<U+3042>", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--l8j"); + + r = idn_decodename(IDN_DECODE_APP, "xn--l8j", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); + + r = idn_decodename2(IDN_DECODE_APP, "xn--l8j", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init2.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init2.tsy new file mode 100644 index 00000000..e1561a44 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init2.tsy @@ -0,0 +1,113 @@ +#ifndef lint +static char *rcsid = "$Id: api-init2.tsy,v 1.1.1.1 2003/06/04 00:26:47 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "codeset.h" +#include "setenv.h" +#include "testutil.h" + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: nameinit(1) +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_nameinit(1); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_ENCODE_APP, "<U+3042>", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); + + r = idn_decodename(IDN_DECODE_APP, "xn--l8j", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--l8j"); + + r = idn_decodename2(IDN_DECODE_APP, "xn--l8j", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--l8j"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init3.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init3.tsy new file mode 100644 index 00000000..9035cabf --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init3.tsy @@ -0,0 +1,117 @@ +#ifndef lint +static char *rcsid = "$Id: api-init3.tsy,v 1.1.1.1 2003/06/04 00:26:47 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "codeset.h" +#include "setenv.h" +#include "testutil.h" + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call nameinit() twice +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_nameinit(1); + ASSERT_RESULT(r, idn_success); + r = idn_nameinit(0); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_ENCODE_APP, "<U+3042>", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); + + r = idn_decodename(IDN_DECODE_APP, "xn--l8j", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--l8j"); + + r = idn_decodename2(IDN_DECODE_APP, "xn--l8j", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--l8j"); + + remove(CONF_FILENAME); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-1.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-1.tsy new file mode 100644 index 00000000..585b5810 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-1.tsy @@ -0,0 +1,96 @@ +#ifndef lint +static char *rcsid = "$Id: api-init4-1.tsy,v 1.1.1.1 2003/06/04 00:26:47 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "setenv.h" +#include "testutil.h" + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call encodename() without initialization +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_ENCODE_APP, "<U+3042>", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--l8j"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-2.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-2.tsy new file mode 100644 index 00000000..fd0150b3 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-2.tsy @@ -0,0 +1,96 @@ +#ifndef lint +static char *rcsid = "$Id: api-init4-2.tsy,v 1.1.1.1 2003/06/04 00:26:47 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "setenv.h" +#include "testutil.h" + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call decodename() without initialization +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_decodename(IDN_DECODE_APP, "xn--l8j", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-3.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-3.tsy new file mode 100644 index 00000000..7da74b97 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init4-3.tsy @@ -0,0 +1,102 @@ +#ifndef lint +static char *rcsid = "$Id: api-init4-3.tsy,v 1.1.1.1 2003/06/04 00:26:47 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "codeset.h" +#include "setenv.h" +#include "testutil.h" + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call decodename2() without initialization +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_decodename2(IDN_DECODE_APP, "xn--l8j", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-1.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-1.tsy new file mode 100644 index 00000000..5669502b --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-1.tsy @@ -0,0 +1,102 @@ +#ifndef lint +static char *rcsid = "$Id: api-init5-1.tsy,v 1.1.1.1 2003/06/04 00:26:48 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "setenv.h" +#include "testutil.h" + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call encodename() and nameinit() +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_ENCODE_APP, "aaa", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_nameinit(1); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_ENCODE_APP, "<U+3042>", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--l8j"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-2.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-2.tsy new file mode 100644 index 00000000..bf088625 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-2.tsy @@ -0,0 +1,102 @@ +#ifndef lint +static char *rcsid = "$Id: api-init5-2.tsy,v 1.1.1.1 2003/06/04 00:26:48 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "setenv.h" +#include "testutil.h" + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call decodename() and nameinit() +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_decodename(IDN_DECODE_APP, "aaa", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_nameinit(1); + ASSERT_RESULT(r, idn_success); + + r = idn_decodename(IDN_DECODE_APP, "xn--l8j", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-3.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-3.tsy new file mode 100644 index 00000000..fae1942f --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api-init5-3.tsy @@ -0,0 +1,109 @@ +#ifndef lint +static char *rcsid = "$Id: api-init5-3.tsy,v 1.1.1.1 2003/06/04 00:26:48 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "codeset.h" +#include "setenv.h" +#include "testutil.h" + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +#define CONF_FILENAME "test.conf" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: init +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + create_conf_file(CONF_FILENAME, 0, + "idn-encoding UTF-8", + NULL); +} + +//# TEARDOWN +// group: init +{ + remove(CONF_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call decodename2() and nameinit() +// group: init +{ + r = idn__setconffile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + + r = idn_decodename2(IDN_DECODE_APP, "aaa", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + + r = idn_nameinit(1); + ASSERT_RESULT(r, idn_success); + + r = idn_decodename2(IDN_DECODE_APP, "xn--l8j", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "<U+3042>"); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/api.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/api.tsy new file mode 100644 index 00000000..3ecfb20c --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/api.tsy @@ -0,0 +1,1009 @@ +#ifndef lint +static char *rcsid = "$Id: api.tsy,v 1.1.1.1 2003/06/04 00:26:50 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <idn/api.h> +#include <idn/log.h> + +#include "codeset.h" +#include "setenv.h" + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +/* + * U+304B: hiragana letter KA + * U+3099: combining katakana-hiragana voiced sound mark + * + * map("U+304B U+3099") -> "U+304C" + * + * U+304C: hiragana letter GA + */ +#define UTF8_NAME "A<U+304B><U+3099>" +#define UTF8_REVNAME "a<U+304C>" + +/* + * A4AC: hiragana letter GA (in EUC-JP) + */ +#define EUCJP_NAME "\xa4\xac" +#define EUCJP_REVNAME "\xa4\xac" + +/* + * Conversion result of "U+304B U+3099 A" + */ +#define PUNYCODE_NAME "xn--a-i8t" + +/* + * Conversion result of "A U+304B U+3099" (in EUC-JP). + */ +#define AUX_EUCJP_NAME "xn--a-i\xa3\xb8t" + + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: generic-conversion +//-- +// Initialize the `api' module. +// Set local encoding to `UTF-8'. +{ + char to[256]; + idn_result_t r; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + idn_nameinit(0); +} + +//# SETUP +// group: quiet +//-- +// Set log level to `fatal' to supress log messages. +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +//-- +// Restore log level. +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: basic conversion by encodename() +// group: generic-conversion +{ + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: basic conversion by decodename() +// group: generic-conversion +{ + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +} + +//# TESTCASE +// title: basic conversion by decodename2() +// group: generic-conversion +{ + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); +#ifdef WITHOUT_ICONV + ASSERT_RESULT(r, idn_failure); +#else + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +#endif +} + +//# TESTCASE +// title: call decodename2() with auxencoding=NULL +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to), + NULL); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +#endif +} + +//# TESTCASE +// title: call encodename() with actions=0 +// group: generic-conversion +{ + r = idn_encodename(0, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: call decodename() with actions=0 +// group: generic-conversion +{ + r = idn_decodename(0, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: call decodename2() with actions=0 +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(0, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: call encodename() with actions=rtcheck +// group: generic-conversion quiet +{ + r = idn_encodename(IDN_RTCHECK, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=decode-query +// group: generic-conversion quiet +{ + r = idn_encodename(IDN_DECODE_QUERY, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=decode-app +// group: generic-conversion quiet +{ + r = idn_encodename(IDN_DECODE_APP, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=decode-stored +// group: generic-conversion quiet +{ + r = idn_encodename(IDN_DECODE_STORED, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=(1<<31) +// group: generic-conversion quiet +{ + r = idn_encodename(1 << 31, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename() with actions=localmap +// group: generic-conversion quiet +{ + r = idn_decodename(IDN_LOCALMAP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=localmap +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_LOCALMAP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=lencheck +// group: generic-conversion quiet +{ + r = idn_decodename(IDN_LENCHECK, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=lencheck +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_LENCHECK, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=encode-query +// group: generic-conversion quiet +{ + r = idn_decodename(IDN_ENCODE_QUERY, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=encode-query +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_ENCODE_QUERY, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=encode-app +// group: generic-conversion quiet +{ + r = idn_decodename(IDN_ENCODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=encode-app +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_ENCODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=encode-stored +// group: generic-conversion quiet +{ + r = idn_decodename(IDN_ENCODE_STORED, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=encode-stored +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_ENCODE_STORED, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=(1<<31) +// group: generic-conversion quiet +{ + r = idn_decodename(1 << 31, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=(1<<31) +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(1 << 31, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call encodename() with actions=localconv +// group: generic-conversion quiet +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_encodename(IDN_LOCALCONV, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=localconv +// group: generic-conversion quiet +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename(IDN_LOCALCONV, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename2() with actions=localconv +// group: generic-conversion +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_LOCALCONV, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_failure); +#endif +} + +//# TESTCASE +// title: call enable(0) and then encodename() +// group: generic-conversion +{ + idn_enable(0); + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: call decodename() when IDN_DISABLE is defined +// group: generic-conversion +{ + idn_enable(0); + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: call decodename() when IDN_DISABLE is defined +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + idn_enable(0); + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: call enable(0) and then encodename() +// group: generic-conversion +{ + idn_enable(0); + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: call enable(0) and then decodename() +// group: generic-conversion +{ + idn_enable(0); + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: call enable(0) and then decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + idn_enable(0); + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: set IDN_DISABLE and call encodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: set IDN_DISABLE and call decodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: set IDN_DISABLE and call decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + setenv("IDN_DISABLE", "1", 1); + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: set IDN_DISABLE, and then call enable(1) and encodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + idn_enable(1); + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: set IDN_DISABLE, and then call enable(1) and decodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + idn_enable(1); + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +} + +//# TESTCASE +// title: set IDN_DISABLE, and then call enable(1) and decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + setenv("IDN_DISABLE", "1", 1); + idn_enable(1); + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +#endif +} + +//# TESTCASE +// title: overrun test for arg `to' of encodename() +// group: generic-conversion +{ + /* Normal case */ + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, + strlen(PUNYCODE_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); + + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, + strlen(PUNYCODE_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* enable(0) case */ + idn_enable(0); + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, + strlen(UTF8_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); + + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, + strlen(UTF8_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* actions=0 case */ + idn_enable(1); + r = idn_encodename(0, UTF8_NAME, to, strlen(UTF8_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); + + r = idn_encodename(0, UTF8_NAME, to, strlen(UTF8_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: overrun test for arg `to' of decodename() +// group: generic-conversion +{ + /* Normal case */ + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(UTF8_REVNAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); + + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(UTF8_REVNAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* idn_enable(0) case */ + idn_enable(0); + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(PUNYCODE_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); + + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(PUNYCODE_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* actions=0 case */ + idn_enable(1); + r = idn_decodename(0, PUNYCODE_NAME, to, strlen(PUNYCODE_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); + + r = idn_decodename(0, PUNYCODE_NAME, to, strlen(PUNYCODE_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: overrun test for arg `to' of decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* Normal case */ + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(UTF8_REVNAME) + 1, EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); + + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(UTF8_REVNAME), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* idn_enable(0) case */ + idn_enable(0); + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(AUX_EUCJP_NAME) + 1, EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); + + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(AUX_EUCJP_NAME), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* actions=0 case */ + idn_enable(1); + r = idn_decodename2(0, AUX_EUCJP_NAME, to, strlen(AUX_EUCJP_NAME) + 1, + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); + + r = idn_decodename2(0, AUX_EUCJP_NAME, to, strlen(AUX_EUCJP_NAME), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); + +#endif +} + +//# TESTCASE +// title: call encodename() with tolen=0 +// group: generic-conversion +{ + r = idn_encodename(IDN_ENCODE_APP, UTF8_NAME, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: call decodename() with tolen=0 +// group: generic-conversion +{ + r = idn_decodename(IDN_DECODE_APP, PUNYCODE_NAME, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: call decodename2() with tolen=0 +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_DECODE_APP, AUX_EUCJP_NAME, to, 0, + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); +#endif +} + +//# TESTCASE +// title: convert an empty string using encodename() +// group: generic-conversion +{ + r = idn_encodename(IDN_ENCODE_APP, "", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); +} + +//# TESTCASE +// title: convert an empty string using decodename() +// group: generic-conversion +{ + r = idn_decodename(IDN_DECODE_APP, "", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); +} + +//# TESTCASE +// title: convert an empty string using decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_decodename2(IDN_DECODE_APP, "", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); +#endif +} + +//# TESTCASE +// title: prohcheck by encodename() +// group: generic-conversion +{ + /* U+1680: prohibited character */ + r = idn_encodename(IDN_PROHCHECK, "<U+1680>", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: unascheck by encodename() +// group: generic-conversion +{ + /* U+0221: unassigned codepoint */ + r = idn_encodename(IDN_UNASCHECK, "<U+0221>", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: bidicheck by encodename() +// group: generic-conversion +{ + /* U+05D0: bidirectional property is "R" */ + /* `a': bidirectional property is "L" */ + /* `0', `-': bidirectional property is "N" */ + r = idn_encodename(IDN_BIDICHECK, "<U+05D0>", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_BIDICHECK, "<U+05D0><U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_BIDICHECK, "<U+05D0><U+05D0>-a", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_encodename(IDN_BIDICHECK, "<U+05D0>-a-<U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_encodename(IDN_BIDICHECK, "a-<U+05D0><U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_encodename(IDN_BIDICHECK, "<U+05D0><U+05D0>-0", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_encodename(IDN_BIDICHECK, "<U+05D0>-0-<U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_BIDICHECK, "0-<U+05D0><U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: asccheck by encodename() +// group: generic-conversion +{ + r = idn_encodename(IDN_ASCCHECK, "-name", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_encodename(IDN_ASCCHECK, "name-", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_encodename(IDN_ASCCHECK, "n ame", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: lencheck by encodename() +// group: generic-conversion +{ + r = idn_encodename(IDN_LENCHECK, + "123456789-123456789-123456789-123456789-" + "123456789-123456789-123", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_encodename(IDN_LENCHECK, + "123456789-123456789-123456789-123456789-" + "123456789-123456789-1234", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_length); + + r = idn_encodename(IDN_LENCHECK, "a..b", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_length); +} + +//# TESTCASE +// title: rtcheck non-prohchecked label by decodename() +// group: generic-conversion +{ + /* "xn--6ue" -> "U+1680" (prohibited character) */ + r = idn_decodename(IDN_RTCHECK, "xn--6ue", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6ue"); +} + +//# TESTCASE +// title: rtcheck non-unaschecked label by decodename() +// group: generic-conversion +{ + /* "xn--6la" -> "U+0221" (unassigned codepoint) */ + r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK, + "xn--6la", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6la"); +} + +//# TESTCASE +// title: rtcheck non-ascchecked label by decodename() +// group: generic-conversion +{ + /* "xn----x7t" -> "- U+3042" */ + r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----x7t", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----x7t"); + + /* "xn----w7t" -> "U+3042 -" */ + r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----w7t", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----w7t"); +} + +//# TESTCASE +// title: rtcheck non-lenchecked label by decodename() +// group: generic-conversion +{ + /* `s1' has 63 characters */ + const char *s1 = + "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + const char *s1rev = + "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>" + "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>" + "<U+5DDD><U+3042><U+3042><U+3042>"; + + /* `s2' has 64 characters */ + const char *s2 = + "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + /* `s3' has an empty label */ + const char *s3 = "a..b"; + + r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s1rev); + + r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s2); + + r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s3); +} + +//# TESTCASE +// title: rtcheck non-prohchecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "xn--6ue" -> "U+1680" (prohibited character) */ + r = idn_decodename2(IDN_RTCHECK, "xn--6ue", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6ue"); +#endif +} + +//# TESTCASE +// title: rtcheck non-unaschecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "xn--6la" -> "U+0221" (unassigned codepoint) */ + r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK, + "xn--6la", to, sizeof(to), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6la"); +#endif +} + +//# TESTCASE +// title: rtcheck non-ascchecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "xn----x7t" -> "- U+3042" */ + r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----x7t", to, sizeof(to), EUCJP_ENCODING_NAME); + + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----x7t"); + + /* "xn----w7t" -> "U+3042 -" */ + r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----w7t", to, sizeof(to), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----w7t"); +#endif +} + +//# TESTCASE +// title: rtcheck non-lenchecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* `s1' has 63 characters */ + const char *s1 = + "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + const char *s1rev = + "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>" + "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>" + "<U+5DDD><U+3042><U+3042><U+3042>"; + + /* `s2' has 64 characters */ + const char *s2 = + "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + /* `s3' has an empty label */ + const char *s3 = "a..b"; + + r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s1rev); + + r = idn_decodename2(IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s2); + + r = idn_decodename(IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s3); +#endif +} + +//# TESTCASE +// title: pass broken string as `from' to encodename() +// group: generic-conversion quiet +{ + /* "\xe3\x21" is not valid UTF-8 string */ + r = idn_encodename(IDN_ENCODE_APP, "\xe3\x21", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_encoding); +} + +//# TESTCASE +// title: pass broken string as `from' to decodename() +// group: generic-conversion quiet +{ + /* "\xe3\x21" is not valid UTF-8 string */ + r = idn_decodename(IDN_DECODE_APP, "\xe3\x21", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_encoding); +} + +//# TESTCASE +// title: pass broken string as `from' to decodename2() +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "\xa4\x21" is not valid EUC-JP string */ + r = idn_decodename2(IDN_DECODE_APP, "\xa4\x21", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_encoding); +#endif +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/checker.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/checker.tsy new file mode 100644 index 00000000..54f8ea0f --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/checker.tsy @@ -0,0 +1,610 @@ +#ifndef lint +static char *rcsid = "$Id: checker.tsy,v 1.1.1.1 2003/06/04 00:26:51 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <idn/checker.h> +#include <idn/log.h> +#include <idn/ucs4.h> +#include "testutil.h" + +#define SIZEOFUCS4(x) (sizeof(x) / sizeof(unsigned long)) + +#define UCS4_NAME_STR "U+304C" /* hiragana letter ga */ +#define UCS4_NAME 0x304C + +#define BUF_SIZE 128 +#define ARRAY_SIZE 9 + +#define CONF_FILENAME "test.map" + +#define LINEBUF_SIZE 2001 + +/* + * Sample strings for `from' argument of normalize(), + * and its expected outputs. + */ +const unsigned long from[4] = { + UCS4_NAME, + 0x00A0, /* no-break space: prohibited character */ + 0x0221, /* unassigned character */ + 0x0000 +}; + + +#define FROM_UCS4NAME_OFFSET 0 +#define FROM_PROH_OFFSET 1 +#define FROM_UNAS_OFFSET 2 + +const unsigned long from2[4] = { + UCS4_NAME, + 0x0221, /* unassigned character */ + 0x00A0, /* no-break space: prohibited character */ + 0x0000 +}; + +#define FROM2_UCS4NAME_OFFSET 0 +#define FROM2_PROH_OFFSET 2 +#define FROM2_UNAS_OFFSET 1 + +static const unsigned long bidi_from[4] = { + 0x05BE, /* hebrew punctuation maqaf */ + 0x0041, /* latin capital letter a */ + 0xFEFC, /* arabic ligature lam with alef final form */ + 0x0000 +}; +#define BIDIFROM_OFFSET 1 + +idn_result_t +test_createproc(const char *parameter, void **ctxp) +{ + return (idn_success); +} + +void +test_destroyproc(void *ctx) +{ +} + +#define FOUNDPTR_OFFSET 2 +idn_result_t +test_lookupproc(void *ctx, const unsigned long *ucs4, + const unsigned long **found) +{ + *found = ucs4 + FOUNDPTR_OFFSET; + return (idn_success); +} + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: generic +//-- +// Initialize the module and create context. +{ + idn_result_t r; + idn_checker_t ctx = NULL; + char name[BUF_SIZE]; + + r = idn_checker_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_checker_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: generic +//-- +// Destroy context. +{ + if (ctx != NULL) + idn_checker_destroy(ctx); +} + +//# SETUP +// group: lookup +//-- +// Initialize the module and create context. +{ + idn_result_t r; + idn_checker_t ctx = NULL; + char name[BUF_SIZE]; + const unsigned long *ptr; + + r = idn_checker_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_checker_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: lookup +//-- +// Destroy context. +{ + if (ctx != NULL) + idn_checker_destroy(ctx); +} + +//# SETUP +// group: addall +//-- +// Initialize the module and create context. +{ + idn_result_t r; + idn_checker_t ctx = NULL; + char *names[ARRAY_SIZE]; + int i; + const unsigned long *ptr; + + for (i = 0; i < ARRAY_SIZE; i++) { + names[i] = malloc(BUF_SIZE); + if (names[i] == NULL) { + ASSERT("malloc failed\n"); + } + } + + r = idn_checker_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_checker_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: addall +//-- +// Destroy context and free some blocks. +{ + if (ctx != NULL) + idn_checker_destroy(ctx); + for (i = 0; i < ARRAY_SIZE; i++) { + free(names[i]); + } +} + +//# SETUP +// group: quiet +//-- +// Set log level to `fatal' to supress log messages. +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +//-- +// Restore log level. +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: idn_checker_add() - boundary condition +// group: generic quiet +{ + r = idn_checker_add(ctx, ""); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_checker_add() - builtin schemes, prohibit +// group: generic quiet +{ + sprintf(name, "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + sprintf(name, "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "nameprep-01"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_checker_add() - builtin schemes, unassigned +// group: generic quiet +{ + sprintf(name, "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + sprintf(name, "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "nameprep-01"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_checker_add() - builtin schemes, bidi +// group: generic quiet +{ + sprintf(name, "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + sprintf(name, "%s%s", IDN_CHECKER_BIDI_PREFIX, "nameprep-01"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_checker_add() - file - boundary condition +// group: generic quiet +{ + sprintf(name, "%sfileset:%s", IDN_CHECKER_UNASSIGNED_PREFIX, ""); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_nofile); + sprintf(name, "%sfileset:%s", IDN_CHECKER_PROHIBIT_PREFIX, ""); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_nofile); + sprintf(name, "%sfileset:%s", IDN_CHECKER_BIDI_PREFIX, ""); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_checker_add() - file - long line +// group: generic quiet +{ + char line[LINEBUF_SIZE]; + const char *first_entry = "304C;"; + const char *other_entry = " 304D"; + int i; + int len; + + memcpy(line, first_entry, strlen(first_entry)); + len = strlen(other_entry); + for (i = len; i < LINEBUF_SIZE - len; i += len) { + memcpy(line + i, other_entry, len); + } + *(line + i) = '\0'; + + create_conf_file(CONF_FILENAME, 0, line, NULL); + sprintf(name, "%sfileset:%s", IDN_CHECKER_UNASSIGNED_PREFIX, + CONF_FILENAME); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_syntax); + sprintf(name, "%sfileset:%s", IDN_CHECKER_PROHIBIT_PREFIX, + CONF_FILENAME); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: idn_checker_add() - file, prohibit +// group: lookup +{ + create_conf_file(CONF_FILENAME, 0, + UCS4_NAME_STR, + NULL); + sprintf(name, "%sfileset:%s", IDN_CHECKER_PROHIBIT_PREFIX, + CONF_FILENAME); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FROM_UCS4NAME_OFFSET); + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from2 + FROM2_UCS4NAME_OFFSET); +} + +//# TESTCASE +// title: idn_checker_add() - file, unassigned +// group: lookup +{ + create_conf_file(CONF_FILENAME, 0, + UCS4_NAME_STR, + NULL); + sprintf(name, "%sfileset:%s", IDN_CHECKER_UNASSIGNED_PREFIX, + CONF_FILENAME); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FROM_UCS4NAME_OFFSET); + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from2 + FROM2_UCS4NAME_OFFSET); +} + +//# TESTCASE +// title: idn_checker_add() - file, bidi +// group: lookup quiet +{ + create_conf_file(CONF_FILENAME, 0, + UCS4_NAME_STR, + NULL); + sprintf(name, "%sfileset:%s", IDN_CHECKER_BIDI_PREFIX, + CONF_FILENAME); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_checker_addall() - boundary condition - scheme name +// group: addall quiet +{ + sprintf(names[0], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + sprintf(names[1], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + sprintf(names[2], "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + sprintf(names[3], "%s%s", IDN_CHECKER_BIDI_PREFIX, ""); + r = idn_checker_addall(ctx, (const char **)names, 4); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_checker_addall() - boundary condition - nschemes = 0 +// group: addall quiet +{ + sprintf(names[0], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "nameprep-01"); + sprintf(names[1], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "nameprep-01"); + sprintf(names[2], "%s%s", IDN_CHECKER_BIDI_PREFIX, ""); + sprintf(names[3], "%s%s", IDN_CHECKER_BIDI_PREFIX, "nameprep-01"); + r = idn_checker_addall(ctx, (const char **)names, 0); + ASSERT_RESULT(r, idn_success); + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, NULL); +} + +//# TESTCASE +// title: idn_checker_addall() - add a lot of schemes #1 +// group: addall +{ + sprintf(names[0], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + sprintf(names[1], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + sprintf(names[2], "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + sprintf(names[3], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + sprintf(names[4], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + sprintf(names[5], "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + sprintf(names[6], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + sprintf(names[7], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + sprintf(names[8], "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + + r = idn_checker_addall(ctx, (const char **)names, 9); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FROM_PROH_OFFSET); + + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from2 + FROM2_PROH_OFFSET); + + r = idn_checker_lookup(ctx, bidi_from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, bidi_from + BIDIFROM_OFFSET); +} + +//# TESTCASE +// title: idn_checker_addall() - add a lot of schemes #2 +// group: addall +{ + sprintf(names[0], "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + sprintf(names[1], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + sprintf(names[2], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + sprintf(names[3], "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + sprintf(names[4], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + sprintf(names[5], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + sprintf(names[6], "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + sprintf(names[7], "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + sprintf(names[8], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + + r = idn_checker_addall(ctx, (const char **)names, 9); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FROM_UNAS_OFFSET); + + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from2 + FROM2_UNAS_OFFSET); + + r = idn_checker_lookup(ctx, bidi_from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, bidi_from + BIDIFROM_OFFSET); +} + +//# TESTCASE +// title: idn_checker_addall() - add same scheme repetedly +// group: addall +{ + int i; + + sprintf(names[0], "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + for (i = 1; i < ARRAY_SIZE; i++) { + strcpy(names[i], names[0]); + } + r = idn_checker_addall(ctx, (const char **)names, ARRAY_SIZE); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FROM_PROH_OFFSET); + + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from2 + FROM2_PROH_OFFSET); +} + +//# TESTCASE +// title: idn_checker_lookup() - builtin schemes - RFC3491 prohibit +// group: lookup +{ + sprintf(name, "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FROM_PROH_OFFSET); + + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from2 + FROM2_PROH_OFFSET); +} + +//# TESTCASE +// title: idn_checker_lookup() - builtin schemes - RFC3491 unassigned +// group: lookup +{ + sprintf(name, "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FROM_UNAS_OFFSET); + + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from2 + FROM2_UNAS_OFFSET); +} + +//# TESTCASE +// title: idn_checker_lookup() - builtin schemes - RFC3491 bidi +// group: lookup +{ + sprintf(name, "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_lookup(ctx, bidi_from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, bidi_from + BIDIFROM_OFFSET); + + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, NULL); + + r = idn_checker_lookup(ctx, from2, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, NULL); +} + +//# TESTCASE +// title: idn_checker_lookup() - context without procedure +// group: lookup +{ + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, NULL); +} + +//# TESTCASE +// title: idn_checker_lookup() - string in ascii +// group: lookup +{ + char *ascii_str = "test"; + unsigned long ucs4_str[5]; + + r = idn_ucs4_utf8toucs4(ascii_str, ucs4_str, SIZEOFUCS4(ucs4_str)); + + sprintf(name, "%s%s", IDN_CHECKER_PROHIBIT_PREFIX, "RFC3491"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + sprintf(name, "%s%s", IDN_CHECKER_UNASSIGNED_PREFIX, "RFC3491"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + sprintf(name, "%s%s", IDN_CHECKER_BIDI_PREFIX, "RFC3491"); + r = idn_checker_add(ctx, name); + ASSERT_RESULT(r, idn_success); + r = idn_checker_lookup(ctx, ucs4_str, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, NULL); +} + +//# TESTCASE +// title: idn_checker_destroy(), idn_checker_incrref() +// group: +{ + idn_result_t r; + idn_checker_t ctx = NULL; + + r = idn_checker_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_checker_create(&ctx); + ASSERT_RESULT(r, idn_success); + idn_checker_incrref(ctx); + idn_checker_destroy(ctx); + idn_checker_destroy(ctx); +} + +//# TESTCASE +// title: idn_checker_register() +// group: generic +{ + const unsigned long *ptr = NULL; + + r = idn_checker_register("test", + test_createproc, + test_destroyproc, + test_lookupproc); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_add(ctx, "test"); + ASSERT_RESULT(r, idn_success); + + r = idn_checker_lookup(ctx, from, &ptr); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(ptr, from + FOUNDPTR_OFFSET); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/codeset.h b/contrib/idn/idnkit-1.0-src/lib/tests/codeset.h new file mode 100644 index 00000000..735a023b --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/codeset.h @@ -0,0 +1,71 @@ +/* $Id: codeset.h,v 1.1.1.1 2003/06/04 00:26:51 marka Exp $ */ +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#ifndef CODESET_H +#define CODESET_H + +/* + * Character encoding name that iconv() recognizes as Japanese EUC. + * + * Please edit the cpp macro definition if iconv() on the system doesn't + * recognize "EUC-JP". + * + * NOTE: + * Konstantin Chuguev's iconv-2.0 doesn't accept "eucJP", but "euc-jp". + */ +#define EUCJP_ENCODING_NAME "eucJP" + + +/* + * Character encoding name that iconv() recognizes as Japanese Shift JIS. + * + * Please edit the cpp macro definition if iconv() on the system doesn't + * recognize "SJIS". + * + * NOTE: + * Konstantin Chuguev's iconv-2.0 doesn't accept "SJIS", but "Shift_JIS". + */ +#define SJIS_ENCODING_NAME "SJIS" + +#endif /* CODESET_H */ diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/converter.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/converter.tsy new file mode 100644 index 00000000..94c865e8 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/converter.tsy @@ -0,0 +1,822 @@ +#ifndef lint +static char *rcsid = "$Id: converter.tsy,v 1.1.1.1 2003/06/04 00:26:53 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <idn/converter.h> +#include <idn/log.h> + +#include "codeset.h" +#include "testutil.h" + + +#ifndef IDN_PUNYCODE_ENCODING_NAME +#define IDN_PUNYCODE_ENCODING_NAME "Punycode" +#endif + +#ifndef IDN_UTF8_ENCODING_NAME +#define IDN_UTF8_ENCODING_NAME "UTF-8" /* by IANA */ +#endif + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +#ifndef SJIS_ENCODING_NAME +#define SJIS_ENCODING_NAME "SJIS" +#endif + +#define CONF_FILENAME "testalias.conf" +#define LINEBUF_SIZE 2001 + +#define SIZEOFUCS4(x) (sizeof(x) / sizeof(unsigned long)) + +/* + * U+1820: mongorian letter a + */ +#define UCS4_INVALID_NAME_FOR_EUCJP 0x1820 + +/* + * A4AC: hiragana letter GA (in EUC-JP) + */ +#define EUCJP_NAME "\xa4\xac" +#define EUCJP_NAME_SIZE 3 + +/* + * U+304C: hiragana letter GA + */ +#define UCS4_NAME 0x304C + +/* + * Conversion result of "U+304C" + */ +#define PUNYCODE_NAME "xn--v8j" +#define PUNYCODE_NAME_SIZE 8 + +#define BUF_SIZE 128 + +idn_result_t +idn_test_encode(idn_converter_t ctx, void *privdata, + const unsigned long *from, char *to, size_t tolen) +{ + idn_result_t r; + + if (tolen >= EUCJP_NAME_SIZE) { + strcpy(to, EUCJP_NAME); + r = idn_success; + } else { + r = idn_buffer_overflow; + } + return (r); + +} + +idn_result_t +idn_test_decode(idn_converter_t ctx, void *privdata, + const char *from, unsigned long *to, size_t tolen) +{ + idn_result_t r; + + if (tolen >= 2) { + to[0] = UCS4_NAME; + to[1] = 0x0000; + r = idn_success; + } else { + r = idn_buffer_overflow; + } + return (r); +} + + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: noinit +//-- +// Do nothing +{ + idn_result_t r; +} + +//# SETUP +// group: generic +//-- +// Initialize the module. +{ + idn_result_t r; + idn_converter_t ctx = NULL; + const char *name; + + r = idn_converter_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_converter_resetalias(); + ASSERT_RESULT(r, idn_success); +} + +//# SETUP +// group: localencoding +//-- +// Initialize the module and load alias file. +{ + idn_result_t r; + idn_converter_t ctx = NULL; + const char *name; + + r = idn_converter_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_converter_resetalias(); + ASSERT_RESULT(r, idn_success); + create_conf_file(CONF_FILENAME, 0, + "*.KOI8-R KOI8-R", + "*.ISO_8859-1 ISO-8859-1", + "*.ISO_8859-2 ISO-8859-1", + "*.UTF-8 UTF-8", + "ja_JP.EUC eucJP", + "japanese eucJP", + NULL); + r = idn_converter_aliasfile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: localencoding +//-- +// reset alias information. +{ + idn_converter_resetalias(); +} + +//# SETUP +// group: conversion +//-- +// Initialize the module and create contexts. +{ + idn_result_t r; + idn_converter_t punycode_ctx = NULL; + idn_converter_t utf8_ctx = NULL; +#ifndef WITHOUT_ICONV + idn_converter_t eucjp_ctx = NULL; +#endif + + r = idn_converter_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_converter_create(IDN_PUNYCODE_ENCODING_NAME, &punycode_ctx, + 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_create(IDN_UTF8_ENCODING_NAME, &utf8_ctx, + IDN_CONVERTER_DELAYEDOPEN); + ASSERT_RESULT(r, idn_success); +#ifndef WITHOUT_ICONV + r = idn_converter_create(EUCJP_ENCODING_NAME, &eucjp_ctx, + IDN_CONVERTER_DELAYEDOPEN); + ASSERT_RESULT(r, idn_success); +#endif +} + +//# TEARDOWN +// group: conversion +//-- +// Destroy contexts. +{ + if (punycode_ctx != NULL) { + idn_converter_destroy(punycode_ctx); + } + if (utf8_ctx != NULL) { + idn_converter_destroy(utf8_ctx); + } +#ifndef WITHOUT_ICONV + if (eucjp_ctx != NULL) { + idn_converter_destroy(eucjp_ctx); + } +#endif +} + +//# SETUP +// group: quiet +//-- +// Set log level to `fatal' to supress log messages. +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +//-- +// Restore log level. +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: idn_converter_addalias() test - without initialization +// group: noinit quiet +{ + r = idn_converter_addalias("a", "b", 0); + ASSERT_RESULT(r, idn_failure); +} + +//# TESTCASE +// title: idn_converter_aliasfile() - without initialization +// group: noinit quiet +{ + r = idn_converter_aliasfile("a"); + ASSERT_RESULT(r, idn_failure); +} + +//# TESTCASE +// title: idn_converter_resetalias() - without initialization +// group: noinit quiet +{ + r = idn_converter_resetalias(); + ASSERT_RESULT(r, idn_failure); +} + +//# TESTCASE +// title: idn_converter_getrealname() - without initialization +// group: noinit quiet +{ + const char *name; + + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "test"); +} + +//# TESTCASE +// title: idn_converter_create() +// group: generic quiet +{ +#ifdef WITHOUT_ICONV + r = idn_converter_addalias("*pc", "Punycode", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("*ej", EUCJP_ENCODING_NAME, 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("*sj", SJIS_ENCODING_NAME, 0); + ASSERT_RESULT(r, idn_success); + + r = idn_converter_create("abcsj", &ctx, 0); + ASSERT_RESULT(r, idn_invalid_name); + + r = idn_converter_create("notresolved", &ctx, 0); + ASSERT_RESULT(r, idn_invalid_name); + r = idn_converter_create("notresolved", &ctx, + IDN_CONVERTER_DELAYEDOPEN); + ASSERT_RESULT(r, idn_invalid_name); +#else + r = idn_converter_addalias("*pc", IDN_PUNYCODE_ENCODING_NAME, 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("*ej", EUCJP_ENCODING_NAME, 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("*sj", SJIS_ENCODING_NAME, 0); + ASSERT_RESULT(r, idn_success); + + r = idn_converter_create("abcsj", &ctx, 0); + ASSERT_RESULT(r, idn_success); + idn_converter_destroy(ctx); + + r = idn_converter_create("notresolved", &ctx, 0); + ASSERT_RESULT(r, idn_invalid_name); + r = idn_converter_create("notresolved", &ctx, + IDN_CONVERTER_DELAYEDOPEN); + ASSERT_RESULT(r, idn_success); + { + unsigned long ucs4_to[BUF_SIZE]; + + r = idn_converter_convtoucs4(ctx, "a", ucs4_to, BUF_SIZE); + ASSERT_RESULT(r, idn_invalid_name); + idn_converter_destroy(ctx); + } +#endif /* WITHOUT_ICONV */ +} + +//# TESTCASE +// title: idn_converter_addalias() - #1 +// group: generic +{ + r = idn_converter_addalias("test", "result-a", 0); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "result-a"); +} + +//# TESTCASE +// title: idn_converter_addalias() - #2 +// group: generic +{ + r = idn_converter_addalias("test", "result-b", 1); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "result-b"); +} + +//# TESTCASE +// title: idn_converter_addalias() - #3 +// group: generic +{ + r = idn_converter_addalias("test", "result-a", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-b", 0); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "result-a"); +} + +//# TESTCASE +// title: idn_converter_addalias() - #4 +// group: generic +{ + r = idn_converter_addalias("test", "result-a", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-b", 1); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "result-b"); +} + +//# TESTCASE +// title: idn_converter_addalias() - #5 +// group: generic +{ + r = idn_converter_addalias("test", "result-a", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-b", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-c", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-d", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-e", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-f", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-g", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-h", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-i", 0); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "result-a"); +} + +//# TESTCASE +// title: idn_converter_addalias() - #6 +// group: generic +{ + r = idn_converter_addalias("test", "result-a", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-b", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-c", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-d", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-e", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-f", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-g", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-h", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-i", 1); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "result-i"); +} + +//# TESTCASE +// title: idn_converter_addalias() - null character +// group: generic +{ + r = idn_converter_addalias("", "result", 0); + ASSERT_RESULT(r, idn_invalid_syntax); + r = idn_converter_addalias("test", "", 0); + ASSERT_RESULT(r, idn_invalid_syntax); + r = idn_converter_addalias("", "", 0); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: idn_converter_resetalias() - no alias added +// group: generic +{ + r = idn_converter_resetalias(); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "test"); + +} + +//# TESTCASE +// title: idn_converter_resetalias() - one alias added +// group: generic +{ + r = idn_converter_addalias("test", "result-a", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_resetalias(); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "test"); + +} + +//# TESTCASE +// title: idn_converter_resetalias() - many aliases added +// group: generic +{ + r = idn_converter_addalias("test", "result-a", 1); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-b", 1); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-c", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-d", 1); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-e", 1); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-f", 1); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-g", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-h", 0); + ASSERT_RESULT(r, idn_success); + r = idn_converter_addalias("test", "result-i", 1); + ASSERT_RESULT(r, idn_success); + r = idn_converter_resetalias(); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("test"); + ASSERT_STRING(name, "test"); +} + +//# TESTCASE +// title: idn_converter_aliasfile() - boundary condition +// group: generic quiet +{ + r = idn_converter_aliasfile(""); + ASSERT_RESULT(r, idn_nofile); + + r = idn_converter_aliasfile("idnalias-not-found.conf"); + ASSERT_RESULT(r, idn_nofile); +} + +//# TESTCASE +// title: idn_converter_aliasfile() - long line +// group: generic quiet +{ + char line[LINEBUF_SIZE]; + const char *entry = "aaaaaaaaaa"; + int i; + int len; + + len = strlen(entry); + for (i = 0; i < LINEBUF_SIZE - len; i += len) { + memcpy(line + i, entry, len); + } + *(line + (LINEBUF_SIZE / 2)) = ' '; + *(line + i) = '\0'; + create_conf_file(CONF_FILENAME, 0, line, NULL); + r = idn_converter_aliasfile(CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: idn_converter_aliasfile() - no new line at end of file +// group: generic quiet +{ + create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE, + "*.ISO_8859-1 ISO-8859-1", + "*.ISO_8859-2 ISO-8859-1", + "*.SJIS Shift_JIS", + "*.Shift_JIS Shift_JIS", + "ja_JP.EUC eucJP", + "japanese eucJP", + NULL); + r = idn_converter_aliasfile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("japanese"); + ASSERT_STRING(name, "eucJP"); + +} + +//# TESTCASE +// title: idn_converter_aliasfile() - invalid entries +// group: generic quiet +{ + create_conf_file(CONF_FILENAME, 0, + "*.ISO_8859-1 ISO-8859-1", + "*.ISO_8859-2 ISO-8859-1", + "*.SJIS", + "*.Shift_JIS", + "ja_JP.EUC eucJP", + "japanese eucJP", + NULL); + r = idn_converter_aliasfile(CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: idn_converter_aliasfile() - more then two items in one line +// group: generic quiet +{ + create_conf_file(CONF_FILENAME, 0, + "*.ISO_8859-1 ISO-8859-1", + "*.ISO_8859-2 ISO-8859-1", + "*.SJIS Shift_JIS ko_KR.EUC", + "*.Shift_JIS Shift_JIS", + "*.big5 Big5 *.big5 *.big5", + "ja_JP.EUC eucJP", + "japanese eucJP", + NULL); + r = idn_converter_aliasfile(CONF_FILENAME); + ASSERT_RESULT(r, idn_success); + name = idn_converter_getrealname("japanese"); + ASSERT_STRING(name, "eucJP"); +} + +//# TESTCASE +// title: idn_converter_localencoding() - #1 +// group: localencoding +{ + r = idn_converter_create("test.UTF-8", &ctx, + IDN_CONVERTER_DELAYEDOPEN); + ASSERT_RESULT(r, idn_success); + name = idn_converter_localencoding(ctx); + ASSERT_STRING(name, "UTF-8"); + idn_converter_destroy(ctx); +} + +//# TESTCASE +// title: idn_converter_localencoding() - #2 +// group: localencoding +{ + r = idn_converter_create("test.KOI8-R", &ctx, + IDN_CONVERTER_DELAYEDOPEN); +#ifdef WITHOUT_ICONV + ASSERT_RESULT(r, idn_invalid_name); +#else + ASSERT_RESULT(r, idn_success); + name = idn_converter_localencoding(ctx); + ASSERT_STRING(name, "KOI8-R"); + idn_converter_destroy(ctx); +#endif +} + +//# TESTCASE +// title: idn_converter_localencoding() - #3 +// group: localencoding +{ + r = idn_converter_create("unresolvedname", &ctx, + IDN_CONVERTER_DELAYEDOPEN); +#ifdef WITHOUT_ICONV + ASSERT_RESULT(r, idn_invalid_name); +#else + ASSERT_RESULT(r, idn_success); + name = idn_converter_localencoding(ctx); + ASSERT_STRING(name, "unresolvedname"); + idn_converter_destroy(ctx); +#endif +} + +//# TESTCASE +// title: idn_converter_encodingtype() +// group: conversion +{ + ASSERT_INT(idn_converter_encodingtype(punycode_ctx), + IDN_ACE_STRICTCASE); + ASSERT_INT(idn_converter_encodingtype(utf8_ctx), + IDN_NONACE); +#ifndef WITHOUT_ICONV + ASSERT_INT(idn_converter_encodingtype(eucjp_ctx), + IDN_NONACE); +#endif +} + +//# TESTCASE +// title: idn_converter_isasciicompatible() +// group: conversion +{ + ASSERT_INT(idn_converter_isasciicompatible(punycode_ctx), 1); + ASSERT_INT(idn_converter_isasciicompatible(utf8_ctx), 0); +#ifndef WITHOUT_ICONV + ASSERT_INT(idn_converter_isasciicompatible(eucjp_ctx), 0); +#endif +} + +//# TESTCASE +// title: idn_converter_convfromucs4() +// group: conversion quiet +{ + unsigned long from_nullchar = 0x0000; + unsigned long from[2] = { UCS4_NAME, 0x0000 }; + char to[1]; + char to_punycode[PUNYCODE_NAME_SIZE]; +#ifndef WITHOUT_ICONV + char to_eucjp[EUCJP_NAME_SIZE]; +#endif + + r = idn_converter_convfromucs4(punycode_ctx, &from_nullchar, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convfromucs4(punycode_ctx, &from_nullchar, to, 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); + + r = idn_converter_convfromucs4(punycode_ctx, from, to_punycode, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convfromucs4(punycode_ctx, from, to_punycode, + PUNYCODE_NAME_SIZE - 1); + ASSERT_RESULT(r, idn_buffer_overflow); + r = idn_converter_convfromucs4(punycode_ctx, from, to_punycode, + PUNYCODE_NAME_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to_punycode, PUNYCODE_NAME); + +#ifndef WITHOUT_ICONV + r = idn_converter_convfromucs4(eucjp_ctx, &from_nullchar, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convfromucs4(eucjp_ctx, &from_nullchar, to, 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); + + r = idn_converter_convfromucs4(eucjp_ctx, from, to_eucjp, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convfromucs4(eucjp_ctx, from, to_eucjp, + EUCJP_NAME_SIZE - 1); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convfromucs4(eucjp_ctx, from, to_eucjp, + EUCJP_NAME_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to_eucjp, EUCJP_NAME); + + from[0] = 0x80000000; + r = idn_converter_convfromucs4(eucjp_ctx, from, to_eucjp, + EUCJP_NAME_SIZE); + ASSERT_RESULT(r, idn_invalid_encoding); + + from[0] = UCS4_INVALID_NAME_FOR_EUCJP; + r = idn_converter_convfromucs4(eucjp_ctx, from, to_eucjp, + EUCJP_NAME_SIZE); + ASSERT_RESULT(r, idn_nomapping); +#endif +} + +//# TESTCASE +// title: idn_converter_convtoucs4() +// group: conversion +{ + unsigned long to_nullchar = 0x0000; + unsigned long to[1]; + unsigned long punycode_to[2]; +#ifndef WITHOUT_ICONV + unsigned long eucjp_to[2]; +#endif + unsigned long ucs4_name[2] = { UCS4_NAME, 0x0000 }; + + r = idn_converter_convtoucs4(punycode_ctx, "", to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convtoucs4(punycode_ctx, "", to, 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, &to_nullchar); + + r = idn_converter_convtoucs4(punycode_ctx, PUNYCODE_NAME, + punycode_to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convtoucs4(punycode_ctx, PUNYCODE_NAME, + punycode_to, 1); + ASSERT_RESULT(r, idn_buffer_overflow); + r = idn_converter_convtoucs4(punycode_ctx, PUNYCODE_NAME, punycode_to, + 2); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING_THRU(punycode_to, ucs4_name); + +#ifndef WITHOUT_ICONV + r = idn_converter_convtoucs4(eucjp_ctx, "", to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convtoucs4(eucjp_ctx, "", to, 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, &to_nullchar); + + r = idn_converter_convtoucs4(eucjp_ctx, EUCJP_NAME, eucjp_to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convtoucs4(eucjp_ctx, EUCJP_NAME, eucjp_to, 1); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_converter_convtoucs4(eucjp_ctx, EUCJP_NAME, eucjp_to, 2); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, &to_nullchar); + + r = idn_converter_convtoucs4(eucjp_ctx, "\xFF\xFF", eucjp_to, 2); + ASSERT_RESULT(r, idn_invalid_encoding); +#endif +} + +//# TESTCASE +// title: idn_converter_destroy(), idn_converter_incrref() +// group: generic +{ + idn_converter_t ctx2; + + r = idn_converter_create(IDN_UTF8_ENCODING_NAME, &ctx, 0); + ASSERT_RESULT(r, idn_success); + idn_converter_destroy(ctx); + + r = idn_converter_create(IDN_UTF8_ENCODING_NAME, &ctx2, 0); + ASSERT_RESULT(r, idn_success); + idn_converter_incrref(ctx2); + ASSERT_RESULT(r, idn_success); + idn_converter_destroy(ctx2); + idn_converter_destroy(ctx2); +} + +//# TESTCASE +// title: idn_converter_register() +// group: generic +{ + char eucjp_to[3]; + unsigned long ucs4_to[2]; + unsigned long ucs4_name[2] = { UCS4_NAME, 0x0000 }; + + r = idn_converter_register("test", + NULL, + NULL, + idn_test_encode, + idn_test_decode, + NULL, + IDN_ACE_STRICTCASE); + ASSERT_RESULT(r, idn_success); + r = idn_converter_create("test", &ctx, 0); + ASSERT_RESULT(r, idn_success); + + r = idn_converter_convfromucs4(ctx, ucs4_name, eucjp_to, sizeof(eucjp_to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(eucjp_to, EUCJP_NAME); + + r = idn_converter_convtoucs4(ctx, "", ucs4_to, SIZEOFUCS4(ucs4_to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(ucs4_to, ucs4_name); + + idn_converter_destroy(ctx); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/delimitermap.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/delimitermap.tsy new file mode 100644 index 00000000..aeaa46c3 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/delimitermap.tsy @@ -0,0 +1,257 @@ +#ifndef lint +static char *rcsid = "$Id: delimitermap.tsy,v 1.1.1.1 2003/06/04 00:26:53 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <idn/delimitermap.h> +#include <idn/ucs4.h> +#include <idn/log.h> +#include "testutil.h" + +/* + * Codepoions to test the add() function. + */ +#define ADDITIONAL_DELIMITER0 0xe0 +#define ADDITIONAL_DELIMITER1 0xe1 + +/* + * Sample string for `from' argument of map(), + * and its expected outputs. + */ +static const unsigned long from[] = { + 0x002e, /* full stop */ + 0x3002, /* ideographic full stop */ + 0xff0e, /* fullwidth full stop */ + 0xff61, /* halfwidth ideographic full stop */ + ADDITIONAL_DELIMITER0, + ADDITIONAL_DELIMITER1, + 0x0000 +}; + +static const unsigned long expected_default[] = { + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + ADDITIONAL_DELIMITER0, + ADDITIONAL_DELIMITER1, + 0x0000 +}; + +static const unsigned long expected_add[] = { + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + ADDITIONAL_DELIMITER1, + 0x0000 +}; + +static const unsigned long expected_addall[] = { + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x002e, /* full stop */ + 0x0000 +}; + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: generic-init +{ + idn_result_t r; + idn_delimitermap_t ctx; + unsigned long to[256]; + + r = idn_delimitermap_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: generic-init +{ + if (ctx != NULL) + idn_delimitermap_destroy(ctx); +} + +//# SETUP +// group: quiet +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call create() +// group: generic-init +{ +} + +//# TESTCASE +// title: call map() without additional delimiters +// group: generic-init +{ + r = idn_delimitermap_map(ctx, from, to, sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: call add() and map() +// group: generic-init +{ + r = idn_delimitermap_add(ctx, ADDITIONAL_DELIMITER0); + ASSERT_RESULT(r, idn_success); + + r = idn_delimitermap_map(ctx, from, to, sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_add); +} + +//# TESTCASE +// title: call addall() +// group: generic-init +{ + unsigned long delimiters[2]; + + delimiters[0] = ADDITIONAL_DELIMITER0; + delimiters[1] = ADDITIONAL_DELIMITER1; + r = idn_delimitermap_addall(ctx, delimiters, 2); + ASSERT_RESULT(r, idn_success); + + r = idn_delimitermap_map(ctx, from, to, sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_addall); +} + +//# TESTCASE +// title: call addall() with nnames=0 +// group: generic-init +{ + unsigned long delimiters[2]; + + r = idn_delimitermap_addall(ctx, delimiters, 0); + ASSERT_RESULT(r, idn_success); + + r = idn_delimitermap_map(ctx, from, to, sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: call add() with invalid codepoint +// group: generic-init quiet +{ + r = idn_delimitermap_add(ctx, 0x0000); /* NUL */ + ASSERT_RESULT(r, idn_invalid_codepoint); + + r = idn_delimitermap_add(ctx, 0xd800); /* surrogate */ + ASSERT_RESULT(r, idn_invalid_codepoint); + + r = idn_delimitermap_add(ctx, 0x110000); /* out of range */ + ASSERT_RESULT(r, idn_invalid_codepoint); +} + +//# TESTCASE +// title: call addall() with invalid codepoint +// group: generic-init quiet +{ + unsigned long delimiters[1]; + + delimiters[0] = 0x0000; /* NUL */ + r = idn_delimitermap_addall(ctx, delimiters, 1); + ASSERT_RESULT(r, idn_invalid_codepoint); + + delimiters[0] = 0xd800; /* surrogate */ + r = idn_delimitermap_addall(ctx, delimiters, 1); + ASSERT_RESULT(r, idn_invalid_codepoint); + + delimiters[0] = 0x110000; /* out of range */ + r = idn_delimitermap_addall(ctx, delimiters, 1); + ASSERT_RESULT(r, idn_invalid_codepoint); +} + +//# TESTCASE +// title: overrun test for arg `to' of map() +// group: generic-init +{ + r = idn_delimitermap_map(ctx, from, to, + idn_ucs4_strlen(expected_default) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); + r = idn_delimitermap_map(ctx, from, to, + idn_ucs4_strlen(expected_default)); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: call map() with tolen=0 +// group: generic-init +{ + r = idn_delimitermap_map(ctx, from, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/iconvchk.c b/contrib/idn/idnkit-1.0-src/lib/tests/iconvchk.c new file mode 100644 index 00000000..895b1977 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/iconvchk.c @@ -0,0 +1,132 @@ +#ifndef lint +static char *rcsid = "$Id: iconvchk.c,v 1.1.1.1 2003/06/04 00:26:54 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stdio.h> +#include <stdlib.h> + +#include <idn/api.h> +#include <idn/converter.h> +#include <idn/result.h> + +#include "codeset.h" + +#define IDN_UTF8_ENCODING_NAME "UTF-8" + +void +eucjp_check(void) +{ + idn_result_t r; + idn_converter_t eucjp_ctx = NULL; + + r = idn_nameinit(0); + if (r != idn_success) { + fprintf(stderr, "idn_nameinit(): failed\n"); + exit (1); + } + + r = idn_converter_create(EUCJP_ENCODING_NAME, &eucjp_ctx, 0); + + if (eucjp_ctx != NULL) { + idn_converter_destroy(eucjp_ctx); + } + + if (r != idn_success) { + if (r == idn_invalid_name) { + fprintf(stderr, \ + "\"%s\" is invalid codeset name, edit codeset.h\n", \ + EUCJP_ENCODING_NAME); + exit (1); + } else { + fprintf(stderr, \ + "idn_converter_create() failed with error \"%s\"\n", \ + idn_result_tostring(r)); + exit (1); + } + } +} + +void +sjis_check(void) +{ + idn_result_t r; + idn_converter_t sjis_ctx = NULL; + + r = idn_nameinit(0); + if (r != idn_success) { + fprintf(stderr, "idn_nameinit(): failed\n"); + exit (1); + } + + r = idn_converter_create(SJIS_ENCODING_NAME, &sjis_ctx, 0); + + if (sjis_ctx != NULL) { + idn_converter_destroy(sjis_ctx); + } + + if (r != idn_success) { + if (r == idn_invalid_name) { + fprintf(stderr, \ + "\"%s\" is invalid codeset name, edit codeset.h\n", \ + SJIS_ENCODING_NAME); + exit (1); + } else { + fprintf(stderr, \ + "idn_converter_create() failed with error \"%s\"\n", \ + idn_result_tostring(r)); + exit (1); + } + } +} + +int +main (int ac, char **av) +{ + eucjp_check(); + sjis_check(); + + exit (0); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/mapper.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/mapper.tsy new file mode 100644 index 00000000..5db6c65a --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/mapper.tsy @@ -0,0 +1,497 @@ +#ifndef lint +static char *rcsid = "$Id: mapper.tsy,v 1.1.1.1 2003/06/04 00:26:54 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <idn/mapper.h> +#include <idn/log.h> +#include <idn/ucs4.h> +#include "testutil.h" + +#define SIZEOFUCS4(x) (sizeof(x) / sizeof(unsigned long)) + +#define UCS4_NAME_STR "U+304C" /* hiragana letter ga */ +#define UCS4_NAME 0x304C + +#define BUF_SIZE 128 +#define ARRAY_SIZE 9 +#define CONF_FILENAME "test.map" + +#define LINEBUF_SIZE 2001 + +/* + * Sample string for `from' argument of map(), + * and its expected outputs. + */ +static const unsigned long from[] = { + 0x0041, /* latin capital letter a */ + 0x0042, /* latin capital letter b */ + UCS4_NAME, + 0x0000 +}; + +static const unsigned long expected_default[] = { + 0x0061, /* latin small letter a */ + 0x0062, /* latin small letter b */ + UCS4_NAME, + 0x0000 +}; + +idn_result_t +test_create(const char *parameter, void **ctxp) +{ + return (idn_success); +} + +void +test_destroy(void *ctxp) +{ +} + +idn_result_t +test_map(void *ctx, const unsigned long *from, unsigned long *to, + size_t tolen) +{ + if (tolen > idn_ucs4_strlen(from)) { + idn_ucs4_strcpy(to, from); + } else { + return (idn_buffer_overflow); + } + + return (idn_success); +} + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: noinit +//-- +// Do nothing +{ + idn_result_t r; + const char *name; +} + +//# SETUP +// group: generic +//-- +// Initialize the module and create context. +{ + idn_result_t r; + idn_mapper_t ctx = NULL; + + r = idn_mapper_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: generic +//-- +// Destroy context. +{ + idn_mapper_destroy(ctx); +} + +//# SETUP +// group: addall +//-- +// Initialize the module and create context. +{ + idn_result_t r; + idn_mapper_t ctx = NULL; + char *names[ARRAY_SIZE]; + int i; + unsigned long to[4]; + + for (i = 0; i < ARRAY_SIZE; i++) { + names[i] = malloc(BUF_SIZE); + if (names[i] == NULL) { + ASSERT("malloc failed\n"); + } + } + + r = idn_mapper_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: addall +//-- +// Destroy context and free some blocks. +{ + idn_mapper_destroy(ctx); + for (i = 0; i < ARRAY_SIZE; i++) { + free(names[i]); + } +} + +//# SETUP +// group: quiet +//-- +// Set log level to `fatal' to supress log messages. +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +//-- +// Restore log level. +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: idn_mapper_add() - boundary condition +// group: generic quiet +{ + r = idn_mapper_add(ctx, ""); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_mapper_add() - builtin schemes +// group: generic quiet +{ + r = idn_mapper_add(ctx, "RFC3491"); + ASSERT_RESULT(r, idn_success); + + r = idn_mapper_add(ctx, "nameprep-01"); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_mapper_add() - boundary condition +// group: generic quiet +{ + r = idn_mapper_add(ctx, ""); + ASSERT_RESULT(r, idn_invalid_name); + r = idn_mapper_add(ctx, "filemap:"); + ASSERT_RESULT(r, idn_nofile); + r = idn_mapper_add(ctx, "filemap:notfound.map"); + ASSERT_RESULT(r, idn_nofile); +} + +//# TESTCASE +// title: idn_mapper_add() - file +// group: generic quiet +{ + char name[BUF_SIZE]; + unsigned long to[4]; + + create_conf_file(CONF_FILENAME, 0, + "0041; 0061;", + "0042; 0062;", + NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: idn_mapper_add() - file - long line +// group: generic quiet +{ + char line[LINEBUF_SIZE]; + char name[BUF_SIZE]; + const char *first_entry = "0041;"; + const char *other_entry = " 0061"; + int i; + int len; + + memcpy(line, first_entry, strlen(first_entry)); + len = strlen(other_entry); + for (i = len; i < LINEBUF_SIZE - len; i += len) { + memcpy(line + i, other_entry, len); + } + *(line + i) = '\0'; + + create_conf_file(CONF_FILENAME, 0, line, NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: idn_mapper_add() - file - no new line at end of file +// group: generic quiet +{ + char name[BUF_SIZE]; + unsigned long to[4]; + + create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE, + "0041; 0061;", + "0042; 0062;", + NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: idn_mapper_add() - file - one item in one line #1 +// group: generic quiet +{ + char name[BUF_SIZE]; + unsigned long to[3]; + unsigned long expected[] = { + 0x0061, + UCS4_NAME, + 0x0000 + }; + + create_conf_file(CONF_FILENAME, 0, + "0041; 0061;", + "0042;", + NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected); +} + +//# TESTCASE +// title: idn_mapper_add() - file - one item in one line #2 +// group: generic quiet +{ + char name[BUF_SIZE]; + unsigned long to[3]; + unsigned long expected[] = { + 0x0061, + UCS4_NAME, + 0x0000 + }; + + create_conf_file(CONF_FILENAME, 0, + "0041; 0061;", + "0042; ;", + NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected); +} + +//# TESTCASE +// title: idn_mapper_add() - file - more then two items in one line #1 +// group: generic quiet +{ + char name[BUF_SIZE]; + unsigned long to[4]; + + create_conf_file(CONF_FILENAME, 0, + "0041; 0061; 0062;", + "0042; 0062; 0063;", + NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: idn_mapper_add() - file - more then two items in one line #2 +// group: generic quiet +{ + char name[BUF_SIZE]; + unsigned long to[6]; + unsigned long expected_to[] = { + 0x0061, + 0x0062, + 0x0062, + 0x0063, + UCS4_NAME, + 0x0000 + }; + + create_conf_file(CONF_FILENAME, 0, + "0041; 0061 0062;", + "0042; 0062 0063;", + NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_success); + + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_to); +} + +//# TESTCASE +// title: idn_mapper_add() - file - more then two items in one line #3 +// group: generic quiet +{ + char name[BUF_SIZE]; + unsigned long to[3]; + + create_conf_file(CONF_FILENAME, 0, + "0041 0042; 0063;", + NULL); + sprintf(name, "filemap:%s", CONF_FILENAME); + r = idn_mapper_add(ctx, name); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: idn_mapper_addall() - add all builtin schemes +// group: addall quiet +{ + strcpy(names[0], "RFC3491"); + strcpy(names[1], "RFC3491"); + strcpy(names[2], "RFC3491"); + strcpy(names[3], "RFC3491"); + strcpy(names[4], "RFC3491"); + strcpy(names[5], "RFC3491"); + strcpy(names[6], "RFC3491"); + strcpy(names[7], "RFC3491"); + strcpy(names[8], "RFC3491"); + + r = idn_mapper_addall(ctx, (const char **)names, 9); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: idn_mapper_addall() - add same scheme repetedly +// group: addall quiet +{ + for (i = 0; i < ARRAY_SIZE; i++) { + strcpy(names[i], "RFC3491"); + } + r = idn_mapper_addall(ctx, (const char **)names, 3); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: idn_mapper_map() - builtin schemes check - RFC3491 +// group: generic quiet +{ + unsigned long to[4]; + + r = idn_mapper_add(ctx, "RFC3491"); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, expected_default); +} + +//# TESTCASE +// title: idn_mapper_map() - context without procedure +// group: generic +{ + unsigned long to[4]; + + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, from); +} + +//# TESTCASE +// title: idn_mapper_destroy(), idn_mapper_incrref() +// group: +{ + idn_result_t r; + idn_mapper_t ctx = NULL; + + r = idn_mapper_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_create(&ctx); + ASSERT_RESULT(r, idn_success); + idn_mapper_incrref(ctx); + idn_mapper_destroy(ctx); + idn_mapper_destroy(ctx); +} + +//# TESTCASE +// title: idn_mapper_register() +// group: generic quiet +{ + unsigned long to[10]; + + r = idn_mapper_register("test", test_create, test_destroy, test_map); + ASSERT_RESULT(r, idn_success); + r = idn_mapper_add(ctx, "test"); + ASSERT_RESULT(r, idn_success); + + r = idn_mapper_map(ctx, from, to, SIZEOFUCS4(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, from); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/mapselector.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/mapselector.tsy new file mode 100644 index 00000000..1484f6c1 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/mapselector.tsy @@ -0,0 +1,592 @@ +#ifndef lint +static char *rcsid = "$Id: mapselector.tsy,v 1.1.1.1 2003/06/04 00:26:55 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include <idn/mapselector.h> +#include <idn/ucs4.h> +#include <idn/log.h> + +#include "testutil.h" + +#define CONF_FILENAME "test.conf" +#define MAP_FILENAME "test.map" + +/* + * Sample TLDs. + */ +static const char *utf8_tlds_jp[] = {"jp", ".jp", "JP", ".JP"}; +static const char *utf8_tlds_tw[] = {"tw", ".tw", "TW", ".TW"}; + +static const unsigned long ucs4_tlds_jp[][4] = {{'j', 'p', '\0', '\0'}, + {'.', 'j', 'p', '\0'}, + {'J', 'P', '\0', '\0'}, + {'.', 'J', 'P', '\0'}}; + +static const unsigned long ucs4_tlds_tw[][4] = {{'t', 'w', '\0', '\0'}, + {'.', 't', 'w', '\0'}, + {'T', 'W', '\0', '\0'}, + {'.', 'T', 'W', '\0'}}; + +/* How many elements in `utf8_tlds_{jp|tw}[]' and `ucs4_tlds_{jp|tw}[]'. */ +#define TLD_NVARIANTS 4 + +/* + * Sample input string for mapping. (UCS4) + */ +static const unsigned long in_string[] = {0x00C0, 0x2212, 0}; + +/* + * Sample mapping results of IN_STRING. + * + * OUT_STRING_FILEMAP is the result of file-mapping (U+2212 -> U+002D). + * OUT_STRING_NAMEPREP is the result of the latest nameprep + * OUT_STRING_BOTH is the result of both file-mapping and nameprep. + */ +static const unsigned long out_string_filemap[] = {0x00C0, 0x002D, 0}; +static const unsigned long out_string_nameprep[] = {0x00E0, 0x2212, 0}; +static const unsigned long out_string_both[] = {0x00E0, 0x002D, 0}; + +#define MAP_FILENAME "test.map" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: generic-init +{ + idn_result_t r; + idn_mapselector_t ctxs[TLD_NVARIANTS]; + unsigned long to[256]; + + { + int i; + for (i = 0; i < TLD_NVARIANTS; i++) + ctxs[i] = NULL; + } + + r = idn_mapselector_initialize(); + ASSERT_RESULT(r, idn_success); + + { + int i; + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_create(&ctxs[i]); + ASSERT_RESULT(r, idn_success); + } + } +} + +//# TEARDOWN +// group: generic-init +{ + { + int i; + + for (i = 0; i < TLD_NVARIANTS; i++) { + if (ctxs[i] != NULL) + idn_mapselector_destroy(ctxs[i]); + remove(CONF_FILENAME); + } + } +} + +//# SETUP +// group: quiet +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +{ + idn_log_setlevel(saved_log_level); +} + +//# SETUP +// group: generic-filemap +{ + create_conf_file(MAP_FILENAME, 0, + "U+2212; U+002D", + NULL); +} + +//# TEARDOWN +// group: generic-filemap +{ + remove(MAP_FILENAME); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call initialize() twice. +// +{ + idn_result_t r; + + r = idn_mapselector_initialize(); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_initialize(); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: call create() +{ + idn_result_t r; + idn_mapselector_t ctx; + + r = idn_mapselector_initialize(); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_create(&ctx); + ASSERT_RESULT(r, idn_success); + + idn_mapselector_destroy(ctx); +} + +//# TESTCASE +// title: call add(filemap) and map() +// group: generic-init generic-filemap +{ + int i, j; + + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_add(ctxs[i], utf8_tlds_jp[i], + "filemap:" MAP_FILENAME); + ASSERT_RESULT(r, idn_success); + } + + for (i = 0; i < TLD_NVARIANTS; i++) { + for (j = 0; j < TLD_NVARIANTS; j++) { + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_jp[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_filemap); + + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_tw[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + } + } +} + +//# TESTCASE +// title: call add(nameprep) and map() +// group: generic-init generic-filemap +{ + int i, j; + + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_add(ctxs[i], utf8_tlds_jp[i], + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + } + + for (i = 0; i < TLD_NVARIANTS; i++) { + for (j = 0; j < TLD_NVARIANTS; j++) { + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_jp[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_nameprep); + + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_tw[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + } + } +} + +//# TESTCASE +// title: call add(filemap) and map2() +// group: generic-init generic-filemap +{ + int i, j; + + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_add(ctxs[i], utf8_tlds_jp[i], + "filemap:" MAP_FILENAME); + ASSERT_RESULT(r, idn_success); + } + + for (i = 0; i < TLD_NVARIANTS; i++) { + for (j = 0; j < TLD_NVARIANTS; j++) { + r = idn_mapselector_map2(ctxs[i], in_string, + ucs4_tlds_jp[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_filemap); + + r = idn_mapselector_map2(ctxs[i], in_string, + ucs4_tlds_tw[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + } + } +} + +//# TESTCASE +// title: call add(nameprep) and map2() +// group: generic-init generic-filemap +{ + int i, j; + + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_add(ctxs[i], utf8_tlds_jp[i], + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + } + + for (i = 0; i < TLD_NVARIANTS; i++) { + for (j = 0; j < TLD_NVARIANTS; j++) { + r = idn_mapselector_map2(ctxs[i], in_string, + ucs4_tlds_jp[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_nameprep); + + r = idn_mapselector_map2(ctxs[i], in_string, + ucs4_tlds_tw[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + } + } +} + +//# TESTCASE +// title: call add(filemap) and map() +// group: generic-init generic-filemap +{ + int i, j; + + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_add(ctxs[i], utf8_tlds_jp[i], + "filemap:" MAP_FILENAME); + ASSERT_RESULT(r, idn_success); + } + + for (i = 0; i < TLD_NVARIANTS; i++) { + for (j = 0; j < TLD_NVARIANTS; j++) { + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_jp[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_filemap); + + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_tw[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + } + } +} + +//# TESTCASE +// title: call add(nameprep) and map() +// group: generic-init generic-filemap +{ + int i, j; + + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_add(ctxs[i], utf8_tlds_jp[i], + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + } + + for (i = 0; i < TLD_NVARIANTS; i++) { + for (j = 0; j < TLD_NVARIANTS; j++) { + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_jp[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_nameprep); + + r = idn_mapselector_map(ctxs[i], in_string, + utf8_tlds_tw[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + } + } +} + +//# TESTCASE +// title: call addall() +// group: generic-init generic-filemap +{ + static const char *names[] = { + "filemap:" MAP_FILENAME, + IDN_NAMEPREP_CURRENT + }; + int i, j; + + for (i = 0; i < TLD_NVARIANTS; i++) { + r = idn_mapselector_addall(ctxs[i], utf8_tlds_jp[i], names, + sizeof(names) / sizeof(*names)); + ASSERT_RESULT(r, idn_success); + } + + for (i = 0; i < TLD_NVARIANTS; i++) { + for (j = 0; j < TLD_NVARIANTS; j++) { + r = idn_mapselector_map2(ctxs[i], in_string, + ucs4_tlds_jp[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_both); + + r = idn_mapselector_map2(ctxs[i], in_string, + ucs4_tlds_tw[j], to, + sizeof(to) / sizeof(*to)); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + } + } +} + +//# TESTCASE +// title: call addall() with nnames=0 +// group: generic-init +{ + static const char *names[] = {IDN_NAMEPREP_CURRENT}; + + r = idn_mapselector_addall(ctxs[0], ".", names, 0); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: call add() with empty tld +// group: generic-init +{ + r = idn_mapselector_add(ctxs[0], "", IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: call addall() with empty tld +// group: generic-init +{ + static const char *names[] = {IDN_NAMEPREP_CURRENT}; + + r = idn_mapselector_addall(ctxs[0], "", names, 1); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: call add() with too long tld +// group: generic-init quiet +{ + r = idn_mapselector_add(ctxs[0], + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJK", + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_add(ctxs[0], + "." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJK", + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_add(ctxs[0], + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKL", + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_invalid_name); + + r = idn_mapselector_add(ctxs[0], + "." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKL", + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: call addall() with too long tld +// group: generic-init quiet +{ + static const char *names[] = {IDN_NAMEPREP_CURRENT}; + + r = idn_mapselector_addall(ctxs[0], + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJK", + names, 1); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_addall(ctxs[0], + "." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJK", + names, 1); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_addall(ctxs[0], + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKL", + names, 1); + ASSERT_RESULT(r, idn_invalid_name); + + r = idn_mapselector_addall(ctxs[0], + "." + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "ABCDEFGHIJKL", + names, 1); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: overrun test for arg `to' of map() +// group: generic-init +{ + r = idn_mapselector_add(ctxs[0], utf8_tlds_jp[0], + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_map(ctxs[0], in_string, utf8_tlds_jp[0], to, + idn_ucs4_strlen(out_string_nameprep) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_nameprep); + + r = idn_mapselector_map(ctxs[0], in_string, utf8_tlds_tw[0], to, + idn_ucs4_strlen(in_string) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + + r = idn_mapselector_map(ctxs[0], in_string, utf8_tlds_jp[0], to, + idn_ucs4_strlen(out_string_nameprep)); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_mapselector_map(ctxs[0], in_string, utf8_tlds_tw[0], to, + idn_ucs4_strlen(in_string)); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: overrun test for arg `to' of map2() +// group: generic-init +{ + r = idn_mapselector_add(ctxs[0], utf8_tlds_jp[0], + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_map2(ctxs[0], in_string, ucs4_tlds_jp[0], to, + idn_ucs4_strlen(out_string_nameprep) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, out_string_nameprep); + + r = idn_mapselector_map2(ctxs[0], in_string, ucs4_tlds_tw[0], to, + idn_ucs4_strlen(in_string) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, in_string); + + r = idn_mapselector_map2(ctxs[0], in_string, ucs4_tlds_jp[0], to, + idn_ucs4_strlen(out_string_nameprep)); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_mapselector_map2(ctxs[0], in_string, ucs4_tlds_tw[0], to, + idn_ucs4_strlen(in_string)); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: call map() with tolen=0 +// group: generic-init +{ + r = idn_mapselector_add(ctxs[0], utf8_tlds_jp[0], + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_map(ctxs[0], in_string, utf8_tlds_jp[0], to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_mapselector_map(ctxs[0], in_string, utf8_tlds_tw[0], to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: call map2() with tolen=0 +// group: generic-init +{ + r = idn_mapselector_add(ctxs[0], utf8_tlds_jp[0], + IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); + + r = idn_mapselector_map2(ctxs[0], in_string, ucs4_tlds_jp[0], to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_mapselector_map2(ctxs[0], in_string, ucs4_tlds_tw[0], to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/nameprep.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/nameprep.tsy new file mode 100644 index 00000000..bba49c7f --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/nameprep.tsy @@ -0,0 +1,340 @@ +#ifndef lint +static char *rcsid = "$Id: nameprep.tsy,v 1.1.1.1 2003/06/04 00:26:56 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <idn/nameprep.h> +#include <idn/log.h> +#include "testutil.h" + +#define UCS4_NAME 0x304C /* hiragana letter ga */ +#define BUF_SIZE 4 +/* + * Sample string for `from' argument for map(), + * and its expected outputs. + */ +static const unsigned long map_from[] = { + 0x0041, /* latin capital letter a */ + 0x0042, /* latin capital letter b */ + UCS4_NAME, + 0x0000 +}; + +static const unsigned long map_expected[] = { + 0x0061, /* latin small letter a */ + 0x0062, /* latin small letter b */ + UCS4_NAME, + 0x0000 +}; + +/* + * Sample string for `from' argument for isprohibited(). + */ +static const unsigned long check_from[4] = { + UCS4_NAME, + 0x00A0, /* no-break space: prohibited character */ + 0x0221, /* unassigned character */ + 0x0000 +}; + +#define FROM_UCS4NAME_OFFSET 0 +#define FROM_PROH_OFFSET 1 +#define FROM_UNAS_OFFSET 2 + +/* + * Sample string for `from' argument for isunassigned(). + */ +static const unsigned long check_from2[4] = { + UCS4_NAME, + 0x0221, /* unassigned character */ + 0x00A0, /* no-break space: prohibited character */ + 0x0000 +}; + +#define FROM2_UCS4NAME_OFFSET 0 +#define FROM2_PROH_OFFSET 2 +#define FROM2_UNAS_OFFSET 1 + +/* + * Sample string for `from' argument for isvalidbidi(). + * (It is not a valid bidi label.) + */ +static const unsigned long bidi_from[4] = { + 0x05BE, /* hebrew punctuation maqaf */ + 0x0041, /* latin capital letter a */ + 0xFEFC, /* arabic ligature lam with alef final form */ + 0x0000 +}; +#define BIDIFROM_OFFSET 1 + +/* + * Empty string. + */ +static const unsigned long ucs4_nullstr[] = { + 0x0000 +}; + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: generic +//-- +// Nothing happens. +{ + idn_result_t r; + idn_nameprep_t handle = NULL; + +} + +//# SETUP +// group: check +//-- +// Initialize the module and create contexts. +{ + idn_result_t r; + idn_nameprep_t handle11 = NULL; + + r = idn_nameprep_create("RFC3491", &handle11); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: check +//-- +// Destroy contexts. +{ + if (handle11 != NULL) { + idn_nameprep_destroy(handle11); + } +} + +//# SETUP +// group: quiet +//-- +// Set log level to `fatal' to supress log messages. +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +//-- +// Restore log level. +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: idn_nameprep_create() - boundary condition +// group: generic quiet +{ + r = idn_nameprep_create("", &handle); + ASSERT_RESULT(r, idn_notfound); +} + +//# TESTCASE +// title: idn_nameprep_create() - version is NULL (current nameprep) +// group: generic quiet +{ + unsigned long to[BUF_SIZE]; + const unsigned long *found; + + r = idn_nameprep_create(NULL, &handle); + ASSERT_RESULT(r, idn_success); + + r = idn_nameprep_map(handle, map_from, to, BUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, map_expected); + + r = idn_nameprep_isunassigned(handle, check_from, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, check_from + FROM_UNAS_OFFSET); + + r = idn_nameprep_isprohibited(handle, check_from, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, check_from + FROM_PROH_OFFSET); + + r = idn_nameprep_isvalidbidi(handle, bidi_from, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, bidi_from + BIDIFROM_OFFSET); + + idn_nameprep_destroy(handle); +} + +//# TESTCASE +// title: idn_nameprep_create() - nameprep-01 +// group: generic quiet +{ + r = idn_nameprep_create("nameprep-01", &handle); + ASSERT_RESULT(r, idn_notfound); +} + +//# TESTCASE +// title: idn_nameprep_create() - RFC3491 +// group: generic +{ + r = idn_nameprep_create("RFC3491", &handle); + ASSERT_RESULT(r, idn_success); + idn_nameprep_destroy(handle); +} + +//# TESTCASE +// title: idn_nameprep_map() - boundary condition +// group: check +{ + unsigned long to[BUF_SIZE]; + + r = idn_nameprep_map(handle11, ucs4_nullstr, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + r = idn_nameprep_map(handle11, ucs4_nullstr, to, 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, ucs4_nullstr); +} + +//# TESTCASE +// title: idn_nameprep_map() - RFC3491 +// group: check +{ + unsigned long to[BUF_SIZE]; + + r = idn_nameprep_map(handle11, map_from, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); + r = idn_nameprep_map(handle11, map_from, to, BUF_SIZE - 1); + ASSERT_RESULT(r, idn_buffer_overflow); + r = idn_nameprep_map(handle11, map_from, to, BUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, map_expected); +} + +//# TESTCASE +// title: idn_nameprep_isunassigned() - boundary condition +// group: check +{ + const unsigned long *found; + + r = idn_nameprep_isunassigned(handle11, ucs4_nullstr, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, NULL); +} + +//# TESTCASE +// title: idn_nameprep_isunassigned() - RFC3491 +// group: check +{ + const unsigned long *found; + + r = idn_nameprep_isunassigned(handle11, check_from, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, check_from + FROM_UNAS_OFFSET); + + r = idn_nameprep_isunassigned(handle11, check_from2, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, check_from2 + FROM2_UNAS_OFFSET); +} + +//# TESTCASE +// title: idn_nameprep_isprohibited() - boundary condition +// group: check +{ + const unsigned long *found; + + r = idn_nameprep_isprohibited(handle11, ucs4_nullstr, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, NULL); +} + +//# TESTCASE +// title: idn_nameprep_isprohibited() - RFC3491 +// group: check +{ + const unsigned long *found; + + r = idn_nameprep_isprohibited(handle11, check_from, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, check_from + FROM_PROH_OFFSET); + + r = idn_nameprep_isprohibited(handle11, check_from2, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, check_from2 + FROM2_PROH_OFFSET); +} + +//# TESTCASE +// title: idn_nameprep_isvalidbidi() - boundary condition +// group: check +{ + const unsigned long *found; + + r = idn_nameprep_isvalidbidi(handle11, ucs4_nullstr, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, NULL); +} + +//# TESTCASE +// title: idn_nameprep_isvalidbidi() - RFC3491 +// group: check +{ + const unsigned long *found; + + r = idn_nameprep_isvalidbidi(handle11, bidi_from, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, bidi_from + BIDIFROM_OFFSET); + + r = idn_nameprep_isvalidbidi(handle11, check_from2, &found); + ASSERT_RESULT(r, idn_success); + ASSERT_PTR(found, NULL); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/normalizer.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/normalizer.tsy new file mode 100644 index 00000000..dc9906d4 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/normalizer.tsy @@ -0,0 +1,346 @@ +#ifndef lint +static char *rcsid = "$Id: normalizer.tsy,v 1.1.1.1 2003/06/04 00:26:57 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <idn/normalizer.h> +#include <idn/log.h> +#include <idn/ucs4.h> + +#define BUF_SIZE 64 +#define TOBUF_SIZE 4 +#define ARRAY_SIZE 20 +#define CONF_FILENAME "test.map" + +/* + * Sample string for `from' argument of normalize(), + * and its expected outputs. + */ +static const unsigned long from[4] = { + 0x304B, /* hiragana letter ka */ + 0x3099, /* combining katakana-hiragana voiced sound mark */ + 0x32D0, /* circled katakana a */ + 0x0000 +}; + +static const unsigned long normalized_kc_str[3] = { + 0x304C, /* hiragana letter ga */ + 0x30A2, /* katakana letter a */ + 0x0000 +}; + +static const unsigned long normalized_c_str[3] = { + 0x304C, /* hiragana letter ga */ + 0x32D0, /* circled katakana a */ + 0x0000 +}; + +idn_result_t +test_proc(const unsigned long *from, unsigned long *to, size_t tolen) +{ + if (tolen > idn_ucs4_strlen(from)) { + idn_ucs4_strcpy(to, from); + } else { + return (idn_buffer_overflow); + } + + return (idn_success); +} + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: noinit +//-- +// Do nothing +{ + idn_result_t r; + const char *name; +} + +//# SETUP +// group: generic +//-- +// Initialize the module and create context. +{ + idn_result_t r; + idn_normalizer_t ctx = NULL; + + r = idn_normalizer_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: generic +//-- +// Destroy context. +{ + idn_normalizer_destroy(ctx); +} + +//# SETUP +// group: addall +//-- +// Initialize the module and create context. +{ + idn_result_t r; + idn_normalizer_t ctx = NULL; + char *names[ARRAY_SIZE]; + int i; + + for (i = 0; i < ARRAY_SIZE; i++) { + names[i] = malloc(BUF_SIZE); + if (names[i] == NULL) { + ASSERT("malloc failed\n"); + } + } + + strcpy(names[0], "RFC3491"); + strcpy(names[1], "unicode-form-kc"); + strcpy(names[2], "unicode-form-kc/3.2.0"); + strcpy(names[3], "RFC3491"); + strcpy(names[4], "unicode-form-kc"); + strcpy(names[5], "unicode-form-kc/3.2.0"); + strcpy(names[6], "RFC3491"); + strcpy(names[7], "unicode-form-kc"); + strcpy(names[8], "unicode-form-kc/3.2.0"); + strcpy(names[9], "RFC3491"); + strcpy(names[10], "unicode-form-kc"); + strcpy(names[11], "unicode-form-kc/3.2.0"); + strcpy(names[12], "RFC3491"); + strcpy(names[13], "unicode-form-kc"); + strcpy(names[14], "unicode-form-kc/3.2.0"); + strcpy(names[15], "RFC3491"); + strcpy(names[16], "unicode-form-kc"); + strcpy(names[17], "unicode-form-kc/3.2.0"); + strcpy(names[18], "RFC3491"); + strcpy(names[19], "unicode-form-kc"); + + r = idn_normalizer_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: addall +//-- +// Destroy context. +{ + idn_normalizer_destroy(ctx); + for (i = 0; i < ARRAY_SIZE; i++) { + free(names[i]); + } +} + +//# SETUP +// group: quiet +//-- +// Set log level to `fatal' to supress log messages. +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +//-- +// Restore log level. +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: idn_normalizer_add() - boundary condition +// group: generic quiet +{ + r = idn_normalizer_add(ctx, ""); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_normalizer_add() - builtin schemes +// group: generic quiet +{ + r = idn_normalizer_add(ctx, "RFC3491"); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_add(ctx, "unicode-form-kc"); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_add(ctx, "unicode-form-kc/3.2.0"); + ASSERT_RESULT(r, idn_success); + + r = idn_normalizer_add(ctx, "nameprep-01"); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_normalizer_addall() - boundary condition +// group: addall quiet +{ + strcpy(names[3], ""); + r = idn_normalizer_addall(ctx, (const char **)names, ARRAY_SIZE); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: idn_normalizer_addall() - nschemes is 0 +// group: addall quiet +{ + r = idn_normalizer_addall(ctx, (const char **)names, 0); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: idn_normalizer_addall() - add a lot of schemes +// group: addall quiet +{ + unsigned long to[TOBUF_SIZE]; + + r = idn_normalizer_addall(ctx, (const char **)names, ARRAY_SIZE); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_normalize(ctx, from, to, TOBUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, normalized_kc_str); +} + +//# TESTCASE +// title: idn_normalizer_addall() - add same scheme repetedly +// group: addall quiet +{ + int i; + unsigned long to[TOBUF_SIZE]; + + for (i = 0; i < ARRAY_SIZE; i++) { + strcpy(names[i], "RFC3491"); + } + r = idn_normalizer_addall(ctx, (const char **)names, ARRAY_SIZE); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_normalize(ctx, from, to, TOBUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, normalized_kc_str); +} + +//# TESTCASE +// title: idn_normalizer_normalize() - schemes check - RFC3491 +// group: generic quiet +{ + unsigned long to[TOBUF_SIZE]; + + r = idn_normalizer_add(ctx, "RFC3491"); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_normalize(ctx, from, to, TOBUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, normalized_kc_str); +} + +//# TESTCASE +// title: idn_normalizer_normalize() - schemes check - unicode-form-kc/3.2.0 +// group: generic quiet +{ + unsigned long to[TOBUF_SIZE]; + + r = idn_normalizer_add(ctx, "unicode-form-kc/3.2.0"); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_normalize(ctx, from, to, TOBUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, normalized_kc_str); +} + +//# TESTCASE +// title: idn_normalizer_normalize() - context without procedure +// group: generic quiet +{ + unsigned long to[TOBUF_SIZE]; + + r = idn_normalizer_normalize(ctx, from, to, TOBUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, from); +} + +//# TESTCASE +// title: idn_normalizer_destroy(), idn_normalizer_incrref() +// group: +{ + idn_result_t r; + idn_normalizer_t ctx = NULL; + + r = idn_normalizer_initialize(); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_create(&ctx); + ASSERT_RESULT(r, idn_success); + idn_normalizer_incrref(ctx); + idn_normalizer_destroy(ctx); + idn_normalizer_destroy(ctx); +} + +//# TESTCASE +// title: idn_normalizer_register() +// group: generic quiet +{ + unsigned long to[TOBUF_SIZE]; + + r = idn_normalizer_register("test", test_proc); + ASSERT_RESULT(r, idn_success); + r = idn_normalizer_add(ctx, "test"); + ASSERT_RESULT(r, idn_success); + + r = idn_normalizer_normalize(ctx, from, to, TOBUF_SIZE); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, from); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/res.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/res.tsy new file mode 100644 index 00000000..39c3895f --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/res.tsy @@ -0,0 +1,1026 @@ +#ifndef lint +static char *rcsid = "$Id: res.tsy,v 1.1.1.1 2003/06/04 00:26:59 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <idn/res.h> +#include <idn/log.h> + +#include "codeset.h" +#include "setenv.h" + +#ifndef EUCJP_ENCODING_NAME +#define EUCJP_ENCODING_NAME "eucJP" +#endif + +/* + * U+304B: hiragana letter KA + * U+3099: combining katakana-hiragana voiced sound mark + * + * map("U+304B U+3099") -> "U+304C" + * + * U+304C: hiragana letter GA + */ +#define UTF8_NAME "A<U+304B><U+3099>" +#define UTF8_REVNAME "a<U+304C>" + +/* + * A4AC: hiragana letter GA (in EUC-JP) + */ +#define EUCJP_NAME "\xa4\xac" +#define EUCJP_REVNAME "\xa4\xac" + +/* + * Conversion result of "U+304B U+3099 A" + */ +#define PUNYCODE_NAME "xn--a-i8t" + +/* + * Conversion result of "A U+304B U+3099" (in EUC-JP). + */ +#define AUX_EUCJP_NAME "xn--a-i\xa3\xb8t" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: generic-conversion +//-- +// Initialize the `resconf' context. +// Set local encoding to `UTF-8'. +{ + char to[256]; + idn_result_t r; + idn_resconf_t ctx; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + unsetenv("IDN_DISABLE"); + + r = idn_resconf_initialize(); + ASSERT_RESULT(r, idn_success); + + r = idn_resconf_create(&ctx); + ASSERT_RESULT(r, idn_success); + + r = idn_resconf_setdefaults(ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: generic-conversion +{ + idn_resconf_destroy(ctx); +} + +//# SETUP +// group: quiet +//-- +// Set log level to `fatal' to supress log messages. +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +//-- +// Restore log level. +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: basic conversion by encodename() +// group: generic-conversion +{ + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: basic conversion by decodename() +// group: generic-conversion +{ + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +} + +//# TESTCASE +// title: basic conversion by decodename2() +// group: generic-conversion +{ + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); +#ifdef WITHOUT_ICONV + ASSERT_RESULT(r, idn_failure); +#else + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +#endif +} + +//# TESTCASE +// title: call decodename2() with auxencoding=NULL +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to), + NULL); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +#endif +} + +//# TESTCASE +// title: call encodename() with actions=0 +// group: generic-conversion +{ + r = idn_res_encodename(ctx, 0, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: call decodename() with actions=0 +// group: generic-conversion +{ + r = idn_res_decodename(ctx, 0, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: call decodename2() with actions=0 +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, 0, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: call encodename() with actions=rtcheck +// group: generic-conversion quiet +{ + r = idn_res_encodename(ctx, IDN_RTCHECK, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=decode-query +// group: generic-conversion quiet +{ + r = idn_res_encodename(ctx, IDN_DECODE_QUERY, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=decode-app +// group: generic-conversion quiet +{ + r = idn_res_encodename(ctx, IDN_DECODE_APP, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=decode-stored +// group: generic-conversion quiet +{ + r = idn_res_encodename(ctx, IDN_DECODE_STORED, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call encodename() with actions=(1<<31) +// group: generic-conversion quiet +{ + r = idn_res_encodename(ctx, 1 << 31, EUCJP_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename() with actions=localmap +// group: generic-conversion quiet +{ + r = idn_res_decodename(ctx, IDN_LOCALMAP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=localmap +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_LOCALMAP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=lencheck +// group: generic-conversion quiet +{ + r = idn_res_decodename(ctx, IDN_LENCHECK, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=lencheck +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_LENCHECK, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=encode-query +// group: generic-conversion quiet +{ + r = idn_res_decodename(ctx, IDN_ENCODE_QUERY, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=encode-query +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_ENCODE_QUERY, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=encode-app +// group: generic-conversion quiet +{ + r = idn_res_decodename(ctx, IDN_ENCODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=encode-app +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_ENCODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=encode-stored +// group: generic-conversion quiet +{ + r = idn_res_decodename(ctx, IDN_ENCODE_STORED, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=encode-stored +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_ENCODE_STORED, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=(1<<31) +// group: generic-conversion quiet +{ + r = idn_res_decodename(ctx, 1 << 31, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +} + +//# TESTCASE +// title: call decodename2() with actions=(1<<31) +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, 1 << 31, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call encodename() with actions=localconv +// group: generic-conversion quiet +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_encodename(ctx, IDN_LOCALCONV, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename() with actions=localconv +// group: generic-conversion quiet +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename(ctx, IDN_LOCALCONV, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_action); +#endif +} + +//# TESTCASE +// title: call decodename2() with actions=localconv +// group: generic-conversion +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_LOCALCONV, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_failure); +#endif +} + +//# TESTCASE +// title: call enable(0) and then encodename() +// group: generic-conversion +{ + idn_res_enable(0); + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: call decodename() when IDN_DISABLE is defined +// group: generic-conversion +{ + idn_res_enable(0); + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: call decodename() when IDN_DISABLE is defined +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + idn_res_enable(0); + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: call enable(0) and then encodename() +// group: generic-conversion +{ + idn_res_enable(0); + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: call enable(0) and then decodename() +// group: generic-conversion +{ + idn_res_enable(0); + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: call enable(0) and then decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + idn_res_enable(0); + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: set IDN_DISABLE and call encodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); +} + +//# TESTCASE +// title: set IDN_DISABLE and call decodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: set IDN_DISABLE and call decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + setenv("IDN_DISABLE", "1", 1); + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); +#endif +} + +//# TESTCASE +// title: set IDN_DISABLE, and then call enable(1) and encodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + idn_res_enable(1); + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); +} + +//# TESTCASE +// title: set IDN_DISABLE, and then call enable(1) and decodename() +// group: generic-conversion +{ + setenv("IDN_DISABLE", "1", 1); + idn_res_enable(1); + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +} + +//# TESTCASE +// title: set IDN_DISABLE, and then call enable(1) and decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + setenv("IDN_DISABLE", "1", 1); + idn_res_enable(1); + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); +#endif +} + +//# TESTCASE +// title: overrun test for arg `to' of encodename() +// group: generic-conversion +{ + /* Normal case */ + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, + strlen(PUNYCODE_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); + + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, + strlen(PUNYCODE_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* enable(0) case */ + idn_res_enable(0); + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, + strlen(UTF8_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); + + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, + strlen(UTF8_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* actions=0 case */ + idn_res_enable(1); + r = idn_res_encodename(ctx, 0, UTF8_NAME, to, strlen(UTF8_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_NAME); + + r = idn_res_encodename(ctx, 0, UTF8_NAME, to, strlen(UTF8_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: overrun test for arg `to' of decodename() +// group: generic-conversion +{ + /* Normal case */ + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(UTF8_REVNAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); + + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(UTF8_REVNAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* idn_res_enable(0) case */ + idn_res_enable(0); + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(PUNYCODE_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); + + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, + strlen(PUNYCODE_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* actions=0 case */ + idn_res_enable(1); + r = idn_res_decodename(ctx, 0, PUNYCODE_NAME, to, + strlen(PUNYCODE_NAME) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, PUNYCODE_NAME); + + r = idn_res_decodename(ctx, 0, PUNYCODE_NAME, to, + strlen(PUNYCODE_NAME)); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: overrun test for arg `to' of decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* Normal case */ + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(UTF8_REVNAME) + 1, EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, UTF8_REVNAME); + + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(UTF8_REVNAME), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* idn_res_enable(0) case */ + idn_res_enable(0); + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(AUX_EUCJP_NAME) + 1, EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); + + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, + strlen(AUX_EUCJP_NAME), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); + + /* actions=0 case */ + idn_res_enable(1); + r = idn_res_decodename2(ctx, 0, AUX_EUCJP_NAME, to, + strlen(AUX_EUCJP_NAME) + 1, EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, AUX_EUCJP_NAME); + + r = idn_res_decodename2(ctx, 0, AUX_EUCJP_NAME, to, + strlen(AUX_EUCJP_NAME), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); + +#endif +} + +//# TESTCASE +// title: call encodename() with tolen=0 +// group: generic-conversion +{ + r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: call decodename() with tolen=0 +// group: generic-conversion +{ + r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: call decodename2() with tolen=0 +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, 0, + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_buffer_overflow); +#endif +} + +//# TESTCASE +// title: convert an empty string using encodename() +// group: generic-conversion +{ + r = idn_res_encodename(ctx, IDN_ENCODE_APP, "", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); +} + +//# TESTCASE +// title: convert an empty string using decodename() +// group: generic-conversion +{ + r = idn_res_decodename(ctx, IDN_DECODE_APP, "", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); +} + +//# TESTCASE +// title: convert an empty string using decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + r = idn_res_decodename2(ctx, IDN_DECODE_APP, "", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); +#endif +} + +//# TESTCASE +// title: prohcheck by encodename() +// group: generic-conversion +{ + /* U+1680: prohibited character */ + r = idn_res_encodename(ctx, IDN_PROHCHECK, "<U+1680>", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: unascheck by encodename() +// group: generic-conversion +{ + /* U+0221: unassigned codepoint */ + r = idn_res_encodename(ctx, IDN_UNASCHECK, "<U+0221>", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: bidicheck by encodename() +// group: generic-conversion +{ + /* U+05D0: bidirectional property is "R" */ + /* `a': bidirectional property is "L" */ + /* `0', `-': bidirectional property is "N" */ + r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0>", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0><U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0><U+05D0>-a", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0>-a-<U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_res_encodename(ctx, IDN_BIDICHECK, "a-<U+05D0><U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0><U+05D0>-0", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0>-0-<U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_res_encodename(ctx, IDN_BIDICHECK, "0-<U+05D0><U+05D0>", + to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: asccheck by encodename() +// group: generic-conversion +{ + r = idn_res_encodename(ctx, IDN_ASCCHECK, "-name", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_res_encodename(ctx, IDN_ASCCHECK, "name-", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); + + r = idn_res_encodename(ctx, IDN_ASCCHECK, "n ame", to, sizeof(to)); + ASSERT_RESULT(r, idn_prohibited); +} + +//# TESTCASE +// title: lencheck by encodename() +// group: generic-conversion +{ + r = idn_res_encodename(ctx, IDN_LENCHECK, + "123456789-123456789-123456789-123456789-" + "123456789-123456789-123", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + + r = idn_res_encodename(ctx, IDN_LENCHECK, + "123456789-123456789-123456789-123456789-" + "123456789-123456789-1234", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_length); + + r = idn_res_encodename(ctx, IDN_LENCHECK, "a..b", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_length); +} + +//# TESTCASE +// title: rtcheck non-prohchecked label by decodename() +// group: generic-conversion +{ + /* "xn--6ue" -> "U+1680" (prohibited character) */ + r = idn_res_decodename(ctx, IDN_RTCHECK, "xn--6ue", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6ue"); +} + +//# TESTCASE +// title: rtcheck non-unaschecked label by decodename() +// group: generic-conversion +{ + /* "xn--6la" -> "U+0221" (unassigned codepoint) */ + r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK, + "xn--6la", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6la"); +} + +//# TESTCASE +// title: rtcheck non-ascchecked label by decodename() +// group: generic-conversion +{ + /* "xn----x7t" -> "- U+3042" */ + r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----x7t", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----x7t"); + + /* "xn----w7t" -> "U+3042 -" */ + r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----w7t", to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----w7t"); +} + +//# TESTCASE +// title: rtcheck non-lenchecked label by decodename() +// group: generic-conversion +{ + /* `s1' has 63 characters */ + const char *s1 = + "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + const char *s1rev = + "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>" + "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>" + "<U+5DDD><U+3042><U+3042><U+3042>"; + + /* `s2' has 64 characters */ + const char *s2 = + "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + /* `s3' has an empty label */ + const char *s3 = "a..b"; + + r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s1rev); + + r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s2); + + r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s3); +} + +//# TESTCASE +// title: rtcheck non-prohchecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "xn--6ue" -> "U+1680" (prohibited character) */ + r = idn_res_decodename2(ctx, IDN_RTCHECK, "xn--6ue", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6ue"); +#endif +} + +//# TESTCASE +// title: rtcheck non-unaschecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "xn--6la" -> "U+0221" (unassigned codepoint) */ + r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK, + "xn--6la", to, sizeof(to), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn--6la"); +#endif +} + +//# TESTCASE +// title: rtcheck non-ascchecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "xn----x7t" -> "- U+3042" */ + r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----x7t", to, sizeof(to), EUCJP_ENCODING_NAME); + + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----x7t"); + + /* "xn----w7t" -> "U+3042 -" */ + r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK, + "xn----w7t", to, sizeof(to), EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, "xn----w7t"); +#endif +} + +//# TESTCASE +// title: rtcheck non-lenchecked label by decodename2() +// group: generic-conversion +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* `s1' has 63 characters */ + const char *s1 = + "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + const char *s1rev = + "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>" + "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>" + "<U+5DDD><U+3042><U+3042><U+3042>"; + + /* `s2' has 64 characters */ + const char *s2 = + "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b"; + + /* `s3' has an empty label */ + const char *s3 = "a..b"; + + r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s1rev); + + r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s2); + + r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to)); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, s3); +#endif +} + +//# TESTCASE +// title: pass broken string as `from' to encodename() +// group: generic-conversion quiet +{ + /* "\xe3\x21" is not valid UTF-8 string */ + r = idn_res_encodename(ctx, IDN_ENCODE_APP, "\xe3\x21", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_encoding); +} + +//# TESTCASE +// title: pass broken string as `from' to decodename() +// group: generic-conversion quiet +{ + /* "\xe3\x21" is not valid UTF-8 string */ + r = idn_res_decodename(ctx, IDN_DECODE_APP, "\xe3\x21", to, sizeof(to)); + ASSERT_RESULT(r, idn_invalid_encoding); +} + +//# TESTCASE +// title: pass broken string as `from' to decodename2() +// group: generic-conversion quiet +{ +#ifdef WITHOUT_ICONV + SKIP_TESTCASE; +#else + /* "\xa4\x21" is not valid EUC-JP string */ + r = idn_res_decodename2(ctx, IDN_DECODE_APP, "\xa4\x21", to, sizeof(to), + EUCJP_ENCODING_NAME); + ASSERT_RESULT(r, idn_invalid_encoding); +#endif +} + diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/resconf.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/resconf.tsy new file mode 100644 index 00000000..a4c2f35d --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/resconf.tsy @@ -0,0 +1,1026 @@ +#ifndef lint +static char *rcsid = "$Id: resconf.tsy,v 1.1.1.1 2003/06/04 00:27:00 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <idn/resconf.h> +#include <idn/converter.h> +#include <idn/log.h> + +#include "setenv.h" +#include "testutil.h" + +#define CONF_FILENAME "test.conf" +#define MAP_FILENAME "test.map" + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: generic-init +{ + idn_result_t r; + idn_resconf_t ctx = NULL; + + setenv("IDN_LOCAL_CODESET", "UTF-8", 1); + + r = idn_resconf_initialize(); + ASSERT_RESULT(r, idn_success); + + r = idn_resconf_create(&ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: generic-init +{ + if (ctx != NULL) + idn_resconf_destroy(ctx); + remove(CONF_FILENAME); + remove(MAP_FILENAME); +} + +//# SETUP +// group: set-defaults +{ + r = idn_resconf_setdefaults(ctx); + ASSERT_RESULT(r, idn_success); +} + +//# TEARDOWN +// group: set-defaults +{ +} + +//# SETUP +// group: quiet +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +{ + idn_log_setlevel(saved_log_level); +} + +//# SETUP +// group: delimitermap_ctx +{ + idn_delimitermap_t delimitermap_ctx1 = NULL; + idn_delimitermap_t delimitermap_ctx2 = NULL; +} + +//# TEARDOWN +// group: delimitermap_ctx +{ + if (delimitermap_ctx1 != NULL) + idn_delimitermap_destroy(delimitermap_ctx1); + if (delimitermap_ctx2 != NULL) + idn_delimitermap_destroy(delimitermap_ctx2); +} + +//# SETUP +// group: idnconverter_ctx +{ + idn_converter_t idnconverter_ctx1 = NULL; + idn_converter_t idnconverter_ctx2 = NULL; +} + +//# TEARDOWN +// group: idnconverter_ctx +{ + if (idnconverter_ctx1 != NULL) + idn_converter_destroy(idnconverter_ctx1); + if (idnconverter_ctx2 != NULL) + idn_converter_destroy(idnconverter_ctx2); +} + +//# SETUP +// group: localconverter_ctx +{ + idn_converter_t localconverter_ctx1 = NULL; + idn_converter_t localconverter_ctx2 = NULL; +} + +//# TEARDOWN +// group: localconverter_ctx +{ + if (localconverter_ctx1 != NULL) + idn_converter_destroy(localconverter_ctx1); + if (localconverter_ctx2 != NULL) + idn_converter_destroy(localconverter_ctx2); +} + +//# SETUP +// group: auxidnconverter_ctx +{ + idn_converter_t auxidnconverter_ctx1 = NULL; + idn_converter_t auxidnconverter_ctx2 = NULL; +} + +//# TEARDOWN +// group: auxidnconverter_ctx +{ + if (auxidnconverter_ctx1 != NULL) + idn_converter_destroy(auxidnconverter_ctx1); + if (auxidnconverter_ctx2 != NULL) + idn_converter_destroy(auxidnconverter_ctx2); +} + +//# SETUP +// group: mapselector_ctx +{ + idn_mapselector_t mapselector_ctx1 = NULL; + idn_mapselector_t mapselector_ctx2 = NULL; +} + +//# TEARDOWN +// group: mapselector_ctx +{ + if (mapselector_ctx1 != NULL) + idn_mapselector_destroy(mapselector_ctx1); + if (mapselector_ctx2 != NULL) + idn_mapselector_destroy(mapselector_ctx2); +} + +//# SETUP +// group: mapper_ctx +{ + idn_mapper_t mapper_ctx1 = NULL; + idn_mapper_t mapper_ctx2 = NULL; +} + +//# TEARDOWN +// group: mapper_ctx +{ + if (mapper_ctx1 != NULL) + idn_mapper_destroy(mapper_ctx1); + if (mapper_ctx2 != NULL) + idn_mapper_destroy(mapper_ctx2); +} + +//# SETUP +// group: normalizer_ctx +{ + idn_normalizer_t normalizer_ctx1 = NULL; + idn_normalizer_t normalizer_ctx2 = NULL; +} + +//# TEARDOWN +// group: normalizer_ctx +{ + if (normalizer_ctx1 != NULL) + idn_normalizer_destroy(normalizer_ctx1); + if (normalizer_ctx2 != NULL) + idn_normalizer_destroy(normalizer_ctx2); +} + +//# SETUP +// group: prohibitchecker_ctx +{ + idn_checker_t prohibitchecker_ctx1 = NULL; + idn_checker_t prohibitchecker_ctx2 = NULL; +} + +//# TEARDOWN +// group: prohibitchecker_ctx +{ + if (prohibitchecker_ctx1 != NULL) + idn_checker_destroy(prohibitchecker_ctx1); + if (prohibitchecker_ctx2 != NULL) + idn_checker_destroy(prohibitchecker_ctx2); +} + +//# SETUP +// group: unassignedchecker_ctx +{ + idn_checker_t unassignedchecker_ctx1 = NULL; + idn_checker_t unassignedchecker_ctx2 = NULL; +} + +//# TEARDOWN +// group: unassignedchecker_ctx +{ + if (unassignedchecker_ctx1 != NULL) + idn_checker_destroy(unassignedchecker_ctx1); + if (unassignedchecker_ctx2 != NULL) + idn_checker_destroy(unassignedchecker_ctx2); +} + +//# SETUP +// group: bidichecker_ctx +{ + idn_checker_t bidichecker_ctx1 = NULL; + idn_checker_t bidichecker_ctx2 = NULL; +} + +//# TEARDOWN +// group: bidichecker_ctx +{ + if (bidichecker_ctx1 != NULL) + idn_checker_destroy(bidichecker_ctx1); + if (bidichecker_ctx2 != NULL) + idn_checker_destroy(bidichecker_ctx2); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call create() without initialization. +//-- +// This must be the first test case. +{ + idn_result_t r; + idn_resconf_t ctx = NULL; + + r = idn_resconf_create(&ctx); + ASSERT_RESULT(r, idn_failure); + + if (ctx != NULL) + idn_resconf_destroy(ctx); +} + +//# TESTCASE +// title: call initialize() twice. +// +{ + idn_result_t r; + + r = idn_resconf_initialize(); + ASSERT_RESULT(r, idn_success); + + r = idn_resconf_initialize(); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: call create() +{ + idn_result_t r; + idn_resconf_t ctx; + + r = idn_resconf_initialize(); + ASSERT_RESULT(r, idn_success); + + r = idn_resconf_create(&ctx); + ASSERT_RESULT(r, idn_success); + + if (ctx != NULL) + idn_resconf_destroy(ctx); +} + +//# TESTCASE +// title: load file (idn-encoding) +// group: generic-init +{ + const char *idn_encoding; + + create_conf_file(CONF_FILENAME, 0, + "idn-encoding Punycode", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: load file (nameprep) +// group: generic-init +{ + const char *idn_encoding; + + create_conf_file(CONF_FILENAME, 0, + "nameprep " IDN_NAMEPREP_CURRENT, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: load file (idn-encoding & nameprep) +// group: generic-init +{ + const char *idn_encoding; + + create_conf_file(CONF_FILENAME, 0, + "idn-encoding Punycode", + "nameprep " IDN_NAMEPREP_CURRENT, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: load file (empty) +// group: generic-init +{ + const char *idn_encoding; + + create_conf_file(CONF_FILENAME, 0, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: load file (local-map filemap) +// group: generic-init +{ + const char *idn_encoding; + + create_conf_file(CONF_FILENAME, 0, + "local-map .jp filemap:" MAP_FILENAME, + NULL); + create_conf_file(MAP_FILENAME, 0, + "2212; FF0D", + NULL); + + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: load file (local-map nameprep) +// group: generic-init +{ + const char *idn_encoding; + + create_conf_file(CONF_FILENAME, 0, + "local-map .jp " IDN_NAMEPREP_CURRENT, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: set defaults +// group: generic-init set-defaults +{ +} + +//# TESTCASE +// title: load file (no file) +// group: generic-init +{ + r = idn_resconf_loadfile(ctx, "no-such-file"); + ASSERT_RESULT(r, idn_nofile); +} + +//# TESTCASE +// title: load file (empty file name) +// group: generic-init +{ + r = idn_resconf_loadfile(ctx, ""); + ASSERT_RESULT(r, idn_nofile); +} + +//# TESTCASE +// title: load file (unknown command) +// group: generic-init quiet +{ + create_conf_file(CONF_FILENAME, 0, + "unknown-command " IDN_NAMEPREP_CURRENT, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: load file (no newline at the end of file) +// group: generic-init quiet +{ + create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE, + "nameprep " IDN_NAMEPREP_CURRENT, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: load file (too long line) +// group: generic-init quiet +{ + char arg[1024]; + char *line; + + /* arg = "local-map . ////..." */ + memset(arg, '/', sizeof(arg)); + arg[sizeof(arg) - 1] = '\0'; + line = "local-map . "; + memcpy(arg, line, strlen(line)); + + create_conf_file(CONF_FILENAME, 0, arg, NULL); + + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: load file (empty file) +// group: generic-init +{ + create_conf_file(CONF_FILENAME, 0, "", NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: load file (invalid parameter for idn-encoding) +// group: generic-init quiet +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + create_conf_file(CONF_FILENAME, 0, + "idn-encoding invalid-encoding-name", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_name); +#endif +} + +//# TESTCASE +// title: load file (define idn-encoding twice) +// group: generic-init quiet +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE, + "idn-encoding Punycode", + "idn-encoding Punycode", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +#endif +} + +//# TESTCASE +// title: load file (invalid parameter for nameprep) +// group: generic-init quiet +{ + create_conf_file(CONF_FILENAME, 0, + "nameprep invalid-version", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: load file (define nameprep twice) +// group: generic-init quiet +{ +#ifndef WITHOUT_ICONV + SKIP_TESTCASE; +#else + create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE, + "nameprep " IDN_NAMEPREP_CURRENT, + "nameprep " IDN_NAMEPREP_CURRENT, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +#endif +} + +//# TESTCASE +// title: load file (invalid parameter for local-map) +// group: generic-init quiet +{ + create_conf_file(CONF_FILENAME, 0, + "local-map .jp :", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_name); + + create_conf_file(CONF_FILENAME, 0, + "local-map .jp invalid:/dev/null", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_name); + + create_conf_file(CONF_FILENAME, 0, + "local-map .jp filemap", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_nofile); + + create_conf_file(CONF_FILENAME, 0, + "local-map .jp filemap:", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_nofile); + + create_conf_file(CONF_FILENAME, 0, + "local-map .jp filemap:no-such-file", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_nofile); + + create_conf_file(CONF_FILENAME, 0, + "local-map " + "abcdefghijklmnopqrstuvwxyz0123" + "abcdefghijklmnopqrstuvwxyz0123" + "4567 " + IDN_NAMEPREP_CURRENT, + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_name); +} + +//# TESTCASE +// title: load file (pass wrong number of parameters to idn-encoding) +// group: generic-init quiet +{ + create_conf_file(CONF_FILENAME, 0, + "idn-encoding ", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); + + create_conf_file(CONF_FILENAME, 0, + "idn-encoding Punycode ?", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: load file (pass wrong number of parameters to nameprep) +// group: generic-init quiet +{ + create_conf_file(CONF_FILENAME, 0, + "nameprep ", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); + + create_conf_file(CONF_FILENAME, 0, + "nameprep " IDN_NAMEPREP_CURRENT " ?", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: load file (pass wrong number of parameters to local-map) +// group: generic-init quiet +{ + create_conf_file(CONF_FILENAME, 0, + "local-map ", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); + + create_conf_file(CONF_FILENAME, 0, + "local-map .jp ", + NULL); + r = idn_resconf_loadfile(ctx, CONF_FILENAME); + ASSERT_RESULT(r, idn_invalid_syntax); +} + +//# TESTCASE +// title: getdelimitermap +// group: generic-init set-defaults delimitermap_ctx +{ + delimitermap_ctx1 = idn_resconf_getdelimitermap(ctx); + ASSERT_PTR_NE(delimitermap_ctx1, NULL); +} + +//# TESTCASE +// title: setdelimitermap +// group: generic-init set-defaults delimitermap_ctx +{ + r = idn_delimitermap_create(&delimitermap_ctx1); + ASSERT_RESULT(r, idn_success); + + /* set delimitermap context. */ + idn_resconf_setdelimitermap(ctx, delimitermap_ctx1); + delimitermap_ctx2 = idn_resconf_getdelimitermap(ctx); + ASSERT_PTR(delimitermap_ctx2, delimitermap_ctx1); + idn_delimitermap_destroy(delimitermap_ctx2); + + /* set NULL as delimitermap context */ + idn_resconf_setdelimitermap(ctx, NULL); + delimitermap_ctx2 = idn_resconf_getdelimitermap(ctx); + ASSERT_PTR(delimitermap_ctx2, NULL); +} + +//# TESTCASE +// title: addalldelimitermapucs +// group: generic-init set-defaults +{ + static unsigned long v[] = {0x002C, 0x3001, 0xFF0C}; + int nv = sizeof(v) / sizeof(*v); + + r = idn_resconf_addalldelimitermapucs(ctx, v, nv); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: getidnconverter +// group: generic-init set-defaults idnconverter_ctx +{ + idnconverter_ctx1 = idn_resconf_getidnconverter(ctx); + ASSERT_PTR_NE(idnconverter_ctx1, NULL); +} + +//# TESTCASE +// title: setidnconverter +// group: generic-init set-defaults idnconverter_ctx +{ + r = idn_converter_create("Punycode", &idnconverter_ctx1, 0); + ASSERT_RESULT(r, idn_success); + + /* set idnconverter context. */ + idn_resconf_setidnconverter(ctx, idnconverter_ctx1); + idnconverter_ctx2 = idn_resconf_getidnconverter(ctx); + ASSERT_PTR(idnconverter_ctx2, idnconverter_ctx1); + idn_converter_destroy(idnconverter_ctx2); + + /* set NULL as idnconverter context */ + idn_resconf_setidnconverter(ctx, NULL); + idnconverter_ctx2 = idn_resconf_getidnconverter(ctx); + ASSERT_PTR(idnconverter_ctx2, NULL); +} + +//# TESTCASE +// title: getlocalconverter +// group: generic-init set-defaults localconverter_ctx +{ + localconverter_ctx1 = idn_resconf_getlocalconverter(ctx); +#ifdef WITHOUT_ICONV + ASSERT_PTR(localconverter_ctx1, NULL); +#else + ASSERT_PTR_NE(localconverter_ctx1, NULL); +#endif +} + +//# TESTCASE +// title: setlocalconverter +// group: generic-init set-defaults localconverter_ctx +{ + r = idn_converter_create("UTF-8", &localconverter_ctx1, 0); + ASSERT_RESULT(r, idn_success); + + /* set localconverter context. */ + idn_resconf_setlocalconverter(ctx, localconverter_ctx1); + localconverter_ctx2 = idn_resconf_getlocalconverter(ctx); +#ifdef WITHOUT_ICONV + ASSERT_PTR(localconverter_ctx2, NULL); +#else + ASSERT_PTR(localconverter_ctx2, localconverter_ctx1); + idn_converter_destroy(localconverter_ctx2); +#endif + + /* set NULL as localconverter context */ + idn_resconf_setlocalconverter(ctx, NULL); + localconverter_ctx2 = idn_resconf_getlocalconverter(ctx); +#ifdef WITHOUT_ICONV + ASSERT_PTR(localconverter_ctx2, NULL); +#else + ASSERT_PTR_NE(localconverter_ctx2, NULL); +#endif +} + +//# TESTCASE +// title: getauxidnconverter +// group: generic-init set-defaults auxidnconverter_ctx +{ + auxidnconverter_ctx1 = idn_resconf_getauxidnconverter(ctx); + ASSERT_PTR(auxidnconverter_ctx1, NULL); +} + +//# TESTCASE +// title: setauxidnconverter +// group: generic-init set-defaults auxidnconverter_ctx +{ + r = idn_converter_create("Punycode", &auxidnconverter_ctx1, 0); + ASSERT_RESULT(r, idn_success); + + /* set auxidnconverter context. */ + idn_resconf_setauxidnconverter(ctx, auxidnconverter_ctx1); + auxidnconverter_ctx2 = idn_resconf_getauxidnconverter(ctx); + ASSERT_PTR(auxidnconverter_ctx2, auxidnconverter_ctx1); + idn_converter_destroy(auxidnconverter_ctx2); + + /* set NULL as auxidnconverter context */ + idn_resconf_setauxidnconverter(ctx, NULL); + auxidnconverter_ctx2 = idn_resconf_getauxidnconverter(ctx); + ASSERT_PTR(auxidnconverter_ctx2, NULL); +} + +//# TESTCASE +// title: getlocalmapselector +// group: generic-init set-defaults mapselector_ctx +{ + mapselector_ctx1 = idn_resconf_getlocalmapselector(ctx); + ASSERT_PTR(mapselector_ctx1, NULL); +} + +//# TESTCASE +// title: setlocalmapselector +// group: generic-init set-defaults mapselector_ctx +{ + r = idn_mapselector_create(&mapselector_ctx1); + ASSERT_RESULT(r, idn_success); + + /* set localmapselector context. */ + idn_resconf_setlocalmapselector(ctx, mapselector_ctx1); + mapselector_ctx2 = idn_resconf_getlocalmapselector(ctx); + ASSERT_PTR(mapselector_ctx2, mapselector_ctx1); + idn_mapselector_destroy(mapselector_ctx2); + + /* set NULL as localmapselector context */ + idn_resconf_setlocalmapselector(ctx, NULL); + mapselector_ctx2 = idn_resconf_getlocalmapselector(ctx); + ASSERT_PTR(mapselector_ctx2, NULL); +} + +//# TESTCASE +// title: addalllocalmapselectornames +// group: generic-init set-defaults +{ + static const char *names[] = { + "filemap:" MAP_FILENAME, + "filemap:" MAP_FILENAME, + "filemap:" MAP_FILENAME + }; + int nnames = sizeof(names) / sizeof(*names); + + create_conf_file(MAP_FILENAME, 0, + "2212; FF0D", + NULL); + r = idn_resconf_addalllocalmapselectornames(ctx, ".jp", names, nnames); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: getmapper +// group: generic-init set-defaults mapper_ctx +{ + mapper_ctx1 = idn_resconf_getmapper(ctx); + ASSERT_PTR_NE(mapper_ctx1, NULL); +} + +//# TESTCASE +// title: setmapper +// group: generic-init set-defaults mapper_ctx +{ + r = idn_mapper_create(&mapper_ctx1); + ASSERT_RESULT(r, idn_success); + + /* set mapper context. */ + idn_resconf_setmapper(ctx, mapper_ctx1); + mapper_ctx2 = idn_resconf_getmapper(ctx); + ASSERT_PTR(mapper_ctx2, mapper_ctx1); + idn_mapper_destroy(mapper_ctx2); + + /* set NULL as mapper context */ + idn_resconf_setmapper(ctx, NULL); + mapper_ctx2 = idn_resconf_getmapper(ctx); + ASSERT_PTR(mapper_ctx2, NULL); +} + +//# TESTCASE +// title: addallmappernames +// group: generic-init set-defaults +{ + static const char *names[] = { + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT + }; + int nnames = sizeof(names) / sizeof(*names); + + r = idn_resconf_addallmappernames(ctx, names, nnames); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: getnormalizer +// group: generic-init set-defaults normalizer_ctx +{ + normalizer_ctx1 = idn_resconf_getnormalizer(ctx); + ASSERT_PTR_NE(normalizer_ctx1, NULL); +} + +//# TESTCASE +// title: setnormalizer +// group: generic-init set-defaults normalizer_ctx +{ + r = idn_normalizer_create(&normalizer_ctx1); + ASSERT_RESULT(r, idn_success); + + /* set normalizer context. */ + idn_resconf_setnormalizer(ctx, normalizer_ctx1); + normalizer_ctx2 = idn_resconf_getnormalizer(ctx); + ASSERT_PTR(normalizer_ctx2, normalizer_ctx1); + idn_normalizer_destroy(normalizer_ctx2); + + /* set NULL as normalizer context */ + idn_resconf_setnormalizer(ctx, NULL); + normalizer_ctx2 = idn_resconf_getnormalizer(ctx); + ASSERT_PTR(normalizer_ctx2, NULL); +} + +//# TESTCASE +// title: addallnormalizernames +// group: generic-init set-defaults +{ + static const char *names[] = { + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT + }; + int nnames = sizeof(names) / sizeof(*names); + + r = idn_resconf_addallnormalizernames(ctx, names, nnames); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: getprohibitchecker +// group: generic-init set-defaults prohibitchecker_ctx +{ + prohibitchecker_ctx1 = idn_resconf_getprohibitchecker(ctx); + ASSERT_PTR_NE(prohibitchecker_ctx1, NULL); +} + +//# TESTCASE +// title: setprohibitchecker +// group: generic-init set-defaults prohibitchecker_ctx +{ + r = idn_checker_create(&prohibitchecker_ctx1); + ASSERT_RESULT(r, idn_success); + + /* set checker context. */ + idn_resconf_setprohibitchecker(ctx, prohibitchecker_ctx1); + prohibitchecker_ctx2 = idn_resconf_getprohibitchecker(ctx); + ASSERT_PTR(prohibitchecker_ctx2, prohibitchecker_ctx1); + idn_checker_destroy(prohibitchecker_ctx2); + + /* set NULL as checker context */ + idn_resconf_setprohibitchecker(ctx, NULL); + prohibitchecker_ctx2 = idn_resconf_getprohibitchecker(ctx); + ASSERT_PTR(prohibitchecker_ctx2, NULL); +} + +//# TESTCASE +// title: addallprohibitcheckernames +// group: generic-init set-defaults +{ + static const char *names[] = { + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT + }; + int nnames = sizeof(names) / sizeof(*names); + + r = idn_resconf_addallprohibitcheckernames(ctx, names, nnames); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: getunassignedchecker +// group: generic-init set-defaults unassignedchecker_ctx +{ + unassignedchecker_ctx1 = idn_resconf_getunassignedchecker(ctx); + ASSERT_PTR_NE(unassignedchecker_ctx1, NULL); +} + +//# TESTCASE +// title: setunassignedchecker +// group: generic-init set-defaults unassignedchecker_ctx +{ + r = idn_checker_create(&unassignedchecker_ctx1); + ASSERT_RESULT(r, idn_success); + + /* set checker context. */ + idn_resconf_setunassignedchecker(ctx, unassignedchecker_ctx1); + unassignedchecker_ctx2 = idn_resconf_getunassignedchecker(ctx); + ASSERT_PTR(unassignedchecker_ctx2, unassignedchecker_ctx1); + idn_checker_destroy(unassignedchecker_ctx2); + + /* set NULL as checker context */ + idn_resconf_setunassignedchecker(ctx, NULL); + unassignedchecker_ctx2 = idn_resconf_getunassignedchecker(ctx); + ASSERT_PTR(unassignedchecker_ctx2, NULL); +} + +//# TESTCASE +// title: addallunassignedcheckernames +// group: generic-init set-defaults +{ + static const char *names[] = { + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT + }; + int nnames = sizeof(names) / sizeof(*names); + + r = idn_resconf_addallunassignedcheckernames(ctx, names, nnames); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: getbidichecker +// group: generic-init set-defaults bidichecker_ctx +{ + bidichecker_ctx1 = idn_resconf_getbidichecker(ctx); + ASSERT_PTR_NE(bidichecker_ctx1, NULL); +} + +//# TESTCASE +// title: setbidichecker +// group: generic-init set-defaults bidichecker_ctx +{ + r = idn_checker_create(&bidichecker_ctx1); + ASSERT_RESULT(r, idn_success); + + /* set checker context. */ + idn_resconf_setbidichecker(ctx, bidichecker_ctx1); + bidichecker_ctx2 = idn_resconf_getbidichecker(ctx); + ASSERT_PTR(bidichecker_ctx2, bidichecker_ctx1); + idn_checker_destroy(bidichecker_ctx2); + + /* set NULL as checker context */ + idn_resconf_setbidichecker(ctx, NULL); + bidichecker_ctx2 = idn_resconf_getbidichecker(ctx); + ASSERT_PTR(bidichecker_ctx2, NULL); +} + +//# TESTCASE +// title: addallbidicheckernames +// group: generic-init set-defaults +{ + static const char *names[] = { + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT, + IDN_NAMEPREP_CURRENT + }; + int nnames = sizeof(names) / sizeof(*names); + + r = idn_resconf_addallbidicheckernames(ctx, names, nnames); + ASSERT_RESULT(r, idn_success); +} + +//# TESTCASE +// title: setnameprepversion +// group: generic-init set-defaults +{ + idn_resconf_setnameprepversion(ctx, IDN_NAMEPREP_CURRENT); + ASSERT_RESULT(r, idn_success); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/setenv.c b/contrib/idn/idnkit-1.0-src/lib/tests/setenv.c new file mode 100644 index 00000000..9c12bf1d --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/setenv.c @@ -0,0 +1,134 @@ +#ifndef lint +static char *rcsid = "$Id: setenv.c,v 1.1.1.1 2003/06/04 00:27:01 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <string.h> + +/* + * We don't include <stdlib.h> here. + * Also <stdlib.h> may declare `environ' and its type might be different + * from ours. + */ +extern char **environ; + +typedef struct myenv myenv_t; + +struct myenv { + char *pointer; + myenv_t *next; + myenv_t *prev; +}; + +static myenv_t *myenvs = NULL; + +void +myunsetenv(const char *name) { + char **e; + myenv_t *mye; + size_t namelen; + extern void free(void *); + + namelen = strlen(name); + for (e = environ; *e != NULL; e++) { + if (strncmp(*e, name, namelen) == 0 && (*e)[namelen] == '=') + break; + } + if (*e == NULL) + return; + + for (mye = myenvs; mye != NULL; mye = mye->next) { + if (mye->pointer == *e) { + if (mye->next != NULL) + mye->next->prev = mye->prev; + if (mye->prev != NULL) + mye->prev->next = mye->next; + if (mye->next == NULL && mye->prev == NULL) + myenvs = NULL; + free(mye); + free(*e); + break; + } + } + + for ( ; *e != NULL; e++) + *e = *(e + 1); +} + +#include <stdlib.h> + +int +mysetenv(const char *name, const char *value, int overwrite) { + myenv_t *mye; + char *buffer; + int result; + + if (getenv(name) != NULL && !overwrite) + return 0; + + buffer = (char *) malloc(strlen(name) + strlen(value) + 2); + if (buffer == NULL) + return -1; + strcpy(buffer, name); + strcat(buffer, "="); + strcat(buffer, value); + + myunsetenv(name); + + mye = (myenv_t *) malloc(sizeof(myenv_t)); + if (mye == NULL) + return -1; + mye->pointer = buffer; + mye->next = myenvs; + mye->prev = NULL; + if (myenvs != NULL) + myenvs->prev = mye; + myenvs = mye; + + result = putenv(buffer); + + return result; +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/setenv.h b/contrib/idn/idnkit-1.0-src/lib/tests/setenv.h new file mode 100644 index 00000000..704c179b --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/setenv.h @@ -0,0 +1,61 @@ +/* $Id: setenv.h,v 1.1.1.1 2003/06/04 00:27:01 marka Exp $ */ +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#ifndef IDN_SETENV_H +#define IDN_SETENV_H + +#include "testconfig.h" + +#ifndef HAVE_SETENV +#define unsetenv(a1) myunsetenv(a1) +#endif + +#ifndef HAVE_SETENV +#define setenv(a1, a2, a3) mysetenv(a1, a2, a3) +#endif + +void myunsetenv(const char *name); +int mysetenv(const char *name, const char *value, int overwrite); + +#endif /* IDN_SETENV_H */ diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/testsuite.c b/contrib/idn/idnkit-1.0-src/lib/tests/testsuite.c new file mode 100644 index 00000000..14b202fc --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/testsuite.c @@ -0,0 +1,578 @@ +#ifndef lint +static char *rcsid = "$Id"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +#include <idn/result.h> +#include <idn/ucs4.h> +#include <testsuite.h> + +typedef struct idn_testcase *idn_testcase_t; + +struct idn_testcase { + char *title; + idn_testsuite_testproc_t proc; +}; + +struct idn_testsuite { + idn_testcase_t testcases; + int ntestcases; + int testcase_size; + + int npassed; + int nfailed; + int nskipped; + idn_testcase_t current_testcase; + idn_teststatus_t current_status; + + idn_testsuite_msgproc_t msgproc; + int verbose; +}; + +#define INITIAL_TESTCASE_SIZE 16 +#define INITIAL_SETUP_SIZE 4 +#define INITIAL_TEARDOWN_SIZE 4 + +static void run_internal(idn_testsuite_t ctx, char *titles[]); +static char *make_hex_string(const char *string); +static char *make_hex_ucs4string(const unsigned long *string); +static void put_failure_message(idn_testsuite_t ctx, const char *msg, + const char *file, int lineno); +static void idn_testsuite_msgtostderr(const char *msg); + +int +idn_testsuite_create(idn_testsuite_t *ctxp) { + idn_testsuite_t ctx = NULL; + + assert(ctxp != NULL); + + ctx = (idn_testsuite_t) malloc(sizeof(struct idn_testsuite)); + if (ctx == NULL) + goto error; + + ctx->testcases = NULL; + ctx->ntestcases = 0; + ctx->testcase_size = 0; + ctx->npassed = 0; + ctx->nfailed = 0; + ctx->nskipped = 0; + ctx->current_testcase = NULL; + ctx->current_status = idn_teststatus_pass; + ctx->msgproc = NULL; + ctx->verbose = 0; + + ctx->testcases = (idn_testcase_t) malloc(sizeof(struct idn_testcase) + * INITIAL_TESTCASE_SIZE); + if (ctx->testcases == NULL) + goto error; + ctx->testcase_size = INITIAL_TESTCASE_SIZE; + + *ctxp = ctx; + return (1); + +error: + if (ctx != NULL) + free(ctx->testcases); + free(ctx); + return (0); +} + +void +idn_testsuite_destroy(idn_testsuite_t ctx) { + int i; + + assert(ctx != NULL); + + for (i = 0; i < ctx->ntestcases; i++) + free(ctx->testcases[i].title); + + free(ctx->testcases); + free(ctx); +} + +int +idn_testsuite_addtestcase(idn_testsuite_t ctx, const char *title, + idn_testsuite_testproc_t proc) { + char *dup_title = NULL; + idn_testcase_t new_buffer = NULL; + idn_testcase_t new_testcase; + int new_size; + + assert(ctx != NULL && title != NULL && proc != NULL); + + dup_title = (char *)malloc(strlen(title) + 1); + if (dup_title == NULL) + goto error; + strcpy(dup_title, title); + + if (ctx->ntestcases == ctx->testcase_size) { + new_size = ctx->testcase_size + INITIAL_TESTCASE_SIZE; + new_buffer = (idn_testcase_t) + realloc(ctx->testcases, + sizeof(struct idn_testcase) * new_size); + if (new_buffer == NULL) + goto error; + ctx->testcases = new_buffer; + ctx->testcase_size = new_size; + } + + new_testcase = ctx->testcases + ctx->ntestcases; + new_testcase->title = dup_title; + new_testcase->proc = proc; + ctx->ntestcases++; + return (1); + +error: + free(dup_title); + free(new_buffer); + return (0); +} + +int +idn_testsuite_ntestcases(idn_testsuite_t ctx) { + assert(ctx != NULL); + return (ctx->ntestcases); +} + +void +idn_testsuite_setverbose(idn_testsuite_t ctx) { + assert(ctx != NULL); + ctx->verbose = 1; +} + +void +idn_testsuite_unsetverbose(idn_testsuite_t ctx) { + assert(ctx != NULL); + ctx->verbose = 0; +} + +static void +run_internal(idn_testsuite_t ctx, char *titles[]) { + int i, j; + int run_testcase; + const char *status; + + assert(ctx != NULL); + + ctx->npassed = 0; + ctx->nfailed = 0; + ctx->nskipped = 0; + + for (i = 0; i < ctx->ntestcases; i++) { + ctx->current_testcase = ctx->testcases + i; + ctx->current_status = idn_teststatus_pass; + + if (titles == NULL) + run_testcase = 1; + else { + run_testcase = 0; + for (j = 0; titles[j] != NULL; j++) { + if (strcmp(ctx->current_testcase->title, + titles[j]) == 0) { + run_testcase = 1; + break; + } + } + } + + if (!run_testcase) { + ctx->nskipped++; + continue; + } + if (ctx->verbose) { + fprintf(stderr, "start testcase %d: %s\n", i + 1, + ctx->testcases[i].title); + } + (ctx->testcases[i].proc)(ctx); + status = idn_teststatus_tostring(ctx->current_status); + if (ctx->verbose) { + fprintf(stderr, "end testcase %d: %s\n", i + 1, + status); + } + + switch (ctx->current_status) { + case idn_teststatus_pass: + ctx->npassed++; + break; + case idn_teststatus_fail: + ctx->nfailed++; + break; + case idn_teststatus_skip: + ctx->nskipped++; + break; + } + } +} + +void +idn_testsuite_runall(idn_testsuite_t ctx) { + assert(ctx != NULL); + run_internal(ctx, NULL); +} + +void +idn_testsuite_run(idn_testsuite_t ctx, char *titles[]) { + assert(ctx != NULL && titles != NULL); + run_internal(ctx, titles); +} + +int +idn_testsuite_npassed(idn_testsuite_t ctx) { + assert(ctx != NULL); + return (ctx->npassed); +} + +int +idn_testsuite_nfailed(idn_testsuite_t ctx) { + assert(ctx != NULL); + return (ctx->nfailed); +} + +int +idn_testsuite_nskipped(idn_testsuite_t ctx) { + assert(ctx != NULL); + return (ctx->nskipped); +} + +idn_teststatus_t +idn_testsuite_getstatus(idn_testsuite_t ctx) { + assert(ctx != NULL); + return (ctx->current_status); +} + +void +idn_testsuite_setstatus(idn_testsuite_t ctx, idn_teststatus_t status) { + assert(ctx != NULL); + assert(status == idn_teststatus_pass || + status == idn_teststatus_fail || + status == idn_teststatus_skip); + + ctx->current_status = status; +} + +const char * +idn_teststatus_tostring(idn_teststatus_t status) { + assert(status == idn_teststatus_pass || + status == idn_teststatus_fail || + status == idn_teststatus_skip); + + switch (status) { + case idn_teststatus_pass: + return "pass"; + break; + case idn_teststatus_fail: + return "failed"; + break; + case idn_teststatus_skip: + return "skipped"; + break; + } + + return "unknown"; +} + +void +idn_testsuite_assert(idn_testsuite_t ctx, const char *msg, + const char *file, int lineno) { + assert(ctx != NULL && msg != NULL && file != NULL); + + if (idn_testsuite_getstatus(ctx) != idn_teststatus_pass) + return; + idn_testsuite_setstatus(ctx, idn_teststatus_fail); + put_failure_message(ctx, msg, file, lineno); +} + +void +idn_testsuite_assertint(idn_testsuite_t ctx, int gotten, int expected, + const char *file, int lineno) { + char msg[256]; /* large enough */ + + assert(ctx != NULL && file != NULL); + + if (idn_testsuite_getstatus(ctx) != idn_teststatus_pass) + return; + if (expected == gotten) + return; + idn_testsuite_setstatus(ctx, idn_teststatus_fail); + + sprintf(msg, "`%d' expected, but got `%d'", expected, gotten); + put_failure_message(ctx, msg, file, lineno); +} + +void +idn_testsuite_assertstring(idn_testsuite_t ctx, + const char *gotten, const char *expected, + const char *file, int lineno) { + char *expected_hex = NULL; + char *gotten_hex = NULL; + char *msg; + + assert(ctx != NULL && gotten != NULL && expected != NULL && + file != NULL); + + if (idn_testsuite_getstatus(ctx) != idn_teststatus_pass) + return; + if (strcmp(expected, gotten) == 0) + return; + idn_testsuite_setstatus(ctx, idn_teststatus_fail); + + msg = (char *)malloc(strlen(expected) * 4 + strlen(gotten) * 4 + 32); + expected_hex = make_hex_string(expected); + gotten_hex = make_hex_string(gotten); + if (msg == NULL || expected_hex == NULL || gotten_hex == NULL) { + msg = ""; + } else { + sprintf(msg, "`%s' expected, but got `%s'", + expected_hex, gotten_hex); + } + + put_failure_message(ctx, msg, file, lineno); + + free(msg); + free(expected_hex); + free(gotten_hex); +} + +void +idn_testsuite_assertptr(idn_testsuite_t ctx, const void *gotten, + const void *expected, const char *file, int lineno) { + char *msg; + + assert(ctx != NULL && file != NULL); + + if (idn_testsuite_getstatus(ctx) != idn_teststatus_pass) + return; + if (expected == gotten) + return; + idn_testsuite_setstatus(ctx, idn_teststatus_fail); + + if (expected == NULL) + msg = "NULL expected, but got non-NULL"; + else if (gotten == NULL) + msg = "non-NULL expected, but got NULL"; + else + msg = "expected pointer != gotten pointer"; + put_failure_message(ctx, msg, file, lineno); +} + +void +idn_testsuite_assertptrne(idn_testsuite_t ctx, + const void *gotten, const void *unexpected, + const char *file, int lineno) { + char *msg; + + assert(ctx != NULL && file != NULL); + + if (idn_testsuite_getstatus(ctx) != idn_teststatus_pass) + return; + if (unexpected != gotten) + return; + idn_testsuite_setstatus(ctx, idn_teststatus_fail); + + if (unexpected == NULL) + msg = "non-NULL unexpected, but got NULL"; + else if (gotten == NULL) + msg = "non-NULL expected, but got NULL"; + else + msg = "expected pointer == gotten pointer"; + put_failure_message(ctx, msg, file, lineno); +} + +void +idn_testsuite_assertresult(idn_testsuite_t ctx, + idn_result_t gotten, idn_result_t expected, + const char *file, int lineno) { + char msg[256]; /* large enough */ + + assert(ctx != NULL && file != NULL); + + if (idn_testsuite_getstatus(ctx) != idn_teststatus_pass) + return; + if (expected == gotten) + return; + idn_testsuite_setstatus(ctx, idn_teststatus_fail); + + sprintf(msg, "`%s' expected, but got `%s'", + idn_result_tostring(expected), idn_result_tostring(gotten)); + put_failure_message(ctx, msg, file, lineno); +} + +void +idn_testsuite_assertucs4string(idn_testsuite_t ctx, + const unsigned long *gotten, + const unsigned long *expected, + const char *file, int lineno) { + char *expected_hex = NULL; + char *gotten_hex = NULL; + char *msg; + + assert(ctx != NULL && gotten != NULL && expected != NULL && + file != NULL); + + if (idn_testsuite_getstatus(ctx) != idn_teststatus_pass) + return; + if (idn_ucs4_strcmp(expected, gotten) == 0) + return; + idn_testsuite_setstatus(ctx, idn_teststatus_fail); + + msg = (char *)malloc(idn_ucs4_strlen(expected) * 8 + + idn_ucs4_strlen(gotten) * 8 + 32); + expected_hex = make_hex_ucs4string(expected); + gotten_hex = make_hex_ucs4string(gotten); + if (msg == NULL || expected_hex == NULL || gotten_hex == NULL) { + msg = ""; + } else { + sprintf(msg, "`%s' expected, but got `%s'", + expected_hex, gotten_hex); + } + + put_failure_message(ctx, msg, file, lineno); + + free(msg); + free(expected_hex); + free(gotten_hex); +} + +static char * +make_hex_string(const char *string) { + static const char hex[] = {"0123456789abcdef"}; + char *hex_string; + const char *src; + char *dst; + + hex_string = (char *)malloc((strlen(string)) * 4 + 1); + if (hex_string == NULL) + return NULL; + + for (src = string, dst = hex_string; *src != '\0'; src++) { + if (0x20 <= *src && *src <= 0x7e && *src != '\\') { + *dst++ = *src; + } else { + *dst++ = '\\'; + *dst++ = 'x'; + *dst++ = hex[*(const unsigned char *)src >> 4]; + *dst++ = hex[*src & 0x0f]; + } + } + *dst = '\0'; + + return hex_string; +} + +#define UCS4_MAX 0x10fffffUL + +static char * +make_hex_ucs4string(const unsigned long *string) { + static const char hex[] = {"0123456789abcdef"}; + char *hex_string; + const unsigned long *src; + char *dst; + + hex_string = (char *)malloc((idn_ucs4_strlen(string)) * 8 + 1); + if (hex_string == NULL) + return NULL; + + for (src = string, dst = hex_string; *src != '\0'; src++) { + if (0x20 <= *src && *src <= 0x7e && *src != '\\') { + *dst++ = *src; + } else if (*src <= UCS4_MAX) { + *dst++ = '\\'; + *dst++ = 'u'; + if (*src >= 0x100000) { + *dst++ = hex[(*src >> 20) & 0x0f]; + } + if (*src >= 0x10000) { + *dst++ = hex[(*src >> 16) & 0x0f]; + } + *dst++ = hex[(*src >> 12) & 0x0f]; + *dst++ = hex[(*src >> 8) & 0x0f]; + *dst++ = hex[(*src >> 4) & 0x0f]; + *dst++ = hex[*src & 0x0f]; + } else { + *dst++ = '\\'; + *dst++ = 'u'; + *dst++ = '?'; + *dst++ = '?'; + *dst++ = '?'; + *dst++ = '?'; + } + } + *dst = '\0'; + + return hex_string; +} + +static void +put_failure_message(idn_testsuite_t ctx, const char *msg, const char *file, + int lineno) { + idn_testsuite_msgproc_t proc; + char buffer[256]; + const char *title; + + proc = (ctx->msgproc == NULL) ? + idn_testsuite_msgtostderr : ctx->msgproc; + title = (ctx->current_testcase != NULL && + ctx->current_testcase->title != NULL) ? + ctx->current_testcase->title : "anonymous"; + + sprintf(buffer, "%.100s: In test `%.100s':", file, title); + (*proc)(buffer); + + sprintf(buffer, "%.100s:%d: failed (%.100s)", file, lineno, msg); + (*proc)(buffer); +} + + +static void +idn_testsuite_msgtostderr(const char *msg) { + fputs(msg, stderr); + fputc('\n', stderr); +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/testsuite.h b/contrib/idn/idnkit-1.0-src/lib/tests/testsuite.h new file mode 100644 index 00000000..a5e47740 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/testsuite.h @@ -0,0 +1,276 @@ +/* $Id: testsuite.h,v 1.1.1.1 2003/06/04 00:27:03 marka Exp $ */ +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#ifndef IDN_TESTSUITE_H +#define IDN_TESTSUITE_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Result codes for test case. + */ +typedef enum { + idn_teststatus_pass, + idn_teststatus_fail, + idn_teststatus_skip +} idn_teststatus_t; + +/* + * Testsuite manager type (opaque). + */ +typedef struct idn_testsuite *idn_testsuite_t; + +/* + * Testcase function type. + */ +typedef void (*idn_testsuite_testproc_t)(idn_testsuite_t ctx); + +/* + * Message handler type. + */ +typedef void (*idn_testsuite_msgproc_t)(const char *msg); + +/* + * Create a testsuite manager context. + * + * Create an empty context and store it in '*ctxp'. + * Return 1 on success. Return 0 if memory is exhausted. + */ +extern int +idn_testsuite_create(idn_testsuite_t *ctxp); + +/* + * Destory the testsuite manager context. + * + * Destroy the context created by idn_testsuite_create(), and release + * memory allocated to the context. + */ +extern void +idn_testsuite_destroy(idn_testsuite_t ctx); + +/* + * Add a test case to the `group' test group. + * Return 1 on success. Return 0 if memory is exhausted. + */ +extern int +idn_testsuite_addtestcase(idn_testsuite_t ctx, const char *title, + idn_testsuite_testproc_t proc); + +/* + * Return the number of test cases registered in the context. + */ +extern int +idn_testsuite_ntestcases(idn_testsuite_t ctx); + +/* + * Run test cases registered in the context. + */ +extern void +idn_testsuite_runall(idn_testsuite_t ctx); +extern void +idn_testsuite_run(idn_testsuite_t ctx, char *titles[]); + +/* + * Return the string description of `status'. + */ +extern const char * +idn_teststatus_tostring(idn_teststatus_t status); + +/* + * Return the number of passed/failed/skipped test cases. + */ +extern int +idn_testsuite_npassed(idn_testsuite_t ctx); +extern int +idn_testsuite_nfailed(idn_testsuite_t ctx); +extern int +idn_testsuite_nskipped(idn_testsuite_t ctx); + +/* + * Set/Get status of the test case running currently. + * + * These functions must be called by test case function. + */ +extern idn_teststatus_t +idn_testsuite_getstatus(idn_testsuite_t ctx); +extern void +idn_testsuite_setstatus(idn_testsuite_t ctx, idn_teststatus_t status); + +/* + * Enable/Disable verbose mode. + */ +extern void +idn_testsuite_setverbose(idn_testsuite_t ctx); +extern void +idn_testsuite_unsetverbose(idn_testsuite_t ctx); + +/* + * Generic assertion with message + */ +extern void +idn_testsuite_assert(idn_testsuite_t ctx, const char *msg, + const char *file, int lineno); + +#define ASSERT_THRU(msg) \ + idn_testsuite_assert(ctx__, msg, __FILE__, __LINE__) +#define ASSERT(msg) \ + do { \ + ASSERT_THRU(msg); \ + if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \ + goto EXIT__; \ + } while (0) + +/* + * Assertion function and macro to compare two `int' values. + * The assertion passes if `gotten' is equal to `expected'. + */ +extern void +idn_testsuite_assertint(idn_testsuite_t ctx, int gotten, int expected, + const char *file, int lineno); + +#define ASSERT_INT(gotten, expected) \ + do { \ + idn_testsuite_assertint(ctx__, gotten, expected, __FILE__, __LINE__); \ + if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \ + goto EXIT__; \ + } while (0) + +/* + * Assertion function and macro to compare two strings. + * The assertion passes if `gotten' is lexically equal to `expected'. + */ +extern void +idn_testsuite_assertstring(idn_testsuite_t ctx, const char *gotten, + const char *expected, const char *file, int lineno); + +#define ASSERT_STRING(gotten, expected) \ + do { \ + idn_testsuite_assertstring(ctx__, gotten, expected, __FILE__, __LINE__); \ + if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \ + goto EXIT__; \ + } while (0) + +/* + * Assertion function and macro to compare two pointers. + * The assertion passes if `gotten' is equal to `expected'. + */ +extern void +idn_testsuite_assertptr(idn_testsuite_t ctx, const void *gotten, + const void *expected, const char *file, int lineno); + +#define ASSERT_PTR(gotten, expected) \ + do { \ + idn_testsuite_assertptr(ctx__, gotten, expected, __FILE__, __LINE__); \ + if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \ + goto EXIT__; \ + } while (0) + +/* + * Assertion function and macro to compare two pointers. + * The assertion passes if `gotten' is NOT equal to `expected'. + */ +extern void +idn_testsuite_assertptrne(idn_testsuite_t ctx, + const void *gotten, const void *unexpected, + const char *file, int lineno); + +#define ASSERT_PTR_NE(gotten, unexpected) \ + do { \ + idn_testsuite_assertptrne(ctx__, gotten, unexpected, __FILE__, __LINE__); \ + if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \ + goto EXIT__; \ + } while (0) + +/* + * Assertion function and macro to compare two `idn_result_t' values. + * The assertion passes if `gotten' is equal to `expected'. + */ +extern void +idn_testsuite_assertresult(idn_testsuite_t ctx, + idn_result_t gotten, idn_result_t expected, + const char *file, int lineno); + +#define ASSERT_RESULT(gotten, expected) \ + do { \ + idn_testsuite_assertresult(ctx__, gotten, expected, __FILE__, __LINE__); \ + if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \ + goto EXIT__; \ + } while (0) + +/* + * Assertion function and macro to compare two UCS4 strings. + * The assertion passes if `gotten' is lexically equal to `expected'. + */ +extern void +idn_testsuite_assertucs4string(idn_testsuite_t ctx, + const unsigned long *gotten, + const unsigned long *expected, + const char *file, + int lineno); + +#define ASSERT_UCS4STRING_THRU(gotten, expected) \ + idn_testsuite_assertucs4string(ctx__, gotten, expected, __FILE__, __LINE__) +#define ASSERT_UCS4STRING(gotten, expected) \ + do { \ + ASSERT_UCS4STRING_THRU(gotten, expected); \ + if (idn_testsuite_getstatus(ctx__) != idn_teststatus_pass) \ + goto EXIT__; \ + } while (0) + +/* + * Shorthands. + */ +#define SKIP_TESTCASE \ + do { \ + idn_testsuite_setstatus(ctx__, idn_teststatus_skip); \ + goto EXIT__; \ + } while (0) + +#ifdef __cplusplus +} +#endif + +#endif /* IDN_TESTSUITE_H */ diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/testutil.c b/contrib/idn/idnkit-1.0-src/lib/tests/testutil.c new file mode 100644 index 00000000..c1872fdf --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/testutil.c @@ -0,0 +1,83 @@ +#ifndef lint +static char *rcsid = "$Id: testutil.c,v 1.1.1.1 2003/06/04 00:27:03 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> +#include "testutil.h" + +int +create_conf_file(const char *filename, unsigned int flags, ...) { + FILE *file; + va_list ap; + const char *arg; + int arg_index; + + file = fopen(filename, "w"); + if (file == NULL) { + fprintf(stderr, "failed to create config file `%s'\n", + filename); + return 0; + } + + arg_index = 0; + va_start(ap, flags); + for (;;) { + arg = va_arg(ap, const char *); + if (arg == NULL) + break; + if (arg_index++ > 0) + fputc('\n', file); + fputs(arg, file); + } + if (!(flags & CONF_NO_EOF_NEWLINE) && arg_index > 0) + fputc('\n', file); + + fclose(file); + return 1; +} diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/testutil.h b/contrib/idn/idnkit-1.0-src/lib/tests/testutil.h new file mode 100644 index 00000000..0e6405d3 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/testutil.h @@ -0,0 +1,71 @@ +/* $Id: testutil.h,v 1.1.1.1 2003/06/04 00:27:03 marka Exp $ */ +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#ifndef IDN_TESTUTIL_H +#define IDN_TESTUTIL_H 1 + +/* + * Option flags for create_conf_file(). + * + * CONF_NO_EOF_NEWLINE -- Don't put newline character + * at the end of file. + */ +#define CONF_NO_EOF_NEWLINE 0x0001 + +/* + * Create a configuration file. + * + * Write strings specified as variable length arguments (`...') to + * `filename'. Note that the arguments must be terminated with `NULL'. + * + * In the created config file, each string in the variable length + * arguments becomes a line. In other words, newline characters are + * added automatically. + * + * This function returns 1 upon success, 0 otherwise. + */ +int +create_conf_file(const char *filename, unsigned int flags, ...); + +#endif /* IDN_TESTUTIL_H */ diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/testygen b/contrib/idn/idnkit-1.0-src/lib/tests/testygen new file mode 100755 index 00000000..5d2f9ca5 --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/testygen @@ -0,0 +1,557 @@ +#! /usr/bin/perl -w +# +# Copyright (c) 2002 Japan Network Information Center. +# All rights reserved. +# +# By using this file, you agree to the terms and conditions set forth bellow. +# +# LICENSE TERMS AND CONDITIONS +# +# The following License Terms and Conditions apply, unless a different +# license is obtained from Japan Network Information Center ("JPNIC"), +# a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, +# Chiyoda-ku, Tokyo 101-0047, Japan. +# +# 1. Use, Modification and Redistribution (including distribution of any +# modified or derived work) in source and/or binary forms is permitted +# under this License Terms and Conditions. +# +# 2. Redistribution of source code must retain the copyright notices as they +# appear in each source code file, this License Terms and Conditions. +# +# 3. Redistribution in binary form must reproduce the Copyright Notice, +# this License Terms and Conditions, in the documentation and/or other +# materials provided with the distribution. For the purposes of binary +# distribution the "Copyright Notice" refers to the following language: +# "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." +# +# 4. The name of JPNIC may not be used to endorse or promote products +# derived from this Software without specific prior written approval of +# JPNIC. +# +# 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +# +use FileHandle; +use Getopt::Std; + +# +# Parsing status. +# +my $STATUS_HEADER = 0; +my $STATUS_HEADER_COMMENT = 1; +my $STATUS_SEPARATOR = 2; +my $STATUS_BODY = 3; +my $STATUS_GLOBAL = 4; +my $STATUS_GLOBAL_COMMENT = 5; +my $STATUS_PREAMBLE = 6; + +my $LINENO_MARK = "<LINENO>"; + +# +# Create a new testsuite context. +# +sub new_testsuite { + return {'ntests' => 0, + 'setups' => {}, + 'teardowns' => {}, + 'tests' => [], + 'titles' => [], + 'preambles' => ''}; +} + +# +# Read `$file' and put the result into `$testsutie'. +# +sub parse_file { + my ($testsuite, $file, $lineinfo) = @_; + my $parser = {'type' => '', + 'group' => '', + 'title' => '', + 'status' => $STATUS_PREAMBLE, + 'error' => '', + 'file' => $file, + 'lineno' => 0, + 'lineinfo' => $lineinfo}; + + my $handle = FileHandle->new($file, 'r'); + if (!defined($handle)) { + die "failed to open the file, $!: $file\n"; + } + + my ($result, $line); + for (;;) { + $line = $handle->getline(); + last if (!defined($line)); + + chomp($line); + $line .= "\n"; + $parser->{lineno}++; + $result = parse_line($testsuite, $parser, $line); + if (!$result) { + die sprintf("%s, at line %d\n", + $parser->{error}, $parser->{lineno}); + } + } + + if ($parser->{status} != $STATUS_GLOBAL) { + die "unexpected EOF, at line $.\n"; + } + + $handle->close(); +} + +sub parse_line { + my ($testsuite, $parser, $line) = @_; + my $result = 1; + + if ($parser->{status} == $STATUS_HEADER) { + if ($line =~ /^\/\/--/) { + $parser->{status} = $STATUS_HEADER_COMMENT; + } elsif ($line =~ /^\/\//) { + $result = parse_header($testsuite, $parser, $line); + } elsif ($line =~ /^\s*$/) { + $parser->{status} = $STATUS_SEPARATOR; + $result = parse_endheader($testsuite, $parser, $line); + } elsif ($line =~ /^\{\s*$/) { + $parser->{status} = $STATUS_BODY; + $result = parse_endheader($testsuite, $parser, $line) + && parse_startbody($testsuite, $parser, $line); + } else { + $parser->{error} = 'syntax error'; + $result = 0; + } + + } elsif ($parser->{status} == $STATUS_HEADER_COMMENT) { + if ($line =~ /^\/\//) { + # nothing to be done. + } elsif ($line =~ /^\s*$/) { + $parser->{status} = $STATUS_SEPARATOR; + $result = parse_endheader($testsuite, $parser, $line); + } elsif ($line =~ /^\{\s*$/) { + $parser->{status} = $STATUS_BODY; + $result = parse_endheader($testsuite, $parser, $line) + && parse_startbody($testsuite, $parser, $line); + } else { + $parser->{error} = 'syntax error'; + $result = 0; + } + + } elsif ($parser->{status} == $STATUS_SEPARATOR) { + if ($line =~ /^\s*$/) { + # nothing to be done. + } elsif ($line =~ /^\{\s*$/) { + $parser->{status} = $STATUS_BODY; + $result = parse_startbody($testsuite, $parser, $line); + } else { + $parser->{error} = 'syntax error'; + $result = 0; + } + + } elsif ($parser->{status} == $STATUS_BODY) { + if ($line =~ /^\}\s*$/) { + $parser->{status} = $STATUS_GLOBAL; + $result = parse_endbody($testsuite, $parser, $line); + } else { + $result = parse_body($testsuite, $parser, $line); + } + + } elsif ($parser->{status} == $STATUS_GLOBAL) { + if ($line =~ /^\/\/\#/) { + $parser->{status} = $STATUS_HEADER; + $result = parse_startheader($testsuite, $parser, $line); + } elsif ($line =~ /^\/\/--/) { + $parser->{status} = $STATUS_GLOBAL_COMMENT; + } elsif ($line =~ /^\s*$/) { + # nothing to be done. + } else { + $parser->{error} = 'syntax error'; + $result = 0; + } + + } elsif ($parser->{status} == $STATUS_GLOBAL_COMMENT) { + if ($line =~ /^\/\//) { + # nothing to be done. + } elsif ($line =~ /^\s*$/) { + $parser->{status} = $STATUS_GLOBAL; + } else { + $parser->{error} = 'syntax error'; + $result = 0; + } + + } elsif ($parser->{status} == $STATUS_PREAMBLE) { + if ($line =~ /^\/\/\#/) { + $parser->{status} = $STATUS_HEADER; + $result = parse_startheader($testsuite, $parser, $line); + } elsif ($line =~ /^\/\/--/) { + $parser->{status} = $STATUS_GLOBAL_COMMENT; + } else { + $result = parse_preamble($testsuite, $parser, $line); + } + + } else { + $parser->{error} = 'syntax error'; + $result = 0; + } + + return $result; +} + +sub parse_startheader { + my ($testsuite, $parser, $line) = @_; + + if ($line =~ /^\/\/\#\s*(SETUP|TEARDOWN|TESTCASE)\s*$/) { + $parser->{type} = $1; + $parser->{group} = ''; + $parser->{title} = ''; + } else { + $parser->{error} = 'invalid test-header format'; + return 0; + } + + + return 1; +} + +sub parse_header { + my ($testsuite, $parser, $line) = @_; + + my $field = $line; + $field =~ s/^\/\/\s*//; + $field =~ s/^(\S+):\s*/$1:/; + $field =~ s/\s+$//; + + return 1 if ($field eq ''); + + if ($field =~ /^group:(.*)$/) { + my $group = $1; + + if ($parser->{group} ne '') { + $parser->{error} = "group defined twice in a header"; + return 0; + } + if ($parser->{type} eq 'SETUP') { + if ($group !~ /^[0-9A-Za-z_\-]+$/) { + $parser->{error} = "invalid group name"; + return 0; + } + if (defined($testsuite->{setups}->{$group})) { + $parser->{error} = sprintf("SETUP \`%s' redefined", $group); + return 0; + } + } elsif ($parser->{type} eq 'TEARDOWN') { + if ($group !~ /^[0-9A-Za-z_\-]+$/) { + $parser->{error} = "invalid group name"; + return 0; + } + if (defined($testsuite->{teardowns}->{$group})) { + $parser->{error} = sprintf("TEARDOWN \`%s' redefined", $group); + return 0; + } + } else { + foreach my $i (split(/[ \t]+/, $group)) { + if ($i !~ /^[0-9A-Za-z_\-]+$/) { + $parser->{error} = "invalid group name \`$i'"; + return 0; + } + if (!defined($testsuite->{setups}->{$i}) + && !defined($testsuite->{teardowns}->{$i})) { + $parser->{error} = sprintf("group \'%s' not defined", $i); + return 0; + } + } + } + $parser->{group} = $group; + + } elsif ($field =~ /^title:(.*)$/) { + my $title = $1; + + if ($parser->{title} ne '') { + $parser->{error} = "title defined twice in a header"; + return 0; + } + if ($title =~ /[\x00-\x1f\x7f-\xff\"\\]/ || $title eq '') { + $parser->{error} = "invalid title"; + return 0; + } + if ($parser->{type} ne 'TESTCASE') { + $parser->{error} = sprintf("title for %s is not permitted", + $parser->{type}); + return 0; + } + $parser->{title} = $title; + + } else { + $parser->{error} = "invalid test-header field"; + return 0; + } + + return 1; +} + +sub parse_endheader { + my ($testsuite, $parser, $line) = @_; + + if ($parser->{type} ne 'TESTCASE' && $parser->{group} eq '') { + $parser->{error} = "missing \`group' in the header"; + return 0; + } + + if ($parser->{type} eq 'TESTCASE' && $parser->{title} eq '') { + $parser->{error} = "missing \`title' in the header"; + return 0; + } + + return 1; +} + +sub parse_startbody { + my ($testsuite, $parser, $line) = @_; + my $group = $parser->{group}; + + if ($parser->{type} eq 'SETUP') { + if ($parser->{lineinfo}) { + $testsuite->{setups}->{$group} = + generate_line_info($parser->{lineno} + 1, $parser->{file}); + } + } elsif ($parser->{type} eq 'TEARDOWN') { + if ($parser->{lineinfo}) { + $testsuite->{teardowns}->{$group} = + generate_line_info($parser->{lineno} + 1, $parser->{file}); + } + } else { + $testsuite->{ntests}++; + push(@{$testsuite->{tests}}, ''); + push(@{$testsuite->{titles}}, $parser->{title}); + + $testsuite->{tests}->[-1] .= "\n"; + $testsuite->{tests}->[-1] .= "$LINENO_MARK\n"; + $testsuite->{tests}->[-1] .= + sprintf("static void\ntestcase\%d(idn_testsuite_t ctx__) {\n", + $testsuite->{ntests}); + + my (@group_names) = split(/[ \t]+/, $group); + for (my $i = 0; $i < @group_names; $i++) { + if (defined($testsuite->{setups}->{$group_names[$i]})) { + $testsuite->{tests}->[-1] .= "\t\{\n"; + $testsuite->{tests}->[-1] .= "#undef EXIT__\n"; + $testsuite->{tests}->[-1] .= "#define EXIT__ exit${i}__\n"; + $testsuite->{tests}->[-1] .= + $testsuite->{setups}->{$group_names[$i]}; + } + } + $testsuite->{tests}->[-1] .= "$LINENO_MARK\n"; + $testsuite->{tests}->[-1] .= "\t\{\n"; + $testsuite->{tests}->[-1] .= "#undef EXIT__\n"; + $testsuite->{tests}->[-1] .= "#define EXIT__ exit__\n"; + if ($parser->{lineinfo}) { + $testsuite->{tests}->[-1] .= + generate_line_info($parser->{lineno} + 1, $parser->{file}); + } + } + + return 1; +} + +sub parse_body { + my ($testsuite, $parser, $line) = @_; + my ($group) = $parser->{group}; + + if ($parser->{type} eq 'SETUP') { + $testsuite->{setups}->{$group} .= $line; + } elsif ($parser->{type} eq 'TEARDOWN') { + $testsuite->{teardowns}->{$group} .= $line; + } else { + $testsuite->{tests}->[-1] .= $line; + } + + return 1; +} + +sub parse_endbody { + my ($testsuite, $parser, $line) = @_; + my ($group) = $parser->{group}; + + if ($parser->{type} eq 'TESTCASE') { + $testsuite->{tests}->[-1] .= "$LINENO_MARK\n"; + $testsuite->{tests}->[-1] .= "\t\}\n"; + $testsuite->{tests}->[-1] .= " exit__:\n"; + $testsuite->{tests}->[-1] .= "\t;\n"; + + my (@group_names) = split(/[ \t]+/, $group); + for (my $i = @group_names - 1; $i >= 0; $i--) { + $testsuite->{tests}->[-1] .= " exit${i}__:\n"; + $testsuite->{tests}->[-1] .= "\t;\n"; + if (defined($testsuite->{teardowns}->{$group_names[$i]})) { + $testsuite->{tests}->[-1] .= + $testsuite->{teardowns}->{$group_names[$i]}; + } + $testsuite->{tests}->[-1] .= "$LINENO_MARK\n"; + $testsuite->{tests}->[-1] .= "\t\}\n"; + } + + $testsuite->{tests}->[-1] .= "}\n"; + } + + return 1; +} + +sub parse_preamble { + my ($testsuite, $parser, $line) = @_; + + if ($parser->{lineinfo} && $parser->{lineno} == 1) { + $testsuite->{preambles} .= generate_line_info(1, $parser->{file}); + } + $testsuite->{preambles} .= $line; + return 1; +} + +sub generate_line_info { + my ($lineno, $file) = @_; + return "#line $lineno \"$file\"\n"; +} + +# +# Output `$testsuite' as source codes of C. +# +sub output_tests { + my ($testsuite, $file, $lineinfo) = @_; + + my $generator = { + 'file' => $file, + 'lineno' => 0 + }; + + my $handle = FileHandle->new($file, 'w'); + if (!defined($handle)) { + die "failed to open the file, $!: $file\n"; + } + + my $preamble_header = + "/* This file is automatically generated by testygen. */\n\n" + . "#define TESTYGEN 1\n" + . "\n"; + output_lines($preamble_header, $generator, $handle, $lineinfo); + + output_lines($testsuite->{preambles}, $generator, $handle, $lineinfo); + + my $preamble_footer = + "\n" + . "$LINENO_MARK\n" + . "#include \"testsuite.h\"\n" + . "\n"; + output_lines($preamble_footer, $generator, $handle, $lineinfo); + + + for (my $i = 0; $i < $testsuite->{ntests}; $i++) { + output_lines($testsuite->{tests}->[$i], $generator, $handle, + $lineinfo); + } + + my $main_header = + "\n" + . "$LINENO_MARK\n" + . "int\n" + . "main(int argc, char *argv[]) {\n" + . "\tidn_testsuite_t ctx;\n" + . "\tconst char *title;\n" + . "\n" + . "\tidn_testsuite_create(&ctx);\n"; + output_lines($main_header, $generator, $handle, $lineinfo); + + for (my $i = 0; $i < $testsuite->{ntests}; $i++) { + my $title = $testsuite->{titles}->[$i]; + my $proc = sprintf("testcase%d", $i + 1); + output_lines("\tidn_testsuite_addtestcase(ctx, \"$title\", $proc);\n", + $generator, $handle, $lineinfo); + } + + my $main_footer = + "\n" + . "\tif (argc > 1 && strcmp(argv[1], \"-v\") == 0) {\n" + . "\t idn_testsuite_setverbose(ctx);\n" + . "\t argc--;\n" + . "\t argv++;\n" + . "\t}\n" + . "\tif (argc == 1)\n" + . "\t idn_testsuite_runall(ctx);\n" + . "\telse\n" + . "\t idn_testsuite_run(ctx, argv + 1);\n" + . "\n" + . "\tprintf(\"passed=%d, failed=%d, total=%d\\n\",\n" + . "\t idn_testsuite_npassed(ctx),\n" + . "\t idn_testsuite_nfailed(ctx),\n" + . "\t idn_testsuite_ntestcases(ctx) - idn_testsuite_nskipped(ctx));\n" + . "\n" + . "\tidn_testsuite_destroy(ctx);\n" + . "\treturn (0);\n" + . "\}\n"; + output_lines($main_footer, $generator, $handle, $lineinfo); + + $handle->close(); +} + +sub output_lines { + my ($lines, $generator, $handle, $lineinfo) = @_; + my ($line); + + chomp($lines); + $lines .= "\n"; + + while ($lines ne '') { + $lines =~ s/^([^\n]*)\n//; + $line = $1; + $generator->{lineno}++; + if ($line eq $LINENO_MARK) { + if ($lineinfo) { + $handle->printf("#line %d \"%s\"\n", $generator->{lineno} + 1, + $generator->{file}); + } + } else { + $handle->print("$line\n"); + } + } +} + +sub output_usage { + warn "$0: [-o output-file] input-file\n"; +} + +# +# main. +# +my (%options); + +if (!getopts('Lo:', \%options)) { + output_usage; + exit(1); +} +if (@ARGV != 1) { + output_usage; + exit(1); +} + +my ($in_file) = $ARGV[0]; +my ($out_file); +if (!defined($options{o})) { + $out_file = $in_file; + $out_file .= '\.tsy' if ($out_file !~ /\.tsy$/); + $out_file =~ s/\.tsy$/\.c/; +} else { + $out_file = $options{o}; +} + +my $testsuite = new_testsuite(); +parse_file($testsuite, $in_file, !$options{L}); +output_tests($testsuite, $out_file, !$options{L}); + +exit(0); diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/ucs4.tsy b/contrib/idn/idnkit-1.0-src/lib/tests/ucs4.tsy new file mode 100644 index 00000000..205edaee --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/ucs4.tsy @@ -0,0 +1,257 @@ +#ifndef lint +static char *rcsid = "$Id: ucs4.tsy,v 1.1.1.1 2003/06/04 00:27:04 marka Exp $"; +#endif + +/* + * Copyright (c) 2002 Japan Network Information Center. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set forth bellow. + * + * LICENSE TERMS AND CONDITIONS + * + * The following License Terms and Conditions apply, unless a different + * license is obtained from Japan Network Information Center ("JPNIC"), + * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, + * Chiyoda-ku, Tokyo 101-0047, Japan. + * + * 1. Use, Modification and Redistribution (including distribution of any + * modified or derived work) in source and/or binary forms is permitted + * under this License Terms and Conditions. + * + * 2. Redistribution of source code must retain the copyright notices as they + * appear in each source code file, this License Terms and Conditions. + * + * 3. Redistribution in binary form must reproduce the Copyright Notice, + * this License Terms and Conditions, in the documentation and/or other + * materials provided with the distribution. For the purposes of binary + * distribution the "Copyright Notice" refers to the following language: + * "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." + * + * 4. The name of JPNIC may not be used to endorse or promote products + * derived from this Software without specific prior written approval of + * JPNIC. + * + * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ + +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <idn/ucs4.h> +#include <idn/log.h> +#include "testutil.h" + +/* + * Sample UTF8 and UCS4 strings. + */ +static const char *utf8_string = + "\x7f" /* 0x0000007f */ + "\xdf\xbf" /* 0x000007ff */ + "\xef\xbf\xbf" /* 0x0000ffff */ + "\xf7\xbf\xbf\xbf" /* 0x001fffff */ + "\xfb\xbf\xbf\xbf\xbf" /* 0x03ffffff */ + "\xfd\xbf\xbf\xbf\xbf\xbf"; /* 0x7fffffff */ + +static const unsigned long ucs4_string[] = { + 0x0000007f, + 0x000007ff, + 0x0000ffff, + 0x001fffff, + 0x03ffffff, + 0x7fffffff, + 0x00000000 +}; + +//-------------------------------------------------------------------- +// Setups and Teardowns. +//-------------------------------------------------------------------- + +//# SETUP +// group: utf8-init +{ + unsigned long to[256]; + size_t tolen = 256; + idn_result_t r; +} + +//# SETUP +// group: ucs4-init +{ + char to[256]; + size_t tolen = 256; + idn_result_t r; +} + +//# SETUP +// group: quiet +{ + int saved_log_level; + + saved_log_level = idn_log_getlevel(); + idn_log_setlevel(idn_log_level_fatal); +} + +//# TEARDOWN +// group: quiet +{ + idn_log_setlevel(saved_log_level); +} + +//-------------------------------------------------------------------- +// Testcases. +//-------------------------------------------------------------------- + +//# TESTCASE +// title: call utf8toucs4() +// group: utf8-init +{ + r = idn_ucs4_utf8toucs4(utf8_string, to, tolen); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, ucs4_string); +} + +//# TESTCASE +// title: call ucs4toutf8() +// group: ucs4-init +{ + r = idn_ucs4_ucs4toutf8(ucs4_string, to, tolen); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, utf8_string); +} + +//# TESTCASE +// title: call utf8toucs4() with empty from +// group: utf8-init +{ + static unsigned long empty_ucs4_string[] = {0}; + + r = idn_ucs4_utf8toucs4("", to, tolen); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, empty_ucs4_string); +} + +//# TESTCASE +// title: call ucs4toutf8() with empty from +// group: ucs4-init +{ + static unsigned long empty_ucs4_string[] = {0}; + + r = idn_ucs4_ucs4toutf8(empty_ucs4_string, to, tolen); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, ""); +} + +//# TESTCASE +// title: call utf8toucs4() with broken string +// group: utf8-init quiet +{ + /* "\xfe" as the 1st byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xfe\xbf\xbf\xbf\xbf\xbf\xbf", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\x7f" as the 2nd byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xdf\x7f", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\xc0" as the 2nd byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xdf\xc0", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\x7f" as the 3rd byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xef\xbf\x7f", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\xc0" as the 3rd byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xef\xbf\xc0", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\x7f" as the 4th byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xf7\xbf\xbf\x7f", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\xc0" as the 4th byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xf7\xbf\xbf\xc0", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\x7f" as the 5th byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xfb\xbf\xbf\xbf\x7f", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\xc0" as the 5th byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xfb\xbf\xbf\xbf\xc0", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\x7f" as the 6th byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xfd\xbf\xbf\xbf\xbf\x7f", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* "\xc0" as the 6th byte is out of range. */ + r = idn_ucs4_utf8toucs4("\xfd\xbf\xbf\xbf\xbf\xc0", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* `from' contains surrogate pair */ + r = idn_ucs4_utf8toucs4("\xed\xa0\x80\xed\xbf\xbf", to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); +} + +//# TESTCASE +// title: call ucs4toutf8() with broken string +// group: ucs4-init quiet +{ + static unsigned long invalid_ucs4_string0[] = {0x80000000, 0}; + static unsigned long invalid_ucs4_string1[] = {0xd800, 0xdfff, 0}; + + /* 0x80000000 is out of range */ + r = idn_ucs4_ucs4toutf8(invalid_ucs4_string0, to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); + + /* `from' contains surrogate pair */ + r = idn_ucs4_ucs4toutf8(invalid_ucs4_string1, to, tolen); + ASSERT_RESULT(r, idn_invalid_encoding); +} + +//# TESTCASE +// title: buffer overrun test for utf8toucs4() +// group: utf8-init +{ + r = idn_ucs4_utf8toucs4(utf8_string, to, + idn_ucs4_strlen(ucs4_string) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_UCS4STRING(to, ucs4_string); + + r = idn_ucs4_utf8toucs4(utf8_string, to, + idn_ucs4_strlen(ucs4_string)); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_ucs4_utf8toucs4(utf8_string, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + +//# TESTCASE +// title: buffer overrun test for ucs4toutf8() +// group: ucs4-init +{ + r = idn_ucs4_ucs4toutf8(ucs4_string, to, strlen(utf8_string) + 1); + ASSERT_RESULT(r, idn_success); + ASSERT_STRING(to, utf8_string); + + r = idn_ucs4_ucs4toutf8(ucs4_string, to, strlen(utf8_string)); + ASSERT_RESULT(r, idn_buffer_overflow); + + r = idn_ucs4_ucs4toutf8(ucs4_string, to, 0); + ASSERT_RESULT(r, idn_buffer_overflow); +} + diff --git a/contrib/idn/idnkit-1.0-src/lib/tests/utffilter b/contrib/idn/idnkit-1.0-src/lib/tests/utffilter new file mode 100755 index 00000000..cebd4dce --- /dev/null +++ b/contrib/idn/idnkit-1.0-src/lib/tests/utffilter @@ -0,0 +1,82 @@ +#! /usr/bin/perl -wp +# +# Copyright (c) 2002 Japan Network Information Center. +# All rights reserved. +# +# By using this file, you agree to the terms and conditions set forth bellow. +# +# LICENSE TERMS AND CONDITIONS +# +# The following License Terms and Conditions apply, unless a different +# license is obtained from Japan Network Information Center ("JPNIC"), +# a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda, +# Chiyoda-ku, Tokyo 101-0047, Japan. +# +# 1. Use, Modification and Redistribution (including distribution of any +# modified or derived work) in source and/or binary forms is permitted +# under this License Terms and Conditions. +# +# 2. Redistribution of source code must retain the copyright notices as they +# appear in each source code file, this License Terms and Conditions. +# +# 3. Redistribution in binary form must reproduce the Copyright Notice, +# this License Terms and Conditions, in the documentation and/or other +# materials provided with the distribution. For the purposes of binary +# distribution the "Copyright Notice" refers to the following language: +# "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved." +# +# 4. The name of JPNIC may not be used to endorse or promote products +# derived from this Software without specific prior written approval of +# JPNIC. +# +# 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +# + +sub to_utf8 ($) { + my ($utf32) = hex($_[0]); + my ($mask, $length); + + if ($utf32 < 0x80) { + $mask = 0; + $length = 1; + } elsif ($utf32 < 0x800) { + $mask = 0xc0; + $length = 2; + } elsif ($utf32 < 0x10000) { + $mask = 0xe0; + $length = 3; + } elsif ($utf32 < 0x200000) { + $mask = 0xf0; + $length = 4; + } elsif ($utf32 < 0x4000000) { + $mask = 0xf8; + $length = 5; + } elsif ($utf32 < 0x80000000) { + $mask = 0xfc; + $length = 6; + } else { + return ''; + } + + my ($result, $offset); + $offset = 6 * ($length - 1); + $result .= sprintf('\\x%02x', ($utf32 >> $offset) | $mask); + while ($offset > 0) { + $offset -= 6; + $result .= sprintf('\\x%02x', (($utf32 >> $offset) & 0x3f) | 0x80); + } + + return $result; +} + +s/<U\+([0-9A-Fa-f]+)>/&to_utf8($1)/eg; |