idnatest.c revision f9878a236aa0d9662d8e40cafdaf2e04cd615835
1/*
2 *******************************************************************************
3 *
4 *   Copyright (C) 2003-2014, International Business Machines
5 *   Corporation and others.  All Rights Reserved.
6 *
7 *******************************************************************************
8 *   file name:  idnatest.c
9 *   encoding:   US-ASCII
10 *   tab size:   8 (not used)
11 *   indentation:4
12 *
13 *   created on: 2003jul11
14 *   created by: Ram Viswanadha
15 */
16#include <stdlib.h>
17#include <string.h>
18#include "unicode/utypes.h"
19
20#if !UCONFIG_NO_IDNA
21
22#include "unicode/ustring.h"
23#include "unicode/uidna.h"
24#include "cintltst.h"
25#include "cmemory.h"
26
27#define MAX_DEST_SIZE 1000
28
29static void TestToUnicode(void);
30static void TestToASCII(void);
31static void TestIDNToUnicode(void);
32static void TestIDNToASCII(void);
33static void TestCompare(void);
34static void TestJB4490(void);
35static void TestJB4475(void);
36static void TestLength(void);
37static void TestJB5273(void);
38static void TestUTS46(void);
39
40void addIDNATest(TestNode** root);
41
42
43typedef int32_t
44(U_EXPORT2 *TestFunc) (   const UChar *src, int32_t srcLength,
45                UChar *dest, int32_t destCapacity,
46                int32_t options, UParseError *parseError,
47                UErrorCode *status);
48typedef int32_t
49(U_EXPORT2 *CompareFunc) (const UChar *s1, int32_t s1Len,
50                const UChar *s2, int32_t s2Len,
51                int32_t options,
52                UErrorCode *status);
53
54
55void
56addIDNATest(TestNode** root)
57{
58   addTest(root, &TestToUnicode,    "idna/TestToUnicode");
59   addTest(root, &TestToASCII,      "idna/TestToASCII");
60   addTest(root, &TestIDNToUnicode, "idna/TestIDNToUnicode");
61   addTest(root, &TestIDNToASCII,   "idna/TestIDNToASCII");
62   addTest(root, &TestCompare,      "idna/TestCompare");
63   addTest(root, &TestJB4490,       "idna/TestJB4490");
64   addTest(root, &TestJB4475,       "idna/TestJB4475");
65   addTest(root, &TestLength,       "idna/TestLength");
66   addTest(root, &TestJB5273,       "idna/TestJB5273");
67   addTest(root, &TestUTS46,        "idna/TestUTS46");
68}
69
70static void
71testAPI(const UChar* src, const UChar* expected, const char* testName,
72            UBool useSTD3ASCIIRules,UErrorCode expectedStatus,
73            UBool doCompare, UBool testUnassigned,  TestFunc func){
74
75    UErrorCode status = U_ZERO_ERROR;
76    UChar destStack[MAX_DEST_SIZE];
77    int32_t destLen = 0;
78    UChar* dest = NULL;
79    int32_t expectedLen = (expected != NULL) ? u_strlen(expected) : 0;
80    int32_t options = (useSTD3ASCIIRules == TRUE) ? UIDNA_USE_STD3_RULES : UIDNA_DEFAULT;
81    UParseError parseError;
82    int32_t tSrcLen = 0;
83    UChar* tSrc = NULL;
84
85    if(src != NULL){
86        tSrcLen = u_strlen(src);
87        tSrc  =(UChar*) malloc( U_SIZEOF_UCHAR * tSrcLen );
88        memcpy(tSrc,src,tSrcLen * U_SIZEOF_UCHAR);
89    }
90
91    /* test null-terminated source and return value of number of UChars required */
92
93    destLen = func(src,-1,NULL,0,options, &parseError , &status);
94    if(status == U_BUFFER_OVERFLOW_ERROR){
95        status = U_ZERO_ERROR; /* reset error code */
96        if(destLen+1 < MAX_DEST_SIZE){
97            dest = destStack;
98            destLen = func(src,-1,dest,destLen+1,options, &parseError, &status);
99            /* TODO : compare output with expected */
100            if(U_SUCCESS(status) && expectedStatus != U_IDNA_STD3_ASCII_RULES_ERROR&& (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
101                log_err("Did not get the expected result for  null terminated source.\n" );
102            }
103        }else{
104            log_err( "%s null terminated source failed. Requires destCapacity > 300\n",testName);
105        }
106    }
107
108    if(status != expectedStatus){
109        log_err_status(status,  "Did not get the expected error for %s null terminated source failed. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status));
110        free(tSrc);
111        return;
112    }
113    if(testUnassigned ){
114        status = U_ZERO_ERROR;
115        destLen = func(src,-1,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status);
116        if(status == U_BUFFER_OVERFLOW_ERROR){
117            status = U_ZERO_ERROR; /* reset error code */
118            if(destLen+1 < MAX_DEST_SIZE){
119                dest = destStack;
120                destLen = func(src,-1,dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status);
121                /* TODO : compare output with expected */
122                if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
123                    log_err("Did not get the expected result for %s null terminated source with both options set.\n",testName);
124
125                }
126            }else{
127                log_err( "%s null terminated source failed. Requires destCapacity > 300\n",testName);
128            }
129        }
130        /*testing query string*/
131        if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){
132            log_err( "Did not get the expected error for %s null terminated source with options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status));
133        }
134    }
135
136    status = U_ZERO_ERROR;
137
138    /* test source with lengthand return value of number of UChars required*/
139    destLen = func(tSrc, tSrcLen, NULL,0,options, &parseError, &status);
140    if(status == U_BUFFER_OVERFLOW_ERROR){
141        status = U_ZERO_ERROR; /* reset error code */
142        if(destLen+1 < MAX_DEST_SIZE){
143            dest = destStack;
144            destLen = func(src,u_strlen(src),dest,destLen+1,options, &parseError, &status);
145            /* TODO : compare output with expected */
146            if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
147                log_err("Did not get the expected result for %s with source length.\n",testName);
148            }
149        }else{
150            log_err( "%s with source length  failed. Requires destCapacity > 300\n",testName);
151        }
152    }
153
154    if(status != expectedStatus){
155        log_err( "Did not get the expected error for %s with source length. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status));
156    }
157    if(testUnassigned){
158        status = U_ZERO_ERROR;
159
160        destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status);
161
162        if(status == U_BUFFER_OVERFLOW_ERROR){
163            status = U_ZERO_ERROR; /* reset error code */
164            if(destLen+1 < MAX_DEST_SIZE){
165                dest = destStack;
166                destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_ALLOW_UNASSIGNED, &parseError, &status);
167                /* TODO : compare output with expected */
168                if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
169                    log_err("Did not get the expected result for %s with source length and both options set.\n",testName);
170                }
171            }else{
172                log_err( "%s with source length  failed. Requires destCapacity > 300\n",testName);
173            }
174        }
175        /*testing query string*/
176        if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){
177            log_err( "Did not get the expected error for %s with source length and options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status));
178        }
179    }
180
181    status = U_ZERO_ERROR;
182    destLen = func(src,-1,NULL,0,options | UIDNA_USE_STD3_RULES, &parseError, &status);
183    if(status == U_BUFFER_OVERFLOW_ERROR){
184        status = U_ZERO_ERROR; /* reset error code*/
185        if(destLen+1 < MAX_DEST_SIZE){
186            dest = destStack;
187            destLen = func(src,-1,dest,destLen+1,options | UIDNA_USE_STD3_RULES, &parseError, &status);
188            /* TODO : compare output with expected*/
189            if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
190                log_err("Did not get the expected result for %s null terminated source with both options set.\n",testName);
191
192            }
193        }else{
194            log_err( "%s null terminated source failed. Requires destCapacity > 300\n",testName);
195        }
196    }
197    /*testing query string*/
198    if(status != expectedStatus){
199        log_err( "Did not get the expected error for %s null terminated source with options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status));
200    }
201
202    status = U_ZERO_ERROR;
203
204    destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_USE_STD3_RULES, &parseError, &status);
205
206    if(status == U_BUFFER_OVERFLOW_ERROR){
207        status = U_ZERO_ERROR; /* reset error code*/
208        if(destLen+1 < MAX_DEST_SIZE){
209            dest = destStack;
210            destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_USE_STD3_RULES, &parseError, &status);
211            /* TODO : compare output with expected*/
212            if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
213                log_err("Did not get the expected result for %s with source length and both options set.\n",testName);
214            }
215        }else{
216            log_err( "%s with source length  failed. Requires destCapacity > 300\n",testName);
217        }
218    }
219    /*testing query string*/
220    if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR){
221        log_err( "Did not get the expected error for %s with source length and options set. Expected: %s Got: %s\n",testName, u_errorName(expectedStatus), u_errorName(status));
222    }
223    free(tSrc);
224}
225
226static const UChar unicodeIn[][41] ={
227    {
228        0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643, 0x0644,
229        0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A, 0x061F, 0x0000
230    },
231    {
232        0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587,
233        0x0000
234    },
235    {
236        0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073, 0x0074,
237        0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076, 0x00ED, 0x010D,
238        0x0065, 0x0073, 0x006B, 0x0079, 0x0000
239    },
240    {
241        0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5, 0x05D8,
242        0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9, 0x05DD, 0x05E2,
243        0x05D1, 0x05E8, 0x05D9, 0x05EA, 0x0000
244    },
245    {
246        0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928, 0x094D,
247        0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902, 0x0928, 0x0939,
248        0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938, 0x0915, 0x0924, 0x0947,
249        0x0939, 0x0948, 0x0902, 0x0000
250    },
251    {
252        0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E, 0x3092,
253        0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044, 0x306E, 0x304B,
254        0x0000
255    },
256/*
257    {
258        0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
259        0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
260        0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C, 0x0000
261    },
262*/
263    {
264        0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435, 0x043E,
265        0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432, 0x043E, 0x0440,
266        0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443, 0x0441, 0x0441, 0x043A,
267        0x0438, 0x0000
268    },
269    {
270        0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F, 0x0070,
271        0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069, 0x006D, 0x0070,
272        0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074, 0x0065, 0x0068, 0x0061,
273        0x0062, 0x006C, 0x0061, 0x0072, 0x0065, 0x006E, 0x0045, 0x0073, 0x0070,
274        0x0061, 0x00F1, 0x006F, 0x006C, 0x0000
275    },
276    {
277        0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587,
278        0x0000
279    },
280    {
281        0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD, 0x006B,
282        0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3, 0x0063, 0x0068,
283        0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069, 0x1EBF, 0x006E, 0x0067,
284        0x0056, 0x0069, 0x1EC7, 0x0074, 0x0000
285    },
286    {
287        0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F, 0x0000
288    },
289    {
290        0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069, 0x0074,
291        0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052, 0x002D, 0x004D,
292        0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053, 0x0000
293    },
294    {
295        0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E, 0x006F,
296        0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061, 0x0079, 0x002D,
297        0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834, 0x6240, 0x0000
298    },
299    {
300        0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032, 0x0000
301    },
302    {
303        0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069, 0x3059,
304        0x308B, 0x0035, 0x79D2, 0x524D, 0x0000
305    },
306    {
307        0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0,
308        0x0000
309    },
310    {
311        0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067, 0x0000
312    },
313    /* test non-BMP code points */
314    {
315        0xD800, 0xDF00, 0xD800, 0xDF01, 0xD800, 0xDF02, 0xD800, 0xDF03, 0xD800, 0xDF05,
316        0xD800, 0xDF06, 0xD800, 0xDF07, 0xD800, 0xDF09, 0xD800, 0xDF0A, 0xD800, 0xDF0B,
317        0x0000
318    },
319    {
320        0xD800, 0xDF0D, 0xD800, 0xDF0C, 0xD800, 0xDF1E, 0xD800, 0xDF0F, 0xD800, 0xDF16,
321        0xD800, 0xDF15, 0xD800, 0xDF14, 0xD800, 0xDF12, 0xD800, 0xDF10, 0xD800, 0xDF20,
322        0xD800, 0xDF21,
323        0x0000
324    },
325    /* Greek  */
326    {
327        0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac
328    },
329    /* Maltese */
330    {
331        0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127,
332        0x0127, 0x0061
333    },
334    /* Russian */
335    {
336        0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435,
337        0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432,
338        0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443,
339        0x0441, 0x0441, 0x043a, 0x0438
340    },
341    {
342        0x0054,0x0045,0x0053,0x0054
343    }
344};
345
346static const char * const asciiIn[] = {
347    "xn--egbpdaj6bu4bxfgehfvwxn",
348    "xn--ihqwcrb4cv8a8dqg056pqjye",
349    "xn--Proprostnemluvesky-uyb24dma41a",
350    "xn--4dbcagdahymbxekheh6e0a7fei0b",
351    "xn--i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd",
352    "xn--n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa",
353/*  "xn--989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c",*/
354    "xn--b1abfaaepdrnnbgefbaDotcwatmq2g4l",
355    "xn--PorqunopuedensimplementehablarenEspaol-fmd56a",
356    "xn--ihqwctvzc91f659drss3x8bo0yb",
357    "xn--TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g",
358    "xn--3B-ww4c5e180e575a65lsy2b",
359    "xn---with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n",
360    "xn--Hello-Another-Way--fc4qua05auwb3674vfr0b",
361    "xn--2-u9tlzr9756bt3uc0v",
362    "xn--MajiKoi5-783gue6qz075azm5e",
363    "xn--de-jg4avhby1noc0d",
364    "xn--d9juau41awczczp",
365    "XN--097CCDEKGHQJK",
366    "XN--db8CBHEJLGH4E0AL",
367    "xn--hxargifdar",                       /* Greek */
368    "xn--bonusaa-5bb1da",                   /* Maltese */
369    "xn--b1abfaaepdrnnbgefbadotcwatmq2g4l",  /* Russian (Cyrillic)*/
370    "TEST"
371
372};
373
374static const char * const domainNames[] = {
375    "slip129-37-118-146.nc.us.ibm.net",
376    "saratoga.pe.utexas.edu",
377    "dial-120-45.ots.utexas.edu",
378    "woo-085.dorms.waller.net",
379    "hd30-049.hil.compuserve.com",
380    "pem203-31.pe.ttu.edu",
381    "56K-227.MaxTNT3.pdq.net",
382    "dial-36-2.ots.utexas.edu",
383    "slip129-37-23-152.ga.us.ibm.net",
384    "ts45ip119.cadvision.com",
385    "sdn-ts-004txaustP05.dialsprint.net",
386    "bar-tnt1s66.erols.com",
387    "101.st-louis-15.mo.dial-access.att.net",
388    "h92-245.Arco.COM",
389    "dial-13-2.ots.utexas.edu",
390    "net-redynet29.datamarkets.com.ar",
391    "ccs-shiva28.reacciun.net.ve",
392    "7.houston-11.tx.dial-access.att.net",
393    "ingw129-37-120-26.mo.us.ibm.net",
394    "dialup6.austintx.com",
395    "dns2.tpao.gov.tr",
396    "slip129-37-119-194.nc.us.ibm.net",
397    "cs7.dillons.co.uk.203.119.193.in-addr.arpa",
398    "swprd1.innovplace.saskatoon.sk.ca",
399    "bikini.bologna.maraut.it",
400    "node91.subnet159-198-79.baxter.com",
401    "cust19.max5.new-york.ny.ms.uu.net",
402    "balexander.slip.andrew.cmu.edu",
403    "pool029.max2.denver.co.dynip.alter.net",
404    "cust49.max9.new-york.ny.ms.uu.net",
405    "s61.abq-dialin2.hollyberry.com",
406    "\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com", /*':'(0x003a) produces U_IDNA_STD3_ASCII_RULES_ERROR*/
407    "www.xn--vea.com",
408    /* "www.\\u00E0\\u00B3\\u00AF.com",//' ' (0x0020) produces U_IDNA_STD3_ASCII_RULES_ERROR*/
409    "www.\\u00C2\\u00A4.com",
410    "www.\\u00C2\\u00A3.com",
411    /* "\\u0025", //'%' (0x0025) produces U_IDNA_STD3_ASCII_RULES_ERROR*/
412    /* "\\u005C\\u005C", //'\' (0x005C) produces U_IDNA_STD3_ASCII_RULES_ERROR*/
413    /*"@",*/
414    /*"\\u002F",*/
415    /*"www.\\u0021.com",*/
416    /*"www.\\u0024.com",*/
417    /*"\\u003f",*/
418    /* These yeild U_IDNA_PROHIBITED_ERROR*/
419    /*"\\u00CF\\u0082.com",*/
420    /*"\\u00CE\\u00B2\\u00C3\\u009Fss.com",*/
421    /*"\\u00E2\\u0098\\u00BA.com",*/
422    "\\u00C3\\u00BC.com"
423
424};
425
426static void
427TestToASCII(){
428
429    int32_t i;
430    UChar buf[MAX_DEST_SIZE];
431    const char* testName = "uidna_toASCII";
432    TestFunc func = uidna_toASCII;
433    for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){
434        u_charsToUChars(asciiIn[i],buf, (int32_t)strlen(asciiIn[i])+1);
435        testAPI(unicodeIn[i], buf,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func);
436
437    }
438}
439
440static void
441TestToUnicode(){
442
443    int32_t i;
444    UChar buf[MAX_DEST_SIZE];
445    const char* testName = "uidna_toUnicode";
446    TestFunc func = uidna_toUnicode;
447    for(i=0;i< (int32_t)(sizeof(asciiIn)/sizeof(asciiIn[0])); i++){
448        u_charsToUChars(asciiIn[i],buf, (int32_t)strlen(asciiIn[i])+1);
449        testAPI(buf,unicodeIn[i],testName,FALSE,U_ZERO_ERROR, TRUE, TRUE, func);
450    }
451}
452
453
454static void
455TestIDNToUnicode(){
456    int32_t i;
457    UChar buf[MAX_DEST_SIZE];
458    UChar expected[MAX_DEST_SIZE];
459    UErrorCode status = U_ZERO_ERROR;
460    int32_t bufLen = 0;
461    UParseError parseError;
462    const char* testName="uidna_IDNToUnicode";
463    TestFunc func = uidna_IDNToUnicode;
464    for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){
465        bufLen = (int32_t)strlen(domainNames[i]);
466        bufLen = u_unescape(domainNames[i],buf, bufLen+1);
467        func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseError,&status);
468        if(U_FAILURE(status)){
469            log_err_status(status,  "%s failed to convert domainNames[%i].Error: %s \n",testName, i, u_errorName(status));
470            break;
471        }
472        testAPI(buf,expected,testName,FALSE,U_ZERO_ERROR, TRUE, TRUE, func);
473         /*test toUnicode with all labels in the string*/
474        testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func);
475        if(U_FAILURE(status)){
476            log_err( "%s failed to convert domainNames[%i].Error: %s \n",testName,i, u_errorName(status));
477            break;
478        }
479    }
480
481}
482
483static void
484TestIDNToASCII(){
485    int32_t i;
486    UChar buf[MAX_DEST_SIZE];
487    UChar expected[MAX_DEST_SIZE];
488    UErrorCode status = U_ZERO_ERROR;
489    int32_t bufLen = 0;
490    UParseError parseError;
491    const char* testName="udina_IDNToASCII";
492    TestFunc func=uidna_IDNToASCII;
493
494    for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){
495        bufLen = (int32_t)strlen(domainNames[i]);
496        bufLen = u_unescape(domainNames[i],buf, bufLen+1);
497        func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseError,&status);
498        if(U_FAILURE(status)){
499            log_err_status(status,  "%s failed to convert domainNames[%i].Error: %s \n",testName,i, u_errorName(status));
500            break;
501        }
502        testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func);
503        /*test toASCII with all labels in the string*/
504        testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, FALSE, TRUE, func);
505        if(U_FAILURE(status)){
506            log_err( "%s failed to convert domainNames[%i].Error: %s \n",testName,i, u_errorName(status));
507            break;
508        }
509    }
510
511
512}
513
514
515static void
516testCompareWithSrc(const UChar* s1, int32_t s1Len,
517            const UChar* s2, int32_t s2Len,
518            const char* testName, CompareFunc func,
519            UBool isEqual){
520
521    UErrorCode status = U_ZERO_ERROR;
522    int32_t retVal = func(s1,-1,s2,-1,UIDNA_DEFAULT,&status);
523
524    if(isEqual==TRUE &&  retVal !=0){
525        log_err("Did not get the expected result for %s with null termniated strings.\n",testName);
526    }
527    if(U_FAILURE(status)){
528        log_err_status(status, "%s null terminated source failed. Error: %s\n", testName,u_errorName(status));
529    }
530
531    status = U_ZERO_ERROR;
532    retVal = func(s1,-1,s2,-1,UIDNA_ALLOW_UNASSIGNED,&status);
533
534    if(isEqual==TRUE &&  retVal !=0){
535        log_err("Did not get the expected result for %s with null termniated strings with options set.\n", testName);
536    }
537    if(U_FAILURE(status)){
538        log_err_status(status, "%s null terminated source and options set failed. Error: %s\n",testName, u_errorName(status));
539    }
540
541    status = U_ZERO_ERROR;
542    retVal = func(s1,s1Len,s2,s2Len,UIDNA_DEFAULT,&status);
543
544    if(isEqual==TRUE &&  retVal !=0){
545        log_err("Did not get the expected result for %s with string length.\n",testName);
546    }
547    if(U_FAILURE(status)){
548        log_err_status(status,  "%s with string length. Error: %s\n",testName, u_errorName(status));
549    }
550
551    status = U_ZERO_ERROR;
552    retVal = func(s1,s1Len,s2,s2Len,UIDNA_ALLOW_UNASSIGNED,&status);
553
554    if(isEqual==TRUE &&  retVal !=0){
555        log_err("Did not get the expected result for %s with string length and options set.\n",testName);
556    }
557    if(U_FAILURE(status)){
558        log_err_status(status,  "%s with string length and options set. Error: %s\n", u_errorName(status), testName);
559    }
560}
561
562
563static void
564TestCompare(){
565    int32_t i;
566
567    const char* testName ="uidna_compare";
568    CompareFunc func = uidna_compare;
569
570    UChar www[] = {0x0057, 0x0057, 0x0057, 0x002E, 0x0000};
571    UChar com[] = {0x002E, 0x0043, 0x004F, 0x004D, 0x0000};
572    UChar buf[MAX_DEST_SIZE]={0x0057, 0x0057, 0x0057, 0x002E, 0x0000};
573    UChar source[MAX_DEST_SIZE]={0},
574          uni0[MAX_DEST_SIZE]={0},
575          uni1[MAX_DEST_SIZE]={0},
576          ascii0[MAX_DEST_SIZE]={0},
577          ascii1[MAX_DEST_SIZE]={0},
578          temp[MAX_DEST_SIZE] ={0};
579
580
581    u_strcat(uni0,unicodeIn[0]);
582    u_strcat(uni0,com);
583
584    u_strcat(uni1,unicodeIn[1]);
585    u_strcat(uni1,com);
586
587    u_charsToUChars(asciiIn[0], temp, (int32_t)strlen(asciiIn[0]));
588    u_strcat(ascii0,temp);
589    u_strcat(ascii0,com);
590
591    memset(temp, 0, U_SIZEOF_UCHAR * MAX_DEST_SIZE);
592
593    u_charsToUChars(asciiIn[1], temp, (int32_t)strlen(asciiIn[1]));
594    u_strcat(ascii1,temp);
595    u_strcat(ascii1,com);
596
597    /* prepend www. */
598    u_strcat(source, www);
599
600    for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){
601        UChar* src;
602        int32_t srcLen;
603
604        memset(buf+4, 0, (MAX_DEST_SIZE-4) * U_SIZEOF_UCHAR);
605
606        u_charsToUChars(asciiIn[i],buf+4, (int32_t)strlen(asciiIn[i]));
607        u_strcat(buf,com);
608
609
610        /* for every entry in unicodeIn array
611           prepend www. and append .com*/
612        source[4]=0;
613        u_strncat(source,unicodeIn[i], u_strlen(unicodeIn[i]));
614        u_strcat(source,com);
615
616        /* a) compare it with itself*/
617        src = source;
618        srcLen = u_strlen(src);
619
620        testCompareWithSrc(src,srcLen,src,srcLen,testName, func, TRUE);
621
622        /* b) compare it with asciiIn equivalent */
623        testCompareWithSrc(src,srcLen,buf,u_strlen(buf),testName, func,TRUE);
624
625        /* c) compare it with unicodeIn not equivalent*/
626        if(i==0){
627            testCompareWithSrc(src,srcLen,uni1,u_strlen(uni1),testName, func,FALSE);
628        }else{
629            testCompareWithSrc(src,srcLen,uni0,u_strlen(uni0),testName, func,FALSE);
630        }
631        /* d) compare it with asciiIn not equivalent */
632        if(i==0){
633            testCompareWithSrc(src,srcLen,ascii1,u_strlen(ascii1),testName, func,FALSE);
634        }else{
635            testCompareWithSrc(src,srcLen,ascii0,u_strlen(ascii0),testName, func,FALSE);
636        }
637
638    }
639}
640
641static void TestJB4490(){
642    static const UChar data[][50]= {
643        {0x00F5,0x00dE,0x00dF,0x00dD, 0x0000},
644        {0xFB00,0xFB01}
645    };
646    UChar output1[40] = {0};
647    UChar output2[40] = {0};
648    int32_t i;
649    for(i=0; i< sizeof(data)/sizeof(data[0]); i++){
650        const UChar* src1 = data[i];
651        int32_t src1Len = u_strlen(src1);
652        UChar* dest1 = output1;
653        int32_t dest1Len = 40;
654        UErrorCode status = U_ZERO_ERROR;
655        UParseError ps;
656        UChar* src2 = NULL;
657        int32_t src2Len = 0;
658        UChar* dest2 = output2;
659        int32_t dest2Len = 40;
660        dest1Len = uidna_toASCII(src1, src1Len, dest1, dest1Len,UIDNA_DEFAULT, &ps, &status);
661        if(U_FAILURE(status)){
662            log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
663        }
664        src2 = dest1;
665        src2Len = dest1Len;
666        dest2Len = uidna_toUnicode(src2, src2Len, dest2, dest2Len, UIDNA_DEFAULT, &ps, &status);
667        if(U_FAILURE(status)){
668            log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
669        }
670    }
671}
672
673static void TestJB4475(){
674
675    static const UChar input[][10] = {
676        {0x0054,0x0045,0x0053,0x0054,0x0000},/* TEST */
677        {0x0074,0x0065,0x0073,0x0074,0x0000} /* test */
678    };
679    int i;
680    UChar output[40] = {0};
681    for(i=0; i< sizeof(input)/sizeof(input[0]); i++){
682        const UChar* src = input[i];
683        int32_t srcLen = u_strlen(src);
684        UChar* dest = output;
685        int32_t destLen = 40;
686        UErrorCode status = U_ZERO_ERROR;
687        UParseError ps;
688
689        destLen = uidna_toASCII(src, srcLen, dest, destLen,UIDNA_DEFAULT, &ps, &status);
690        if(U_FAILURE(status)){
691            log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
692            continue;
693        }
694        if(u_strncmp(input[i], dest, srcLen)!=0){
695            log_err("uidna_toASCII did not return the expected output.\n");
696        }
697    }
698}
699
700static void TestLength(){
701    {
702        static const char* cl = "my_very_very_very_very_very_very_very_very_very_very_very_very_very_long_and_incredibly_uncreative_domain_label";
703        UChar ul[128] = {'\0'};
704        UChar dest[256] = {'\0'};
705        /* this unicode string is longer than MAX_LABEL_BUFFER_SIZE and produces an
706           IDNA prepared string (including xn--)that is exactly 63 bytes long */
707        UChar ul1[] = { 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
708                        0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0x00AD, 0x034F, 0x1806, 0x180B,
709                        0x180C, 0x180D, 0x200B, 0x200C, 0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02,
710                        0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B,
711                        0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFEFF, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
712                        0xC138, 0x0041, 0x00AD, 0x034F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B,
713                        0x200C, 0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05,
714                        0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E,
715                        0xFE0F, 0xFEFF, 0x00AD, 0x034F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B,
716                        0x200C, 0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05,
717                        0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E,
718                        0xFE0F, 0xFEFF, 0x00AD, 0x034F, 0x1806, 0x180B, 0x180C, 0x180D, 0x200B,
719                        0x200C, 0x200D, 0x2060, 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05,
720                        0xFE06, 0xFE07, 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E,
721                        0xFE0F, 0xFEFF, 0x0000
722                      };
723
724        int32_t len1 = UPRV_LENGTHOF(ul1)-1/*remove the null termination*/;
725        int32_t destLen = UPRV_LENGTHOF(dest);
726        UErrorCode status = U_ZERO_ERROR;
727        UParseError ps;
728        int32_t len = (int32_t)strlen(cl);
729        u_charsToUChars(cl, ul, len+1);
730        destLen = uidna_toUnicode(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
731        if(status != U_ZERO_ERROR){
732            log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
733        }
734
735        status = U_ZERO_ERROR;
736        destLen = UPRV_LENGTHOF(dest);
737        len = -1;
738        destLen = uidna_toUnicode(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
739        if(status != U_ZERO_ERROR){
740            log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
741        }
742        status = U_ZERO_ERROR;
743        destLen = UPRV_LENGTHOF(dest);
744        len = (int32_t)strlen(cl);
745        destLen = uidna_toASCII(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
746        if(status != U_IDNA_LABEL_TOO_LONG_ERROR){
747            log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
748        }
749
750        status = U_ZERO_ERROR;
751        destLen = UPRV_LENGTHOF(dest);
752        len = -1;
753        destLen = uidna_toASCII(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
754        if(status != U_IDNA_LABEL_TOO_LONG_ERROR){
755            log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
756        }
757
758        status = U_ZERO_ERROR;
759        destLen = UPRV_LENGTHOF(dest);
760        destLen = uidna_toASCII(ul1, len1, dest, destLen, UIDNA_DEFAULT, &ps, &status);
761        if(status != U_ZERO_ERROR){
762            log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
763        }
764
765        status = U_ZERO_ERROR;
766        destLen = UPRV_LENGTHOF(dest);
767        len1 = -1;
768        destLen = uidna_toASCII(ul1, len1, dest, destLen, UIDNA_DEFAULT, &ps, &status);
769        if(status != U_ZERO_ERROR){
770            log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
771        }
772    }
773    {
774        static const char* cl = "my_very_very_long_and_incredibly_uncreative_domain_label.my_very_very_long_and_incredibly_uncreative_domain_label.my_very_very_long_and_incredibly_uncreative_domain_label.my_very_very_long_and_incredibly_uncreative_domain_label.my_very_very_long_and_incredibly_uncreative_domain_label.my_very_very_long_and_incredibly_uncreative_domain_label.ibm.com";
775        UChar ul[400] = {'\0'};
776        UChar dest[400] = {'\0'};
777        int32_t destLen = UPRV_LENGTHOF(dest);
778        UErrorCode status = U_ZERO_ERROR;
779        UParseError ps;
780        int32_t len = (int32_t)strlen(cl);
781        u_charsToUChars(cl, ul, len+1);
782
783        destLen = uidna_IDNToUnicode(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
784        if(status != U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR){
785            log_err_status(status, "uidna_IDNToUnicode failed with error %s.\n", u_errorName(status));
786        }
787
788        status = U_ZERO_ERROR;
789        destLen = UPRV_LENGTHOF(dest);
790        len = -1;
791        destLen = uidna_IDNToUnicode(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
792        if(status != U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR){
793            log_err_status(status, "uidna_IDNToUnicode failed with error %s.\n", u_errorName(status));
794        }
795
796        status = U_ZERO_ERROR;
797        destLen = UPRV_LENGTHOF(dest);
798        len = (int32_t)strlen(cl);
799        destLen = uidna_IDNToASCII(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
800        if(status != U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR){
801            log_err_status(status, "uidna_IDNToASCII failed with error %s.\n", u_errorName(status));
802        }
803
804        status = U_ZERO_ERROR;
805        destLen = UPRV_LENGTHOF(dest);
806        len = -1;
807        destLen = uidna_IDNToASCII(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
808        if(status != U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR){
809            log_err_status(status, "uidna_IDNToASCII failed with error %s.\n", u_errorName(status));
810        }
811
812        status = U_ZERO_ERROR;
813        uidna_compare(ul, len, ul, len, UIDNA_DEFAULT, &status);
814        if(status != U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR){
815            log_err_status(status, "uidna_compare failed with error %s.\n", u_errorName(status));
816        }
817        uidna_compare(ul, -1, ul, -1, UIDNA_DEFAULT, &status);
818        if(status != U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR){
819            log_err_status(status, "uidna_compare failed with error %s.\n", u_errorName(status));
820        }
821    }
822}
823static void TestJB5273(){
824    static const char INVALID_DOMAIN_NAME[] = "xn--m\\u00FCller.de";
825    UChar invalid_idn[25] = {'\0'};
826    int32_t len = u_unescape(INVALID_DOMAIN_NAME, invalid_idn, strlen(INVALID_DOMAIN_NAME));
827    UChar output[50] = {'\0'};
828    UErrorCode status = U_ZERO_ERROR;
829    UParseError prsError;
830    int32_t outLen = uidna_toUnicode(invalid_idn, len, output, 50, UIDNA_DEFAULT, &prsError, &status);
831    (void)outLen;    /* Suppress set but not used warning. */
832    if(U_FAILURE(status)){
833        log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
834    }
835    status = U_ZERO_ERROR;
836    outLen = uidna_toUnicode(invalid_idn, len, output, 50, UIDNA_USE_STD3_RULES, &prsError, &status);
837    if(U_FAILURE(status)){
838        log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
839    }
840
841    status = U_ZERO_ERROR;
842    outLen = uidna_IDNToUnicode(invalid_idn, len, output, 50, UIDNA_DEFAULT, &prsError, &status);
843    if(U_FAILURE(status)){
844        log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
845    }
846    status = U_ZERO_ERROR;
847    outLen = uidna_IDNToUnicode(invalid_idn, len, output, 50, UIDNA_USE_STD3_RULES, &prsError, &status);
848    if(U_FAILURE(status)){
849        log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
850    }
851}
852
853/*
854 * Test the new (ICU 4.6/2010) C API that was added for UTS #46.
855 * Just an API test: Functionality is tested via C++ intltest.
856 */
857static void TestUTS46() {
858    static const UChar fA_sharps16[] = { 0x66, 0x41, 0xdf, 0 };
859    static const char fA_sharps8[] = { 0x66, 0x41, (char)0xc3, (char)0x9f, 0 };
860    static const UChar fa_sharps16[] = { 0x66, 0x61, 0xdf, 0 };
861    static const char fa_sharps8[] = { 0x66, 0x61, (char)0xc3, (char)0x9f, 0 };
862    static const UChar fass16[] = { 0x66, 0x61, 0x73, 0x73, 0 };
863    static const char fass8[] = { 0x66, 0x61, 0x73, 0x73, 0 };
864    static const UChar fA_BEL[] = { 0x66, 0x41, 7, 0 };
865    static const UChar fa_FFFD[] = { 0x66, 0x61, 0xfffd, 0 };
866
867    UChar dest16[10];
868    char dest8[10];
869    int32_t length;
870
871    UIDNAInfo info = UIDNA_INFO_INITIALIZER;
872    UErrorCode errorCode = U_ZERO_ERROR;
873    UIDNA *uts46 = uidna_openUTS46(UIDNA_USE_STD3_RULES|UIDNA_NONTRANSITIONAL_TO_UNICODE,
874                                   &errorCode);
875    if(U_FAILURE(errorCode)) {
876        log_err_status(errorCode, "uidna_openUTS46() failed: %s\n", u_errorName(errorCode));
877        return;
878    }
879
880    /* These calls should succeed. */
881    length = uidna_labelToASCII(uts46, fA_sharps16, -1,
882                                dest16, UPRV_LENGTHOF(dest16), &info, &errorCode);
883    if( U_FAILURE(errorCode) || length != 4 || 0 != u_memcmp(dest16, fass16, 5) ||
884        !info.isTransitionalDifferent || info.errors != 0
885    ) {
886        log_err("uidna_labelToASCII() failed: %s\n", u_errorName(errorCode));
887    }
888    errorCode = U_ZERO_ERROR;
889    length = uidna_labelToUnicode(uts46, fA_sharps16, u_strlen(fA_sharps16),
890                                  dest16, UPRV_LENGTHOF(dest16), &info, &errorCode);
891    if( U_FAILURE(errorCode) || length != 3 || 0 != u_memcmp(dest16, fa_sharps16, 4) ||
892        !info.isTransitionalDifferent || info.errors != 0
893    ) {
894        log_err("uidna_labelToUnicode() failed: %s\n", u_errorName(errorCode));
895    }
896    errorCode = U_ZERO_ERROR;
897    length = uidna_nameToASCII(uts46, fA_sharps16, u_strlen(fA_sharps16),
898                               dest16, 4, &info, &errorCode);
899    if( errorCode != U_STRING_NOT_TERMINATED_WARNING ||
900        length != 4 || 0 != u_memcmp(dest16, fass16, 4) ||
901        !info.isTransitionalDifferent || info.errors != 0
902    ) {
903        log_err("uidna_nameToASCII() failed: %s\n", u_errorName(errorCode));
904    }
905    errorCode = U_ZERO_ERROR;
906    length = uidna_nameToUnicode(uts46, fA_sharps16, -1,
907                                 dest16, 3, &info, &errorCode);
908    if( errorCode != U_STRING_NOT_TERMINATED_WARNING ||
909        length != 3 || 0 != u_memcmp(dest16, fa_sharps16, 3) ||
910        !info.isTransitionalDifferent || info.errors != 0
911    ) {
912        log_err("uidna_nameToUnicode() failed: %s\n", u_errorName(errorCode));
913    }
914
915    errorCode = U_ZERO_ERROR;
916    length = uidna_labelToASCII_UTF8(uts46, fA_sharps8, -1,
917                                     dest8, UPRV_LENGTHOF(dest8), &info, &errorCode);
918    if( U_FAILURE(errorCode) || length != 4 || 0 != memcmp(dest8, fass8, 5) ||
919        !info.isTransitionalDifferent || info.errors != 0
920    ) {
921        log_err("uidna_labelToASCII_UTF8() failed: %s\n", u_errorName(errorCode));
922    }
923    errorCode = U_ZERO_ERROR;
924    length = uidna_labelToUnicodeUTF8(uts46, fA_sharps8, strlen(fA_sharps8),
925                                      dest8, UPRV_LENGTHOF(dest8), &info, &errorCode);
926    if( U_FAILURE(errorCode) || length != 4 || 0 != memcmp(dest8, fa_sharps8, 5) ||
927        !info.isTransitionalDifferent || info.errors != 0
928    ) {
929        log_err("uidna_labelToUnicodeUTF8() failed: %s\n", u_errorName(errorCode));
930    }
931    errorCode = U_ZERO_ERROR;
932    length = uidna_nameToASCII_UTF8(uts46, fA_sharps8, strlen(fA_sharps8),
933                                    dest8, 4, &info, &errorCode);
934    if( errorCode != U_STRING_NOT_TERMINATED_WARNING ||
935        length != 4 || 0 != memcmp(dest8, fass8, 4) ||
936        !info.isTransitionalDifferent || info.errors != 0
937    ) {
938        log_err("uidna_nameToASCII_UTF8() failed: %s\n", u_errorName(errorCode));
939    }
940    errorCode = U_ZERO_ERROR;
941    length = uidna_nameToUnicodeUTF8(uts46, fA_sharps8, -1,
942                                     dest8, 4, &info, &errorCode);
943    if( errorCode != U_STRING_NOT_TERMINATED_WARNING ||
944        length != 4 || 0 != memcmp(dest8, fa_sharps8, 4) ||
945        !info.isTransitionalDifferent || info.errors != 0
946    ) {
947        log_err("uidna_nameToUnicodeUTF8() failed: %s\n", u_errorName(errorCode));
948    }
949
950    errorCode = U_ZERO_ERROR;
951    length = uidna_nameToASCII(uts46, NULL, 0,
952                               dest16, 0, &info, &errorCode);
953    if( errorCode != U_STRING_NOT_TERMINATED_WARNING ||
954        length != 0 ||
955        info.isTransitionalDifferent || info.errors != UIDNA_ERROR_EMPTY_LABEL
956    ) {
957        log_err("uidna_nameToASCII(empty) failed: %s\n", u_errorName(errorCode));
958    }
959    errorCode = U_ZERO_ERROR;
960    length = uidna_nameToUnicode(uts46, fA_BEL, -1,
961                                 dest16, 3, &info, &errorCode);
962    if( errorCode != U_STRING_NOT_TERMINATED_WARNING ||
963        length != 3 || 0 != u_memcmp(dest16, fa_FFFD, 3) ||
964        info.isTransitionalDifferent || info.errors == 0
965    ) {
966        log_err("uidna_nameToUnicode(fa<BEL>) failed: %s\n", u_errorName(errorCode));
967    }
968
969    /* These calls should fail. */
970    errorCode = U_USELESS_COLLATOR_ERROR;
971    length = uidna_labelToASCII(uts46, fA_sharps16, -1,
972                                dest16, UPRV_LENGTHOF(dest16), &info, &errorCode);
973    if(errorCode != U_USELESS_COLLATOR_ERROR) {
974        log_err("uidna_labelToASCII(failure) failed: %s\n", u_errorName(errorCode));
975    }
976    errorCode = U_ZERO_ERROR;
977    length = uidna_labelToUnicode(uts46, fA_sharps16, u_strlen(fA_sharps16),
978                                  dest16, UPRV_LENGTHOF(dest16), NULL, &errorCode);
979    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
980        log_err("uidna_labelToUnicode(UIDNAInfo=NULL) failed: %s\n", u_errorName(errorCode));
981    }
982    errorCode = U_ZERO_ERROR;
983    length = uidna_nameToASCII(uts46, NULL, u_strlen(fA_sharps16),
984                               dest16, 4, &info, &errorCode);
985    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
986        log_err("uidna_nameToASCII(src=NULL) failed: %s\n", u_errorName(errorCode));
987    }
988    errorCode = U_ZERO_ERROR;
989    length = uidna_nameToUnicode(uts46, fA_sharps16, -2,
990                                 dest16, 3, &info, &errorCode);
991    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
992        log_err("uidna_nameToUnicode(length<-1) failed: %s\n", u_errorName(errorCode));
993    }
994
995    errorCode = U_ZERO_ERROR;
996    length = uidna_labelToASCII_UTF8(uts46, fA_sharps8, -1,
997                                     NULL, UPRV_LENGTHOF(dest8), &info, &errorCode);
998    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
999        log_err("uidna_labelToASCII_UTF8(dest=NULL) failed: %s\n", u_errorName(errorCode));
1000    }
1001    errorCode = U_ZERO_ERROR;
1002    length = uidna_labelToUnicodeUTF8(uts46, fA_sharps8, strlen(fA_sharps8),
1003                                      dest8, -1, &info, &errorCode);
1004    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
1005        log_err("uidna_labelToUnicodeUTF8(capacity<0) failed: %s\n", u_errorName(errorCode));
1006    }
1007    errorCode = U_ZERO_ERROR;
1008    length = uidna_nameToASCII_UTF8(uts46, dest8, strlen(fA_sharps8),
1009                                    dest8, 4, &info, &errorCode);
1010    if(errorCode != U_ILLEGAL_ARGUMENT_ERROR) {
1011        log_err("uidna_nameToASCII_UTF8(src==dest!=NULL) failed: %s\n", u_errorName(errorCode));
1012    }
1013    errorCode = U_ZERO_ERROR;
1014    length = uidna_nameToUnicodeUTF8(uts46, fA_sharps8, -1,
1015                                     dest8, 3, &info, &errorCode);
1016    if(errorCode != U_BUFFER_OVERFLOW_ERROR || length != 4) {
1017        log_err("uidna_nameToUnicodeUTF8() overflow failed: %s\n", u_errorName(errorCode));
1018    }
1019
1020    uidna_close(uts46);
1021}
1022
1023#endif
1024
1025/*
1026 * Hey, Emacs, please set the following:
1027 *
1028 * Local Variables:
1029 * indent-tabs-mode: nil
1030 * End:
1031 *
1032 */
1033