1#ifndef lint
2static char *rcsid = "Id: resconf.tsy,v 1.1 2003/06/04 00:27:00 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 <stdarg.h>
53#include <idn/resconf.h>
54#include <idn/converter.h>
55#include <idn/log.h>
56
57#include "setenv.h"
58#include "testutil.h"
59
60#define CONF_FILENAME		"test.conf"
61#define MAP_FILENAME		"test.map"
62
63//--------------------------------------------------------------------
64// Setups and Teardowns.
65//--------------------------------------------------------------------
66
67//# SETUP
68//      group: generic-init
69{
70	idn_result_t r;
71	idn_resconf_t ctx = NULL;
72
73	setenv("IDN_LOCAL_CODESET", "UTF-8", 1);
74
75	r = idn_resconf_initialize();
76	ASSERT_RESULT(r, idn_success);
77
78	r = idn_resconf_create(&ctx);
79	ASSERT_RESULT(r, idn_success);
80}
81
82//# TEARDOWN
83//      group: generic-init
84{
85	if (ctx != NULL)
86		idn_resconf_destroy(ctx);
87	remove(CONF_FILENAME);
88	remove(MAP_FILENAME);
89}
90
91//# SETUP
92//	group: set-defaults
93{
94	r = idn_resconf_setdefaults(ctx);
95	ASSERT_RESULT(r, idn_success);
96}
97
98//# TEARDOWN
99//	group: set-defaults
100{
101}
102
103//# SETUP
104//	group: quiet
105{
106	int saved_log_level;
107
108	saved_log_level = idn_log_getlevel();
109	idn_log_setlevel(idn_log_level_fatal);
110}
111
112//# TEARDOWN
113//	group: quiet
114{
115	idn_log_setlevel(saved_log_level);
116}
117
118//# SETUP
119//	group: delimitermap_ctx
120{
121	idn_delimitermap_t delimitermap_ctx1 = NULL;
122	idn_delimitermap_t delimitermap_ctx2 = NULL;
123}
124
125//# TEARDOWN
126//	group: delimitermap_ctx
127{
128	if (delimitermap_ctx1 != NULL)
129		idn_delimitermap_destroy(delimitermap_ctx1);
130	if (delimitermap_ctx2 != NULL)
131		idn_delimitermap_destroy(delimitermap_ctx2);
132}
133
134//# SETUP
135//	group: idnconverter_ctx
136{
137	idn_converter_t idnconverter_ctx1 = NULL;
138	idn_converter_t idnconverter_ctx2 = NULL;
139}
140
141//# TEARDOWN
142//	group: idnconverter_ctx
143{
144	if (idnconverter_ctx1 != NULL)
145		idn_converter_destroy(idnconverter_ctx1);
146	if (idnconverter_ctx2 != NULL)
147		idn_converter_destroy(idnconverter_ctx2);
148}
149
150//# SETUP
151//	group: localconverter_ctx
152{
153	idn_converter_t localconverter_ctx1 = NULL;
154	idn_converter_t localconverter_ctx2 = NULL;
155}
156
157//# TEARDOWN
158//	group: localconverter_ctx
159{
160	if (localconverter_ctx1 != NULL)
161		idn_converter_destroy(localconverter_ctx1);
162	if (localconverter_ctx2 != NULL)
163		idn_converter_destroy(localconverter_ctx2);
164}
165
166//# SETUP
167//	group: auxidnconverter_ctx
168{
169	idn_converter_t auxidnconverter_ctx1 = NULL;
170	idn_converter_t auxidnconverter_ctx2 = NULL;
171}
172
173//# TEARDOWN
174//	group: auxidnconverter_ctx
175{
176	if (auxidnconverter_ctx1 != NULL)
177		idn_converter_destroy(auxidnconverter_ctx1);
178	if (auxidnconverter_ctx2 != NULL)
179		idn_converter_destroy(auxidnconverter_ctx2);
180}
181
182//# SETUP
183//	group: mapselector_ctx
184{
185	idn_mapselector_t mapselector_ctx1 = NULL;
186	idn_mapselector_t mapselector_ctx2 = NULL;
187}
188
189//# TEARDOWN
190//	group: mapselector_ctx
191{
192	if (mapselector_ctx1 != NULL)
193		idn_mapselector_destroy(mapselector_ctx1);
194	if (mapselector_ctx2 != NULL)
195		idn_mapselector_destroy(mapselector_ctx2);
196}
197
198//# SETUP
199//	group: mapper_ctx
200{
201	idn_mapper_t mapper_ctx1 = NULL;
202	idn_mapper_t mapper_ctx2 = NULL;
203}
204
205//# TEARDOWN
206//	group: mapper_ctx
207{
208	if (mapper_ctx1 != NULL)
209		idn_mapper_destroy(mapper_ctx1);
210	if (mapper_ctx2 != NULL)
211		idn_mapper_destroy(mapper_ctx2);
212}
213
214//# SETUP
215//	group: normalizer_ctx
216{
217	idn_normalizer_t normalizer_ctx1 = NULL;
218	idn_normalizer_t normalizer_ctx2 = NULL;
219}
220
221//# TEARDOWN
222//	group: normalizer_ctx
223{
224	if (normalizer_ctx1 != NULL)
225		idn_normalizer_destroy(normalizer_ctx1);
226	if (normalizer_ctx2 != NULL)
227		idn_normalizer_destroy(normalizer_ctx2);
228}
229
230//# SETUP
231//	group: prohibitchecker_ctx
232{
233	idn_checker_t prohibitchecker_ctx1 = NULL;
234	idn_checker_t prohibitchecker_ctx2 = NULL;
235}
236
237//# TEARDOWN
238//	group: prohibitchecker_ctx
239{
240	if (prohibitchecker_ctx1 != NULL)
241		idn_checker_destroy(prohibitchecker_ctx1);
242	if (prohibitchecker_ctx2 != NULL)
243		idn_checker_destroy(prohibitchecker_ctx2);
244}
245
246//# SETUP
247//	group: unassignedchecker_ctx
248{
249	idn_checker_t unassignedchecker_ctx1 = NULL;
250	idn_checker_t unassignedchecker_ctx2 = NULL;
251}
252
253//# TEARDOWN
254//	group: unassignedchecker_ctx
255{
256	if (unassignedchecker_ctx1 != NULL)
257		idn_checker_destroy(unassignedchecker_ctx1);
258	if (unassignedchecker_ctx2 != NULL)
259		idn_checker_destroy(unassignedchecker_ctx2);
260}
261
262//# SETUP
263//	group: bidichecker_ctx
264{
265	idn_checker_t bidichecker_ctx1 = NULL;
266	idn_checker_t bidichecker_ctx2 = NULL;
267}
268
269//# TEARDOWN
270//	group: bidichecker_ctx
271{
272	if (bidichecker_ctx1 != NULL)
273		idn_checker_destroy(bidichecker_ctx1);
274	if (bidichecker_ctx2 != NULL)
275		idn_checker_destroy(bidichecker_ctx2);
276}
277
278//--------------------------------------------------------------------
279// Testcases.
280//--------------------------------------------------------------------
281
282//# TESTCASE
283//	title: call create() without initialization.
284//--
285//	This must be the first test case.
286{
287	idn_result_t r;
288	idn_resconf_t ctx = NULL;
289
290	r = idn_resconf_create(&ctx);
291	ASSERT_RESULT(r, idn_failure);
292
293	if (ctx != NULL)
294		idn_resconf_destroy(ctx);
295}
296
297//# TESTCASE
298//	title: call initialize() twice.
299//
300{
301	idn_result_t r;
302
303	r = idn_resconf_initialize();
304	ASSERT_RESULT(r, idn_success);
305
306	r = idn_resconf_initialize();
307	ASSERT_RESULT(r, idn_success);
308}
309
310//# TESTCASE
311//	title: call create()
312{
313	idn_result_t r;
314	idn_resconf_t ctx;
315
316	r = idn_resconf_initialize();
317	ASSERT_RESULT(r, idn_success);
318
319	r = idn_resconf_create(&ctx);
320	ASSERT_RESULT(r, idn_success);
321
322	if (ctx != NULL)
323		idn_resconf_destroy(ctx);
324}
325
326//# TESTCASE
327//	title: load file (idn-encoding)
328//	group: generic-init
329{
330	const char *idn_encoding;
331
332	create_conf_file(CONF_FILENAME, 0,
333			 "idn-encoding	Punycode",
334			 NULL);
335	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
336	ASSERT_RESULT(r, idn_success);
337}
338
339//# TESTCASE
340//	title: load file (nameprep)
341//	group: generic-init
342{
343	const char *idn_encoding;
344
345	create_conf_file(CONF_FILENAME, 0,
346			 "nameprep	" IDN_NAMEPREP_CURRENT,
347			 NULL);
348	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
349	ASSERT_RESULT(r, idn_success);
350}
351
352//# TESTCASE
353//	title: load file (idn-encoding & nameprep)
354//	group: generic-init
355{
356	const char *idn_encoding;
357
358	create_conf_file(CONF_FILENAME, 0,
359			 "idn-encoding	Punycode",
360			 "nameprep	" IDN_NAMEPREP_CURRENT,
361			 NULL);
362	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
363	ASSERT_RESULT(r, idn_success);
364}
365
366//# TESTCASE
367//	title: load file (empty)
368//	group: generic-init
369{
370	const char *idn_encoding;
371
372	create_conf_file(CONF_FILENAME, 0,
373			 NULL);
374	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
375	ASSERT_RESULT(r, idn_success);
376}
377
378//# TESTCASE
379//	title: load file (local-map filemap)
380//	group: generic-init
381{
382	const char *idn_encoding;
383
384	create_conf_file(CONF_FILENAME, 0,
385			 "local-map	.jp	filemap:" MAP_FILENAME,
386			 NULL);
387	create_conf_file(MAP_FILENAME, 0,
388			 "2212; FF0D",
389			 NULL);
390
391	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
392	ASSERT_RESULT(r, idn_success);
393}
394
395//# TESTCASE
396//	title: load file (local-map nameprep)
397//	group: generic-init
398{
399	const char *idn_encoding;
400
401	create_conf_file(CONF_FILENAME, 0,
402			 "local-map	.jp	" IDN_NAMEPREP_CURRENT,
403			 NULL);
404	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
405	ASSERT_RESULT(r, idn_success);
406}
407
408//# TESTCASE
409//	title: set defaults
410//	group: generic-init set-defaults
411{
412}
413
414//# TESTCASE
415//	title: load file (no file)
416//	group: generic-init
417{
418	r = idn_resconf_loadfile(ctx, "no-such-file");
419	ASSERT_RESULT(r, idn_nofile);
420}
421
422//# TESTCASE
423//	title: load file (empty file name)
424//	group: generic-init
425{
426	r = idn_resconf_loadfile(ctx, "");
427	ASSERT_RESULT(r, idn_nofile);
428}
429
430//# TESTCASE
431//	title: load file (unknown command)
432//	group: generic-init quiet
433{
434	create_conf_file(CONF_FILENAME, 0,
435			 "unknown-command	" IDN_NAMEPREP_CURRENT,
436			 NULL);
437	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
438	ASSERT_RESULT(r, idn_invalid_syntax);
439}
440
441//# TESTCASE
442//	title: load file (no newline at the end of file)
443//	group: generic-init quiet
444{
445	create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE,
446			 "nameprep	" IDN_NAMEPREP_CURRENT,
447			 NULL);
448	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
449	ASSERT_RESULT(r, idn_success);
450}
451
452//# TESTCASE
453//	title: load file (too long line)
454//	group: generic-init quiet
455{
456	char arg[1024];
457	char *line;
458
459	/* arg = "local-map . ////..." */
460	memset(arg, '/', sizeof(arg));
461	arg[sizeof(arg) - 1] = '\0';
462	line = "local-map	.	";
463	memcpy(arg, line, strlen(line));
464
465	create_conf_file(CONF_FILENAME, 0, arg, NULL);
466
467	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
468	ASSERT_RESULT(r, idn_invalid_syntax);
469}
470
471//# TESTCASE
472//	title: load file (empty file)
473//	group: generic-init
474{
475	create_conf_file(CONF_FILENAME, 0, "", NULL);
476	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
477	ASSERT_RESULT(r, idn_success);
478}
479
480//# TESTCASE
481//	title: load file (invalid parameter for idn-encoding)
482//	group: generic-init quiet
483{
484#ifndef WITHOUT_ICONV
485	SKIP_TESTCASE;
486#else
487	create_conf_file(CONF_FILENAME, 0,
488			 "idn-encoding	invalid-encoding-name",
489			 NULL);
490	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
491	ASSERT_RESULT(r, idn_invalid_name);
492#endif
493}
494
495//# TESTCASE
496//	title: load file (define idn-encoding twice)
497//	group: generic-init quiet
498{
499#ifndef WITHOUT_ICONV
500	SKIP_TESTCASE;
501#else
502	create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE,
503			 "idn-encoding	Punycode",
504			 "idn-encoding	Punycode",
505			 NULL);
506	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
507	ASSERT_RESULT(r, idn_invalid_syntax);
508#endif
509}
510
511//# TESTCASE
512//	title: load file (invalid parameter for nameprep)
513//	group: generic-init quiet
514{
515	create_conf_file(CONF_FILENAME, 0,
516			 "nameprep	invalid-version",
517			 NULL);
518	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
519	ASSERT_RESULT(r, idn_invalid_name);
520}
521
522//# TESTCASE
523//	title: load file (define nameprep twice)
524//	group: generic-init quiet
525{
526#ifndef WITHOUT_ICONV
527	SKIP_TESTCASE;
528#else
529	create_conf_file(CONF_FILENAME, CONF_NO_EOF_NEWLINE,
530			 "nameprep	" IDN_NAMEPREP_CURRENT,
531			 "nameprep	" IDN_NAMEPREP_CURRENT,
532			 NULL);
533	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
534	ASSERT_RESULT(r, idn_invalid_syntax);
535#endif
536}
537
538//# TESTCASE
539//	title: load file (invalid parameter for local-map)
540//	group: generic-init quiet
541{
542	create_conf_file(CONF_FILENAME, 0,
543			 "local-map	.jp	:",
544			 NULL);
545	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
546	ASSERT_RESULT(r, idn_invalid_name);
547
548	create_conf_file(CONF_FILENAME, 0,
549			 "local-map	.jp	invalid:/dev/null",
550			 NULL);
551	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
552	ASSERT_RESULT(r, idn_invalid_name);
553
554	create_conf_file(CONF_FILENAME, 0,
555			 "local-map	.jp	filemap",
556			 NULL);
557	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
558	ASSERT_RESULT(r, idn_nofile);
559
560	create_conf_file(CONF_FILENAME, 0,
561			 "local-map	.jp	filemap:",
562			 NULL);
563	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
564	ASSERT_RESULT(r, idn_nofile);
565
566	create_conf_file(CONF_FILENAME, 0,
567			 "local-map	.jp	filemap:no-such-file",
568			 NULL);
569	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
570	ASSERT_RESULT(r, idn_nofile);
571
572	create_conf_file(CONF_FILENAME, 0,
573			 "local-map "
574			 "abcdefghijklmnopqrstuvwxyz0123"
575			 "abcdefghijklmnopqrstuvwxyz0123"
576			 "4567 "
577			 IDN_NAMEPREP_CURRENT,
578			 NULL);
579	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
580	ASSERT_RESULT(r, idn_invalid_name);
581}
582
583//# TESTCASE
584//	title: load file (pass wrong number of parameters to idn-encoding)
585//	group: generic-init quiet
586{
587	create_conf_file(CONF_FILENAME, 0,
588			 "idn-encoding	",
589			 NULL);
590	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
591	ASSERT_RESULT(r, idn_invalid_syntax);
592
593	create_conf_file(CONF_FILENAME, 0,
594			 "idn-encoding	Punycode ?",
595			 NULL);
596	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
597	ASSERT_RESULT(r, idn_invalid_syntax);
598}
599
600//# TESTCASE
601//	title: load file (pass wrong number of parameters to nameprep)
602//	group: generic-init quiet
603{
604	create_conf_file(CONF_FILENAME, 0,
605			 "nameprep	",
606			 NULL);
607	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
608	ASSERT_RESULT(r, idn_invalid_syntax);
609
610	create_conf_file(CONF_FILENAME, 0,
611			 "nameprep	" IDN_NAMEPREP_CURRENT " ?",
612			 NULL);
613	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
614	ASSERT_RESULT(r, idn_invalid_syntax);
615}
616
617//# TESTCASE
618//	title: load file (pass wrong number of parameters to local-map)
619//	group: generic-init quiet
620{
621	create_conf_file(CONF_FILENAME, 0,
622			 "local-map	",
623			 NULL);
624	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
625	ASSERT_RESULT(r, idn_invalid_syntax);
626
627	create_conf_file(CONF_FILENAME, 0,
628			 "local-map	.jp	",
629			 NULL);
630	r = idn_resconf_loadfile(ctx, CONF_FILENAME);
631	ASSERT_RESULT(r, idn_invalid_syntax);
632}
633
634//# TESTCASE
635//	title: getdelimitermap
636//	group: generic-init set-defaults delimitermap_ctx
637{
638	delimitermap_ctx1 = idn_resconf_getdelimitermap(ctx);
639	ASSERT_PTR_NE(delimitermap_ctx1, NULL);
640}
641
642//# TESTCASE
643//	title: setdelimitermap
644//	group: generic-init set-defaults delimitermap_ctx
645{
646	r = idn_delimitermap_create(&delimitermap_ctx1);
647	ASSERT_RESULT(r, idn_success);
648
649	/* set delimitermap context. */
650	idn_resconf_setdelimitermap(ctx, delimitermap_ctx1);
651	delimitermap_ctx2 = idn_resconf_getdelimitermap(ctx);
652	ASSERT_PTR(delimitermap_ctx2, delimitermap_ctx1);
653	idn_delimitermap_destroy(delimitermap_ctx2);
654
655	/* set NULL as delimitermap context */
656	idn_resconf_setdelimitermap(ctx, NULL);
657	delimitermap_ctx2 = idn_resconf_getdelimitermap(ctx);
658	ASSERT_PTR(delimitermap_ctx2, NULL);
659}
660
661//# TESTCASE
662//	title: addalldelimitermapucs
663//	group: generic-init set-defaults
664{
665	static unsigned long v[] = {0x002C, 0x3001, 0xFF0C};
666	int nv = sizeof(v) / sizeof(*v);
667
668	r = idn_resconf_addalldelimitermapucs(ctx, v, nv);
669	ASSERT_RESULT(r, idn_success);
670}
671
672//# TESTCASE
673//	title: getidnconverter
674//	group: generic-init set-defaults idnconverter_ctx
675{
676	idnconverter_ctx1 = idn_resconf_getidnconverter(ctx);
677	ASSERT_PTR_NE(idnconverter_ctx1, NULL);
678}
679
680//# TESTCASE
681//	title: setidnconverter
682//	group: generic-init set-defaults idnconverter_ctx
683{
684	r = idn_converter_create("Punycode", &idnconverter_ctx1, 0);
685	ASSERT_RESULT(r, idn_success);
686
687	/* set idnconverter context. */
688	idn_resconf_setidnconverter(ctx, idnconverter_ctx1);
689	idnconverter_ctx2 = idn_resconf_getidnconverter(ctx);
690	ASSERT_PTR(idnconverter_ctx2, idnconverter_ctx1);
691	idn_converter_destroy(idnconverter_ctx2);
692
693	/* set NULL as idnconverter context */
694	idn_resconf_setidnconverter(ctx, NULL);
695	idnconverter_ctx2 = idn_resconf_getidnconverter(ctx);
696	ASSERT_PTR(idnconverter_ctx2, NULL);
697}
698
699//# TESTCASE
700//	title: getlocalconverter
701//	group: generic-init set-defaults localconverter_ctx
702{
703	localconverter_ctx1 = idn_resconf_getlocalconverter(ctx);
704#ifdef WITHOUT_ICONV
705	ASSERT_PTR(localconverter_ctx1, NULL);
706#else
707	ASSERT_PTR_NE(localconverter_ctx1, NULL);
708#endif
709}
710
711//# TESTCASE
712//	title: setlocalconverter
713//	group: generic-init set-defaults localconverter_ctx
714{
715	r = idn_converter_create("UTF-8", &localconverter_ctx1, 0);
716	ASSERT_RESULT(r, idn_success);
717
718	/* set localconverter context. */
719	idn_resconf_setlocalconverter(ctx, localconverter_ctx1);
720	localconverter_ctx2 = idn_resconf_getlocalconverter(ctx);
721#ifdef WITHOUT_ICONV
722	ASSERT_PTR(localconverter_ctx2, NULL);
723#else
724	ASSERT_PTR(localconverter_ctx2, localconverter_ctx1);
725	idn_converter_destroy(localconverter_ctx2);
726#endif
727
728	/* set NULL as localconverter context */
729	idn_resconf_setlocalconverter(ctx, NULL);
730	localconverter_ctx2 = idn_resconf_getlocalconverter(ctx);
731#ifdef WITHOUT_ICONV
732	ASSERT_PTR(localconverter_ctx2, NULL);
733#else
734	ASSERT_PTR_NE(localconverter_ctx2, NULL);
735#endif
736}
737
738//# TESTCASE
739//	title: getauxidnconverter
740//	group: generic-init set-defaults auxidnconverter_ctx
741{
742	auxidnconverter_ctx1 = idn_resconf_getauxidnconverter(ctx);
743	ASSERT_PTR(auxidnconverter_ctx1, NULL);
744}
745
746//# TESTCASE
747//	title: setauxidnconverter
748//	group: generic-init set-defaults auxidnconverter_ctx
749{
750	r = idn_converter_create("Punycode", &auxidnconverter_ctx1, 0);
751	ASSERT_RESULT(r, idn_success);
752
753	/* set auxidnconverter context. */
754	idn_resconf_setauxidnconverter(ctx, auxidnconverter_ctx1);
755	auxidnconverter_ctx2 = idn_resconf_getauxidnconverter(ctx);
756	ASSERT_PTR(auxidnconverter_ctx2, auxidnconverter_ctx1);
757	idn_converter_destroy(auxidnconverter_ctx2);
758
759	/* set NULL as auxidnconverter context */
760	idn_resconf_setauxidnconverter(ctx, NULL);
761	auxidnconverter_ctx2 = idn_resconf_getauxidnconverter(ctx);
762	ASSERT_PTR(auxidnconverter_ctx2, NULL);
763}
764
765//# TESTCASE
766//	title: getlocalmapselector
767//	group: generic-init set-defaults mapselector_ctx
768{
769	mapselector_ctx1 = idn_resconf_getlocalmapselector(ctx);
770	ASSERT_PTR(mapselector_ctx1, NULL);
771}
772
773//# TESTCASE
774//	title: setlocalmapselector
775//	group: generic-init set-defaults mapselector_ctx
776{
777	r = idn_mapselector_create(&mapselector_ctx1);
778	ASSERT_RESULT(r, idn_success);
779
780	/* set localmapselector context. */
781	idn_resconf_setlocalmapselector(ctx, mapselector_ctx1);
782	mapselector_ctx2 = idn_resconf_getlocalmapselector(ctx);
783	ASSERT_PTR(mapselector_ctx2, mapselector_ctx1);
784	idn_mapselector_destroy(mapselector_ctx2);
785
786	/* set NULL as localmapselector context */
787	idn_resconf_setlocalmapselector(ctx, NULL);
788	mapselector_ctx2 = idn_resconf_getlocalmapselector(ctx);
789	ASSERT_PTR(mapselector_ctx2, NULL);
790}
791
792//# TESTCASE
793//	title: addalllocalmapselectornames
794//	group: generic-init set-defaults
795{
796	static const char *names[] = {
797		"filemap:" MAP_FILENAME,
798		"filemap:" MAP_FILENAME,
799		"filemap:" MAP_FILENAME
800	};
801	int nnames = sizeof(names) / sizeof(*names);
802
803	create_conf_file(MAP_FILENAME, 0,
804			 "2212; FF0D",
805			 NULL);
806	r = idn_resconf_addalllocalmapselectornames(ctx, ".jp", names, nnames);
807	ASSERT_RESULT(r, idn_success);
808}
809
810//# TESTCASE
811//	title: getmapper
812//	group: generic-init set-defaults mapper_ctx
813{
814	mapper_ctx1 = idn_resconf_getmapper(ctx);
815	ASSERT_PTR_NE(mapper_ctx1, NULL);
816}
817
818//# TESTCASE
819//	title: setmapper
820//	group: generic-init set-defaults mapper_ctx
821{
822	r = idn_mapper_create(&mapper_ctx1);
823	ASSERT_RESULT(r, idn_success);
824
825	/* set mapper context. */
826	idn_resconf_setmapper(ctx, mapper_ctx1);
827	mapper_ctx2 = idn_resconf_getmapper(ctx);
828	ASSERT_PTR(mapper_ctx2, mapper_ctx1);
829	idn_mapper_destroy(mapper_ctx2);
830
831	/* set NULL as mapper context */
832	idn_resconf_setmapper(ctx, NULL);
833	mapper_ctx2 = idn_resconf_getmapper(ctx);
834	ASSERT_PTR(mapper_ctx2, NULL);
835}
836
837//# TESTCASE
838//	title: addallmappernames
839//	group: generic-init set-defaults
840{
841	static const char *names[] = {
842		IDN_NAMEPREP_CURRENT,
843		IDN_NAMEPREP_CURRENT,
844		IDN_NAMEPREP_CURRENT
845	};
846	int nnames = sizeof(names) / sizeof(*names);
847
848	r = idn_resconf_addallmappernames(ctx, names, nnames);
849	ASSERT_RESULT(r, idn_success);
850}
851
852//# TESTCASE
853//	title: getnormalizer
854//	group: generic-init set-defaults normalizer_ctx
855{
856	normalizer_ctx1 = idn_resconf_getnormalizer(ctx);
857	ASSERT_PTR_NE(normalizer_ctx1, NULL);
858}
859
860//# TESTCASE
861//	title: setnormalizer
862//	group: generic-init set-defaults normalizer_ctx
863{
864	r = idn_normalizer_create(&normalizer_ctx1);
865	ASSERT_RESULT(r, idn_success);
866
867	/* set normalizer context. */
868	idn_resconf_setnormalizer(ctx, normalizer_ctx1);
869	normalizer_ctx2 = idn_resconf_getnormalizer(ctx);
870	ASSERT_PTR(normalizer_ctx2, normalizer_ctx1);
871	idn_normalizer_destroy(normalizer_ctx2);
872
873	/* set NULL as normalizer context */
874	idn_resconf_setnormalizer(ctx, NULL);
875	normalizer_ctx2 = idn_resconf_getnormalizer(ctx);
876	ASSERT_PTR(normalizer_ctx2, NULL);
877}
878
879//# TESTCASE
880//	title: addallnormalizernames
881//	group: generic-init set-defaults
882{
883	static const char *names[] = {
884		IDN_NAMEPREP_CURRENT,
885		IDN_NAMEPREP_CURRENT,
886		IDN_NAMEPREP_CURRENT
887	};
888	int nnames = sizeof(names) / sizeof(*names);
889
890	r = idn_resconf_addallnormalizernames(ctx, names, nnames);
891	ASSERT_RESULT(r, idn_success);
892}
893
894//# TESTCASE
895//	title: getprohibitchecker
896//	group: generic-init set-defaults prohibitchecker_ctx
897{
898	prohibitchecker_ctx1 = idn_resconf_getprohibitchecker(ctx);
899	ASSERT_PTR_NE(prohibitchecker_ctx1, NULL);
900}
901
902//# TESTCASE
903//	title: setprohibitchecker
904//	group: generic-init set-defaults prohibitchecker_ctx
905{
906	r = idn_checker_create(&prohibitchecker_ctx1);
907	ASSERT_RESULT(r, idn_success);
908
909	/* set checker context. */
910	idn_resconf_setprohibitchecker(ctx, prohibitchecker_ctx1);
911	prohibitchecker_ctx2 = idn_resconf_getprohibitchecker(ctx);
912	ASSERT_PTR(prohibitchecker_ctx2, prohibitchecker_ctx1);
913	idn_checker_destroy(prohibitchecker_ctx2);
914
915	/* set NULL as checker context */
916	idn_resconf_setprohibitchecker(ctx, NULL);
917	prohibitchecker_ctx2 = idn_resconf_getprohibitchecker(ctx);
918	ASSERT_PTR(prohibitchecker_ctx2, NULL);
919}
920
921//# TESTCASE
922//	title: addallprohibitcheckernames
923//	group: generic-init set-defaults
924{
925	static const char *names[] = {
926		IDN_NAMEPREP_CURRENT,
927		IDN_NAMEPREP_CURRENT,
928		IDN_NAMEPREP_CURRENT
929	};
930	int nnames = sizeof(names) / sizeof(*names);
931
932	r = idn_resconf_addallprohibitcheckernames(ctx, names, nnames);
933	ASSERT_RESULT(r, idn_success);
934}
935
936//# TESTCASE
937//	title: getunassignedchecker
938//	group: generic-init set-defaults unassignedchecker_ctx
939{
940	unassignedchecker_ctx1 = idn_resconf_getunassignedchecker(ctx);
941	ASSERT_PTR_NE(unassignedchecker_ctx1, NULL);
942}
943
944//# TESTCASE
945//	title: setunassignedchecker
946//	group: generic-init set-defaults unassignedchecker_ctx
947{
948	r = idn_checker_create(&unassignedchecker_ctx1);
949	ASSERT_RESULT(r, idn_success);
950
951	/* set checker context. */
952	idn_resconf_setunassignedchecker(ctx, unassignedchecker_ctx1);
953	unassignedchecker_ctx2 = idn_resconf_getunassignedchecker(ctx);
954	ASSERT_PTR(unassignedchecker_ctx2, unassignedchecker_ctx1);
955	idn_checker_destroy(unassignedchecker_ctx2);
956
957	/* set NULL as checker context */
958	idn_resconf_setunassignedchecker(ctx, NULL);
959	unassignedchecker_ctx2 = idn_resconf_getunassignedchecker(ctx);
960	ASSERT_PTR(unassignedchecker_ctx2, NULL);
961}
962
963//# TESTCASE
964//	title: addallunassignedcheckernames
965//	group: generic-init set-defaults
966{
967	static const char *names[] = {
968		IDN_NAMEPREP_CURRENT,
969		IDN_NAMEPREP_CURRENT,
970		IDN_NAMEPREP_CURRENT
971	};
972	int nnames = sizeof(names) / sizeof(*names);
973
974	r = idn_resconf_addallunassignedcheckernames(ctx, names, nnames);
975	ASSERT_RESULT(r, idn_success);
976}
977
978//# TESTCASE
979//	title: getbidichecker
980//	group: generic-init set-defaults bidichecker_ctx
981{
982	bidichecker_ctx1 = idn_resconf_getbidichecker(ctx);
983	ASSERT_PTR_NE(bidichecker_ctx1, NULL);
984}
985
986//# TESTCASE
987//	title: setbidichecker
988//	group: generic-init set-defaults bidichecker_ctx
989{
990	r = idn_checker_create(&bidichecker_ctx1);
991	ASSERT_RESULT(r, idn_success);
992
993	/* set checker context. */
994	idn_resconf_setbidichecker(ctx, bidichecker_ctx1);
995	bidichecker_ctx2 = idn_resconf_getbidichecker(ctx);
996	ASSERT_PTR(bidichecker_ctx2, bidichecker_ctx1);
997	idn_checker_destroy(bidichecker_ctx2);
998
999	/* set NULL as checker context */
1000	idn_resconf_setbidichecker(ctx, NULL);
1001	bidichecker_ctx2 = idn_resconf_getbidichecker(ctx);
1002	ASSERT_PTR(bidichecker_ctx2, NULL);
1003}
1004
1005//# TESTCASE
1006//	title: addallbidicheckernames
1007//	group: generic-init set-defaults
1008{
1009	static const char *names[] = {
1010		IDN_NAMEPREP_CURRENT,
1011		IDN_NAMEPREP_CURRENT,
1012		IDN_NAMEPREP_CURRENT
1013	};
1014	int nnames = sizeof(names) / sizeof(*names);
1015
1016	r = idn_resconf_addallbidicheckernames(ctx, names, nnames);
1017	ASSERT_RESULT(r, idn_success);
1018}
1019
1020//# TESTCASE
1021//	title: setnameprepversion
1022//	group: generic-init set-defaults
1023{
1024	idn_resconf_setnameprepversion(ctx, IDN_NAMEPREP_CURRENT);
1025	ASSERT_RESULT(r, idn_success);
1026}
1027