]> git.saurik.com Git - apple/icu.git/blame - icuSources/test/cintltst/idnatest.c
ICU-57163.0.1.tar.gz
[apple/icu.git] / icuSources / test / cintltst / idnatest.c
CommitLineData
374ca955
A
1/*
2 *******************************************************************************
3 *
2ca993e8 4 * Copyright (C) 2003-2016, International Business Machines
374ca955
A
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"
b331163b 25#include "cmemory.h"
374ca955 26
374ca955
A
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);
73c04bcf
A
34static void TestJB4490(void);
35static void TestJB4475(void);
46f4442e
A
36static void TestLength(void);
37static void TestJB5273(void);
729e4ab9
A
38static void TestUTS46(void);
39
374ca955
A
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");
46f4442e 63 addTest(root, &TestJB4490, "idna/TestJB4490");
73c04bcf
A
64 addTest(root, &TestJB4475, "idna/TestJB4475");
65 addTest(root, &TestLength, "idna/TestLength");
46f4442e 66 addTest(root, &TestJB5273, "idna/TestJB5273");
729e4ab9 67 addTest(root, &TestUTS46, "idna/TestUTS46");
374ca955
A
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){
729e4ab9 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));
374ca955
A
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
46f4442e 226static const UChar unicodeIn[][41] ={
374ca955
A
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
73c04bcf
A
340 },
341 {
342 0x0054,0x0045,0x0053,0x0054
374ca955 343 }
374ca955
A
344};
345
46f4442e 346static const char * const asciiIn[] = {
374ca955
A
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 */
73c04bcf
A
369 "xn--b1abfaaepdrnnbgefbadotcwatmq2g4l", /* Russian (Cyrillic)*/
370 "TEST"
374ca955
A
371
372};
373
46f4442e 374static const char * const domainNames[] = {
374ca955
A
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",*/
73c04bcf 422 "\\u00C3\\u00BC.com"
374ca955
A
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;
2ca993e8 433 for(i=0;i< UPRV_LENGTHOF(unicodeIn); i++){
374ca955
A
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;
2ca993e8 447 for(i=0;i< UPRV_LENGTHOF(asciiIn); i++){
374ca955
A
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;
2ca993e8 464 for(i=0;i< UPRV_LENGTHOF(domainNames); i++){
374ca955
A
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)){
729e4ab9 469 log_err_status(status, "%s failed to convert domainNames[%i].Error: %s \n",testName, i, u_errorName(status));
374ca955
A
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
2ca993e8 494 for(i=0;i< UPRV_LENGTHOF(domainNames); i++){
374ca955
A
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)){
729e4ab9 499 log_err_status(status, "%s failed to convert domainNames[%i].Error: %s \n",testName,i, u_errorName(status));
374ca955
A
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)){
729e4ab9 528 log_err_status(status, "%s null terminated source failed. Error: %s\n", testName,u_errorName(status));
374ca955
A
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)){
729e4ab9 538 log_err_status(status, "%s null terminated source and options set failed. Error: %s\n",testName, u_errorName(status));
374ca955
A
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)){
729e4ab9 548 log_err_status(status, "%s with string length. Error: %s\n",testName, u_errorName(status));
374ca955
A
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)){
729e4ab9 558 log_err_status(status, "%s with string length and options set. Error: %s\n", u_errorName(status), testName);
374ca955
A
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
2ca993e8 600 for(i=0;i< UPRV_LENGTHOF(unicodeIn); i++){
374ca955
A
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
73c04bcf
A
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;
2ca993e8 649 for(i=0; i< UPRV_LENGTHOF(data); i++){
73c04bcf
A
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)){
729e4ab9 662 log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
73c04bcf
A
663 }
664 src2 = dest1;
665 src2Len = dest1Len;
666 dest2Len = uidna_toUnicode(src2, src2Len, dest2, dest2Len, UIDNA_DEFAULT, &ps, &status);
667 if(U_FAILURE(status)){
729e4ab9 668 log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
73c04bcf
A
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};
2ca993e8 681 for(i=0; i< UPRV_LENGTHOF(input); i++){
73c04bcf
A
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)){
729e4ab9
A
691 log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
692 continue;
73c04bcf
A
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}
46f4442e
A
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
b331163b
A
724 int32_t len1 = UPRV_LENGTHOF(ul1)-1/*remove the null termination*/;
725 int32_t destLen = UPRV_LENGTHOF(dest);
46f4442e
A
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){
729e4ab9 732 log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
46f4442e
A
733 }
734
735 status = U_ZERO_ERROR;
b331163b 736 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
737 len = -1;
738 destLen = uidna_toUnicode(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
739 if(status != U_ZERO_ERROR){
729e4ab9 740 log_err_status(status, "uidna_toUnicode failed with error %s.\n", u_errorName(status));
46f4442e
A
741 }
742 status = U_ZERO_ERROR;
b331163b 743 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
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){
729e4ab9 747 log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
46f4442e
A
748 }
749
750 status = U_ZERO_ERROR;
b331163b 751 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
752 len = -1;
753 destLen = uidna_toASCII(ul, len, dest, destLen, UIDNA_DEFAULT, &ps, &status);
754 if(status != U_IDNA_LABEL_TOO_LONG_ERROR){
729e4ab9 755 log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
46f4442e
A
756 }
757
758 status = U_ZERO_ERROR;
b331163b 759 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
760 destLen = uidna_toASCII(ul1, len1, dest, destLen, UIDNA_DEFAULT, &ps, &status);
761 if(status != U_ZERO_ERROR){
729e4ab9 762 log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
46f4442e
A
763 }
764
765 status = U_ZERO_ERROR;
b331163b 766 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
767 len1 = -1;
768 destLen = uidna_toASCII(ul1, len1, dest, destLen, UIDNA_DEFAULT, &ps, &status);
769 if(status != U_ZERO_ERROR){
729e4ab9 770 log_err_status(status, "uidna_toASCII failed with error %s.\n", u_errorName(status));
46f4442e
A
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'};
b331163b 777 int32_t destLen = UPRV_LENGTHOF(dest);
46f4442e
A
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){
729e4ab9 785 log_err_status(status, "uidna_IDNToUnicode failed with error %s.\n", u_errorName(status));
46f4442e
A
786 }
787
788 status = U_ZERO_ERROR;
b331163b 789 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
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){
729e4ab9 793 log_err_status(status, "uidna_IDNToUnicode failed with error %s.\n", u_errorName(status));
46f4442e
A
794 }
795
796 status = U_ZERO_ERROR;
b331163b 797 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
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){
729e4ab9 801 log_err_status(status, "uidna_IDNToASCII failed with error %s.\n", u_errorName(status));
46f4442e
A
802 }
803
804 status = U_ZERO_ERROR;
b331163b 805 destLen = UPRV_LENGTHOF(dest);
46f4442e
A
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){
729e4ab9 809 log_err_status(status, "uidna_IDNToASCII failed with error %s.\n", u_errorName(status));
46f4442e
A
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){
729e4ab9 815 log_err_status(status, "uidna_compare failed with error %s.\n", u_errorName(status));
46f4442e
A
816 }
817 uidna_compare(ul, -1, ul, -1, UIDNA_DEFAULT, &status);
818 if(status != U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR){
729e4ab9 819 log_err_status(status, "uidna_compare failed with error %s.\n", u_errorName(status));
46f4442e
A
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);
57a6839d 831 (void)outLen; /* Suppress set but not used warning. */
46f4442e 832 if(U_FAILURE(status)){
729e4ab9 833 log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
46f4442e
A
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)){
729e4ab9 838 log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
46f4442e
A
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)){
729e4ab9 844 log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
46f4442e
A
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)){
729e4ab9 849 log_err_status(status, "uidna_toUnicode failed with error: %s\n", u_errorName(status));
46f4442e
A
850 }
851}
729e4ab9
A
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,
b331163b 882 dest16, UPRV_LENGTHOF(dest16), &info, &errorCode);
729e4ab9
A
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),
b331163b 890 dest16, UPRV_LENGTHOF(dest16), &info, &errorCode);
729e4ab9
A
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,
b331163b 917 dest8, UPRV_LENGTHOF(dest8), &info, &errorCode);
729e4ab9
A
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),
b331163b 925 dest8, UPRV_LENGTHOF(dest8), &info, &errorCode);
729e4ab9
A
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,
b331163b 972 dest16, UPRV_LENGTHOF(dest16), &info, &errorCode);
729e4ab9
A
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),
b331163b 978 dest16, UPRV_LENGTHOF(dest16), NULL, &errorCode);
729e4ab9
A
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,
b331163b 997 NULL, UPRV_LENGTHOF(dest8), &info, &errorCode);
729e4ab9
A
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
374ca955
A
1023#endif
1024
1025/*
1026 * Hey, Emacs, please set the following:
1027 *
1028 * Local Variables:
1029 * indent-tabs-mode: nil
1030 * End:
1031 *
1032 */