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