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