1#ifndef lint
2static char *rcsid = "$Id: res.tsy,v 1.1 2003/06/04 00:26:59 marka Exp $";
3#endif
4
5/*
6 * Copyright (c) 2002 Japan Network Information Center.
7 * All rights reserved.
8 *  
9 * By using this file, you agree to the terms and conditions set forth bellow.
10 * 
11 * 			LICENSE TERMS AND CONDITIONS 
12 * 
13 * The following License Terms and Conditions apply, unless a different
14 * license is obtained from Japan Network Information Center ("JPNIC"),
15 * a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
16 * Chiyoda-ku, Tokyo 101-0047, Japan.
17 * 
18 * 1. Use, Modification and Redistribution (including distribution of any
19 *    modified or derived work) in source and/or binary forms is permitted
20 *    under this License Terms and Conditions.
21 * 
22 * 2. Redistribution of source code must retain the copyright notices as they
23 *    appear in each source code file, this License Terms and Conditions.
24 * 
25 * 3. Redistribution in binary form must reproduce the Copyright Notice,
26 *    this License Terms and Conditions, in the documentation and/or other
27 *    materials provided with the distribution.  For the purposes of binary
28 *    distribution the "Copyright Notice" refers to the following language:
29 *    "Copyright (c) 2000-2002 Japan Network Information Center.  All rights reserved."
30 * 
31 * 4. The name of JPNIC may not be used to endorse or promote products
32 *    derived from this Software without specific prior written approval of
33 *    JPNIC.
34 * 
35 * 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
36 *    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37 *    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
38 *    PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL JPNIC BE LIABLE
39 *    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
40 *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
41 *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
42 *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
43 *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
44 *    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
45 *    ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
46 */
47
48#include <stddef.h>
49#include <stdio.h>
50#include <stdlib.h>
51#include <string.h>
52#include <idn/res.h>
53#include <idn/log.h>
54
55#include "codeset.h"
56#include "setenv.h"
57
58#ifndef EUCJP_ENCODING_NAME
59#define EUCJP_ENCODING_NAME	"eucJP"
60#endif
61
62/*
63 * U+304B: hiragana letter KA
64 * U+3099: combining katakana-hiragana voiced sound mark
65 *
66 * 	map("U+304B U+3099") -> "U+304C"
67 *
68 * U+304C: hiragana letter GA
69 */
70#define UTF8_NAME		"A<U+304B><U+3099>"
71#define UTF8_REVNAME		"a<U+304C>"
72
73/*
74 * A4AC: hiragana letter GA (in EUC-JP)
75 */
76#define EUCJP_NAME	"\xa4\xac"
77#define EUCJP_REVNAME	"\xa4\xac"
78
79/*
80 * Conversion result of "U+304B U+3099 A"
81 */
82#define PUNYCODE_NAME	"xn--a-i8t"
83
84/*
85 * Conversion result of "A U+304B U+3099" (in EUC-JP).
86 */
87#define AUX_EUCJP_NAME	"xn--a-i\xa3\xb8t"
88
89//--------------------------------------------------------------------
90// Setups and Teardowns.
91//--------------------------------------------------------------------
92
93//# SETUP
94//	group: generic-conversion
95//--
96//	Initialize the `resconf' context.
97//	Set local encoding to `UTF-8'.
98{
99	char to[256];
100	idn_result_t r;
101	idn_resconf_t ctx;
102
103	setenv("IDN_LOCAL_CODESET", "UTF-8", 1);
104	unsetenv("IDN_DISABLE");
105
106	r = idn_resconf_initialize();
107	ASSERT_RESULT(r, idn_success);
108
109	r = idn_resconf_create(&ctx);
110	ASSERT_RESULT(r, idn_success);
111
112	r = idn_resconf_setdefaults(ctx);
113	ASSERT_RESULT(r, idn_success);
114}
115
116//# TEARDOWN
117//	group: generic-conversion
118{
119	idn_resconf_destroy(ctx);
120}
121
122//# SETUP
123//	group: quiet
124//--
125//	Set log level to `fatal' to supress log messages.
126{
127	int saved_log_level;
128
129	saved_log_level = idn_log_getlevel();
130	idn_log_setlevel(idn_log_level_fatal);
131}
132
133//# TEARDOWN
134//	group: quiet
135//--
136//	Restore log level.
137{
138	idn_log_setlevel(saved_log_level);
139}
140
141//--------------------------------------------------------------------
142// Testcases.
143//--------------------------------------------------------------------
144
145//# TESTCASE
146//	title: basic conversion by encodename()
147//	group: generic-conversion
148{
149	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to));
150	ASSERT_RESULT(r, idn_success);
151	ASSERT_STRING(to, PUNYCODE_NAME);
152}
153
154//# TESTCASE
155//	title: basic conversion by decodename()
156//	group: generic-conversion
157{
158	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to));
159	ASSERT_RESULT(r, idn_success);
160	ASSERT_STRING(to, UTF8_REVNAME);
161}
162
163//# TESTCASE
164//	title: basic conversion by decodename2()
165//	group: generic-conversion
166{
167	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to),
168			    EUCJP_ENCODING_NAME);
169#ifdef WITHOUT_ICONV
170	ASSERT_RESULT(r, idn_failure);
171#else
172	ASSERT_RESULT(r, idn_success);
173	ASSERT_STRING(to, UTF8_REVNAME);
174#endif
175}
176
177//# TESTCASE
178//	title: call decodename2() with auxencoding=NULL
179//	group: generic-conversion
180{
181#ifdef WITHOUT_ICONV
182	SKIP_TESTCASE;
183#else
184	r = idn_res_decodename2(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to),
185			    NULL);
186	ASSERT_RESULT(r, idn_success);
187	ASSERT_STRING(to, UTF8_REVNAME);
188#endif
189}
190
191//# TESTCASE
192//	title: call encodename() with actions=0
193//	group: generic-conversion
194{
195	r = idn_res_encodename(ctx, 0, UTF8_NAME, to, sizeof(to));
196	ASSERT_RESULT(r, idn_success);
197	ASSERT_STRING(to, UTF8_NAME);
198}
199
200//# TESTCASE
201//	title: call decodename() with actions=0
202//	group: generic-conversion
203{
204	r = idn_res_decodename(ctx, 0, PUNYCODE_NAME, to, sizeof(to));
205	ASSERT_RESULT(r, idn_success);
206	ASSERT_STRING(to, PUNYCODE_NAME);
207}
208
209//# TESTCASE
210//	title: call decodename2() with actions=0
211//	group: generic-conversion
212{
213#ifdef WITHOUT_ICONV
214	SKIP_TESTCASE;
215#else
216	r = idn_res_decodename2(ctx, 0, AUX_EUCJP_NAME, to, sizeof(to),
217			    EUCJP_ENCODING_NAME);
218	ASSERT_RESULT(r, idn_success);
219	ASSERT_STRING(to, AUX_EUCJP_NAME);
220#endif
221}
222
223//# TESTCASE
224//	title: call encodename() with actions=rtcheck
225//	group: generic-conversion quiet
226{
227	r = idn_res_encodename(ctx, IDN_RTCHECK, EUCJP_NAME, to, sizeof(to));
228	ASSERT_RESULT(r, idn_invalid_action);
229}
230
231//# TESTCASE
232//	title: call encodename() with actions=decode-query
233//	group: generic-conversion quiet
234{
235	r = idn_res_encodename(ctx, IDN_DECODE_QUERY, EUCJP_NAME, to, sizeof(to));
236	ASSERT_RESULT(r, idn_invalid_action);
237}
238
239//# TESTCASE
240//	title: call encodename() with actions=decode-app
241//	group: generic-conversion quiet
242{
243	r = idn_res_encodename(ctx, IDN_DECODE_APP, EUCJP_NAME, to, sizeof(to));
244	ASSERT_RESULT(r, idn_invalid_action);
245}
246
247//# TESTCASE
248//	title: call encodename() with actions=decode-stored
249//	group: generic-conversion quiet
250{
251	r = idn_res_encodename(ctx, IDN_DECODE_STORED, EUCJP_NAME, to, sizeof(to));
252	ASSERT_RESULT(r, idn_invalid_action);
253}
254
255//# TESTCASE
256//	title: call encodename() with actions=(1<<31)
257//	group: generic-conversion quiet
258{
259	r = idn_res_encodename(ctx, 1 << 31, EUCJP_NAME, to, sizeof(to));
260	ASSERT_RESULT(r, idn_invalid_action);
261}
262
263//# TESTCASE
264//	title: call decodename() with actions=localmap
265//	group: generic-conversion quiet
266{
267	r = idn_res_decodename(ctx, IDN_LOCALMAP, PUNYCODE_NAME, to, sizeof(to));
268	ASSERT_RESULT(r, idn_invalid_action);
269}
270
271//# TESTCASE
272//	title: call decodename2() with actions=localmap
273//	group: generic-conversion quiet
274{
275#ifdef WITHOUT_ICONV
276	SKIP_TESTCASE;
277#else
278	r = idn_res_decodename2(ctx, IDN_LOCALMAP, AUX_EUCJP_NAME, to, sizeof(to),
279			    EUCJP_ENCODING_NAME);
280	ASSERT_RESULT(r, idn_invalid_action);
281#endif
282}
283
284//# TESTCASE
285//	title: call decodename() with actions=lencheck
286//	group: generic-conversion quiet
287{
288	r = idn_res_decodename(ctx, IDN_LENCHECK, PUNYCODE_NAME, to, sizeof(to));
289	ASSERT_RESULT(r, idn_invalid_action);
290}
291
292//# TESTCASE
293//	title: call decodename2() with actions=lencheck
294//	group: generic-conversion quiet
295{
296#ifdef WITHOUT_ICONV
297	SKIP_TESTCASE;
298#else
299	r = idn_res_decodename2(ctx, IDN_LENCHECK, AUX_EUCJP_NAME, to, sizeof(to),
300			    EUCJP_ENCODING_NAME);
301	ASSERT_RESULT(r, idn_invalid_action);
302#endif
303}
304
305//# TESTCASE
306//	title: call decodename() with actions=encode-query
307//	group: generic-conversion quiet
308{
309	r = idn_res_decodename(ctx, IDN_ENCODE_QUERY, PUNYCODE_NAME, to, sizeof(to));
310	ASSERT_RESULT(r, idn_invalid_action);
311}
312
313//# TESTCASE
314//	title: call decodename2() with actions=encode-query
315//	group: generic-conversion quiet
316{
317#ifdef WITHOUT_ICONV
318	SKIP_TESTCASE;
319#else
320	r = idn_res_decodename2(ctx, IDN_ENCODE_QUERY, AUX_EUCJP_NAME, to, sizeof(to),
321			    EUCJP_ENCODING_NAME);
322	ASSERT_RESULT(r, idn_invalid_action);
323#endif
324}
325
326//# TESTCASE
327//	title: call decodename() with actions=encode-app
328//	group: generic-conversion quiet
329{
330	r = idn_res_decodename(ctx, IDN_ENCODE_APP, PUNYCODE_NAME, to, sizeof(to));
331	ASSERT_RESULT(r, idn_invalid_action);
332}
333
334//# TESTCASE
335//	title: call decodename2() with actions=encode-app
336//	group: generic-conversion quiet
337{
338#ifdef WITHOUT_ICONV
339	SKIP_TESTCASE;
340#else
341	r = idn_res_decodename2(ctx, IDN_ENCODE_APP, AUX_EUCJP_NAME, to, sizeof(to),
342			    EUCJP_ENCODING_NAME);
343	ASSERT_RESULT(r, idn_invalid_action);
344#endif
345}
346
347//# TESTCASE
348//	title: call decodename() with actions=encode-stored
349//	group: generic-conversion quiet
350{
351	r = idn_res_decodename(ctx, IDN_ENCODE_STORED, PUNYCODE_NAME, to, sizeof(to));
352	ASSERT_RESULT(r, idn_invalid_action);
353}
354
355//# TESTCASE
356//	title: call decodename2() with actions=encode-stored
357//	group: generic-conversion quiet
358{
359#ifdef WITHOUT_ICONV
360	SKIP_TESTCASE;
361#else
362	r = idn_res_decodename2(ctx, IDN_ENCODE_STORED, AUX_EUCJP_NAME, to, sizeof(to),
363			    EUCJP_ENCODING_NAME);
364	ASSERT_RESULT(r, idn_invalid_action);
365#endif
366}
367
368//# TESTCASE
369//	title: call decodename() with actions=(1<<31)
370//	group: generic-conversion quiet
371{
372	r = idn_res_decodename(ctx, 1 << 31, PUNYCODE_NAME, to, sizeof(to));
373	ASSERT_RESULT(r, idn_invalid_action);
374}
375
376//# TESTCASE
377//	title: call decodename2() with actions=(1<<31)
378//	group: generic-conversion quiet
379{
380#ifdef WITHOUT_ICONV
381	SKIP_TESTCASE;
382#else
383	r = idn_res_decodename2(ctx, 1 << 31, AUX_EUCJP_NAME, to, sizeof(to),
384			    EUCJP_ENCODING_NAME);
385	ASSERT_RESULT(r, idn_invalid_action);
386#endif
387}
388
389//# TESTCASE
390//	title: call encodename() with actions=localconv
391//	group: generic-conversion quiet
392{
393#ifndef WITHOUT_ICONV
394	SKIP_TESTCASE;
395#else
396	r = idn_res_encodename(ctx, IDN_LOCALCONV, UTF8_NAME, to, sizeof(to));
397	ASSERT_RESULT(r, idn_invalid_action);
398#endif
399}
400
401//# TESTCASE
402//	title: call decodename() with actions=localconv
403//	group: generic-conversion quiet
404{
405#ifndef WITHOUT_ICONV
406	SKIP_TESTCASE;
407#else
408	r = idn_res_decodename(ctx, IDN_LOCALCONV, PUNYCODE_NAME, to, sizeof(to));
409	ASSERT_RESULT(r, idn_invalid_action);
410#endif
411}
412
413//# TESTCASE
414//	title: call decodename2() with actions=localconv
415//	group: generic-conversion
416{
417#ifndef WITHOUT_ICONV
418	SKIP_TESTCASE;
419#else
420	r = idn_res_decodename2(ctx, IDN_LOCALCONV, AUX_EUCJP_NAME, to, sizeof(to),
421			    EUCJP_ENCODING_NAME);
422	ASSERT_RESULT(r, idn_failure);
423#endif
424}
425
426//# TESTCASE
427//	title: call enable(0) and then encodename()
428//	group: generic-conversion
429{
430	idn_res_enable(0);
431	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to));
432	ASSERT_RESULT(r, idn_success);
433	ASSERT_STRING(to, UTF8_NAME);
434}
435
436//# TESTCASE
437//	title: call decodename() when IDN_DISABLE is defined
438//	group: generic-conversion
439{
440	idn_res_enable(0);
441	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to));
442	ASSERT_RESULT(r, idn_success);
443	ASSERT_STRING(to, PUNYCODE_NAME);
444}
445
446//# TESTCASE
447//	title: call decodename() when IDN_DISABLE is defined
448//	group: generic-conversion
449{
450#ifdef WITHOUT_ICONV
451	SKIP_TESTCASE;
452#else
453	idn_res_enable(0);
454	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to),
455			    EUCJP_ENCODING_NAME);
456	ASSERT_RESULT(r, idn_success);
457	ASSERT_STRING(to, AUX_EUCJP_NAME);
458#endif
459}
460
461//# TESTCASE
462//	title: call enable(0) and then encodename()
463//	group: generic-conversion
464{
465	idn_res_enable(0);
466	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to));
467	ASSERT_RESULT(r, idn_success);
468	ASSERT_STRING(to, UTF8_NAME);
469}
470
471//# TESTCASE
472//	title: call enable(0) and then decodename()
473//	group: generic-conversion
474{
475	idn_res_enable(0);
476	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to));
477	ASSERT_RESULT(r, idn_success);
478	ASSERT_STRING(to, PUNYCODE_NAME);
479}
480
481//# TESTCASE
482//	title: call enable(0) and then decodename2()
483//	group: generic-conversion
484{
485#ifdef WITHOUT_ICONV
486	SKIP_TESTCASE;
487#else
488	idn_res_enable(0);
489	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to),
490			    EUCJP_ENCODING_NAME);
491	ASSERT_RESULT(r, idn_success);
492	ASSERT_STRING(to, AUX_EUCJP_NAME);
493#endif
494}
495
496//# TESTCASE
497//	title: set IDN_DISABLE and call encodename()
498//	group: generic-conversion
499{
500	setenv("IDN_DISABLE", "1", 1);
501	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to));
502	ASSERT_RESULT(r, idn_success);
503	ASSERT_STRING(to, UTF8_NAME);
504}
505
506//# TESTCASE
507//	title: set IDN_DISABLE and call decodename()
508//	group: generic-conversion
509{
510	setenv("IDN_DISABLE", "1", 1);
511	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to));
512	ASSERT_RESULT(r, idn_success);
513	ASSERT_STRING(to, PUNYCODE_NAME);
514}
515
516//# TESTCASE
517//	title: set IDN_DISABLE and call decodename2()
518//	group: generic-conversion
519{
520#ifdef WITHOUT_ICONV
521	SKIP_TESTCASE;
522#else
523	setenv("IDN_DISABLE", "1", 1);
524	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to),
525			    EUCJP_ENCODING_NAME);
526	ASSERT_RESULT(r, idn_success);
527	ASSERT_STRING(to, AUX_EUCJP_NAME);
528#endif
529}
530
531//# TESTCASE
532//	title: set IDN_DISABLE, and then call enable(1) and encodename()
533//	group: generic-conversion
534{
535	setenv("IDN_DISABLE", "1", 1);
536	idn_res_enable(1);
537	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, sizeof(to));
538	ASSERT_RESULT(r, idn_success);
539	ASSERT_STRING(to, PUNYCODE_NAME);
540}
541
542//# TESTCASE
543//	title: set IDN_DISABLE, and then call enable(1) and decodename()
544//	group: generic-conversion
545{
546	setenv("IDN_DISABLE", "1", 1);
547	idn_res_enable(1);
548	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, sizeof(to));
549	ASSERT_RESULT(r, idn_success);
550	ASSERT_STRING(to, UTF8_REVNAME);
551}
552
553//# TESTCASE
554//	title: set IDN_DISABLE, and then call enable(1) and decodename2()
555//	group: generic-conversion
556{
557#ifdef WITHOUT_ICONV
558	SKIP_TESTCASE;
559#else
560	setenv("IDN_DISABLE", "1", 1);
561	idn_res_enable(1);
562	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, sizeof(to),
563			    EUCJP_ENCODING_NAME);
564	ASSERT_RESULT(r, idn_success);
565	ASSERT_STRING(to, UTF8_REVNAME);
566#endif
567}
568
569//# TESTCASE
570//	title: overrun test for arg `to' of encodename()
571//	group: generic-conversion
572{
573	/* Normal case */
574	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to,
575			   strlen(PUNYCODE_NAME) + 1);
576	ASSERT_RESULT(r, idn_success);
577	ASSERT_STRING(to, PUNYCODE_NAME);
578
579	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to,
580			   strlen(PUNYCODE_NAME));
581	ASSERT_RESULT(r, idn_buffer_overflow);
582
583	/* enable(0) case */
584	idn_res_enable(0);
585	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to,
586			   strlen(UTF8_NAME) + 1);
587	ASSERT_RESULT(r, idn_success);
588	ASSERT_STRING(to, UTF8_NAME);
589
590	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to,
591			   strlen(UTF8_NAME));
592	ASSERT_RESULT(r, idn_buffer_overflow);
593
594	/* actions=0 case */
595	idn_res_enable(1);
596	r = idn_res_encodename(ctx, 0, UTF8_NAME, to, strlen(UTF8_NAME) + 1);
597	ASSERT_RESULT(r, idn_success);
598	ASSERT_STRING(to, UTF8_NAME);
599
600	r = idn_res_encodename(ctx, 0, UTF8_NAME, to, strlen(UTF8_NAME));
601	ASSERT_RESULT(r, idn_buffer_overflow);
602}
603
604//# TESTCASE
605//	title: overrun test for arg `to' of decodename()
606//	group: generic-conversion
607{
608	/* Normal case */
609	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to,
610			   strlen(UTF8_REVNAME) + 1);
611	ASSERT_RESULT(r, idn_success);
612	ASSERT_STRING(to, UTF8_REVNAME);
613
614	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to,
615			   strlen(UTF8_REVNAME));
616	ASSERT_RESULT(r, idn_buffer_overflow);
617
618	/* idn_res_enable(0) case */
619	idn_res_enable(0);
620	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to,
621			   strlen(PUNYCODE_NAME) + 1);
622	ASSERT_RESULT(r, idn_success);
623	ASSERT_STRING(to, PUNYCODE_NAME);
624
625	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to,
626			   strlen(PUNYCODE_NAME));
627	ASSERT_RESULT(r, idn_buffer_overflow);
628
629	/* actions=0 case */
630	idn_res_enable(1);
631	r = idn_res_decodename(ctx, 0, PUNYCODE_NAME, to,
632			       strlen(PUNYCODE_NAME) + 1);
633	ASSERT_RESULT(r, idn_success);
634	ASSERT_STRING(to, PUNYCODE_NAME);
635
636	r = idn_res_decodename(ctx, 0, PUNYCODE_NAME, to,
637			       strlen(PUNYCODE_NAME));
638	ASSERT_RESULT(r, idn_buffer_overflow);
639}
640
641//# TESTCASE
642//	title: overrun test for arg `to' of decodename2()
643//	group: generic-conversion
644{
645#ifdef WITHOUT_ICONV
646	SKIP_TESTCASE;
647#else
648	/* Normal case */
649	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to,
650			    strlen(UTF8_REVNAME) + 1, EUCJP_ENCODING_NAME);
651	ASSERT_RESULT(r, idn_success);
652	ASSERT_STRING(to, UTF8_REVNAME);
653
654	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to,
655			    strlen(UTF8_REVNAME), EUCJP_ENCODING_NAME);
656	ASSERT_RESULT(r, idn_buffer_overflow);
657
658	/* idn_res_enable(0) case */
659	idn_res_enable(0);
660	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to,
661			    strlen(AUX_EUCJP_NAME) + 1, EUCJP_ENCODING_NAME);
662	ASSERT_RESULT(r, idn_success);
663	ASSERT_STRING(to, AUX_EUCJP_NAME);
664
665	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to,
666			    strlen(AUX_EUCJP_NAME), EUCJP_ENCODING_NAME);
667	ASSERT_RESULT(r, idn_buffer_overflow);
668
669	/* actions=0 case */
670	idn_res_enable(1);
671	r = idn_res_decodename2(ctx, 0, AUX_EUCJP_NAME, to,
672			    strlen(AUX_EUCJP_NAME) + 1, EUCJP_ENCODING_NAME);
673	ASSERT_RESULT(r, idn_success);
674	ASSERT_STRING(to, AUX_EUCJP_NAME);
675
676	r = idn_res_decodename2(ctx, 0, AUX_EUCJP_NAME, to,
677				strlen(AUX_EUCJP_NAME), EUCJP_ENCODING_NAME);
678	ASSERT_RESULT(r, idn_buffer_overflow);
679
680#endif
681}
682
683//# TESTCASE
684//	title: call encodename() with tolen=0
685//	group: generic-conversion
686{
687	r = idn_res_encodename(ctx, IDN_ENCODE_APP, UTF8_NAME, to, 0);
688	ASSERT_RESULT(r, idn_buffer_overflow);
689}
690
691//# TESTCASE
692//	title: call decodename() with tolen=0
693//	group: generic-conversion
694{
695	r = idn_res_decodename(ctx, IDN_DECODE_APP, PUNYCODE_NAME, to, 0);
696	ASSERT_RESULT(r, idn_buffer_overflow);
697}
698
699//# TESTCASE
700//	title: call decodename2() with tolen=0
701//	group: generic-conversion
702{
703#ifdef WITHOUT_ICONV
704	SKIP_TESTCASE;
705#else
706	r = idn_res_decodename2(ctx, IDN_DECODE_APP, AUX_EUCJP_NAME, to, 0,
707			    EUCJP_ENCODING_NAME);
708	ASSERT_RESULT(r, idn_buffer_overflow);
709#endif
710}
711
712//# TESTCASE
713//	title: convert an empty string using encodename()
714//	group: generic-conversion
715{
716	r = idn_res_encodename(ctx, IDN_ENCODE_APP, "", to, sizeof(to));
717	ASSERT_RESULT(r, idn_success);
718	ASSERT_STRING(to, "");
719}
720
721//# TESTCASE
722//	title: convert an empty string using decodename()
723//	group: generic-conversion
724{
725	r = idn_res_decodename(ctx, IDN_DECODE_APP, "", to, sizeof(to));
726	ASSERT_RESULT(r, idn_success);
727	ASSERT_STRING(to, "");
728}
729
730//# TESTCASE
731//	title: convert an empty string using decodename2()
732//	group: generic-conversion
733{
734#ifdef WITHOUT_ICONV
735	SKIP_TESTCASE;
736#else
737	r = idn_res_decodename2(ctx, IDN_DECODE_APP, "", to, sizeof(to),
738			    EUCJP_ENCODING_NAME);
739	ASSERT_RESULT(r, idn_success);
740	ASSERT_STRING(to, "");
741#endif
742}
743
744//# TESTCASE
745//	title: prohcheck by encodename()
746//	group: generic-conversion
747{
748	/* U+1680: prohibited character */
749	r = idn_res_encodename(ctx, IDN_PROHCHECK, "<U+1680>", to, sizeof(to));
750	ASSERT_RESULT(r, idn_prohibited);
751}
752
753//# TESTCASE
754//	title: unascheck by encodename()
755//	group: generic-conversion
756{
757	/* U+0221: unassigned codepoint */
758	r = idn_res_encodename(ctx, IDN_UNASCHECK, "<U+0221>", to, sizeof(to));
759	ASSERT_RESULT(r, idn_prohibited);
760}
761
762//# TESTCASE
763//	title: bidicheck by encodename()
764//	group: generic-conversion
765{
766	/* U+05D0:   bidirectional property is "R" */
767	/* `a':      bidirectional property is "L" */
768	/* `0', `-': bidirectional property is "N" */
769	r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0>", to, sizeof(to));
770	ASSERT_RESULT(r, idn_success);
771
772	r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0><U+05D0>",
773			   to, sizeof(to));
774	ASSERT_RESULT(r, idn_success);
775
776	r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0><U+05D0>-a",
777			   to, sizeof(to));
778	ASSERT_RESULT(r, idn_prohibited);
779
780	r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0>-a-<U+05D0>",
781			   to, sizeof(to));
782	ASSERT_RESULT(r, idn_prohibited);
783
784	r = idn_res_encodename(ctx, IDN_BIDICHECK, "a-<U+05D0><U+05D0>",
785			   to, sizeof(to));
786	ASSERT_RESULT(r, idn_prohibited);
787
788	r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0><U+05D0>-0",
789			   to, sizeof(to));
790	ASSERT_RESULT(r, idn_prohibited);
791
792	r = idn_res_encodename(ctx, IDN_BIDICHECK, "<U+05D0>-0-<U+05D0>",
793			   to, sizeof(to));
794	ASSERT_RESULT(r, idn_success);
795
796	r = idn_res_encodename(ctx, IDN_BIDICHECK, "0-<U+05D0><U+05D0>",
797			   to, sizeof(to));
798	ASSERT_RESULT(r, idn_prohibited);
799}
800
801//# TESTCASE
802//	title: asccheck by encodename()
803//	group: generic-conversion
804{
805	r = idn_res_encodename(ctx, IDN_ASCCHECK, "-name", to, sizeof(to));
806	ASSERT_RESULT(r, idn_prohibited);
807
808	r = idn_res_encodename(ctx, IDN_ASCCHECK, "name-", to, sizeof(to));
809	ASSERT_RESULT(r, idn_prohibited);
810
811	r = idn_res_encodename(ctx, IDN_ASCCHECK, "n ame", to, sizeof(to));
812	ASSERT_RESULT(r, idn_prohibited);
813}
814
815//# TESTCASE
816//	title: lencheck by encodename()
817//	group: generic-conversion
818{
819	r = idn_res_encodename(ctx, IDN_LENCHECK,
820			   "123456789-123456789-123456789-123456789-"
821			   "123456789-123456789-123", to, sizeof(to));
822	ASSERT_RESULT(r, idn_success);
823
824	r = idn_res_encodename(ctx, IDN_LENCHECK,
825			   "123456789-123456789-123456789-123456789-"
826			   "123456789-123456789-1234", to, sizeof(to));
827	ASSERT_RESULT(r, idn_invalid_length);
828
829	r = idn_res_encodename(ctx, IDN_LENCHECK, "a..b", to, sizeof(to));
830	ASSERT_RESULT(r, idn_invalid_length);
831}
832
833//# TESTCASE
834//	title: rtcheck non-prohchecked label by decodename()
835//	group: generic-conversion
836{
837	/* "xn--6ue" -> "U+1680" (prohibited character) */
838	r = idn_res_decodename(ctx, IDN_RTCHECK, "xn--6ue", to, sizeof(to));
839	ASSERT_RESULT(r, idn_success);
840	ASSERT_STRING(to, "xn--6ue");
841}
842
843//# TESTCASE
844//	title: rtcheck non-unaschecked label by decodename()
845//	group: generic-conversion
846{
847	/* "xn--6la" -> "U+0221" (unassigned codepoint) */
848	r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK,
849			   "xn--6la", to, sizeof(to));
850	ASSERT_RESULT(r, idn_success);
851	ASSERT_STRING(to, "xn--6la");
852}
853
854//# TESTCASE
855//	title: rtcheck non-ascchecked label by decodename()
856//	group: generic-conversion
857{
858	/* "xn----x7t" -> "- U+3042" */
859	r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK,
860			   "xn----x7t", to, sizeof(to));
861	ASSERT_RESULT(r, idn_success);
862	ASSERT_STRING(to, "xn----x7t");
863
864	/* "xn----w7t" -> "U+3042 -" */
865	r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK,
866			   "xn----w7t", to, sizeof(to));
867	ASSERT_RESULT(r, idn_success);
868	ASSERT_STRING(to, "xn----w7t");
869}
870
871//# TESTCASE
872//	title: rtcheck non-lenchecked label by decodename()
873//	group: generic-conversion
874{
875	/* `s1' has 63 characters */
876	const char *s1 =
877	    "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b";
878
879	const char *s1rev =
880	    "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>"
881	    "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>"
882	    "<U+5DDD><U+3042><U+3042><U+3042>";
883
884	/* `s2' has 64 characters */
885	const char *s2 =
886	    "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b";
887
888	/* `s3' has an empty label */
889	const char *s3 = "a..b";
890
891	r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to));
892	ASSERT_RESULT(r, idn_success);
893	ASSERT_STRING(to, s1rev);
894
895	r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to));
896	ASSERT_RESULT(r, idn_success);
897	ASSERT_STRING(to, s2);
898
899	r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to));
900	ASSERT_RESULT(r, idn_success);
901	ASSERT_STRING(to, s3);
902}
903
904//# TESTCASE
905//	title: rtcheck non-prohchecked label by decodename2()
906//	group: generic-conversion
907{
908#ifdef WITHOUT_ICONV
909	SKIP_TESTCASE;
910#else
911	/* "xn--6ue" -> "U+1680" (prohibited character) */
912	r = idn_res_decodename2(ctx, IDN_RTCHECK, "xn--6ue", to, sizeof(to),
913			    EUCJP_ENCODING_NAME);
914	ASSERT_RESULT(r, idn_success);
915	ASSERT_STRING(to, "xn--6ue");
916#endif
917}
918
919//# TESTCASE
920//	title: rtcheck non-unaschecked label by decodename2()
921//	group: generic-conversion
922{
923#ifdef WITHOUT_ICONV
924	SKIP_TESTCASE;
925#else
926	/* "xn--6la" -> "U+0221" (unassigned codepoint) */
927	r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_UNASCHECK,
928			    "xn--6la", to, sizeof(to), EUCJP_ENCODING_NAME);
929	ASSERT_RESULT(r, idn_success);
930	ASSERT_STRING(to, "xn--6la");
931#endif
932}
933
934//# TESTCASE
935//	title: rtcheck non-ascchecked label by decodename2()
936//	group: generic-conversion
937{
938#ifdef WITHOUT_ICONV
939	SKIP_TESTCASE;
940#else
941	/* "xn----x7t" -> "- U+3042" */
942	r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK,
943			    "xn----x7t", to, sizeof(to), EUCJP_ENCODING_NAME);
944
945	ASSERT_RESULT(r, idn_success);
946	ASSERT_STRING(to, "xn----x7t");
947
948	/* "xn----w7t" -> "U+3042 -" */
949	r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK | IDN_ASCCHECK,
950			    "xn----w7t", to, sizeof(to), EUCJP_ENCODING_NAME);
951	ASSERT_RESULT(r, idn_success);
952	ASSERT_STRING(to, "xn----w7t");
953#endif
954}
955
956//# TESTCASE
957//	title: rtcheck non-lenchecked label by decodename2()
958//	group: generic-conversion
959{
960#ifdef WITHOUT_ICONV
961	SKIP_TESTCASE;
962#else
963	/* `s1' has 63 characters */
964	const char *s1 =
965	    "xn--l8jaa5522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b";
966
967	const char *s1rev =
968	    "<U+9752><U+68EE><U+5CA9><U+624B><U+5BAE><U+57CE><U+79CB><U+7530>"
969	    "<U+5C71><U+5F62><U+798F><U+5CF6><U+6771><U+4EAC><U+795E><U+5948>"
970	    "<U+5DDD><U+3042><U+3042><U+3042>";
971
972	/* `s2' has 64 characters */
973	const char *s2 =
974	    "xn--a-w7ta6522a8sj38bzugvvblo3y90fjzgvxlmxscifws3d43odzaq6aj340b";
975
976	/* `s3' has an empty label */
977	const char *s3 = "a..b";
978
979	r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK, s1, to, sizeof(to),
980			    EUCJP_ENCODING_NAME);
981	ASSERT_RESULT(r, idn_success);
982	ASSERT_STRING(to, s1rev);
983
984	r = idn_res_decodename2(ctx, IDN_IDNCONV | IDN_RTCHECK, s2, to, sizeof(to),
985			    EUCJP_ENCODING_NAME);
986	ASSERT_RESULT(r, idn_success);
987	ASSERT_STRING(to, s2);
988
989	r = idn_res_decodename(ctx, IDN_IDNCONV | IDN_RTCHECK, s3, to, sizeof(to));
990	ASSERT_RESULT(r, idn_success);
991	ASSERT_STRING(to, s3);
992#endif
993}
994
995//# TESTCASE
996//	title: pass broken string as `from' to encodename()
997//	group: generic-conversion quiet
998{
999	/* "\xe3\x21" is not valid UTF-8 string */
1000	r = idn_res_encodename(ctx, IDN_ENCODE_APP, "\xe3\x21", to, sizeof(to));
1001	ASSERT_RESULT(r, idn_invalid_encoding);
1002}
1003
1004//# TESTCASE
1005//	title: pass broken string as `from' to decodename()
1006//	group: generic-conversion quiet
1007{
1008	/* "\xe3\x21" is not valid UTF-8 string */
1009	r = idn_res_decodename(ctx, IDN_DECODE_APP, "\xe3\x21", to, sizeof(to));
1010	ASSERT_RESULT(r, idn_invalid_encoding);
1011}
1012
1013//# TESTCASE
1014//	title: pass broken string as `from' to decodename2()
1015//	group: generic-conversion quiet
1016{
1017#ifdef WITHOUT_ICONV
1018	SKIP_TESTCASE;
1019#else
1020	/* "\xa4\x21" is not valid EUC-JP string */
1021	r = idn_res_decodename2(ctx, IDN_DECODE_APP, "\xa4\x21", to, sizeof(to),
1022			    EUCJP_ENCODING_NAME);
1023	ASSERT_RESULT(r, idn_invalid_encoding);
1024#endif
1025}
1026
1027