Home | History | Annotate | Download | only in intltest
      1 /*
      2  *******************************************************************************
      3  *
      4  *   Copyright (C) 2003-2009, 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/ustring.h"
     26 #include "unicode/usprep.h"
     27 #include "unicode/uniset.h"
     28 #include "testidna.h"
     29 #include "idnaref.h"
     30 #include "nptrans.h"
     31 #include "unicode/putil.h"
     32 #include "idnaconf.h"
     33 
     34 static const UChar unicodeIn[][41] ={
     35     {
     36         0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643, 0x0644,
     37         0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A, 0x061F, 0x0000
     38     },
     39     {
     40         0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587,
     41         0x0000
     42     },
     43     {
     44         0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073, 0x0074,
     45         0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076, 0x00ED, 0x010D,
     46         0x0065, 0x0073, 0x006B, 0x0079, 0x0000
     47     },
     48     {
     49         0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5, 0x05D8,
     50         0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9, 0x05DD, 0x05E2,
     51         0x05D1, 0x05E8, 0x05D9, 0x05EA, 0x0000
     52     },
     53     {
     54         0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928, 0x094D,
     55         0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902, 0x0928, 0x0939,
     56         0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938, 0x0915, 0x0924, 0x0947,
     57         0x0939, 0x0948, 0x0902, 0x0000
     58     },
     59     {
     60         0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E, 0x3092,
     61         0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044, 0x306E, 0x304B,
     62         0x0000
     63     },
     64 /*
     65     {
     66         0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
     67         0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
     68         0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C, 0x0000
     69     },
     70 */
     71     {
     72         0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435, 0x043E,
     73         0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432, 0x043E, 0x0440,
     74         0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443, 0x0441, 0x0441, 0x043A,
     75         0x0438, 0x0000
     76     },
     77     {
     78         0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F, 0x0070,
     79         0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069, 0x006D, 0x0070,
     80         0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074, 0x0065, 0x0068, 0x0061,
     81         0x0062, 0x006C, 0x0061, 0x0072, 0x0065, 0x006E, 0x0045, 0x0073, 0x0070,
     82         0x0061, 0x00F1, 0x006F, 0x006C, 0x0000
     83     },
     84     {
     85         0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587,
     86         0x0000
     87     },
     88     {
     89         0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD, 0x006B,
     90         0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3, 0x0063, 0x0068,
     91         0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069, 0x1EBF, 0x006E, 0x0067,
     92         0x0056, 0x0069, 0x1EC7, 0x0074, 0x0000
     93     },
     94     {
     95         0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F, 0x0000
     96     },
     97     {
     98         0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069, 0x0074,
     99         0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052, 0x002D, 0x004D,
    100         0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053, 0x0000
    101     },
    102     {
    103         0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E, 0x006F,
    104         0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061, 0x0079, 0x002D,
    105         0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834, 0x6240, 0x0000
    106     },
    107     {
    108         0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032, 0x0000
    109     },
    110     {
    111         0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069, 0x3059,
    112         0x308B, 0x0035, 0x79D2, 0x524D, 0x0000
    113     },
    114     {
    115         0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0,
    116         0x0000
    117     },
    118     {
    119         0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067, 0x0000
    120     },
    121     // test non-BMP code points
    122     {
    123         0xD800, 0xDF00, 0xD800, 0xDF01, 0xD800, 0xDF02, 0xD800, 0xDF03, 0xD800, 0xDF05,
    124         0xD800, 0xDF06, 0xD800, 0xDF07, 0xD800, 0xDF09, 0xD800, 0xDF0A, 0xD800, 0xDF0B,
    125         0x0000
    126     },
    127     {
    128         0xD800, 0xDF0D, 0xD800, 0xDF0C, 0xD800, 0xDF1E, 0xD800, 0xDF0F, 0xD800, 0xDF16,
    129         0xD800, 0xDF15, 0xD800, 0xDF14, 0xD800, 0xDF12, 0xD800, 0xDF10, 0xD800, 0xDF20,
    130         0xD800, 0xDF21,
    131         0x0000
    132     },
    133     // Greek
    134     {
    135         0x03b5, 0x03bb, 0x03bb, 0x03b7, 0x03bd, 0x03b9, 0x03ba, 0x03ac
    136     },
    137     // Maltese
    138     {
    139         0x0062, 0x006f, 0x006e, 0x0121, 0x0075, 0x0073, 0x0061, 0x0127,
    140         0x0127, 0x0061
    141     },
    142     // Russian
    143     {
    144         0x043f, 0x043e, 0x0447, 0x0435, 0x043c, 0x0443, 0x0436, 0x0435,
    145         0x043e, 0x043d, 0x0438, 0x043d, 0x0435, 0x0433, 0x043e, 0x0432,
    146         0x043e, 0x0440, 0x044f, 0x0442, 0x043f, 0x043e, 0x0440, 0x0443,
    147         0x0441, 0x0441, 0x043a, 0x0438
    148     },
    149     {
    150         0xFB00, 0xFB01
    151     }
    152 
    153 };
    154 
    155 static const char *asciiIn[] = {
    156     "xn--egbpdaj6bu4bxfgehfvwxn",
    157     "xn--ihqwcrb4cv8a8dqg056pqjye",
    158     "xn--Proprostnemluvesky-uyb24dma41a",
    159     "xn--4dbcagdahymbxekheh6e0a7fei0b",
    160     "xn--i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd",
    161     "xn--n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa",
    162 /*  "xn--989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c",*/
    163     "xn--b1abfaaepdrnnbgefbaDotcwatmq2g4l",
    164     "xn--PorqunopuedensimplementehablarenEspaol-fmd56a",
    165     "xn--ihqwctvzc91f659drss3x8bo0yb",
    166     "xn--TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g",
    167     "xn--3B-ww4c5e180e575a65lsy2b",
    168     "xn---with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n",
    169     "xn--Hello-Another-Way--fc4qua05auwb3674vfr0b",
    170     "xn--2-u9tlzr9756bt3uc0v",
    171     "xn--MajiKoi5-783gue6qz075azm5e",
    172     "xn--de-jg4avhby1noc0d",
    173     "xn--d9juau41awczczp",
    174     "XN--097CCDEKGHQJK",
    175     "XN--db8CBHEJLGH4E0AL",
    176     "xn--hxargifdar",                       // Greek
    177     "xn--bonusaa-5bb1da",                   // Maltese
    178     "xn--b1abfaaepdrnnbgefbadotcwatmq2g4l", // Russian (Cyrillic)
    179     "fffi"
    180 };
    181 
    182 static const char *domainNames[] = {
    183     "slip129-37-118-146.nc.us.ibm.net",
    184     "saratoga.pe.utexas.edu",
    185     "dial-120-45.ots.utexas.edu",
    186     "woo-085.dorms.waller.net",
    187     "hd30-049.hil.compuserve.com",
    188     "pem203-31.pe.ttu.edu",
    189     "56K-227.MaxTNT3.pdq.net",
    190     "dial-36-2.ots.utexas.edu",
    191     "slip129-37-23-152.ga.us.ibm.net",
    192     "ts45ip119.cadvision.com",
    193     "sdn-ts-004txaustP05.dialsprint.net",
    194     "bar-tnt1s66.erols.com",
    195     "101.st-louis-15.mo.dial-access.att.net",
    196     "h92-245.Arco.COM",
    197     "dial-13-2.ots.utexas.edu",
    198     "net-redynet29.datamarkets.com.ar",
    199     "ccs-shiva28.reacciun.net.ve",
    200     "7.houston-11.tx.dial-access.att.net",
    201     "ingw129-37-120-26.mo.us.ibm.net",
    202     "dialup6.austintx.com",
    203     "dns2.tpao.gov.tr",
    204     "slip129-37-119-194.nc.us.ibm.net",
    205     "cs7.dillons.co.uk.203.119.193.in-addr.arpa",
    206     "swprd1.innovplace.saskatoon.sk.ca",
    207     "bikini.bologna.maraut.it",
    208     "node91.subnet159-198-79.baxter.com",
    209     "cust19.max5.new-york.ny.ms.uu.net",
    210     "balexander.slip.andrew.cmu.edu",
    211     "pool029.max2.denver.co.dynip.alter.net",
    212     "cust49.max9.new-york.ny.ms.uu.net",
    213     "s61.abq-dialin2.hollyberry.com",
    214     "\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com", //':'(0x003a) produces U_IDNA_STD3_ASCII_RULES_ERROR
    215     "www.xn--vea.com",
    216    // "www.\\u00E0\\u00B3\\u00AF.com",//' ' (0x0020) produces U_IDNA_STD3_ASCII_RULES_ERROR
    217     "www.\\u00C2\\u00A4.com",
    218     "www.\\u00C2\\u00A3.com",
    219     // "\\u0025", //'%' (0x0025) produces U_IDNA_STD3_ASCII_RULES_ERROR
    220     // "\\u005C\\u005C", //'\' (0x005C) produces U_IDNA_STD3_ASCII_RULES_ERROR
    221     //"@",
    222     //"\\u002F",
    223     //"www.\\u0021.com",
    224     //"www.\\u0024.com",
    225     //"\\u003f",
    226     // These yeild U_IDNA_PROHIBITED_ERROR
    227     //"\\u00CF\\u0082.com",
    228     //"\\u00CE\\u00B2\\u00C3\\u009Fss.com",
    229     //"\\u00E2\\u0098\\u00BA.com",
    230     "\\u00C3\\u00BC.com",
    231 
    232 };
    233 
    234 typedef struct ErrorCases ErrorCases;
    235 
    236 static const struct ErrorCases{
    237 
    238     UChar unicode[100];
    239     const char *ascii;
    240     UErrorCode expected;
    241     UBool useSTD3ASCIIRules;
    242     UBool testToUnicode;
    243     UBool testLabel;
    244 } errorCases[] = {
    245       {
    246 
    247         {
    248             0x0077, 0x0077, 0x0077, 0x002e, /* www. */
    249             0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
    250             0x070F,/*prohibited*/
    251             0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
    252             0x002e, 0x0063, 0x006f, 0x006d, /* com. */
    253             0x0000
    254         },
    255         "www.XN--8mb5595fsoa28orucya378bqre2tcwop06c5qbw82a1rffmae0361dea96b.com",
    256         U_IDNA_PROHIBITED_ERROR,
    257         FALSE, FALSE, TRUE
    258     },
    259 
    260     {
    261         {
    262             0x0077, 0x0077, 0x0077, 0x002e, /* www. */
    263             0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
    264             0x0221, 0x0234/*Unassigned code points*/,
    265             0x002e, 0x0063, 0x006f, 0x006d, /* com. */
    266             0x0000
    267         },
    268         "www.XN--6lA2Bz548Fj1GuA391Bf1Gb1N59Ab29A7iA.com",
    269 
    270         U_IDNA_UNASSIGNED_ERROR,
    271         FALSE, FALSE, TRUE
    272     },
    273     {
    274         {
    275             0x0077, 0x0077, 0x0077, 0x002e, /* www. */
    276             0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
    277             0x0644, 0x064A, 0x0647,/*Arabic code points. Cannot mix RTL with LTR*/
    278             0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
    279             0x002e, 0x0063, 0x006f, 0x006d, /* com. */
    280             0x0000
    281         },
    282         "www.xn--ghBGI4851OiyA33VqrD6Az86C4qF83CtRv93D5xBk15AzfG0nAgA0578DeA71C.com",
    283         U_IDNA_CHECK_BIDI_ERROR,
    284         FALSE, FALSE, TRUE
    285     },
    286     {
    287         {
    288             0x0077, 0x0077, 0x0077, 0x002e, /* www. */
    289             /* labels cannot begin with an HYPHEN */
    290             0x002D, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
    291             0x002E,
    292             0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
    293             0x002e, 0x0063, 0x006f, 0x006d, /* com. */
    294             0x0000
    295 
    296         },
    297         "www.xn----b95Ew8SqA315Ao5FbuMlnNmhA.com",
    298         U_IDNA_STD3_ASCII_RULES_ERROR,
    299         TRUE, FALSE, FALSE
    300     },
    301     {
    302         {
    303             /* correct ACE-prefix followed by unicode */
    304             0x0077, 0x0077, 0x0077, 0x002e, /* www. */
    305             0x0078, 0x006e, 0x002d,0x002d,  /* ACE Prefix */
    306             0x002D, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
    307             0x002D,
    308             0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
    309             0x002e, 0x0063, 0x006f, 0x006d, /* com. */
    310             0x0000
    311 
    312         },
    313         /* wrong ACE-prefix followed by valid ACE-encoded ASCII */
    314         "www.XY-----b91I0V65S96C2A355Cw1E5yCeQr19CsnP1mFfmAE0361DeA96B.com",
    315         U_IDNA_ACE_PREFIX_ERROR,
    316         FALSE, FALSE, FALSE
    317     },
    318     /* cannot verify U_IDNA_VERIFICATION_ERROR */
    319 
    320     {
    321       {
    322         0x0077, 0x0077, 0x0077, 0x002e, /* www. */
    323         0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774,
    324         0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74,
    325         0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C,
    326         0x002e, 0x0063, 0x006f, 0x006d, /* com. */
    327         0x0000
    328       },
    329       "www.xn--989AoMsVi5E83Db1D2A355Cv1E0vAk1DwRv93D5xBh15A0Dt30A5JpSD879Ccm6FeA98C.com",
    330       U_IDNA_LABEL_TOO_LONG_ERROR,
    331       FALSE, FALSE, TRUE
    332     },
    333 
    334     {
    335       {
    336         0x0077, 0x0077, 0x0077, 0x002e, /* www. */
    337         0x0030, 0x0644, 0x064A, 0x0647, 0x0031, /* Arabic code points squashed between EN codepoints */
    338         0x002e, 0x0063, 0x006f, 0x006d, /* com. */
    339         0x0000
    340       },
    341       "www.xn--01-tvdmo.com",
    342       U_IDNA_CHECK_BIDI_ERROR,
    343       FALSE, FALSE, TRUE
    344     },
    345 
    346     {
    347       {
    348         0x0077, 0x0077, 0x0077, 0x002e, // www.
    349         0x206C, 0x0644, 0x064A, 0x0647, 0x206D, // Arabic code points squashed between BN codepoints
    350         0x002e, 0x0063, 0x006f, 0x006d, // com.
    351         0x0000
    352       },
    353       "www.XN--ghbgi278xia.com",
    354       U_IDNA_PROHIBITED_ERROR,
    355       FALSE, FALSE, TRUE
    356     },
    357     {
    358       {
    359         0x0077, 0x0077, 0x0077, 0x002e, // www.
    360         0x002D, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, // HYPHEN at the start of label
    361         0x002e, 0x0063, 0x006f, 0x006d, // com.
    362         0x0000
    363       },
    364       "www.-abcde.com",
    365       U_IDNA_STD3_ASCII_RULES_ERROR,
    366       TRUE, FALSE, FALSE
    367     },
    368     {
    369       {
    370         0x0077, 0x0077, 0x0077, 0x002e, // www.
    371         0x0041, 0x0042, 0x0043, 0x0044, 0x0045,0x002D, // HYPHEN at the end of the label
    372         0x002e, 0x0063, 0x006f, 0x006d, // com.
    373         0x0000
    374       },
    375       "www.abcde-.com",
    376       U_IDNA_STD3_ASCII_RULES_ERROR,
    377       TRUE, FALSE, FALSE
    378     },
    379     {
    380       {
    381         0x0077, 0x0077, 0x0077, 0x002e, // www.
    382         0x0041, 0x0042, 0x0043, 0x0044, 0x0045,0x0040, // Containing non LDH code point
    383         0x002e, 0x0063, 0x006f, 0x006d, // com.
    384         0x0000
    385       },
    386       "www.abcde@.com",
    387       U_IDNA_STD3_ASCII_RULES_ERROR,
    388       TRUE, FALSE, FALSE
    389     },
    390     {
    391       {
    392         0x0077, 0x0077, 0x0077, 0x002e, // www.
    393         // zero length label
    394         0x002e, 0x0063, 0x006f, 0x006d, // com.
    395         0x0000
    396       },
    397       "www..com",
    398       U_IDNA_ZERO_LENGTH_LABEL_ERROR,
    399       TRUE, FALSE, FALSE
    400     },
    401     {
    402       {0},
    403       NULL,
    404       U_ILLEGAL_ARGUMENT_ERROR,
    405       TRUE, TRUE, FALSE
    406     }
    407 };
    408 
    409 
    410 
    411 
    412 #define MAX_DEST_SIZE 300
    413 
    414 void TestIDNA::debug(const UChar* src, int32_t srcLength, int32_t options){
    415     UParseError parseError;
    416     UErrorCode transStatus = U_ZERO_ERROR;
    417     UErrorCode prepStatus  = U_ZERO_ERROR;
    418     NamePrepTransform* trans = NamePrepTransform::createInstance(parseError,transStatus);
    419     int32_t prepOptions = (((options & UIDNA_ALLOW_UNASSIGNED) != 0) ? USPREP_ALLOW_UNASSIGNED: 0);
    420     UStringPrepProfile* prep = usprep_openByType(USPREP_RFC3491_NAMEPREP,&prepStatus);
    421     UChar *transOut=NULL, *prepOut=NULL;
    422     int32_t transOutLength=0, prepOutLength=0;
    423 
    424 
    425     transOutLength  = trans->process(src,srcLength,transOut, 0, prepOptions>0, &parseError, transStatus);
    426     if( transStatus == U_BUFFER_OVERFLOW_ERROR){
    427         transStatus = U_ZERO_ERROR;
    428         transOut    = (UChar*) malloc(U_SIZEOF_UCHAR * transOutLength);
    429         transOutLength = trans->process(src,srcLength,transOut, transOutLength, prepOptions>0, &parseError, transStatus);
    430     }
    431 
    432     prepOutLength  = usprep_prepare(prep, src, srcLength, prepOut, 0, prepOptions, &parseError, &prepStatus);
    433 
    434     if( prepStatus == U_BUFFER_OVERFLOW_ERROR){
    435         prepStatus = U_ZERO_ERROR;
    436         prepOut    = (UChar*) malloc(U_SIZEOF_UCHAR * prepOutLength);
    437         prepOutLength  = usprep_prepare(prep, src, srcLength, prepOut, prepOutLength, prepOptions, &parseError, &prepStatus);
    438     }
    439 
    440     if(UnicodeString(transOut,transOutLength)!= UnicodeString(prepOut, prepOutLength)){
    441         errln("Failed. Expected: " + prettify(UnicodeString(transOut, transOutLength))
    442               + " Got: " + prettify(UnicodeString(prepOut,prepOutLength)));
    443     }
    444     free(transOut);
    445     free(prepOut);
    446     delete trans;
    447 
    448 }
    449 
    450 void TestIDNA::testAPI(const UChar* src, const UChar* expected, const char* testName,
    451             UBool useSTD3ASCIIRules,UErrorCode expectedStatus,
    452             UBool doCompare, UBool testUnassigned, TestFunc func, UBool testSTD3ASCIIRules){
    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_ERROR&& (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
    479                 errln("Did not get the expected result for "+UnicodeString(testName) +" 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 > 300\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, &parseError, &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_UNASSIGNED, &parseError, &status);
    507                 // TODO : compare output with expected
    508                 if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
    509                     //errln("Did not get the expected result for %s null terminated source with both options set.\n",testName);
    510                     errln("Did not get the expected result for "+UnicodeString(testName) +
    511                           " null terminated source "+ prettify(src) +
    512                           " with both options set. Expected: "+  prettify(UnicodeString(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: " +UnicodeString(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,destLen, 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, &parseError, &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(dest,destLen, expected,expectedLen,0,&status)!=0){
    571                     errln("Did not get the expected result for %s with source length and both options set.\n",testName);
    572                 }
    573             }else{
    574                 errln( "%s with source length  failed. Requires destCapacity > 300\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: " +UnicodeString(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_RULES, &parseError, &status);
    596                 // TODO : compare output with expected
    597                 if(U_SUCCESS(status) && (doCompare==TRUE) && u_strCaseCompare(dest,destLen, expected,expectedLen,0,&status)!=0){
    598                     //errln("Did not get the expected result for %s null terminated source with both options set.\n",testName);
    599                     errln("Did not get the expected result for "+UnicodeString(testName) +" 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, &parseError, &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(dest,destLen, expected,expectedLen,0,&status)!=0){
    627                     errln("Did not get the expected result for %s with source length and both options set.\n",testName);
    628                 }
    629             }else{
    630                 errln( "%s with source length  failed. Requires destCapacity > 300\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: " +UnicodeString(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 strings.\n",testName);
    656     }
    657     if(U_FAILURE(status)){
    658         errcheckln(status, "%s null terminated source failed. Error: %s", testName,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 strings with options set.\n", testName);
    666     }
    667     if(U_FAILURE(status)){
    668         errcheckln(status, "%s null terminated source and options set failed. Error: %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",testName);
    676     }
    677     if(U_FAILURE(status)){
    678         errcheckln(status, "%s with string length. Error: %s",testName, u_errorName(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 options 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, &parseError,&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, &parseError,&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, func,FALSE);
    817         }else{
    818             testCompare(src,srcLen,uni0.getBuffer(),uni0.length()-1,testName, func,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,caseFlags, &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 IDNToUnicode){
    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 IDNToUnicode,
    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(conformanceTestCases[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(utf8Chars2);
    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 conformanceTestCases[") + i +UnicodeString( "].in ( ")+prettify(utf8Chars1) +UnicodeString(" ) failed. Error: ")+ UnicodeString(u_errorName(status)));
    954             continue;
    955         }
    956         if(utf8Chars2 != NULL){
    957             u_strFromUTF8(expected,MAX_DEST_SIZE,&expectedLen,utf8Chars2,utf8Chars2Len, &status);
    958             if(U_FAILURE(status)){
    959                 errln(UnicodeString("Conversion of UTF8 source in conformanceTestCases[") + 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* testName,
    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, &status);
   1006     if(U_FAILURE(status)){
   1007         errcheckln(status, "%s null terminated source failed. Error: %s",testName, 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, &status);
   1014             if(U_FAILURE(status)){
   1015                 errcheckln(status, "%s null terminated source failed - %s",testName, u_errorName(status));
   1016                 break;
   1017             }
   1018         }else{
   1019             oddLen = func(even,-1,odd,MAX_DEST_SIZE,options, &parseError, &status);
   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_UNASSIGNED, &parseError, &status);
   1043     if(U_FAILURE(status)){
   1044         errcheckln(status, "%s null terminated source with options set failed. Error: %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_UNASSIGNED, &parseError, &status);
   1051             if(U_FAILURE(status)){
   1052                 errcheckln(status, "%s null terminated source with options set failed - %s",testName, u_errorName(status));
   1053                 break;
   1054             }
   1055         }else{
   1056             oddLen = func(even,-1,odd,MAX_DEST_SIZE,options|UIDNA_ALLOW_UNASSIGNED, &parseError, &status);
   1057             if(U_FAILURE(status)){
   1058                 errln("%s null terminated source with options set failed\n",testName);
   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 failed\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 failed\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",testName, 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",testName, 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",testName, 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_UNASSIGNED, &parseError, &status);
   1116     if(U_FAILURE(status)){
   1117         errcheckln(status, "%s null terminated source with options set failed. Error: %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_UNASSIGNED, &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_UNASSIGNED, &parseError, &status);
   1130             if(U_FAILURE(status)){
   1131                 errcheckln(status, "%s  source with source length and options set 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 failed\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 failed\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 separator */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, IDNToUnicode);
   1219 
   1220         // c) compare it with unicodeIn not equivalent
   1221         if(i==0){
   1222             testCompare(src,srcLen,uni1.getBuffer(),uni1.length()-1,testName, func,FALSE);
   1223         }else{
   1224             testCompare(src,srcLen,uni0.getBuffer(),uni0.length()-1,testName, func,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 void TestIDNA::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par)
   1240 {
   1241     if (exec) logln((UnicodeString)"TestSuite IDNA API ");
   1242     switch (index) {
   1243 
   1244         case 0: name = "TestToASCII"; if (exec) TestToASCII(); break;
   1245         case 1: name = "TestToUnicode"; if (exec) TestToUnicode(); break;
   1246         case 2: name = "TestIDNToASCII"; if (exec) TestIDNToASCII(); break;
   1247         case 3: name = "TestIDNToUnicode"; if (exec) TestIDNToUnicode(); break;
   1248         case 4: name = "TestCompare"; if (exec) TestCompare(); break;
   1249         case 5: name = "TestErrorCases"; if (exec) TestErrorCases(); break;
   1250         case 6: name = "TestChaining"; if (exec) TestChaining(); break;
   1251         case 7: name = "TestRootLabelSeparator"; if(exec) TestRootLabelSeparator(); break;
   1252         case 8: name = "TestCompareReferenceImpl"; if(exec) TestCompareReferenceImpl(); break;
   1253         case 9: name = "TestDataFile"; if(exec) TestDataFile(); break;
   1254         case 10: name = "TestRefIDNA"; if(exec) TestRefIDNA(); break;
   1255         case 11: name = "TestIDNAMonkeyTest"; if(exec) TestIDNAMonkeyTest(); break;
   1256         case 12:
   1257             {
   1258                 name = "TestConformanceTestVectors";
   1259                 if(exec){
   1260                     logln("TestSuite IDNA conf----"); logln();
   1261                     IdnaConfTest test;
   1262                     callTest(test, par);
   1263                 }
   1264                 break;
   1265             }
   1266         default: name = ""; break; /*needed to end loop*/
   1267     }
   1268 }
   1269 void TestIDNA::TestToASCII(){
   1270     testToASCII("uidna_toASCII", uidna_toASCII);
   1271 }
   1272 void TestIDNA::TestToUnicode(){
   1273     testToUnicode("uidna_toUnicode", uidna_toUnicode);
   1274 }
   1275 void TestIDNA::TestIDNToASCII(){
   1276     testIDNToASCII("uidna_IDNToASCII", uidna_IDNToASCII);
   1277 }
   1278 void TestIDNA::TestIDNToUnicode(){
   1279     testIDNToUnicode("uidna_IDNToUnicode", uidna_IDNToUnicode);
   1280 }
   1281 void TestIDNA::TestCompare(){
   1282     testCompare("uidna_compare",uidna_compare);
   1283 }
   1284 void TestIDNA::TestErrorCases(){
   1285     testErrorCases( "uidna_IDNToASCII",uidna_IDNToASCII,
   1286                     "uidna_IDNToUnicode",uidna_IDNToUnicode);
   1287 }
   1288 void TestIDNA::TestRootLabelSeparator(){
   1289     testRootLabelSeparator( "uidna_compare",uidna_compare,
   1290                             "uidna_IDNToASCII", uidna_IDNToASCII,
   1291                             "uidna_IDNToUnicode",uidna_IDNToUnicode
   1292                             );
   1293 }
   1294 void TestIDNA::TestChaining(){
   1295     testChaining("uidna_toASCII",uidna_toASCII, "uidna_toUnicode", uidna_toUnicode);
   1296 }
   1297 
   1298 
   1299 static const int loopCount = 100;
   1300 static const int maxCharCount = 20;
   1301 static const int maxCodePoint = 0x10ffff;
   1302 static uint32_t
   1303 randul()
   1304 {
   1305     static UBool initialized = FALSE;
   1306     if (!initialized)
   1307     {
   1308         srand((unsigned)time(NULL));
   1309         initialized = TRUE;
   1310     }
   1311     // Assume rand has at least 12 bits of precision
   1312     uint32_t l = 0;
   1313     for (uint32_t i=0; i<sizeof(l); ++i)
   1314         ((char*)&l)[i] = (char)((rand() & 0x0FF0) >> 4);
   1315     return l;
   1316 }
   1317 
   1318 /**
   1319  * Return a random integer i where 0 <= i < n.
   1320  * A special function that gets random codepoints from planes 0,1,2 and 14
   1321  */
   1322 static int32_t rand_uni()
   1323 {
   1324    int32_t retVal = (int32_t)(randul()& 0x3FFFF);
   1325    if(retVal >= 0x30000){
   1326        retVal+=0xB0000;
   1327    }
   1328    return retVal;
   1329 }
   1330 
   1331 static int32_t randi(int32_t n){
   1332     return (int32_t) (randul() % (n+1));
   1333 }
   1334 
   1335 void getTestSource(UnicodeString& fillIn) {
   1336     int32_t i = 0;
   1337     int32_t charCount = (randi(maxCharCount) + 1);
   1338     while (i <charCount ) {
   1339         int32_t codepoint = rand_uni();
   1340         if(codepoint == 0x0000){
   1341             continue;
   1342         }
   1343         fillIn.append((UChar32)codepoint);
   1344         i++;
   1345     }
   1346 
   1347 }
   1348 
   1349 UnicodeString TestIDNA::testCompareReferenceImpl(UnicodeString& src,
   1350                                         TestFunc refIDNA, const char* refIDNAName,
   1351                                         TestFunc uIDNA, const char* uIDNAName,
   1352                                         int32_t options){
   1353 
   1354     const UChar* srcUChars = src.getBuffer();
   1355     UChar exp[MAX_DEST_SIZE]={0};
   1356     int32_t expCap = MAX_DEST_SIZE, expLen=0;
   1357     UErrorCode expStatus = U_ZERO_ERROR;
   1358     UParseError parseError;
   1359 
   1360     logln("Comparing "+ UnicodeString(refIDNAName)
   1361            + " with "+ UnicodeString(uIDNAName)
   1362            +" for input: " + prettify(srcUChars));
   1363 
   1364     expLen = refIDNA(srcUChars, src.length()-1, exp, expCap,
   1365                       options, &parseError, &expStatus);
   1366 
   1367     UChar got[MAX_DEST_SIZE]={0};
   1368     int32_t gotCap = MAX_DEST_SIZE, gotLen=0;
   1369     UErrorCode gotStatus = U_ZERO_ERROR;
   1370 
   1371     gotLen = uIDNA(srcUChars, src.length()-1, got, gotCap,
   1372                    options, &parseError, &gotStatus);
   1373 
   1374     if(expStatus != gotStatus){
   1375         errln("Did not get the expected status while comparing " + UnicodeString(refIDNAName)
   1376                + " with " + UnicodeString(uIDNAName)
   1377                + " Expected: " + UnicodeString(u_errorName(expStatus))
   1378                + " Got: " + UnicodeString(u_errorName(gotStatus))
   1379                + " for Source: "+ prettify(srcUChars)
   1380                + " Options: " + options);
   1381         return UnicodeString("");
   1382     }
   1383 
   1384     // now we know that both implementations yielded same error
   1385     if(U_SUCCESS(expStatus)){
   1386         // compare the outputs if status == U_ZERO_ERROR
   1387         if(u_strCompare(exp, expLen, got, gotLen, TRUE) != 0){
   1388             errln("Did not get the expected output while comparing " + UnicodeString(refIDNAName)
   1389                + " with " + UnicodeString(uIDNAName)
   1390                + " Expected: " + prettify(UnicodeString(exp, expLen))
   1391                + " Got: " + prettify(UnicodeString(got, gotLen))
   1392                + " for Source: "+ prettify(srcUChars)
   1393                + " Options: " + options);
   1394         }
   1395         return UnicodeString(exp, expLen);
   1396 
   1397     }else{
   1398         logln("Got the same error while comparing "
   1399             + UnicodeString(refIDNAName)
   1400             + " with "+ UnicodeString(uIDNAName)
   1401             +" for input: " + prettify(srcUChars));
   1402     }
   1403     return UnicodeString("");
   1404 }
   1405 
   1406 void TestIDNA::testCompareReferenceImpl(const UChar* src, int32_t srcLen){
   1407     UnicodeString label(src,srcLen);
   1408     label.append((UChar)0x0000);
   1409 
   1410     //test idnaref_toASCII and idnare
   1411     UnicodeString asciiLabel = testCompareReferenceImpl(label,
   1412                                                       idnaref_toASCII, "idnaref_toASCII",
   1413                                                       uidna_toASCII, "uidna_toASCII",
   1414                                                       UIDNA_ALLOW_UNASSIGNED);
   1415     testCompareReferenceImpl(label,
   1416                               idnaref_toASCII, "idnaref_toASCII",
   1417                               uidna_toASCII, "uidna_toASCII",
   1418                               UIDNA_DEFAULT);
   1419     testCompareReferenceImpl(label,
   1420                               idnaref_toASCII, "idnaref_toASCII",
   1421                               uidna_toASCII, "uidna_toASCII",
   1422                               UIDNA_USE_STD3_RULES);
   1423     testCompareReferenceImpl(label,
   1424                               idnaref_toASCII, "idnaref_toASCII",
   1425                               uidna_toASCII, "uidna_toASCII",
   1426                               UIDNA_USE_STD3_RULES | UIDNA_ALLOW_UNASSIGNED);
   1427 
   1428     if(asciiLabel.length()!=0){
   1429         asciiLabel.append((UChar)0x0000);
   1430 
   1431         // test toUnciode
   1432         testCompareReferenceImpl(asciiLabel,
   1433                                   idnaref_toUnicode, "idnaref_toUnicode",
   1434                                   uidna_toUnicode, "uidna_toUnicode",
   1435                                   UIDNA_ALLOW_UNASSIGNED);
   1436         testCompareReferenceImpl(asciiLabel,
   1437                                   idnaref_toUnicode, "idnaref_toUnicode",
   1438                                   uidna_toUnicode, "uidna_toUnicode",
   1439                                   UIDNA_DEFAULT);
   1440         testCompareReferenceImpl(asciiLabel,
   1441                                   idnaref_toUnicode, "idnaref_toUnicode",
   1442                                   uidna_toUnicode, "uidna_toUnicode",
   1443                                   UIDNA_USE_STD3_RULES);
   1444         testCompareReferenceImpl(asciiLabel,
   1445                                   idnaref_toUnicode, "idnaref_toUnicode",
   1446                                   uidna_toUnicode, "uidna_toUnicode",
   1447                                   UIDNA_USE_STD3_RULES | UIDNA_ALLOW_UNASSIGNED);
   1448     }
   1449 
   1450 }
   1451 const char* failures[] ={
   1452     "\\uAA42\\U0001F8DD\\U00019D01\\U000149A3\\uD385\\U000EE0F5\\U00018B92\\U000179D1\\U00018624\\U0002227F\\U000E83C0\\U000E8DCD\\u5460\\U00017F34\\U0001570B\\u43D1\\U0002C9C9\\U000281EC\\u2105\\U000180AE\\uC5D4",
   1453     "\\U0002F5A6\\uD638\\u0D0A\\u9E9C\\uFE5B\\U0001FCCB\\u66C4",
   1454 };
   1455 
   1456 void TestIDNA::TestIDNAMonkeyTest(){
   1457     UnicodeString source;
   1458     UErrorCode status = U_ZERO_ERROR;
   1459     int i;
   1460 
   1461     getInstance(status);    // Init prep
   1462     if (U_FAILURE(status)) {
   1463         dataerrln("Test could not initialize. Got %s", u_errorName(status));
   1464         return;
   1465     }
   1466 
   1467     for(i=0; i<loopCount; i++){
   1468         source.truncate(0);
   1469         getTestSource(source);
   1470         source.append((UChar)0x0000);
   1471         const UChar* src = source.getBuffer();
   1472         testCompareReferenceImpl(src,source.length()-1);
   1473         testCompareReferenceImpl(src,source.length()-1);
   1474     }
   1475 
   1476     /* for debugging */
   1477     for (i=0; i<(int)(sizeof(failures)/sizeof(failures[0])); i++){
   1478         source.truncate(0);
   1479         source.append( UnicodeString(failures[i], -1, US_INV) );
   1480         source = source.unescape();
   1481         source.append((UChar)0x0000);
   1482         const UChar *src = source.getBuffer();
   1483         testCompareReferenceImpl(src,source.length()-1);
   1484         //debug(source.getBuffer(),source.length(),UIDNA_ALLOW_UNASSIGNED);
   1485     }
   1486 
   1487 
   1488     source.truncate(0);
   1489     source.append(UNICODE_STRING_SIMPLE("\\uCF18\\U00021161\\U000EEF11\\U0002BB82\\U0001D63C"));
   1490     debug(source.getBuffer(),source.length(),UIDNA_ALLOW_UNASSIGNED);
   1491 
   1492     { // test deletion of code points
   1493         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);
   1494         source = source.unescape();
   1495         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);
   1496         expected = expected.unescape();
   1497         UnicodeString ascii("xn--b1abfaaepdrnnbgefbadotcwatmq2g4l");
   1498         ascii.append((UChar)0x0000);
   1499         testAPI(source.getBuffer(),ascii.getBuffer(), "uidna_toASCII", FALSE, U_ZERO_ERROR, TRUE, TRUE, uidna_toASCII);
   1500 
   1501         testAPI(source.getBuffer(),ascii.getBuffer(), "idnaref_toASCII", FALSE, U_ZERO_ERROR, TRUE, TRUE, idnaref_toASCII);
   1502 
   1503         testCompareReferenceImpl(source.getBuffer(), source.length()-1);
   1504     }
   1505 
   1506 }
   1507 
   1508 void TestIDNA::TestCompareReferenceImpl(){
   1509 
   1510     UChar src [2] = {0,0};
   1511     int32_t srcLen = 0;
   1512 
   1513 
   1514     for(int32_t i = 0x40000 ; i< 0x10ffff; i++){
   1515         if(quick==TRUE && i> 0x1FFFF){
   1516             return;
   1517         }
   1518         if(i >= 0x30000 && i <= 0xF0000){
   1519            i+=0xB0000;
   1520         }
   1521         if(i>0xFFFF){
   1522            src[0] = U16_LEAD(i);
   1523            src[1] = U16_TRAIL(i);
   1524            srcLen =2;
   1525         }else{
   1526             src[0] = (UChar)i;
   1527             src[1] = 0;
   1528             srcLen = 1;
   1529         }
   1530         testCompareReferenceImpl(src, srcLen);
   1531     }
   1532 }
   1533 
   1534 void TestIDNA::TestRefIDNA(){
   1535     UErrorCode status = U_ZERO_ERROR;
   1536     getInstance(status);    // Init prep
   1537     if (U_FAILURE(status)) {
   1538         if (status == U_FILE_ACCESS_ERROR) {
   1539             dataerrln("Test could not initialize. Got %s", u_errorName(status));
   1540         }
   1541         return;
   1542     }
   1543 
   1544     testToASCII("idnaref_toASCII", idnaref_toASCII);
   1545     testToUnicode("idnaref_toUnicode", idnaref_toUnicode);
   1546     testIDNToASCII("idnaref_IDNToASCII", idnaref_IDNToASCII);
   1547     testIDNToUnicode("idnaref_IDNToUnicode", idnaref_IDNToUnicode);
   1548     testCompare("idnaref_compare",idnaref_compare);
   1549     testErrorCases( "idnaref_IDNToASCII",idnaref_IDNToASCII,
   1550                     "idnaref_IDNToUnicode",idnaref_IDNToUnicode);
   1551     testChaining("idnaref_toASCII",idnaref_toASCII, "idnaref_toUnicode", idnaref_toUnicode);
   1552 
   1553     testRootLabelSeparator( "idnaref_compare",idnaref_compare,
   1554                             "idnaref_IDNToASCII", idnaref_IDNToASCII,
   1555                             "idnaref_IDNToUnicode",idnaref_IDNToUnicode
   1556                             );
   1557     testChaining("idnaref_toASCII",idnaref_toASCII, "idnaref_toUnicode", idnaref_toUnicode);
   1558 }
   1559 
   1560 
   1561 void TestIDNA::TestDataFile(){
   1562      testData(*this);
   1563 }
   1564 TestIDNA::~TestIDNA(){
   1565     if(gPrep!=NULL){
   1566         delete gPrep;
   1567         gPrep = NULL;
   1568     }
   1569 }
   1570 
   1571 NamePrepTransform* TestIDNA::gPrep = NULL;
   1572 
   1573 NamePrepTransform* TestIDNA::getInstance(UErrorCode& status){
   1574     if(TestIDNA::gPrep == NULL){
   1575         UParseError parseError;
   1576         TestIDNA::gPrep = NamePrepTransform::createInstance(parseError, status);
   1577         if(TestIDNA::gPrep ==NULL){
   1578            //status = U_MEMORY_ALLOCATION_ERROR;
   1579            return NULL;
   1580         }
   1581     }
   1582     return TestIDNA::gPrep;
   1583 
   1584 }
   1585 #endif /* #if !UCONFIG_NO_IDNA */
   1586