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