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: testidna.cpp |
| 9 * encoding: US-ASCII |
| 10 * tab size: 8 (not used) |
| 11 * indentation:4 |
| 12 * |
| 13 * created on: 2003feb1 |
| 14 * created by: Ram Viswanadha |
| 15 */ |
| 16 |
| 17 #include "unicode/utypes.h" |
| 18 |
| 19 #if !UCONFIG_NO_IDNA && !UCONFIG_NO_TRANSLITERATION |
| 20 |
| 21 #include <time.h> |
| 22 #include <limits.h> |
| 23 #include <stdlib.h> |
| 24 #include <string.h> |
| 25 #include "unicode/localpointer.h" |
| 26 #include "unicode/ustring.h" |
| 27 #include "unicode/usprep.h" |
| 28 #include "unicode/uniset.h" |
| 29 #include "testidna.h" |
| 30 #include "idnaref.h" |
| 31 #include "nptrans.h" |
| 32 #include "unicode/putil.h" |
| 33 #include "idnaconf.h" |
| 34 |
| 35 static const UChar unicodeIn[][41] ={ |
| 36 { |
| 37 0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643, 0x0644, |
| 38 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A, 0x061F, 0x0000 |
| 39 }, |
| 40 { |
| 41 0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587, |
| 42 0x0000 |
| 43 }, |
| 44 { |
| 45 0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073, 0x0074, |
| 46 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076, 0x00ED, 0x010D, |
| 47 0x0065, 0x0073, 0x006B, 0x0079, 0x0000 |
| 48 }, |
| 49 { |
| 50 0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5, 0x05D8, |
| 51 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9, 0x05DD, 0x05E2, |
| 52 0x05D1, 0x05E8, 0x05D9, 0x05EA, 0x0000 |
| 53 }, |
| 54 { |
| 55 0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928, 0x094D, |
| 56 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902, 0x0928, 0x0939, |
| 57 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938, 0x0915, 0x0924, 0x0947, |
| 58 0x0939, 0x0948, 0x0902, 0x0000 |
| 59 }, |
| 60 { |
| 61 0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E, 0x3092, |
| 62 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044, 0x306E, 0x304B, |
| 63 0x0000 |
| 64 }, |
| 65 /* |
| 66 { |
| 67 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774, |
| 68 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74, |
| 69 0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C, 0x0000 |
| 70 }, |
| 71 */ |
| 72 { |
| 73 0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435, 0x043E, |
| 74 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432, 0x043E, 0x0440, |
| 75 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443, 0x0441, 0x0441, 0x043A, |
| 76 0x0438, 0x0000 |
| 77 }, |
| 78 { |
| 79 0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F, 0x0070, |
| 80 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069, 0x006D, 0x0070, |
| 81 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074, 0x0065, 0x0068, 0x0061, |
| 82 0x0062, 0x006C, 0x0061, 0x0072, 0x0065, 0x006E, 0x0045, 0x0073, 0x0070, |
| 83 0x0061, 0x00F1, 0x006F, 0x006C, 0x0000 |
| 84 }, |
| 85 { |
| 86 0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587, |
| 87 0x0000 |
| 88 }, |
| 89 { |
| 90 0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD, 0x006B, |
| 91 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3, 0x0063, 0x0068, |
| 92 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069, 0x1EBF, 0x006E, 0x0067, |
| 93 0x0056, 0x0069, 0x1EC7, 0x0074, 0x0000 |
| 94 }, |
| 95 { |
| 96 0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F, 0x0000 |
| 97 }, |
| 98 { |
| 99 0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069, 0x0074, |
| 100 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052, 0x002D, 0x004D, |
| 101 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053, 0x0000 |
| 102 }, |
| 103 { |
| 104 0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E, 0x006F, |
| 105 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061, 0x0079, 0x002D, |
| 106 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834, 0x6240, 0x0000 |
| 107 }, |
| 108 { |
| 109 0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032, 0x0000 |
| 110 }, |
| 111 { |
| 112 0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069, 0x3059, |
| 113 0x308B, 0x0035, 0x79D2, 0x524D, 0x0000 |
| 114 }, |
| 115 { |
| 116 0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0, |
| 117 0x0000 |
| 118 }, |
| 119 { |
| 120 0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067, 0x0000 |
| 121 }, |
| 122 // test non-BMP code points |
| 123 { |
| 124 0xD800, 0xDF00, 0xD800, 0xDF01, 0xD800, 0xDF02, 0xD800, 0xDF03, 0xD800,
0xDF05, |
| 125 0xD800, 0xDF06, 0xD800, 0xDF07, 0xD800, 0xDF09, 0xD800, 0xDF0A, 0xD800,
0xDF0B, |
| 126 0x0000 |
| 127 }, |
| 128 { |
| 129 0xD800, 0xDF0D, 0xD800, 0xDF0C, 0xD800, 0xDF1E, 0xD800, 0xDF0F, 0xD800,
0xDF16, |
| 130 0xD800, 0xDF15, 0xD800, 0xDF14, 0xD800, 0xDF12, 0xD800, 0xDF10, 0xD800,
0xDF20, |
| 131 0xD800, 0xDF21, |
| 132 0x0000 |
| 133 }, |
| 134 // Greek |
| 135 { |
| 136 0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac |
| 137 }, |
| 138 // Maltese |
| 139 { |
| 140 0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127, |
| 141 0x0127, 0x0061 |
| 142 }, |
| 143 // Russian |
| 144 { |
| 145 0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435, |
| 146 0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432, |
| 147 0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443, |
| 148 0x0441, 0x0441, 0x043a, 0x0438 |
| 149 }, |
| 150 { |
| 151 0xFB00, 0xFB01 |
| 152 } |
| 153 |
| 154 }; |
| 155 |
| 156 static const char *asciiIn[] = { |
| 157 "xn--egbpdaj6bu4bxfgehfvwxn", |
| 158 "xn--ihqwcrb4cv8a8dqg056pqjye", |
| 159 "xn--Proprostnemluvesky-uyb24dma41a", |
| 160 "xn--4dbcagdahymbxekheh6e0a7fei0b", |
| 161 "xn--i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", |
| 162 "xn--n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", |
| 163 /* "xn--989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c",
*/ |
| 164 "xn--b1abfaaepdrnnbgefbaDotcwatmq2g4l", |
| 165 "xn--PorqunopuedensimplementehablarenEspaol-fmd56a", |
| 166 "xn--ihqwctvzc91f659drss3x8bo0yb", |
| 167 "xn--TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", |
| 168 "xn--3B-ww4c5e180e575a65lsy2b", |
| 169 "xn---with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", |
| 170 "xn--Hello-Another-Way--fc4qua05auwb3674vfr0b", |
| 171 "xn--2-u9tlzr9756bt3uc0v", |
| 172 "xn--MajiKoi5-783gue6qz075azm5e", |
| 173 "xn--de-jg4avhby1noc0d", |
| 174 "xn--d9juau41awczczp", |
| 175 "XN--097CCDEKGHQJK", |
| 176 "XN--db8CBHEJLGH4E0AL", |
| 177 "xn--hxargifdar", // Greek |
| 178 "xn--bonusaa-5bb1da", // Maltese |
| 179 "xn--b1abfaaepdrnnbgefbadotcwatmq2g4l", // Russian (Cyrillic) |
| 180 "fffi" |
| 181 }; |
| 182 |
| 183 static const char *domainNames[] = { |
| 184 "slip129-37-118-146.nc.us.ibm.net", |
| 185 "saratoga.pe.utexas.edu", |
| 186 "dial-120-45.ots.utexas.edu", |
| 187 "woo-085.dorms.waller.net", |
| 188 "hd30-049.hil.compuserve.com", |
| 189 "pem203-31.pe.ttu.edu", |
| 190 "56K-227.MaxTNT3.pdq.net", |
| 191 "dial-36-2.ots.utexas.edu", |
| 192 "slip129-37-23-152.ga.us.ibm.net", |
| 193 "ts45ip119.cadvision.com", |
| 194 "sdn-ts-004txaustP05.dialsprint.net", |
| 195 "bar-tnt1s66.erols.com", |
| 196 "101.st-louis-15.mo.dial-access.att.net", |
| 197 "h92-245.Arco.COM", |
| 198 "dial-13-2.ots.utexas.edu", |
| 199 "net-redynet29.datamarkets.com.ar", |
| 200 "ccs-shiva28.reacciun.net.ve", |
| 201 "7.houston-11.tx.dial-access.att.net", |
| 202 "ingw129-37-120-26.mo.us.ibm.net", |
| 203 "dialup6.austintx.com", |
| 204 "dns2.tpao.gov.tr", |
| 205 "slip129-37-119-194.nc.us.ibm.net", |
| 206 "cs7.dillons.co.uk.203.119.193.in-addr.arpa", |
| 207 "swprd1.innovplace.saskatoon.sk.ca", |
| 208 "bikini.bologna.maraut.it", |
| 209 "node91.subnet159-198-79.baxter.com", |
| 210 "cust19.max5.new-york.ny.ms.uu.net", |
| 211 "balexander.slip.andrew.cmu.edu", |
| 212 "pool029.max2.denver.co.dynip.alter.net", |
| 213 "cust49.max9.new-york.ny.ms.uu.net", |
| 214 "s61.abq-dialin2.hollyberry.com", |
| 215 "\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com", //':'(0x003a) produces U_IDN
A_STD3_ASCII_RULES_ERROR |
| 216 "www.xn--vea.com", |
| 217 // "www.\\u00E0\\u00B3\\u00AF.com",//' ' (0x0020) produces U_IDNA_STD3_ASCII_
RULES_ERROR |
| 218 "www.\\u00C2\\u00A4.com", |
| 219 "www.\\u00C2\\u00A3.com", |
| 220 // "\\u0025", //'%' (0x0025) produces U_IDNA_STD3_ASCII_RULES_ERROR |
| 221 // "\\u005C\\u005C", //'\' (0x005C) produces U_IDNA_STD3_ASCII_RULES_ERROR |
| 222 //"@", |
| 223 //"\\u002F", |
| 224 //"www.\\u0021.com", |
| 225 //"www.\\u0024.com", |
| 226 //"\\u003f", |
| 227 // These yeild U_IDNA_PROHIBITED_ERROR |
| 228 //"\\u00CF\\u0082.com", |
| 229 //"\\u00CE\\u00B2\\u00C3\\u009Fss.com", |
| 230 //"\\u00E2\\u0098\\u00BA.com", |
| 231 "\\u00C3\\u00BC.com", |
| 232 |
| 233 }; |
| 234 |
| 235 typedef struct ErrorCases ErrorCases; |
| 236 |
| 237 static const struct ErrorCases{ |
| 238 |
| 239 UChar unicode[100]; |
| 240 const char *ascii; |
| 241 UErrorCode expected; |
| 242 UBool useSTD3ASCIIRules; |
| 243 UBool testToUnicode; |
| 244 UBool testLabel; |
| 245 } errorCases[] = { |
| 246 { |
| 247 |
| 248 { |
| 249 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ |
| 250 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC7
74, |
| 251 0x070F,/*prohibited*/ |
| 252 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA
74, |
| 253 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ |
| 254 0x0000 |
| 255 }, |
| 256 "www.XN--8mb5595fsoa28orucya378bqre2tcwop06c5qbw82a1rffmae0361dea96b.com
", |
| 257 U_IDNA_PROHIBITED_ERROR, |
| 258 FALSE, FALSE, TRUE |
| 259 }, |
| 260 |
| 261 { |
| 262 { |
| 263 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ |
| 264 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC7
74, |
| 265 0x0221, 0x0234/*Unassigned code points*/, |
| 266 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ |
| 267 0x0000 |
| 268 }, |
| 269 "www.XN--6lA2Bz548Fj1GuA391Bf1Gb1N59Ab29A7iA.com", |
| 270 |
| 271 U_IDNA_UNASSIGNED_ERROR, |
| 272 FALSE, FALSE, TRUE |
| 273 }, |
| 274 { |
| 275 { |
| 276 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ |
| 277 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC7
74, |
| 278 0x0644, 0x064A, 0x0647,/*Arabic code points. Cannot mix RTL with LTR
*/ |
| 279 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA
74, |
| 280 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ |
| 281 0x0000 |
| 282 }, |
| 283 "www.xn--ghBGI4851OiyA33VqrD6Az86C4qF83CtRv93D5xBk15AzfG0nAgA0578DeA71C.
com", |
| 284 U_IDNA_CHECK_BIDI_ERROR, |
| 285 FALSE, FALSE, TRUE |
| 286 }, |
| 287 { |
| 288 { |
| 289 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ |
| 290 /* labels cannot begin with an HYPHEN */ |
| 291 0x002D, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC7
74, |
| 292 0x002E, |
| 293 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA
74, |
| 294 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ |
| 295 0x0000 |
| 296 |
| 297 }, |
| 298 "www.xn----b95Ew8SqA315Ao5FbuMlnNmhA.com", |
| 299 U_IDNA_STD3_ASCII_RULES_ERROR, |
| 300 TRUE, FALSE, FALSE |
| 301 }, |
| 302 { |
| 303 { |
| 304 /* correct ACE-prefix followed by unicode */ |
| 305 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ |
| 306 0x0078, 0x006e, 0x002d,0x002d, /* ACE Prefix */ |
| 307 0x002D, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC7
74, |
| 308 0x002D, |
| 309 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA
74, |
| 310 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ |
| 311 0x0000 |
| 312 |
| 313 }, |
| 314 /* wrong ACE-prefix followed by valid ACE-encoded ASCII */ |
| 315 "www.XY-----b91I0V65S96C2A355Cw1E5yCeQr19CsnP1mFfmAE0361DeA96B.com", |
| 316 U_IDNA_ACE_PREFIX_ERROR, |
| 317 FALSE, FALSE, FALSE |
| 318 }, |
| 319 /* cannot verify U_IDNA_VERIFICATION_ERROR */ |
| 320 |
| 321 { |
| 322 { |
| 323 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ |
| 324 0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774, |
| 325 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74, |
| 326 0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C, |
| 327 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ |
| 328 0x0000 |
| 329 }, |
| 330 "www.xn--989AoMsVi5E83Db1D2A355Cv1E0vAk1DwRv93D5xBh15A0Dt30A5JpSD879Ccm6Fe
A98C.com", |
| 331 U_IDNA_LABEL_TOO_LONG_ERROR, |
| 332 FALSE, FALSE, TRUE |
| 333 }, |
| 334 |
| 335 { |
| 336 { |
| 337 0x0077, 0x0077, 0x0077, 0x002e, /* www. */ |
| 338 0x0030, 0x0644, 0x064A, 0x0647, 0x0031, /* Arabic code points squashed b
etween EN codepoints */ |
| 339 0x002e, 0x0063, 0x006f, 0x006d, /* com. */ |
| 340 0x0000 |
| 341 }, |
| 342 "www.xn--01-tvdmo.com", |
| 343 U_IDNA_CHECK_BIDI_ERROR, |
| 344 FALSE, FALSE, TRUE |
| 345 }, |
| 346 |
| 347 { |
| 348 { |
| 349 0x0077, 0x0077, 0x0077, 0x002e, // www. |
| 350 0x206C, 0x0644, 0x064A, 0x0647, 0x206D, // Arabic code points squashed b
etween BN codepoints |
| 351 0x002e, 0x0063, 0x006f, 0x006d, // com. |
| 352 0x0000 |
| 353 }, |
| 354 "www.XN--ghbgi278xia.com", |
| 355 U_IDNA_PROHIBITED_ERROR, |
| 356 FALSE, FALSE, TRUE |
| 357 }, |
| 358 { |
| 359 { |
| 360 0x0077, 0x0077, 0x0077, 0x002e, // www. |
| 361 0x002D, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, // HYPHEN at the start o
f label |
| 362 0x002e, 0x0063, 0x006f, 0x006d, // com. |
| 363 0x0000 |
| 364 }, |
| 365 "www.-abcde.com", |
| 366 U_IDNA_STD3_ASCII_RULES_ERROR, |
| 367 TRUE, FALSE, FALSE |
| 368 }, |
| 369 { |
| 370 { |
| 371 0x0077, 0x0077, 0x0077, 0x002e, // www. |
| 372 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,0x002D, // HYPHEN at the end of t
he label |
| 373 0x002e, 0x0063, 0x006f, 0x006d, // com. |
| 374 0x0000 |
| 375 }, |
| 376 "www.abcde-.com", |
| 377 U_IDNA_STD3_ASCII_RULES_ERROR, |
| 378 TRUE, FALSE, FALSE |
| 379 }, |
| 380 { |
| 381 { |
| 382 0x0077, 0x0077, 0x0077, 0x002e, // www. |
| 383 0x0041, 0x0042, 0x0043, 0x0044, 0x0045,0x0040, // Containing non LDH cod
e point |
| 384 0x002e, 0x0063, 0x006f, 0x006d, // com. |
| 385 0x0000 |
| 386 }, |
| 387 "www.abcde@.com", |
| 388 U_IDNA_STD3_ASCII_RULES_ERROR, |
| 389 TRUE, FALSE, FALSE |
| 390 }, |
| 391 { |
| 392 { |
| 393 0x0077, 0x0077, 0x0077, 0x002e, // www. |
| 394 // zero length label |
| 395 0x002e, 0x0063, 0x006f, 0x006d, // com. |
| 396 0x0000 |
| 397 }, |
| 398 "www..com", |
| 399 U_IDNA_ZERO_LENGTH_LABEL_ERROR, |
| 400 TRUE, FALSE, FALSE |
| 401 }, |
| 402 { |
| 403 {0}, |
| 404 NULL, |
| 405 U_ILLEGAL_ARGUMENT_ERROR, |
| 406 TRUE, TRUE, FALSE |
| 407 } |
| 408 }; |
| 409 |
| 410 |
| 411 |
| 412 |
| 413 #define MAX_DEST_SIZE 300 |
| 414 |
| 415 void TestIDNA::debug(const UChar* src, int32_t srcLength, int32_t options){ |
| 416 UParseError parseError; |
| 417 UErrorCode transStatus = U_ZERO_ERROR; |
| 418 UErrorCode prepStatus = U_ZERO_ERROR; |
| 419 NamePrepTransform* trans = NamePrepTransform::createInstance(parseError,tran
sStatus); |
| 420 int32_t prepOptions = (((options & UIDNA_ALLOW_UNASSIGNED) != 0) ? USPREP_AL
LOW_UNASSIGNED: 0); |
| 421 LocalUStringPrepProfilePointer prep(usprep_openByType(USPREP_RFC3491_NAMEPRE
P,&prepStatus)); |
| 422 UChar *transOut=NULL, *prepOut=NULL; |
| 423 int32_t transOutLength=0, prepOutLength=0; |
| 424 |
| 425 |
| 426 transOutLength = trans->process(src,srcLength,transOut, 0, prepOptions>0, &
parseError, transStatus); |
| 427 if( transStatus == U_BUFFER_OVERFLOW_ERROR){ |
| 428 transStatus = U_ZERO_ERROR; |
| 429 transOut = (UChar*) malloc(U_SIZEOF_UCHAR * transOutLength); |
| 430 transOutLength = trans->process(src,srcLength,transOut, transOutLength,
prepOptions>0, &parseError, transStatus); |
| 431 } |
| 432 |
| 433 prepOutLength = usprep_prepare(prep.getAlias(), src, srcLength, prepOut, 0,
prepOptions, &parseError, &prepStatus); |
| 434 |
| 435 if( prepStatus == U_BUFFER_OVERFLOW_ERROR){ |
| 436 prepStatus = U_ZERO_ERROR; |
| 437 prepOut = (UChar*) malloc(U_SIZEOF_UCHAR * prepOutLength); |
| 438 prepOutLength = usprep_prepare(prep.getAlias(), src, srcLength, prepOut
, prepOutLength, prepOptions, &parseError, &prepStatus); |
| 439 } |
| 440 |
| 441 if(UnicodeString(transOut,transOutLength)!= UnicodeString(prepOut, prepOutLe
ngth)){ |
| 442 errln("Failed. Expected: " + prettify(UnicodeString(transOut, transOutLe
ngth)) |
| 443 + " Got: " + prettify(UnicodeString(prepOut,prepOutLength))); |
| 444 } |
| 445 free(transOut); |
| 446 free(prepOut); |
| 447 delete trans; |
| 448 } |
| 449 |
| 450 void TestIDNA::testAPI(const UChar* src, const UChar* expected, const char* test
Name, |
| 451 UBool useSTD3ASCIIRules,UErrorCode expectedStatus, |
| 452 UBool doCompare, UBool testUnassigned, TestFunc func, UBool testSTD3
ASCIIRules){ |
| 453 |
| 454 UErrorCode status = U_ZERO_ERROR; |
| 455 UChar destStack[MAX_DEST_SIZE]; |
| 456 int32_t destLen = 0; |
| 457 UChar* dest = NULL; |
| 458 int32_t expectedLen = (expected != NULL) ? u_strlen(expected) : 0; |
| 459 int32_t options = (useSTD3ASCIIRules == TRUE) ? UIDNA_USE_STD3_RULES : UIDNA
_DEFAULT; |
| 460 UParseError parseError; |
| 461 int32_t tSrcLen = 0; |
| 462 UChar* tSrc = NULL; |
| 463 |
| 464 if(src != NULL){ |
| 465 tSrcLen = u_strlen(src); |
| 466 tSrc =(UChar*) malloc( U_SIZEOF_UCHAR * tSrcLen ); |
| 467 memcpy(tSrc,src,tSrcLen * U_SIZEOF_UCHAR); |
| 468 } |
| 469 |
| 470 // test null-terminated source and return value of number of UChars required |
| 471 destLen = func(src,-1,NULL,0,options, &parseError , &status); |
| 472 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 473 status = U_ZERO_ERROR; // reset error code |
| 474 if(destLen+1 < MAX_DEST_SIZE){ |
| 475 dest = destStack; |
| 476 destLen = func(src,-1,dest,destLen+1,options, &parseError, &status); |
| 477 // TODO : compare output with expected |
| 478 if(U_SUCCESS(status) && expectedStatus != U_IDNA_STD3_ASCII_RULES_ER
ROR&& (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0
,&status)!=0){ |
| 479 errln("Did not get the expected result for "+UnicodeString(testN
ame) +" null terminated source. Expected : " |
| 480 + prettify(UnicodeString(expected,expectedLen)) |
| 481 + " Got: " + prettify(UnicodeString(dest,destLen)) |
| 482 ); |
| 483 } |
| 484 }else{ |
| 485 errln( "%s null terminated source failed. Requires destCapacity > 30
0\n",testName); |
| 486 } |
| 487 } |
| 488 |
| 489 if(status != expectedStatus){ |
| 490 errcheckln(status, "Did not get the expected error for "+ |
| 491 UnicodeString(testName)+ |
| 492 " null terminated source. Expected: " +UnicodeString(u_errorName
(expectedStatus)) |
| 493 + " Got: "+ UnicodeString(u_errorName(status)) |
| 494 + " Source: " + prettify(UnicodeString(src)) |
| 495 ); |
| 496 free(tSrc); |
| 497 return; |
| 498 } |
| 499 if(testUnassigned ){ |
| 500 status = U_ZERO_ERROR; |
| 501 destLen = func(src,-1,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &parseErr
or, &status); |
| 502 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 503 status = U_ZERO_ERROR; // reset error code |
| 504 if(destLen+1 < MAX_DEST_SIZE){ |
| 505 dest = destStack; |
| 506 destLen = func(src,-1,dest,destLen+1,options | UIDNA_ALLOW_UNASS
IGNED, &parseError, &status); |
| 507 // TODO : compare output with expected |
| 508 if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(de
st,destLen, expected,expectedLen,0,&status)!=0){ |
| 509 //errln("Did not get the expected result for %s null termina
ted source with both options set.\n",testName); |
| 510 errln("Did not get the expected result for "+UnicodeString(t
estName) + |
| 511 " null terminated source "+ prettify(src) + |
| 512 " with both options set. Expected: "+ prettify(Unicod
eString(expected,expectedLen))+ |
| 513 "Got: " + prettify(UnicodeString(dest,destLen))); |
| 514 |
| 515 debug(src,-1,options | UIDNA_ALLOW_UNASSIGNED); |
| 516 |
| 517 } |
| 518 }else{ |
| 519 errln( "%s null terminated source failed. Requires destCapacity
> 300\n",testName); |
| 520 } |
| 521 } |
| 522 //testing query string |
| 523 if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR
){ |
| 524 errln( "Did not get the expected error for "+ |
| 525 UnicodeString(testName)+ |
| 526 " null terminated source with options set. Expected: " +Unic
odeString(u_errorName(expectedStatus)) |
| 527 + " Got: "+ UnicodeString(u_errorName(status)) |
| 528 + " Source: " + prettify(UnicodeString(src)) |
| 529 ); |
| 530 } |
| 531 } |
| 532 |
| 533 status = U_ZERO_ERROR; |
| 534 |
| 535 // test source with lengthand return value of number of UChars required |
| 536 destLen = func(tSrc, tSrcLen, NULL,0,options, &parseError, &status); |
| 537 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 538 status = U_ZERO_ERROR; // reset error code |
| 539 if(destLen+1 < MAX_DEST_SIZE){ |
| 540 dest = destStack; |
| 541 destLen = func(src,u_strlen(src),dest,destLen+1,options, &parseError
, &status); |
| 542 // TODO : compare output with expected |
| 543 if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,d
estLen, expected,expectedLen,0,&status)!=0){ |
| 544 errln("Did not get the expected result for %s with source length
.\n",testName); |
| 545 } |
| 546 }else{ |
| 547 errln( "%s with source length failed. Requires destCapacity > 300\n
",testName); |
| 548 } |
| 549 } |
| 550 |
| 551 if(status != expectedStatus){ |
| 552 errln( "Did not get the expected error for "+ |
| 553 UnicodeString(testName)+ |
| 554 " with source length. Expected: " +UnicodeString(u_errorName
(expectedStatus)) |
| 555 + " Got: "+ UnicodeString(u_errorName(status)) |
| 556 + " Source: " + prettify(UnicodeString(src)) |
| 557 ); |
| 558 } |
| 559 if(testUnassigned){ |
| 560 status = U_ZERO_ERROR; |
| 561 |
| 562 destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_ALLOW_UNASSIGNED, &pa
rseError, &status); |
| 563 |
| 564 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 565 status = U_ZERO_ERROR; // reset error code |
| 566 if(destLen+1 < MAX_DEST_SIZE){ |
| 567 dest = destStack; |
| 568 destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_
ALLOW_UNASSIGNED, &parseError, &status); |
| 569 // TODO : compare output with expected |
| 570 if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(de
st,destLen, expected,expectedLen,0,&status)!=0){ |
| 571 errln("Did not get the expected result for %s with source le
ngth and both options set.\n",testName); |
| 572 } |
| 573 }else{ |
| 574 errln( "%s with source length failed. Requires destCapacity > 3
00\n",testName); |
| 575 } |
| 576 } |
| 577 //testing query string |
| 578 if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR
){ |
| 579 errln( "Did not get the expected error for "+ |
| 580 UnicodeString(testName)+ |
| 581 " with source length and options set. Expected: " +UnicodeSt
ring(u_errorName(expectedStatus)) |
| 582 + " Got: "+ UnicodeString(u_errorName(status)) |
| 583 + " Source: " + prettify(UnicodeString(src)) |
| 584 ); |
| 585 } |
| 586 } |
| 587 |
| 588 status = U_ZERO_ERROR; |
| 589 if(testSTD3ASCIIRules==TRUE){ |
| 590 destLen = func(src,-1,NULL,0,options | UIDNA_USE_STD3_RULES, &parseError
, &status); |
| 591 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 592 status = U_ZERO_ERROR; // reset error code |
| 593 if(destLen+1 < MAX_DEST_SIZE){ |
| 594 dest = destStack; |
| 595 destLen = func(src,-1,dest,destLen+1,options | UIDNA_USE_STD3_RU
LES, &parseError, &status); |
| 596 // TODO : compare output with expected |
| 597 if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(de
st,destLen, expected,expectedLen,0,&status)!=0){ |
| 598 //errln("Did not get the expected result for %s null termina
ted source with both options set.\n",testName); |
| 599 errln("Did not get the expected result for "+UnicodeString(t
estName) +" null terminated source with both options set. Expected: "+ prettify(
UnicodeString(expected,expectedLen))); |
| 600 |
| 601 } |
| 602 }else{ |
| 603 errln( "%s null terminated source failed. Requires destCapacity
> 300\n",testName); |
| 604 } |
| 605 } |
| 606 //testing query string |
| 607 if(status != expectedStatus){ |
| 608 errln( "Did not get the expected error for "+ |
| 609 UnicodeString(testName)+ |
| 610 " null terminated source with options set. Expected: " +
UnicodeString(u_errorName(expectedStatus)) |
| 611 + " Got: "+ UnicodeString(u_errorName(status)) |
| 612 + " Source: " + prettify(UnicodeString(src)) |
| 613 ); |
| 614 } |
| 615 |
| 616 status = U_ZERO_ERROR; |
| 617 |
| 618 destLen = func(tSrc,tSrcLen,NULL,0,options | UIDNA_USE_STD3_RULES, &pars
eError, &status); |
| 619 |
| 620 if(status == U_BUFFER_OVERFLOW_ERROR){ |
| 621 status = U_ZERO_ERROR; // reset error code |
| 622 if(destLen+1 < MAX_DEST_SIZE){ |
| 623 dest = destStack; |
| 624 destLen = func(src,u_strlen(src),dest,destLen+1,options | UIDNA_
USE_STD3_RULES, &parseError, &status); |
| 625 // TODO : compare output with expected |
| 626 if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(de
st,destLen, expected,expectedLen,0,&status)!=0){ |
| 627 errln("Did not get the expected result for %s with source le
ngth and both options set.\n",testName); |
| 628 } |
| 629 }else{ |
| 630 errln( "%s with source length failed. Requires destCapacity > 3
00\n",testName); |
| 631 } |
| 632 } |
| 633 //testing query string |
| 634 if(status != expectedStatus && expectedStatus != U_IDNA_UNASSIGNED_ERROR
){ |
| 635 errln( "Did not get the expected error for "+ |
| 636 UnicodeString(testName)+ |
| 637 " with source length and options set. Expected: " +Unico
deString(u_errorName(expectedStatus)) |
| 638 + " Got: "+ UnicodeString(u_errorName(status)) |
| 639 + " Source: " + prettify(UnicodeString(src)) |
| 640 ); |
| 641 } |
| 642 } |
| 643 free(tSrc); |
| 644 } |
| 645 |
| 646 void TestIDNA::testCompare(const UChar* s1, int32_t s1Len, |
| 647 const UChar* s2, int32_t s2Len, |
| 648 const char* testName, CompareFunc func, |
| 649 UBool isEqual){ |
| 650 |
| 651 UErrorCode status = U_ZERO_ERROR; |
| 652 int32_t retVal = func(s1,-1,s2,-1,UIDNA_DEFAULT,&status); |
| 653 |
| 654 if(isEqual==TRUE && retVal !=0){ |
| 655 errln("Did not get the expected result for %s with null termniated strin
gs.\n",testName); |
| 656 } |
| 657 if(U_FAILURE(status)){ |
| 658 errcheckln(status, "%s null terminated source failed. Error: %s", testNa
me,u_errorName(status)); |
| 659 } |
| 660 |
| 661 status = U_ZERO_ERROR; |
| 662 retVal = func(s1,-1,s2,-1,UIDNA_ALLOW_UNASSIGNED,&status); |
| 663 |
| 664 if(isEqual==TRUE && retVal !=0){ |
| 665 errln("Did not get the expected result for %s with null termniated strin
gs with options set.\n", testName); |
| 666 } |
| 667 if(U_FAILURE(status)){ |
| 668 errcheckln(status, "%s null terminated source and options set failed. Er
ror: %s",testName, u_errorName(status)); |
| 669 } |
| 670 |
| 671 status = U_ZERO_ERROR; |
| 672 retVal = func(s1,s1Len,s2,s2Len,UIDNA_DEFAULT,&status); |
| 673 |
| 674 if(isEqual==TRUE && retVal !=0){ |
| 675 errln("Did not get the expected result for %s with string length.\n",tes
tName); |
| 676 } |
| 677 if(U_FAILURE(status)){ |
| 678 errcheckln(status, "%s with string length. Error: %s",testName, u_errorN
ame(status)); |
| 679 } |
| 680 |
| 681 status = U_ZERO_ERROR; |
| 682 retVal = func(s1,s1Len,s2,s2Len,UIDNA_ALLOW_UNASSIGNED,&status); |
| 683 |
| 684 if(isEqual==TRUE && retVal !=0){ |
| 685 errln("Did not get the expected result for %s with string length and opt
ions set.\n",testName); |
| 686 } |
| 687 if(U_FAILURE(status)){ |
| 688 errcheckln(status, "%s with string length and options set. Error: %s", u
_errorName(status), testName); |
| 689 } |
| 690 } |
| 691 |
| 692 void TestIDNA::testToASCII(const char* testName, TestFunc func){ |
| 693 |
| 694 int32_t i; |
| 695 UChar buf[MAX_DEST_SIZE]; |
| 696 |
| 697 for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ |
| 698 u_charsToUChars(asciiIn[i],buf, (int32_t)(strlen(asciiIn[i])+1)); |
| 699 testAPI(unicodeIn[i], buf,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func
); |
| 700 |
| 701 } |
| 702 } |
| 703 |
| 704 void TestIDNA::testToUnicode(const char* testName, TestFunc func){ |
| 705 |
| 706 int32_t i; |
| 707 UChar buf[MAX_DEST_SIZE]; |
| 708 |
| 709 for(i=0;i< (int32_t)(sizeof(asciiIn)/sizeof(asciiIn[0])); i++){ |
| 710 u_charsToUChars(asciiIn[i],buf, (int32_t)(strlen(asciiIn[i])+1)); |
| 711 testAPI(buf,unicodeIn[i],testName,FALSE,U_ZERO_ERROR, TRUE, TRUE, func); |
| 712 } |
| 713 } |
| 714 |
| 715 |
| 716 void TestIDNA::testIDNToUnicode(const char* testName, TestFunc func){ |
| 717 int32_t i; |
| 718 UChar buf[MAX_DEST_SIZE]; |
| 719 UChar expected[MAX_DEST_SIZE]; |
| 720 UErrorCode status = U_ZERO_ERROR; |
| 721 int32_t bufLen = 0; |
| 722 UParseError parseError; |
| 723 for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){ |
| 724 bufLen = (int32_t)strlen(domainNames[i]); |
| 725 bufLen = u_unescape(domainNames[i],buf, bufLen+1); |
| 726 func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseEr
ror,&status); |
| 727 if(U_FAILURE(status)){ |
| 728 errcheckln(status, "%s failed to convert domainNames[%i].Error: %s",
testName, i, u_errorName(status)); |
| 729 break; |
| 730 } |
| 731 testAPI(buf,expected,testName,FALSE,U_ZERO_ERROR, TRUE, TRUE, func); |
| 732 //test toUnicode with all labels in the string |
| 733 testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func); |
| 734 if(U_FAILURE(status)){ |
| 735 errln( "%s failed to convert domainNames[%i].Error: %s \n",testName,
i, u_errorName(status)); |
| 736 break; |
| 737 } |
| 738 } |
| 739 |
| 740 } |
| 741 |
| 742 void TestIDNA::testIDNToASCII(const char* testName, TestFunc func){ |
| 743 int32_t i; |
| 744 UChar buf[MAX_DEST_SIZE]; |
| 745 UChar expected[MAX_DEST_SIZE]; |
| 746 UErrorCode status = U_ZERO_ERROR; |
| 747 int32_t bufLen = 0; |
| 748 UParseError parseError; |
| 749 for(i=0;i< (int32_t)(sizeof(domainNames)/sizeof(domainNames[0])); i++){ |
| 750 bufLen = (int32_t)strlen(domainNames[i]); |
| 751 bufLen = u_unescape(domainNames[i],buf, bufLen+1); |
| 752 func(buf,bufLen,expected,MAX_DEST_SIZE, UIDNA_ALLOW_UNASSIGNED, &parseEr
ror,&status); |
| 753 if(U_FAILURE(status)){ |
| 754 errcheckln(status, "%s failed to convert domainNames[%i].Error: %s",
testName,i, u_errorName(status)); |
| 755 break; |
| 756 } |
| 757 testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, TRUE, TRUE, func); |
| 758 //test toASCII with all labels in the string |
| 759 testAPI(buf,expected,testName, FALSE,U_ZERO_ERROR, FALSE, TRUE, func); |
| 760 if(U_FAILURE(status)){ |
| 761 errln( "%s failed to convert domainNames[%i].Error: %s \n",testName,
i, u_errorName(status)); |
| 762 break; |
| 763 } |
| 764 } |
| 765 |
| 766 } |
| 767 |
| 768 void TestIDNA::testCompare(const char* testName, CompareFunc func){ |
| 769 int32_t i; |
| 770 |
| 771 |
| 772 UChar www[] = {0x0057, 0x0057, 0x0057, 0x002E, 0x0000}; |
| 773 UChar com[] = {0x002E, 0x0043, 0x004F, 0x004D, 0x0000}; |
| 774 UChar buf[MAX_DEST_SIZE]={0x0057, 0x0057, 0x0057, 0x002E, 0x0000}; |
| 775 |
| 776 UnicodeString source(www), uni0(www),uni1(www), ascii0(www), ascii1(www); |
| 777 |
| 778 uni0.append(unicodeIn[0]); |
| 779 uni0.append(com); |
| 780 uni0.append((UChar)0x0000); |
| 781 |
| 782 uni1.append(unicodeIn[1]); |
| 783 uni1.append(com); |
| 784 uni1.append((UChar)0x0000); |
| 785 |
| 786 ascii0.append(asciiIn[0]); |
| 787 ascii0.append(com); |
| 788 ascii0.append((UChar)0x0000); |
| 789 |
| 790 ascii1.append(asciiIn[1]); |
| 791 ascii1.append(com); |
| 792 ascii1.append((UChar)0x0000); |
| 793 |
| 794 for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ |
| 795 |
| 796 u_charsToUChars(asciiIn[i],buf+4, (int32_t)(strlen(asciiIn[i])+1)); |
| 797 u_strcat(buf,com); |
| 798 |
| 799 // for every entry in unicodeIn array |
| 800 // prepend www. and append .com |
| 801 source.truncate(4); |
| 802 source.append(unicodeIn[i]); |
| 803 source.append(com); |
| 804 source.append((UChar)0x0000); |
| 805 // a) compare it with itself |
| 806 const UChar* src = source.getBuffer(); |
| 807 int32_t srcLen = u_strlen(src); //subtract null |
| 808 |
| 809 testCompare(src,srcLen,src,srcLen,testName, func, TRUE); |
| 810 |
| 811 // b) compare it with asciiIn equivalent |
| 812 testCompare(src,srcLen,buf,u_strlen(buf),testName, func,TRUE); |
| 813 |
| 814 // c) compare it with unicodeIn not equivalent |
| 815 if(i==0){ |
| 816 testCompare(src,srcLen,uni1.getBuffer(),uni1.length()-1,testName, fu
nc,FALSE); |
| 817 }else{ |
| 818 testCompare(src,srcLen,uni0.getBuffer(),uni0.length()-1,testName, fu
nc,FALSE); |
| 819 } |
| 820 // d) compare it with asciiIn not equivalent |
| 821 if(i==0){ |
| 822 testCompare(src,srcLen,ascii1.getBuffer(),ascii1.length()-1,testName
, func,FALSE); |
| 823 }else{ |
| 824 testCompare(src,srcLen,ascii0.getBuffer(),ascii0.length()-1,testName
, func,FALSE); |
| 825 } |
| 826 |
| 827 } |
| 828 } |
| 829 |
| 830 #if 0 |
| 831 |
| 832 static int32_t |
| 833 getNextSeperator(UChar *src,int32_t srcLength, |
| 834 UChar **limit){ |
| 835 if(srcLength == -1){ |
| 836 int32_t i; |
| 837 for(i=0 ; ;i++){ |
| 838 if(src[i] == 0){ |
| 839 *limit = src + i; // point to null |
| 840 return i; |
| 841 } |
| 842 if(src[i]==0x002e){ |
| 843 *limit = src + (i+1); // go past the delimiter |
| 844 return i; |
| 845 } |
| 846 } |
| 847 // we have not found the delimiter |
| 848 if(i==srcLength){ |
| 849 *limit = src+srcLength; |
| 850 } |
| 851 return i; |
| 852 }else{ |
| 853 int32_t i; |
| 854 for(i=0;i<srcLength;i++){ |
| 855 if(src[i]==0x002e){ |
| 856 *limit = src + (i+1); // go past the delimiter |
| 857 return i; |
| 858 } |
| 859 } |
| 860 // we have not found the delimiter |
| 861 if(i==srcLength){ |
| 862 *limit = src+srcLength; |
| 863 } |
| 864 return i; |
| 865 } |
| 866 } |
| 867 |
| 868 void printPunycodeOutput(){ |
| 869 |
| 870 UChar dest[MAX_DEST_SIZE]; |
| 871 int32_t destCapacity=MAX_DEST_SIZE; |
| 872 UChar* start; |
| 873 UChar* limit; |
| 874 int32_t labelLen=0; |
| 875 UBool caseFlags[MAX_DEST_SIZE]; |
| 876 |
| 877 for(int32_t i=0;i< sizeof(errorCases)/sizeof(errorCases[0]);i++){ |
| 878 ErrorCases errorCase = errorCases[i]; |
| 879 UErrorCode status = U_ZERO_ERROR; |
| 880 start = errorCase.unicode; |
| 881 int32_t srcLen = u_strlen(start); |
| 882 labelLen = getNextSeperator(start,srcLen,&limit); |
| 883 start = limit; |
| 884 labelLen=getNextSeperator(start,srcLen-labelLen,&limit); |
| 885 int32_t destLen = u_strToPunycode(dest,destCapacity,start,labelLen,caseF
lags, &status); |
| 886 if(U_FAILURE(status)){ |
| 887 printf("u_strToPunycode failed for index %i\n",i); |
| 888 continue; |
| 889 } |
| 890 for(int32_t j=0; j<destLen; j++){ |
| 891 printf("%c",(char)dest[j]); |
| 892 } |
| 893 printf("\n"); |
| 894 } |
| 895 } |
| 896 #endif |
| 897 |
| 898 void TestIDNA::testErrorCases(const char* IDNToASCIIName, TestFunc IDNToASCII, |
| 899 const char* IDNToUnicodeName, TestFunc IDNToUnicod
e){ |
| 900 UChar buf[MAX_DEST_SIZE]; |
| 901 int32_t bufLen=0; |
| 902 |
| 903 for(int32_t i=0;i< (int32_t)(sizeof(errorCases)/sizeof(errorCases[0]));i++){ |
| 904 ErrorCases errorCase = errorCases[i]; |
| 905 UChar* src =NULL; |
| 906 if(errorCase.ascii != NULL){ |
| 907 bufLen = (int32_t)strlen(errorCase.ascii); |
| 908 u_charsToUChars(errorCase.ascii,buf, bufLen+1); |
| 909 }else{ |
| 910 bufLen = 1 ; |
| 911 memset(buf,0,U_SIZEOF_UCHAR*MAX_DEST_SIZE); |
| 912 } |
| 913 |
| 914 if(errorCase.unicode[0]!=0){ |
| 915 src = errorCase.unicode; |
| 916 } |
| 917 // test toASCII |
| 918 testAPI(src,buf, |
| 919 IDNToASCIIName, errorCase.useSTD3ASCIIRules, |
| 920 errorCase.expected, TRUE, TRUE, IDNToASCII); |
| 921 if(errorCase.testLabel ==TRUE){ |
| 922 testAPI(src,buf, |
| 923 IDNToASCIIName, errorCase.useSTD3ASCIIRules, |
| 924 errorCase.expected, FALSE,TRUE, IDNToASCII); |
| 925 } |
| 926 if(errorCase.testToUnicode ==TRUE){ |
| 927 testAPI((src==NULL)? NULL : buf,src, |
| 928 IDNToUnicodeName, errorCase.useSTD3ASCIIRules, |
| 929 errorCase.expected, TRUE, TRUE, IDNToUnicode); |
| 930 } |
| 931 |
| 932 } |
| 933 |
| 934 } |
| 935 /* |
| 936 void TestIDNA::testConformance(const char* toASCIIName, TestFunc toASCII, |
| 937 const char* IDNToASCIIName, TestFunc IDNToASCII, |
| 938 const char* IDNToUnicodeName, TestFunc IDNToUnico
de, |
| 939 const char* toUnicodeName, TestFunc toUnicode){ |
| 940 UChar src[MAX_DEST_SIZE]; |
| 941 int32_t srcLen=0; |
| 942 UChar expected[MAX_DEST_SIZE]; |
| 943 int32_t expectedLen = 0; |
| 944 for(int32_t i=0;i< (int32_t)(sizeof(conformanceTestCases)/sizeof(conformance
TestCases[0]));i++){ |
| 945 const char* utf8Chars1 = conformanceTestCases[i].in; |
| 946 int32_t utf8Chars1Len = (int32_t)strlen(utf8Chars1); |
| 947 const char* utf8Chars2 = conformanceTestCases[i].out; |
| 948 int32_t utf8Chars2Len = (utf8Chars2 == NULL) ? 0 : (int32_t)strlen(utf8C
hars2); |
| 949 |
| 950 UErrorCode status = U_ZERO_ERROR; |
| 951 u_strFromUTF8(src,MAX_DEST_SIZE,&srcLen,utf8Chars1,utf8Chars1Len,&status
); |
| 952 if(U_FAILURE(status)){ |
| 953 errln(UnicodeString("Conversion of UTF8 source in conformanceTestCas
es[") + i +UnicodeString( "].in ( ")+prettify(utf8Chars1) +UnicodeString(" ) fai
led. Error: ")+ UnicodeString(u_errorName(status))); |
| 954 continue; |
| 955 } |
| 956 if(utf8Chars2 != NULL){ |
| 957 u_strFromUTF8(expected,MAX_DEST_SIZE,&expectedLen,utf8Chars2,utf8Cha
rs2Len, &status); |
| 958 if(U_FAILURE(status)){ |
| 959 errln(UnicodeString("Conversion of UTF8 source in conformanceTes
tCases[") + i +UnicodeString( "].in ( ")+prettify(utf8Chars1) +UnicodeString(" )
failed. Error: ")+ UnicodeString(u_errorName(status))); |
| 960 continue; |
| 961 } |
| 962 } |
| 963 |
| 964 if(conformanceTestCases[i].expectedStatus != U_ZERO_ERROR){ |
| 965 // test toASCII |
| 966 testAPI(src,expected, |
| 967 IDNToASCIIName, FALSE, |
| 968 conformanceTestCases[i].expectedStatus, |
| 969 TRUE, |
| 970 (conformanceTestCases[i].expectedStatus != U_IDNA_UNASSIGNED
_ERROR), |
| 971 IDNToASCII); |
| 972 |
| 973 testAPI(src,expected, |
| 974 toASCIIName, FALSE, |
| 975 conformanceTestCases[i].expectedStatus, TRUE, |
| 976 (conformanceTestCases[i].expectedStatus != U_IDNA_UNASSIGNED
_ERROR), |
| 977 toASCII); |
| 978 } |
| 979 |
| 980 testAPI(src,src, |
| 981 IDNToUnicodeName, FALSE, |
| 982 conformanceTestCases[i].expectedStatus, TRUE, TRUE, IDNToUnicode
); |
| 983 testAPI(src,src, |
| 984 toUnicodeName, FALSE, |
| 985 conformanceTestCases[i].expectedStatus, TRUE, TRUE, toUnicode); |
| 986 |
| 987 } |
| 988 |
| 989 } |
| 990 */ |
| 991 // test and ascertain |
| 992 // func(func(func(src))) == func(src) |
| 993 void TestIDNA::testChaining(const UChar* src,int32_t numIterations,const char* t
estName, |
| 994 UBool useSTD3ASCIIRules, UBool caseInsensitive, TestFunc func)
{ |
| 995 UChar even[MAX_DEST_SIZE]; |
| 996 UChar odd[MAX_DEST_SIZE]; |
| 997 UChar expected[MAX_DEST_SIZE]; |
| 998 int32_t i=0,evenLen=0,oddLen=0,expectedLen=0; |
| 999 UErrorCode status = U_ZERO_ERROR; |
| 1000 int32_t srcLen = u_strlen(src); |
| 1001 int32_t options = (useSTD3ASCIIRules == TRUE) ? UIDNA_USE_STD3_RULES : UIDNA
_DEFAULT; |
| 1002 UParseError parseError; |
| 1003 |
| 1004 // test null-terminated source |
| 1005 expectedLen = func(src,-1,expected,MAX_DEST_SIZE, options, &parseError, &sta
tus); |
| 1006 if(U_FAILURE(status)){ |
| 1007 errcheckln(status, "%s null terminated source failed. Error: %s",testNam
e, u_errorName(status)); |
| 1008 } |
| 1009 memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1010 memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1011 for(;i<=numIterations; i++){ |
| 1012 if((i%2) ==0){ |
| 1013 evenLen = func(odd,-1,even,MAX_DEST_SIZE,options, &parseError, &stat
us); |
| 1014 if(U_FAILURE(status)){ |
| 1015 errcheckln(status, "%s null terminated source failed - %s",testN
ame, u_errorName(status)); |
| 1016 break; |
| 1017 } |
| 1018 }else{ |
| 1019 oddLen = func(even,-1,odd,MAX_DEST_SIZE,options, &parseError, &statu
s); |
| 1020 if(U_FAILURE(status)){ |
| 1021 errln("%s null terminated source failed\n",testName); |
| 1022 break; |
| 1023 } |
| 1024 } |
| 1025 } |
| 1026 if(caseInsensitive ==TRUE){ |
| 1027 if( u_strCaseCompare(even,evenLen, expected,expectedLen, 0, &status) !=0
|| |
| 1028 u_strCaseCompare(odd,oddLen, expected,expectedLen, 0, &status) !=0 )
{ |
| 1029 |
| 1030 errln("Chaining for %s null terminated source failed\n",testName); |
| 1031 } |
| 1032 }else{ |
| 1033 if( u_strncmp(even,expected,expectedLen) != 0 || |
| 1034 u_strncmp(odd,expected,expectedLen) !=0 ){ |
| 1035 |
| 1036 errln("Chaining for %s null terminated source failed\n",testName); |
| 1037 } |
| 1038 } |
| 1039 |
| 1040 // test null-terminated source |
| 1041 status = U_ZERO_ERROR; |
| 1042 expectedLen = func(src,-1,expected,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNASSIG
NED, &parseError, &status); |
| 1043 if(U_FAILURE(status)){ |
| 1044 errcheckln(status, "%s null terminated source with options set failed. E
rror: %s",testName, u_errorName(status)); |
| 1045 } |
| 1046 memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1047 memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1048 for(;i<=numIterations; i++){ |
| 1049 if((i%2) ==0){ |
| 1050 evenLen = func(odd,-1,even,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNASSIG
NED, &parseError, &status); |
| 1051 if(U_FAILURE(status)){ |
| 1052 errcheckln(status, "%s null terminated source with options set f
ailed - %s",testName, u_errorName(status)); |
| 1053 break; |
| 1054 } |
| 1055 }else{ |
| 1056 oddLen = func(even,-1,odd,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNASSIGN
ED, &parseError, &status); |
| 1057 if(U_FAILURE(status)){ |
| 1058 errln("%s null terminated source with options set failed\n",test
Name); |
| 1059 break; |
| 1060 } |
| 1061 } |
| 1062 } |
| 1063 if(caseInsensitive ==TRUE){ |
| 1064 if( u_strCaseCompare(even,evenLen, expected,expectedLen, 0, &status) !=0
|| |
| 1065 u_strCaseCompare(odd,oddLen, expected,expectedLen, 0, &status) !=0 )
{ |
| 1066 |
| 1067 errln("Chaining for %s null terminated source with options set faile
d\n",testName); |
| 1068 } |
| 1069 }else{ |
| 1070 if( u_strncmp(even,expected,expectedLen) != 0 || |
| 1071 u_strncmp(odd,expected,expectedLen) !=0 ){ |
| 1072 |
| 1073 errln("Chaining for %s null terminated source with options set faile
d\n",testName); |
| 1074 } |
| 1075 } |
| 1076 |
| 1077 |
| 1078 // test source with length |
| 1079 status = U_ZERO_ERROR; |
| 1080 expectedLen = func(src,srcLen,expected,MAX_DEST_SIZE,options, &parseError, &
status); |
| 1081 if(U_FAILURE(status)){ |
| 1082 errcheckln(status, "%s null terminated source failed. Error: %s",testNam
e, u_errorName(status)); |
| 1083 } |
| 1084 memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1085 memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1086 for(;i<=numIterations; i++){ |
| 1087 if((i%2) ==0){ |
| 1088 evenLen = func(odd,oddLen,even,MAX_DEST_SIZE,options, &parseError, &
status); |
| 1089 if(U_FAILURE(status)){ |
| 1090 errcheckln(status, "%s source with source length failed - %s",te
stName, u_errorName(status)); |
| 1091 break; |
| 1092 } |
| 1093 }else{ |
| 1094 oddLen = func(even,evenLen,odd,MAX_DEST_SIZE,options, &parseError, &
status); |
| 1095 if(U_FAILURE(status)){ |
| 1096 errcheckln(status, "%s source with source length failed - %s",te
stName, u_errorName(status)); |
| 1097 break; |
| 1098 } |
| 1099 } |
| 1100 } |
| 1101 if(caseInsensitive ==TRUE){ |
| 1102 if( u_strCaseCompare(even,evenLen, expected,expectedLen, 0, &status) !=0
|| |
| 1103 u_strCaseCompare(odd,oddLen, expected,expectedLen, 0, &status) !=0 )
{ |
| 1104 |
| 1105 errln("Chaining for %s source with source length failed\n",testName)
; |
| 1106 } |
| 1107 }else{ |
| 1108 if( u_strncmp(even,expected,expectedLen) != 0 || |
| 1109 u_strncmp(odd,expected,expectedLen) !=0 ){ |
| 1110 |
| 1111 errln("Chaining for %s source with source length failed\n",testName)
; |
| 1112 } |
| 1113 } |
| 1114 status = U_ZERO_ERROR; |
| 1115 expectedLen = func(src,srcLen,expected,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNA
SSIGNED, &parseError, &status); |
| 1116 if(U_FAILURE(status)){ |
| 1117 errcheckln(status, "%s null terminated source with options set failed. E
rror: %s",testName, u_errorName(status)); |
| 1118 } |
| 1119 memcpy(odd,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1120 memcpy(even,expected,(expectedLen+1) * U_SIZEOF_UCHAR); |
| 1121 for(;i<=numIterations; i++){ |
| 1122 if((i%2) ==0){ |
| 1123 evenLen = func(odd,oddLen,even,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNA
SSIGNED, &parseError, &status); |
| 1124 if(U_FAILURE(status)){ |
| 1125 errcheckln(status, "%s source with source length and options set
failed - %s",testName, u_errorName(status)); |
| 1126 break; |
| 1127 } |
| 1128 }else{ |
| 1129 oddLen = func(even,evenLen,odd,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNA
SSIGNED, &parseError, &status); |
| 1130 if(U_FAILURE(status)){ |
| 1131 errcheckln(status, "%s source with source length and options se
t failed - %s",testName, u_errorName(status)); |
| 1132 break; |
| 1133 } |
| 1134 } |
| 1135 } |
| 1136 if(caseInsensitive ==TRUE){ |
| 1137 if( u_strCaseCompare(even,evenLen, expected,expectedLen, 0, &status) !=0
|| |
| 1138 u_strCaseCompare(odd,oddLen, expected,expectedLen, 0, &status) !=0 )
{ |
| 1139 |
| 1140 errln("Chaining for %s source with source length and options set fa
iled\n",testName); |
| 1141 } |
| 1142 }else{ |
| 1143 if( u_strncmp(even,expected,expectedLen) != 0 || |
| 1144 u_strncmp(odd,expected,expectedLen) !=0 ){ |
| 1145 |
| 1146 errln("Chaining for %s source with source length and options set fa
iled\n",testName); |
| 1147 } |
| 1148 } |
| 1149 } |
| 1150 void TestIDNA::testChaining(const char* toASCIIName, TestFunc toASCII, |
| 1151 const char* toUnicodeName, TestFunc toUnicode){ |
| 1152 int32_t i; |
| 1153 UChar buf[MAX_DEST_SIZE]; |
| 1154 |
| 1155 for(i=0;i< (int32_t)(sizeof(asciiIn)/sizeof(asciiIn[0])); i++){ |
| 1156 u_charsToUChars(asciiIn[i],buf, (int32_t)(strlen(asciiIn[i])+1)); |
| 1157 testChaining(buf,5,toUnicodeName, FALSE, FALSE, toUnicode); |
| 1158 } |
| 1159 for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ |
| 1160 testChaining(unicodeIn[i], 5,toASCIIName, FALSE, TRUE, toASCII); |
| 1161 } |
| 1162 } |
| 1163 |
| 1164 |
| 1165 void TestIDNA::testRootLabelSeparator(const char* testName, CompareFunc func, |
| 1166 const char* IDNToASCIIName, TestFunc IDNToASCII, |
| 1167 const char* IDNToUnicodeName, TestFunc IDNToUnicode)
{ |
| 1168 int32_t i; |
| 1169 |
| 1170 |
| 1171 UChar www[] = {0x0057, 0x0057, 0x0057, 0x002E, 0x0000}; |
| 1172 UChar com[] = {0x002E, 0x0043, 0x004F, 0x004D, 0x002E, /* root label separat
or */0x0000}; |
| 1173 UChar buf[MAX_DEST_SIZE]={0x0057, 0x0057, 0x0057, 0x002E, 0x0000}; |
| 1174 |
| 1175 UnicodeString source(www), uni0(www),uni1(www), ascii0(www), ascii1(www); |
| 1176 |
| 1177 uni0.append(unicodeIn[0]); |
| 1178 uni0.append(com); |
| 1179 uni0.append((UChar)0x0000); |
| 1180 |
| 1181 uni1.append(unicodeIn[1]); |
| 1182 uni1.append(com); |
| 1183 uni1.append((UChar)0x0000); |
| 1184 |
| 1185 ascii0.append(asciiIn[0]); |
| 1186 ascii0.append(com); |
| 1187 ascii0.append((UChar)0x0000); |
| 1188 |
| 1189 ascii1.append(asciiIn[1]); |
| 1190 ascii1.append(com); |
| 1191 ascii1.append((UChar)0x0000); |
| 1192 |
| 1193 for(i=0;i< (int32_t)(sizeof(unicodeIn)/sizeof(unicodeIn[0])); i++){ |
| 1194 |
| 1195 u_charsToUChars(asciiIn[i],buf+4, (int32_t)(strlen(asciiIn[i])+1)); |
| 1196 u_strcat(buf,com); |
| 1197 |
| 1198 // for every entry in unicodeIn array |
| 1199 // prepend www. and append .com |
| 1200 source.truncate(4); |
| 1201 source.append(unicodeIn[i]); |
| 1202 source.append(com); |
| 1203 source.append((UChar)0x0000); |
| 1204 |
| 1205 const UChar* src = source.getBuffer(); |
| 1206 int32_t srcLen = u_strlen(src); //subtract null |
| 1207 |
| 1208 // b) compare it with asciiIn equivalent |
| 1209 testCompare(src,srcLen,buf,u_strlen(buf),testName, func,TRUE); |
| 1210 |
| 1211 // a) compare it with itself |
| 1212 testCompare(src,srcLen,src,srcLen,testName, func,TRUE); |
| 1213 |
| 1214 |
| 1215 // IDNToASCII comparison |
| 1216 testAPI(src,buf,IDNToASCIIName,FALSE,U_ZERO_ERROR,TRUE, TRUE, IDNToASCII
); |
| 1217 // IDNToUnicode comparison |
| 1218 testAPI(buf,src,IDNToUnicodeName, FALSE,U_ZERO_ERROR, TRUE, TRUE, IDNToU
nicode); |
| 1219 |
| 1220 // c) compare it with unicodeIn not equivalent |
| 1221 if(i==0){ |
| 1222 testCompare(src,srcLen,uni1.getBuffer(),uni1.length()-1,testName, fu
nc,FALSE); |
| 1223 }else{ |
| 1224 testCompare(src,srcLen,uni0.getBuffer(),uni0.length()-1,testName, fu
nc,FALSE); |
| 1225 } |
| 1226 // d) compare it with asciiIn not equivalent |
| 1227 if(i==0){ |
| 1228 testCompare(src,srcLen,ascii1.getBuffer(),ascii1.length()-1,testName
, func,FALSE); |
| 1229 }else{ |
| 1230 testCompare(src,srcLen,ascii0.getBuffer(),ascii0.length()-1,testName
, func,FALSE); |
| 1231 } |
| 1232 } |
| 1233 } |
| 1234 |
| 1235 //--------------------------------------------- |
| 1236 // runIndexedTest |
| 1237 //--------------------------------------------- |
| 1238 |
| 1239 extern IntlTest *createUTS46Test(); |
| 1240 |
| 1241 void TestIDNA::runIndexedTest( int32_t index, UBool exec, const char* &name, cha
r* par) |
| 1242 { |
| 1243 if (exec) logln((UnicodeString)"TestSuite IDNA API "); |
| 1244 switch (index) { |
| 1245 |
| 1246 case 0: name = "TestToASCII"; if (exec) TestToASCII(); break; |
| 1247 case 1: name = "TestToUnicode"; if (exec) TestToUnicode(); break; |
| 1248 case 2: name = "TestIDNToASCII"; if (exec) TestIDNToASCII(); break; |
| 1249 case 3: name = "TestIDNToUnicode"; if (exec) TestIDNToUnicode(); break; |
| 1250 case 4: name = "TestCompare"; if (exec) TestCompare(); break; |
| 1251 case 5: name = "TestErrorCases"; if (exec) TestErrorCases(); break; |
| 1252 case 6: name = "TestChaining"; if (exec) TestChaining(); break; |
| 1253 case 7: name = "TestRootLabelSeparator"; if(exec) TestRootLabelSeparator
(); break; |
| 1254 case 8: name = "TestCompareReferenceImpl"; if(exec) TestCompareReference
Impl(); break; |
| 1255 case 9: name = "TestDataFile"; if(exec) TestDataFile(); break; |
| 1256 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
| 1257 case 10: name = "TestRefIDNA"; if(exec) TestRefIDNA(); break; |
| 1258 case 11: name = "TestIDNAMonkeyTest"; if(exec) TestIDNAMonkeyTest(); bre
ak; |
| 1259 #else |
| 1260 case 10: case 11: name = "skip"; break; |
| 1261 #endif |
| 1262 case 12: |
| 1263 { |
| 1264 name = "TestConformanceTestVectors"; |
| 1265 if(exec){ |
| 1266 logln("TestSuite IDNA conf----"); logln(); |
| 1267 IdnaConfTest test; |
| 1268 callTest(test, par); |
| 1269 } |
| 1270 break; |
| 1271 } |
| 1272 case 13: |
| 1273 name = "UTS46Test"; |
| 1274 if (exec) { |
| 1275 logln("TestSuite UTS46Test---"); logln(); |
| 1276 LocalPointer<IntlTest> test(createUTS46Test()); |
| 1277 callTest(*test, par); |
| 1278 } |
| 1279 break; |
| 1280 default: name = ""; break; /*needed to end loop*/ |
| 1281 } |
| 1282 } |
| 1283 void TestIDNA::TestToASCII(){ |
| 1284 testToASCII("uidna_toASCII", uidna_toASCII); |
| 1285 } |
| 1286 void TestIDNA::TestToUnicode(){ |
| 1287 testToUnicode("uidna_toUnicode", uidna_toUnicode); |
| 1288 } |
| 1289 void TestIDNA::TestIDNToASCII(){ |
| 1290 testIDNToASCII("uidna_IDNToASCII", uidna_IDNToASCII); |
| 1291 } |
| 1292 void TestIDNA::TestIDNToUnicode(){ |
| 1293 testIDNToUnicode("uidna_IDNToUnicode", uidna_IDNToUnicode); |
| 1294 } |
| 1295 void TestIDNA::TestCompare(){ |
| 1296 testCompare("uidna_compare",uidna_compare); |
| 1297 } |
| 1298 void TestIDNA::TestErrorCases(){ |
| 1299 testErrorCases( "uidna_IDNToASCII",uidna_IDNToASCII, |
| 1300 "uidna_IDNToUnicode",uidna_IDNToUnicode); |
| 1301 } |
| 1302 void TestIDNA::TestRootLabelSeparator(){ |
| 1303 testRootLabelSeparator( "uidna_compare",uidna_compare, |
| 1304 "uidna_IDNToASCII", uidna_IDNToASCII, |
| 1305 "uidna_IDNToUnicode",uidna_IDNToUnicode |
| 1306 ); |
| 1307 } |
| 1308 void TestIDNA::TestChaining(){ |
| 1309 testChaining("uidna_toASCII",uidna_toASCII, "uidna_toUnicode", uidna_toUnico
de); |
| 1310 } |
| 1311 |
| 1312 |
| 1313 static const int loopCount = 100; |
| 1314 static const int maxCharCount = 20; |
| 1315 static const int maxCodePoint = 0x10ffff; |
| 1316 static uint32_t |
| 1317 randul() |
| 1318 { |
| 1319 static UBool initialized = FALSE; |
| 1320 if (!initialized) |
| 1321 { |
| 1322 srand((unsigned)time(NULL)); |
| 1323 initialized = TRUE; |
| 1324 } |
| 1325 // Assume rand has at least 12 bits of precision |
| 1326 uint32_t l = 0; |
| 1327 for (uint32_t i=0; i<sizeof(l); ++i) |
| 1328 ((char*)&l)[i] = (char)((rand() & 0x0FF0) >> 4); |
| 1329 return l; |
| 1330 } |
| 1331 |
| 1332 /** |
| 1333 * Return a random integer i where 0 <= i < n. |
| 1334 * A special function that gets random codepoints from planes 0,1,2 and 14 |
| 1335 */ |
| 1336 static int32_t rand_uni() |
| 1337 { |
| 1338 int32_t retVal = (int32_t)(randul()& 0x3FFFF); |
| 1339 if(retVal >= 0x30000){ |
| 1340 retVal+=0xB0000; |
| 1341 } |
| 1342 return retVal; |
| 1343 } |
| 1344 |
| 1345 static int32_t randi(int32_t n){ |
| 1346 return (int32_t) (randul() % (n+1)); |
| 1347 } |
| 1348 |
| 1349 void getTestSource(UnicodeString& fillIn) { |
| 1350 int32_t i = 0; |
| 1351 int32_t charCount = (randi(maxCharCount) + 1); |
| 1352 while (i <charCount ) { |
| 1353 int32_t codepoint = rand_uni(); |
| 1354 if(codepoint == 0x0000){ |
| 1355 continue; |
| 1356 } |
| 1357 fillIn.append((UChar32)codepoint); |
| 1358 i++; |
| 1359 } |
| 1360 |
| 1361 } |
| 1362 |
| 1363 UnicodeString TestIDNA::testCompareReferenceImpl(UnicodeString& src, |
| 1364 TestFunc refIDNA, const char* refIDNANam
e, |
| 1365 TestFunc uIDNA, const char* uIDNAName, |
| 1366 int32_t options){ |
| 1367 |
| 1368 const UChar* srcUChars = src.getBuffer(); |
| 1369 UChar exp[MAX_DEST_SIZE]={0}; |
| 1370 int32_t expCap = MAX_DEST_SIZE, expLen=0; |
| 1371 UErrorCode expStatus = U_ZERO_ERROR; |
| 1372 UParseError parseError; |
| 1373 |
| 1374 logln("Comparing "+ UnicodeString(refIDNAName) |
| 1375 + " with "+ UnicodeString(uIDNAName) |
| 1376 +" for input: " + prettify(srcUChars)); |
| 1377 |
| 1378 expLen = refIDNA(srcUChars, src.length()-1, exp, expCap, |
| 1379 options, &parseError, &expStatus); |
| 1380 |
| 1381 UChar got[MAX_DEST_SIZE]={0}; |
| 1382 int32_t gotCap = MAX_DEST_SIZE, gotLen=0; |
| 1383 UErrorCode gotStatus = U_ZERO_ERROR; |
| 1384 |
| 1385 gotLen = uIDNA(srcUChars, src.length()-1, got, gotCap, |
| 1386 options, &parseError, &gotStatus); |
| 1387 |
| 1388 if(expStatus != gotStatus){ |
| 1389 errln("Did not get the expected status while comparing " + UnicodeString
(refIDNAName) |
| 1390 + " with " + UnicodeString(uIDNAName) |
| 1391 + " Expected: " + UnicodeString(u_errorName(expStatus)) |
| 1392 + " Got: " + UnicodeString(u_errorName(gotStatus)) |
| 1393 + " for Source: "+ prettify(srcUChars) |
| 1394 + " Options: " + options); |
| 1395 return UnicodeString(""); |
| 1396 } |
| 1397 |
| 1398 // now we know that both implementations yielded same error |
| 1399 if(U_SUCCESS(expStatus)){ |
| 1400 // compare the outputs if status == U_ZERO_ERROR |
| 1401 if(u_strCompare(exp, expLen, got, gotLen, TRUE) != 0){ |
| 1402 errln("Did not get the expected output while comparing " + UnicodeSt
ring(refIDNAName) |
| 1403 + " with " + UnicodeString(uIDNAName) |
| 1404 + " Expected: " + prettify(UnicodeString(exp, expLen)) |
| 1405 + " Got: " + prettify(UnicodeString(got, gotLen)) |
| 1406 + " for Source: "+ prettify(srcUChars) |
| 1407 + " Options: " + options); |
| 1408 } |
| 1409 return UnicodeString(exp, expLen); |
| 1410 |
| 1411 }else{ |
| 1412 logln("Got the same error while comparing " |
| 1413 + UnicodeString(refIDNAName) |
| 1414 + " with "+ UnicodeString(uIDNAName) |
| 1415 +" for input: " + prettify(srcUChars)); |
| 1416 } |
| 1417 return UnicodeString(""); |
| 1418 } |
| 1419 |
| 1420 void TestIDNA::testCompareReferenceImpl(const UChar* src, int32_t srcLen){ |
| 1421 UnicodeString label(src,srcLen); |
| 1422 label.append((UChar)0x0000); |
| 1423 |
| 1424 //test idnaref_toASCII and idnare |
| 1425 UnicodeString asciiLabel = testCompareReferenceImpl(label, |
| 1426 idnaref_toASCII, "idnaref_
toASCII", |
| 1427 uidna_toASCII, "uidna_toAS
CII", |
| 1428 UIDNA_ALLOW_UNASSIGNED); |
| 1429 testCompareReferenceImpl(label, |
| 1430 idnaref_toASCII, "idnaref_toASCII", |
| 1431 uidna_toASCII, "uidna_toASCII", |
| 1432 UIDNA_DEFAULT); |
| 1433 testCompareReferenceImpl(label, |
| 1434 idnaref_toASCII, "idnaref_toASCII", |
| 1435 uidna_toASCII, "uidna_toASCII", |
| 1436 UIDNA_USE_STD3_RULES); |
| 1437 testCompareReferenceImpl(label, |
| 1438 idnaref_toASCII, "idnaref_toASCII", |
| 1439 uidna_toASCII, "uidna_toASCII", |
| 1440 UIDNA_USE_STD3_RULES | UIDNA_ALLOW_UNASSIGNED); |
| 1441 |
| 1442 if(asciiLabel.length()!=0){ |
| 1443 asciiLabel.append((UChar)0x0000); |
| 1444 |
| 1445 // test toUnciode |
| 1446 testCompareReferenceImpl(asciiLabel, |
| 1447 idnaref_toUnicode, "idnaref_toUnicode", |
| 1448 uidna_toUnicode, "uidna_toUnicode", |
| 1449 UIDNA_ALLOW_UNASSIGNED); |
| 1450 testCompareReferenceImpl(asciiLabel, |
| 1451 idnaref_toUnicode, "idnaref_toUnicode", |
| 1452 uidna_toUnicode, "uidna_toUnicode", |
| 1453 UIDNA_DEFAULT); |
| 1454 testCompareReferenceImpl(asciiLabel, |
| 1455 idnaref_toUnicode, "idnaref_toUnicode", |
| 1456 uidna_toUnicode, "uidna_toUnicode", |
| 1457 UIDNA_USE_STD3_RULES); |
| 1458 testCompareReferenceImpl(asciiLabel, |
| 1459 idnaref_toUnicode, "idnaref_toUnicode", |
| 1460 uidna_toUnicode, "uidna_toUnicode", |
| 1461 UIDNA_USE_STD3_RULES | UIDNA_ALLOW_UNASSIGNED)
; |
| 1462 } |
| 1463 |
| 1464 } |
| 1465 const char* failures[] ={ |
| 1466 "\\uAA42\\U0001F8DD\\U00019D01\\U000149A3\\uD385\\U000EE0F5\\U00018B92\\U000
179D1\\U00018624\\U0002227F\\U000E83C0\\U000E8DCD\\u5460\\U00017F34\\U0001570B\\
u43D1\\U0002C9C9\\U000281EC\\u2105\\U000180AE\\uC5D4", |
| 1467 "\\U0002F5A6\\uD638\\u0D0A\\u9E9C\\uFE5B\\U0001FCCB\\u66C4", |
| 1468 }; |
| 1469 |
| 1470 void TestIDNA::TestIDNAMonkeyTest(){ |
| 1471 UnicodeString source; |
| 1472 UErrorCode status = U_ZERO_ERROR; |
| 1473 int i; |
| 1474 |
| 1475 getInstance(status); // Init prep |
| 1476 if (U_FAILURE(status)) { |
| 1477 dataerrln("Test could not initialize. Got %s", u_errorName(status)); |
| 1478 return; |
| 1479 } |
| 1480 |
| 1481 for(i=0; i<loopCount; i++){ |
| 1482 source.truncate(0); |
| 1483 getTestSource(source); |
| 1484 source.append((UChar)0x0000); |
| 1485 const UChar* src = source.getBuffer(); |
| 1486 testCompareReferenceImpl(src,source.length()-1); |
| 1487 testCompareReferenceImpl(src,source.length()-1); |
| 1488 } |
| 1489 |
| 1490 /* for debugging */ |
| 1491 for (i=0; i<(int)(sizeof(failures)/sizeof(failures[0])); i++){ |
| 1492 source.truncate(0); |
| 1493 source.append( UnicodeString(failures[i], -1, US_INV) ); |
| 1494 source = source.unescape(); |
| 1495 source.append((UChar)0x0000); |
| 1496 const UChar *src = source.getBuffer(); |
| 1497 testCompareReferenceImpl(src,source.length()-1); |
| 1498 //debug(source.getBuffer(),source.length(),UIDNA_ALLOW_UNASSIGNED); |
| 1499 } |
| 1500 |
| 1501 |
| 1502 source.truncate(0); |
| 1503 source.append(UNICODE_STRING_SIMPLE("\\uCF18\\U00021161\\U000EEF11\\U0002BB8
2\\U0001D63C")); |
| 1504 debug(source.getBuffer(),source.length(),UIDNA_ALLOW_UNASSIGNED); |
| 1505 |
| 1506 { // test deletion of code points |
| 1507 UnicodeString source("\\u043f\\u00AD\\u034f\\u043e\\u0447\\u0435\\u043c\
\u0443\\u0436\\u0435\\u043e\\u043d\\u0438\\u043d\\u0435\\u0433\\u043e\\u0432\\u0
43e\\u0440\\u044f\\u0442\\u043f\\u043e\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438
\\u0000", -1, US_INV); |
| 1508 source = source.unescape(); |
| 1509 UnicodeString expected("\\u043f\\u043e\\u0447\\u0435\\u043c\\u0443\\u043
6\\u0435\\u043e\\u043d\\u0438\\u043d\\u0435\\u0433\\u043e\\u0432\\u043e\\u0440\\
u044f\\u0442\\u043f\\u043e\\u0440\\u0443\\u0441\\u0441\\u043a\\u0438\\u0000", -1
, US_INV); |
| 1510 expected = expected.unescape(); |
| 1511 UnicodeString ascii("xn--b1abfaaepdrnnbgefbadotcwatmq2g4l"); |
| 1512 ascii.append((UChar)0x0000); |
| 1513 testAPI(source.getBuffer(),ascii.getBuffer(), "uidna_toASCII", FALSE, U_
ZERO_ERROR, TRUE, TRUE, uidna_toASCII); |
| 1514 |
| 1515 testAPI(source.getBuffer(),ascii.getBuffer(), "idnaref_toASCII", FALSE,
U_ZERO_ERROR, TRUE, TRUE, idnaref_toASCII); |
| 1516 |
| 1517 testCompareReferenceImpl(source.getBuffer(), source.length()-1); |
| 1518 } |
| 1519 |
| 1520 } |
| 1521 |
| 1522 void TestIDNA::TestCompareReferenceImpl(){ |
| 1523 |
| 1524 UChar src [2] = {0,0}; |
| 1525 int32_t srcLen = 0; |
| 1526 |
| 1527 |
| 1528 for(int32_t i = 0x40000 ; i< 0x10ffff; i++){ |
| 1529 if(quick==TRUE && i> 0x1FFFF){ |
| 1530 return; |
| 1531 } |
| 1532 if(i >= 0x30000 && i <= 0xF0000){ |
| 1533 i+=0xB0000; |
| 1534 } |
| 1535 if(i>0xFFFF){ |
| 1536 src[0] = U16_LEAD(i); |
| 1537 src[1] = U16_TRAIL(i); |
| 1538 srcLen =2; |
| 1539 }else{ |
| 1540 src[0] = (UChar)i; |
| 1541 src[1] = 0; |
| 1542 srcLen = 1; |
| 1543 } |
| 1544 testCompareReferenceImpl(src, srcLen); |
| 1545 } |
| 1546 } |
| 1547 |
| 1548 void TestIDNA::TestRefIDNA(){ |
| 1549 UErrorCode status = U_ZERO_ERROR; |
| 1550 getInstance(status); // Init prep |
| 1551 if (U_FAILURE(status)) { |
| 1552 if (status == U_FILE_ACCESS_ERROR) { |
| 1553 dataerrln("Test could not initialize. Got %s", u_errorName(status)); |
| 1554 } |
| 1555 return; |
| 1556 } |
| 1557 |
| 1558 testToASCII("idnaref_toASCII", idnaref_toASCII); |
| 1559 testToUnicode("idnaref_toUnicode", idnaref_toUnicode); |
| 1560 testIDNToASCII("idnaref_IDNToASCII", idnaref_IDNToASCII); |
| 1561 testIDNToUnicode("idnaref_IDNToUnicode", idnaref_IDNToUnicode); |
| 1562 testCompare("idnaref_compare",idnaref_compare); |
| 1563 testErrorCases( "idnaref_IDNToASCII",idnaref_IDNToASCII, |
| 1564 "idnaref_IDNToUnicode",idnaref_IDNToUnicode); |
| 1565 testChaining("idnaref_toASCII",idnaref_toASCII, "idnaref_toUnicode", idnaref
_toUnicode); |
| 1566 |
| 1567 testRootLabelSeparator( "idnaref_compare",idnaref_compare, |
| 1568 "idnaref_IDNToASCII", idnaref_IDNToASCII, |
| 1569 "idnaref_IDNToUnicode",idnaref_IDNToUnicode |
| 1570 ); |
| 1571 testChaining("idnaref_toASCII",idnaref_toASCII, "idnaref_toUnicode", idnaref
_toUnicode); |
| 1572 } |
| 1573 |
| 1574 |
| 1575 void TestIDNA::TestDataFile(){ |
| 1576 testData(*this); |
| 1577 } |
| 1578 TestIDNA::~TestIDNA(){ |
| 1579 if(gPrep!=NULL){ |
| 1580 delete gPrep; |
| 1581 gPrep = NULL; |
| 1582 } |
| 1583 } |
| 1584 |
| 1585 NamePrepTransform* TestIDNA::gPrep = NULL; |
| 1586 |
| 1587 NamePrepTransform* TestIDNA::getInstance(UErrorCode& status){ |
| 1588 if(TestIDNA::gPrep == NULL){ |
| 1589 UParseError parseError; |
| 1590 TestIDNA::gPrep = NamePrepTransform::createInstance(parseError, status); |
| 1591 if(TestIDNA::gPrep ==NULL){ |
| 1592 //status = U_MEMORY_ALLOCATION_ERROR; |
| 1593 return NULL; |
| 1594 } |
| 1595 } |
| 1596 return TestIDNA::gPrep; |
| 1597 |
| 1598 } |
| 1599 #endif /* #if !UCONFIG_NO_IDNA */ |
OLD | NEW |