Home | History | Annotate | Download | only in cintltst
      1 /*
      2  *******************************************************************************
      3  *
      4  *   Copyright (C) 2003-2010, International Business Machines
      5  *   Corporation and others.  All Rights Reserved.
      6  *
      7  *******************************************************************************
      8  *   file name:  spreptst.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/usprep.h"
     24 #include "cstring.h"
     25 #include "cintltst.h"
     26 #include "nfsprep.h"
     27 
     28 
     29 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
     30 
     31 void addUStringPrepTest(TestNode** root);
     32 void doStringPrepTest(const char* binFileName, const char* txtFileName,
     33                  int32_t options, UErrorCode* errorCode);
     34 
     35 static void Test_nfs4_cs_prep_data(void);
     36 static void Test_nfs4_cis_prep_data(void);
     37 static void Test_nfs4_mixed_prep_data(void);
     38 static void Test_nfs4_cs_prep(void);
     39 static void Test_nfs4_cis_prep(void);
     40 static void Test_nfs4_mixed_prep(void);
     41 static void TestBEAMWarning(void);
     42 static void TestCoverage(void);
     43 static void TestStringPrepProfiles(void);
     44 
     45 UStringPrepProfileType getTypeFromProfileName(const char* profileName);
     46 
     47 void
     48 addUStringPrepTest(TestNode** root)
     49 {
     50 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION
     51    addTest(root, &Test_nfs4_cs_prep_data,    "spreptst/Test_nfs4_cs_prep_data");
     52    addTest(root, &Test_nfs4_cis_prep_data,   "spreptst/Test_nfs4_cis_prep_data");
     53    addTest(root, &Test_nfs4_mixed_prep_data, "spreptst/Test_nfs4_mixed_prep_data");
     54    addTest(root, &Test_nfs4_cs_prep,         "spreptst/Test_nfs4_cs_prep");
     55    addTest(root, &Test_nfs4_cis_prep,        "spreptst/Test_nfs4_cis_prep");
     56    addTest(root, &Test_nfs4_mixed_prep,      "spreptst/Test_nfs4_mixed_prep");
     57    addTest(root, &TestBEAMWarning,           "spreptst/TestBEAMWarning");
     58 #endif
     59    addTest(root, &TestCoverage,              "spreptst/TestCoverage");
     60    addTest(root, &TestStringPrepProfiles,              "spreptst/TestStringPrepProfiles");
     61 }
     62 
     63 static void
     64 Test_nfs4_cs_prep_data(void){
     65     UErrorCode errorCode = U_ZERO_ERROR;
     66     loadTestData(&errorCode);
     67     if(U_FAILURE(errorCode)) {
     68         log_data_err("Could not load testdata.dat, status = %s\n", u_errorName(errorCode));
     69         return;
     70     }
     71 
     72     log_verbose("Testing nfs4_cs_prep_ci.txt\n");
     73     doStringPrepTest("nfscsi","nfs4_cs_prep_ci.txt", USPREP_DEFAULT, &errorCode);
     74 
     75     log_verbose("Testing nfs4_cs_prep_cs.txt\n");
     76     errorCode = U_ZERO_ERROR;
     77     doStringPrepTest("nfscss","nfs4_cs_prep_cs.txt", USPREP_DEFAULT, &errorCode);
     78 
     79 
     80 }
     81 static void
     82 Test_nfs4_cis_prep_data(void){
     83     UErrorCode errorCode = U_ZERO_ERROR;
     84     log_verbose("Testing nfs4_cis_prep.txt\n");
     85     doStringPrepTest("nfscis","nfs4_cis_prep.txt", USPREP_DEFAULT, &errorCode);
     86 }
     87 static void
     88 Test_nfs4_mixed_prep_data(void){
     89     UErrorCode errorCode = U_ZERO_ERROR;
     90     loadTestData(&errorCode);
     91     if(U_FAILURE(errorCode)) {
     92         log_data_err("Could not load testdata.dat, status = %s\n", u_errorName(errorCode));
     93         return;
     94     }
     95 
     96     log_verbose("Testing nfs4_mixed_prep_s.txt\n");
     97     doStringPrepTest("nfsmxs","nfs4_mixed_prep_s.txt", USPREP_DEFAULT, &errorCode);
     98 
     99     errorCode = U_ZERO_ERROR;
    100     log_verbose("Testing nfs4_mixed_prep_p.txt\n");
    101     doStringPrepTest("nfsmxp","nfs4_mixed_prep_p.txt", USPREP_DEFAULT, &errorCode);
    102 
    103 }
    104 
    105 static const struct ConformanceTestCases
    106    {
    107      const char *comment;
    108      const char *in;
    109      const char *out;
    110      const char *profile;
    111      UErrorCode expectedStatus;
    112    }
    113    conformanceTestCases[] =
    114    {
    115 
    116      {/*0*/
    117        "Case folding ASCII U+0043 U+0041 U+0046 U+0045",
    118        "\x43\x41\x46\x45", "\x63\x61\x66\x65",
    119        "nfs4_cis_prep",
    120        U_ZERO_ERROR
    121 
    122      },
    123      {/*1*/
    124        "Case folding 8bit U+00DF (german sharp s)",
    125        "\xC3\x9F", "\x73\x73",
    126        "nfs4_cis_prep",
    127        U_ZERO_ERROR
    128      },
    129      {/*2*/
    130        "Non-ASCII multibyte space character U+1680",
    131        "\xE1\x9A\x80", NULL,
    132        "nfs4_cis_prep",
    133        U_STRINGPREP_PROHIBITED_ERROR
    134      },
    135      {/*3*/
    136        "Non-ASCII 8bit control character U+0085",
    137        "\xC2\x85", NULL,
    138        "nfs4_cis_prep",
    139        U_STRINGPREP_PROHIBITED_ERROR
    140      },
    141      {/*4*/
    142        "Non-ASCII multibyte control character U+180E",
    143        "\xE1\xA0\x8E", NULL,
    144        "nfs4_cis_prep",
    145        U_STRINGPREP_PROHIBITED_ERROR
    146      },
    147      {/*5*/
    148        "Non-ASCII control character U+1D175",
    149        "\xF0\x9D\x85\xB5", NULL,
    150        "nfs4_cis_prep",
    151        U_STRINGPREP_PROHIBITED_ERROR
    152      },
    153      {/*6*/
    154        "Plane 0 private use character U+F123",
    155        "\xEF\x84\xA3", NULL,
    156        "nfs4_cis_prep",
    157        U_STRINGPREP_PROHIBITED_ERROR
    158      },
    159      {/*7*/
    160        "Plane 15 private use character U+F1234",
    161        "\xF3\xB1\x88\xB4", NULL,
    162        "nfs4_cis_prep",
    163        U_STRINGPREP_PROHIBITED_ERROR
    164      },
    165      {/*8*/
    166        "Plane 16 private use character U+10F234",
    167        "\xF4\x8F\x88\xB4", NULL,
    168        "nfs4_cis_prep",
    169        U_STRINGPREP_PROHIBITED_ERROR
    170      },
    171      {/*9*/
    172        "Non-character code point U+8FFFE",
    173        "\xF2\x8F\xBF\xBE", NULL,
    174        "nfs4_cis_prep",
    175        U_STRINGPREP_PROHIBITED_ERROR
    176      },
    177      {/*10*/
    178        "Non-character code point U+10FFFF",
    179        "\xF4\x8F\xBF\xBF", NULL,
    180        "nfs4_cis_prep",
    181        U_STRINGPREP_PROHIBITED_ERROR
    182      },
    183  /*
    184      {
    185        "Surrogate code U+DF42",
    186        "\xED\xBD\x82", NULL, "nfs4_cis_prep", UIDNA_DEFAULT,
    187        U_STRINGPREP_PROHIBITED_ERROR
    188      },
    189 */
    190      {/*11*/
    191        "Non-plain text character U+FFFD",
    192        "\xEF\xBF\xBD", NULL,
    193        "nfs4_cis_prep",
    194        U_STRINGPREP_PROHIBITED_ERROR
    195      },
    196      {/*12*/
    197        "Ideographic description character U+2FF5",
    198        "\xE2\xBF\xB5", NULL,
    199        "nfs4_cis_prep",
    200        U_STRINGPREP_PROHIBITED_ERROR
    201      },
    202      {/*13*/
    203        "Display property character U+0341",
    204        "\xCD\x81", "\xCC\x81",
    205        "nfs4_cis_prep", U_ZERO_ERROR
    206 
    207      },
    208 
    209      {/*14*/
    210        "Left-to-right mark U+200E",
    211        "\xE2\x80\x8E", "\xCC\x81",
    212        "nfs4_cis_prep",
    213        U_STRINGPREP_PROHIBITED_ERROR
    214      },
    215      {/*15*/
    216 
    217        "Deprecated U+202A",
    218        "\xE2\x80\xAA", "\xCC\x81",
    219        "nfs4_cis_prep",
    220        U_STRINGPREP_PROHIBITED_ERROR
    221      },
    222      {/*16*/
    223        "Language tagging character U+E0001",
    224        "\xF3\xA0\x80\x81", "\xCC\x81",
    225        "nfs4_cis_prep",
    226        U_STRINGPREP_PROHIBITED_ERROR
    227      },
    228      {/*17*/
    229        "Language tagging character U+E0042",
    230        "\xF3\xA0\x81\x82", NULL,
    231        "nfs4_cis_prep",
    232        U_STRINGPREP_PROHIBITED_ERROR
    233      },
    234      {/*18*/
    235        "Bidi: RandALCat character U+05BE and LCat characters",
    236        "\x66\x6F\x6F\xD6\xBE\x62\x61\x72", NULL,
    237        "nfs4_cis_prep",
    238        U_STRINGPREP_CHECK_BIDI_ERROR
    239      },
    240      {/*19*/
    241        "Bidi: RandALCat character U+FD50 and LCat characters",
    242        "\x66\x6F\x6F\xEF\xB5\x90\x62\x61\x72", NULL,
    243        "nfs4_cis_prep",
    244        U_STRINGPREP_CHECK_BIDI_ERROR
    245      },
    246      {/*20*/
    247        "Bidi: RandALCat character U+FB38 and LCat characters",
    248        "\x66\x6F\x6F\xEF\xB9\xB6\x62\x61\x72", "\x66\x6F\x6F\x20\xd9\x8e\x62\x61\x72",
    249        "nfs4_cis_prep",
    250        U_ZERO_ERROR
    251      },
    252      {/*21*/
    253        "Bidi: RandALCat without trailing RandALCat U+0627 U+0031",
    254        "\xD8\xA7\x31", NULL,
    255        "nfs4_cis_prep",
    256        U_STRINGPREP_CHECK_BIDI_ERROR
    257      },
    258      {/*22*/
    259        "Bidi: RandALCat character U+0627 U+0031 U+0628",
    260        "\xD8\xA7\x31\xD8\xA8", "\xD8\xA7\x31\xD8\xA8",
    261        "nfs4_cis_prep",
    262        U_ZERO_ERROR
    263      },
    264      {/*23*/
    265        "Unassigned code point U+E0002",
    266        "\xF3\xA0\x80\x82", NULL,
    267        "nfs4_cis_prep",
    268        U_STRINGPREP_UNASSIGNED_ERROR
    269      },
    270 
    271 /*  // Invalid UTF-8
    272      {
    273        "Larger test (shrinking)",
    274        "X\xC2\xAD\xC3\xDF\xC4\xB0\xE2\x84\xA1\x6a\xcc\x8c\xc2\xa0\xc2"
    275        "\xaa\xce\xb0\xe2\x80\x80", "xssi\xcc\x87""tel\xc7\xb0 a\xce\xb0 ",
    276        "nfs4_cis_prep",
    277         U_ZERO_ERROR
    278      },
    279     {
    280 
    281        "Larger test (expanding)",
    282        "X\xC3\xDF\xe3\x8c\x96\xC4\xB0\xE2\x84\xA1\xE2\x92\x9F\xE3\x8c\x80",
    283        "xss\xe3\x82\xad\xe3\x83\xad\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\x88"
    284        "\xe3\x83\xab""i\xcc\x87""tel\x28""d\x29\xe3\x82\xa2\xe3\x83\x91"
    285        "\xe3\x83\xbc\xe3\x83\x88"
    286        "nfs4_cis_prep",
    287         U_ZERO_ERROR
    288      },
    289   */
    290 };
    291 
    292 #define MAX_BUFFER_SIZE  1000
    293 
    294 static int32_t
    295 unescapeData(const char* src, int32_t srcLen,
    296              char* dest, int32_t destCapacity,
    297              UErrorCode* status){
    298 
    299     UChar b1Stack[MAX_BUFFER_SIZE];
    300     int32_t b1Capacity = MAX_BUFFER_SIZE,
    301             b1Len      = 0,
    302             destLen    = 0;
    303 
    304     UChar* b1 = b1Stack;
    305 
    306     b1Len = u_unescape(src,b1,b1Capacity);
    307 
    308     u_strToUTF8(dest, destCapacity, &destLen, b1, b1Len, status);
    309 
    310     return destLen;
    311 }
    312 
    313 
    314 static void Test_nfs4_cis_prep(void){
    315     int32_t i=0;
    316     UErrorCode loadStatus = U_ZERO_ERROR;
    317     loadTestData(&loadStatus);
    318     if (U_FAILURE(loadStatus)) {
    319         log_data_err("Test could not initialize. Got %s\n", u_errorName(loadStatus));
    320         return;
    321     }
    322 
    323     for(i=0;i< (int32_t)(sizeof(conformanceTestCases)/sizeof(conformanceTestCases[0]));i++){
    324         const char* src = conformanceTestCases[i].in;
    325         UErrorCode status = U_ZERO_ERROR;
    326         UParseError parseError;
    327         UErrorCode expectedStatus = conformanceTestCases[i].expectedStatus;
    328         const char* expectedDest = conformanceTestCases[i].out;
    329         char* dest = NULL;
    330         int32_t destLen = 0;
    331 
    332         destLen = nfs4_cis_prepare(src , (int32_t)strlen(src), dest, destLen, &parseError, &status);
    333         if(status == U_BUFFER_OVERFLOW_ERROR){
    334             status = U_ZERO_ERROR;
    335             dest = (char*) malloc(++destLen);
    336             destLen = nfs4_cis_prepare( src , (int32_t)strlen(src), dest, destLen, &parseError, &status);
    337         }
    338 
    339         if(expectedStatus != status){
    340             log_data_err("Did not get the expected status for nfs4_cis_prep at index %i. Expected: %s Got: %s - (Are you missing data?)\n",i, u_errorName(expectedStatus), u_errorName(status));
    341         }
    342         if(U_SUCCESS(status) && (strcmp(expectedDest,dest) !=0)){
    343               log_err("Did not get the expected output for nfs4_cis_prep at index %i.\n", i);
    344         }
    345         free(dest);
    346     }
    347 }
    348 
    349 
    350 
    351 /*
    352    There are several special identifiers ("who") which need to be
    353    understood universally, rather than in the context of a particular
    354    DNS domain.  Some of these identifiers cannot be understood when an
    355    NFS client accesses the server, but have meaning when a local process
    356    accesses the file.  The ability to display and modify these
    357    permissions is permitted over NFS, even if none of the access methods
    358    on the server understands the identifiers.
    359 
    360     Who                    Description
    361    _______________________________________________________________
    362 
    363    "OWNER"                The owner of the file.
    364    "GROUP"                The group associated with the file.
    365    "EVERYONE"             The world.
    366    "INTERACTIVE"          Accessed from an interactive terminal.
    367    "NETWORK"              Accessed via the network.
    368    "DIALUP"               Accessed as a dialup user to the server.
    369    "BATCH"                Accessed from a batch job.
    370    "ANONYMOUS"            Accessed without any authentication.
    371    "AUTHENTICATED"        Any authenticated user (opposite of
    372                           ANONYMOUS)
    373    "SERVICE"              Access from a system service.
    374 
    375    To avoid conflict, these special identifiers are distinguish by an
    376    appended "@" and should appear in the form "xxxx@" (note: no domain
    377    name after the "@").  For example: ANONYMOUS@.
    378 */
    379 static const char* mixed_prep_data[] ={
    380     "OWNER@",
    381     "GROUP@",
    382     "EVERYONE@",
    383     "INTERACTIVE@",
    384     "NETWORK@",
    385     "DIALUP@",
    386     "BATCH@",
    387     "ANONYMOUS@",
    388     "AUTHENTICATED@",
    389     "\\u0930\\u094D\\u092E\\u094D\\u0915\\u094D\\u0937\\u0947\\u0924\\u094D (at) slip129-37-118-146.nc.us.ibm.net",
    390     "\\u0936\\u094d\\u0930\\u0940\\u092e\\u0926\\u094d (at) saratoga.pe.utexas.edu",
    391     "\\u092d\\u0917\\u0935\\u0926\\u094d\\u0917\\u0940\\u0924\\u093e (at) dial-120-45.ots.utexas.edu",
    392     "\\u0905\\u0927\\u094d\\u092f\\u093e\\u092f (at) woo-085.dorms.waller.net",
    393     "\\u0905\\u0930\\u094d\\u091c\\u0941\\u0928 (at) hd30-049.hil.compuserve.com",
    394     "\\u0935\\u093f\\u0937\\u093e\\u0926 (at) pem203-31.pe.ttu.edu",
    395     "\\u092f\\u094b\\u0917 (at) 56K-227.MaxTNT3.pdq.net",
    396     "\\u0927\\u0943\\u0924\\u0930\\u093e\\u0937\\u094d\\u091f\\u094d\\u0930 (at) dial-36-2.ots.utexas.edu",
    397     "\\u0909\\u0935\\u093E\\u091A\\u0943 (at) slip129-37-23-152.ga.us.ibm.net",
    398     "\\u0927\\u0930\\u094d\\u092e\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947 (at) ts45ip119.cadvision.com",
    399     "\\u0915\\u0941\\u0930\\u0941\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947 (at) sdn-ts-004txaustP05.dialsprint.net",
    400     "\\u0938\\u092e\\u0935\\u0947\\u0924\\u093e (at) bar-tnt1s66.erols.com",
    401     "\\u092f\\u0941\\u092f\\u0941\\u0924\\u094d\\u0938\\u0935\\u0903 (at) 101.st-louis-15.mo.dial-access.att.net",
    402     "\\u092e\\u093e\\u092e\\u0915\\u093e\\u0903 (at) h92-245.Arco.COM",
    403     "\\u092a\\u093e\\u0923\\u094d\\u0921\\u0935\\u093e\\u0936\\u094d\\u091a\\u0948\\u0935 (at) dial-13-2.ots.utexas.edu",
    404     "\\u0915\\u093f\\u092e\\u0915\\u0941\\u0930\\u094d\\u0935\\u0924 (at) net-redynet29.datamarkets.com.ar",
    405     "\\u0938\\u0902\\u091c\\u0935 (at) ccs-shiva28.reacciun.net.ve",
    406     "\\u0c30\\u0c18\\u0c41\\u0c30\\u0c3e\\u0c2e\\u0c4d (at) 7.houston-11.tx.dial-access.att.net",
    407     "\\u0c35\\u0c3f\\u0c36\\u0c4d\\u0c35\\u0c28\\u0c3e\\u0c27 (at) ingw129-37-120-26.mo.us.ibm.net",
    408     "\\u0c06\\u0c28\\u0c02\\u0c26\\u0c4d (at) dialup6.austintx.com",
    409     "\\u0C35\\u0C26\\u0C4D\\u0C26\\u0C3F\\u0C30\\u0C3E\\u0C1C\\u0C41 (at) dns2.tpao.gov.tr",
    410     "\\u0c30\\u0c3e\\u0c1c\\u0c40\\u0c35\\u0c4d (at) slip129-37-119-194.nc.us.ibm.net",
    411     "\\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26 (at) cs7.dillons.co.uk.203.119.193.in-addr.arpa",
    412     "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c35\\u0c4d (at) swprd1.innovplace.saskatoon.sk.ca",
    413     "\\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26 (at) bikini.bologna.maraut.it",
    414     "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c2c\\u0c4d (at) node91.subnet159-198-79.baxter.com",
    415     "\\u0c38\\u0c46\\u0c28\\u0c4d\\u0c17\\u0c41\\u0c2a\\u0c4d\\u0c24 (at) cust19.max5.new-york.ny.ms.uu.net",
    416     "\\u0c05\\u0c2e\\u0c30\\u0c47\\u0c02\\u0c26\\u0c4d\\u0c30 (at) balexander.slip.andrew.cmu.edu",
    417     "\\u0c39\\u0c28\\u0c41\\u0c2e\\u0c3e\\u0c28\\u0c41\\u0c32 (at) pool029.max2.denver.co.dynip.alter.net",
    418     "\\u0c30\\u0c35\\u0c3f (at) cust49.max9.new-york.ny.ms.uu.net",
    419     "\\u0c15\\u0c41\\u0c2e\\u0c3e\\u0c30\\u0c4d (at) s61.abq-dialin2.hollyberry.com",
    420     "\\u0c35\\u0c3f\\u0c36\\u0c4d\\u0c35\\u0c28\\u0c3e\\u0c27@\\u0917\\u0928\\u0947\\u0936.sanjose.ibm.com",
    421     "\\u0c06\\u0c26\\u0c3f\\u0c24\\u0c4d\\u0c2f@www.\\u00E0\\u00B3\\u00AF.com",
    422     "\\u0C15\\u0C02\\u0C26\\u0C4D\\u0C30\\u0C47\\u0C17\\u0C41\\u0c32@www.\\u00C2\\u00A4.com",
    423     "\\u0c36\\u0c4d\\u0c30\\u0c40\\u0C27\\u0C30\\u0C4D@www.\\u00C2\\u00A3.com",
    424     "\\u0c15\\u0c02\\u0c1f\\u0c2e\\u0c36\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f@\\u0025",
    425     "\\u0c2e\\u0c3e\\u0c27\\u0c35\\u0c4d@\\u005C\\u005C",
    426     "\\u0c26\\u0c46\\u0c36\\u0c46\\u0c1f\\u0c4d\\u0c1f\\u0c3f@www.\\u0021.com",
    427     "test@www.\\u0024.com",
    428     "help@\\u00C3\\u00BC.com",
    429 
    430 };
    431 
    432 
    433 static void
    434 Test_nfs4_mixed_prep(void){
    435     UErrorCode loadStatus = U_ZERO_ERROR;
    436     loadTestData(&loadStatus);
    437     if (U_FAILURE(loadStatus)) {
    438         log_data_err("Test could not initialize. Got %s\n", u_errorName(loadStatus));
    439         return;
    440     }
    441 
    442     {
    443         int32_t i=0;
    444         char src[MAX_BUFFER_SIZE];
    445         int32_t srcLen;
    446 
    447         for(i=0; i< LENGTHOF(mixed_prep_data); i++){
    448             int32_t destLen=0;
    449             char* dest = NULL;
    450             UErrorCode status = U_ZERO_ERROR;
    451             UParseError parseError;
    452             srcLen = unescapeData(mixed_prep_data[i], (int32_t)strlen(mixed_prep_data[i]), src, MAX_BUFFER_SIZE, &status);
    453             if(U_FAILURE(status)){
    454                 log_err("Conversion of data at index %i failed. Error: %s\n", i, u_errorName(status));
    455                 continue;
    456             }
    457             destLen = nfs4_mixed_prepare(src, srcLen, NULL, 0, &parseError, &status);
    458             if(status == U_BUFFER_OVERFLOW_ERROR){
    459                 status = U_ZERO_ERROR;
    460                 dest = (char*)malloc(++destLen);
    461                 destLen = nfs4_mixed_prepare(src, srcLen, dest, destLen, &parseError, &status);
    462             }
    463             free(dest);
    464             if(U_FAILURE(status)){
    465                 log_data_err("Preparation of string at index %i failed. Error: %s - (Are you missing data?)\n", i, u_errorName(status));
    466                 continue;
    467             }
    468         }
    469     }
    470     /* test the error condition */
    471     {
    472         const char* source = "OWNER (at) oss.software.ibm.com";
    473         char dest[MAX_BUFFER_SIZE];
    474         char src[MAX_BUFFER_SIZE] = {0};
    475         UErrorCode status = U_ZERO_ERROR;
    476         UParseError parseError;
    477 
    478         int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status);
    479 
    480         nfs4_mixed_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, &parseError, &status);
    481 
    482         if(status != U_PARSE_ERROR){
    483             log_err("Did not get the expected error.Expected: %s Got: %s\n", u_errorName(U_PARSE_ERROR), u_errorName(status));
    484         }
    485     }
    486 
    487 
    488 }
    489 
    490 static void
    491 Test_nfs4_cs_prep(void){
    492     UErrorCode errorCode = U_ZERO_ERROR;
    493     loadTestData(&errorCode);
    494     if(U_FAILURE(errorCode)) {
    495         log_data_err("Could not load testdata.dat, status = %s\n", u_errorName(errorCode));
    496         return;
    497     }
    498 
    499     {
    500         /* BiDi checking is turned off */
    501         const char *source = "\\uC138\\uACC4\\uC758\\uBAA8\\uB4E0\\uC0AC\\uB78C\\uB4E4\\uC774\\u0644\\u064A\\u0647\\uD55C\\uAD6D\\uC5B4\\uB97C\\uC774\\uD574\\uD55C\\uB2E4\\uBA74";
    502         UErrorCode status = U_ZERO_ERROR;
    503         char src[MAX_BUFFER_SIZE]={'\0'};
    504         UParseError parseError;
    505         int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status);
    506         if(U_SUCCESS(status)){
    507             char dest[MAX_BUFFER_SIZE] = {'\0'};
    508             int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, FALSE, &parseError, &status);
    509             if(U_FAILURE(status)){
    510                 log_err("StringPrep failed for case: BiDi Checking Turned OFF with error: %s\n", u_errorName(status));
    511             }
    512             if(strcmp(dest,src)!=0){
    513                 log_err("Did not get the expected output for case: BiDi Checking Turned OFF\n");
    514             }
    515             if(destLen != srcLen){
    516                 log_err("Did not get the expected length for the output for case: BiDi Checking Turned OFF. Expected: %i Got: %i\n", srcLen, destLen);
    517             }
    518         }else{
    519             log_err("Conversion failed for case: BiDi Checking Turned OFF with error: %s\n", u_errorName(status));
    520         }
    521     }
    522     {
    523         /* Normalization turned off */
    524         const char *source = "www.\\u00E0\\u00B3\\u00AF.com";
    525         UErrorCode status = U_ZERO_ERROR;
    526         char src[MAX_BUFFER_SIZE]={'\0'};
    527         UParseError parseError;
    528         int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status);
    529         if(U_SUCCESS(status)){
    530             char dest[MAX_BUFFER_SIZE] = {'\0'};
    531             int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, FALSE, &parseError, &status);
    532             if(U_FAILURE(status)){
    533                 log_err("StringPrep failed for case: Normalization Turned OFF with error: %s\n", u_errorName(status));
    534             }
    535             if(strcmp(dest,src)!=0){
    536                 log_err("Did not get the expected output for case: Normalization Turned OFF\n");
    537             }
    538             if(destLen != srcLen){
    539                 log_err("Did not get the expected length for the output for case: Normalization Turned OFF. Expected: %i Got: %i\n", srcLen, destLen);
    540             }
    541         }else{
    542             log_err("Conversion failed for case: Normalization Turned OFF with error: %s\n", u_errorName(status));
    543         }
    544     }
    545     {
    546         /* case mapping turned off */
    547         const char *source = "THISISATEST";
    548         UErrorCode status = U_ZERO_ERROR;
    549         char src[MAX_BUFFER_SIZE]={'\0'};
    550         UParseError parseError;
    551         int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status);
    552         if(U_SUCCESS(status)){
    553             char dest[MAX_BUFFER_SIZE] = {'\0'};
    554             int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, TRUE, &parseError, &status);
    555             if(U_FAILURE(status)){
    556                 log_err("StringPrep failed for case: Case Mapping Turned OFF with error: %s\n", u_errorName(status));
    557             }
    558             if(strcmp(dest,src)!=0){
    559                 log_err("Did not get the expected output for case: Case Mapping Turned OFF\n");
    560             }
    561             if(destLen != srcLen){
    562                 log_err("Did not get the expected length for the output for case: Case Mapping Turned OFF. Expected: %i Got: %i\n", srcLen, destLen);
    563             }
    564         }else{
    565             log_err("Conversion failed for case: Case Mapping Turned OFF with error: %s\n", u_errorName(status));
    566         }
    567     }
    568     {
    569         /* case mapping turned on */
    570         const char *source = "THISISATEST";
    571         const char *expected = "thisisatest";
    572         UErrorCode status = U_ZERO_ERROR;
    573         char src[MAX_BUFFER_SIZE]={'\0'};
    574         char exp[MAX_BUFFER_SIZE]={'\0'};
    575         UParseError parseError;
    576         int32_t srcLen = unescapeData(source, (int32_t)strlen(source), src, MAX_BUFFER_SIZE, &status);
    577         int32_t expLen = unescapeData(expected, (int32_t)strlen(expected), exp, MAX_BUFFER_SIZE, &status);
    578         if(U_SUCCESS(status)){
    579             char dest[MAX_BUFFER_SIZE] = {'\0'};
    580             int32_t destLen = nfs4_cs_prepare(src, srcLen, dest, MAX_BUFFER_SIZE, FALSE, &parseError, &status);
    581             if(U_FAILURE(status)){
    582                 log_err("StringPrep failed for case: Case Mapping Turned On with error: %s\n", u_errorName(status));
    583             }
    584             if(strcmp(exp, dest)!=0){
    585                 log_err("Did not get the expected output for case: Case Mapping Turned On!\n");
    586             }
    587             if(destLen != expLen){
    588                 log_err("Did not get the expected length for the outputfor case: Case Mapping Turned On. Expected: %i Got: %i\n", strlen(expected), destLen);
    589             }
    590         }else{
    591             log_err("Conversion failed for case: Case Mapping Turned ON with error: %s\n", u_errorName(status));
    592         }
    593     }
    594 }
    595 
    596 
    597 
    598 static void TestBEAMWarning(){
    599     UErrorCode status = U_ZERO_ERROR;
    600     UParseError parseError;
    601     UStringPrepProfile* profile = NULL;
    602     /* get the test data path */
    603     const char *testdatapath = NULL;
    604     UChar src =0x0000;
    605     testdatapath = loadTestData(&status);
    606     if(U_FAILURE(status)) {
    607         log_data_err("Could not load testdata.dat, status = %s\n", u_errorName(status));
    608         return;
    609     }
    610     /* open the profile */
    611     profile = usprep_open(testdatapath, "nfscis",  &status);
    612     usprep_prepare(profile,&src , 0, NULL, 0, USPREP_DEFAULT, &parseError, &status);
    613 
    614     usprep_close(profile);
    615 }
    616 
    617 static void TestCoverage(void) {
    618     UErrorCode status = U_USELESS_COLLATOR_ERROR;
    619     UParseError parseError;
    620 
    621     usprep_open(NULL, NULL, &status);
    622     if (status != U_USELESS_COLLATOR_ERROR) {
    623         log_err("usprep_open didn't react correctly to a bad UErrorCode\n");
    624     }
    625     usprep_prepare(NULL, NULL, 0, NULL, 0, USPREP_DEFAULT, &parseError, &status);
    626     if (status != U_USELESS_COLLATOR_ERROR) {
    627         log_err("usprep_prepare didn't react correctly to a bad UErrorCode\n");
    628     }
    629     status = U_ZERO_ERROR;
    630     usprep_prepare(NULL, NULL, 0, NULL, 0, USPREP_DEFAULT, &parseError, &status);
    631     if (status != U_ILLEGAL_ARGUMENT_ERROR) {
    632         log_err("usprep_prepare didn't check its arguments\n");
    633     }
    634 
    635     /* Don't crash */
    636     usprep_close(NULL);
    637 }
    638 
    639 /**** Profile Test ****/
    640 
    641 #define SPREP_PROFILE_TEST_MAX_LENGTH 64
    642 /* The format of the test cases should be the following:
    643 * {
    644 *     Profile name
    645 *     src string1
    646 *     expected result1
    647 *     src string2
    648 *     expected result2
    649 *     ...
    650 * }
    651 *
    652 * *Note: For expected failures add FAIL to beginning of the source string and for expected result use "FAIL".
    653 */
    654 static const char *profile_test_case[] = {
    655 /**** RFC4013_SASLPREP ****/
    656     "RFC4013_SASLPREP",
    657     "user:\\u00A0\\u0AC6\\u1680\\u00ADpassword1",
    658     "user: \\u0AC6 password1",
    659 
    660 /**** RFC4011_MIB ****/
    661     "RFC4011_MIB",
    662     "Policy\\u034F\\u200DBase\\u0020d\\u1806\\u200C",
    663     "PolicyBase d",
    664 
    665 /**** RFC4505_TRACE ****/
    666     "RFC4505_TRACE",
    667     "Anony\\u0020\\u00A0mous\\u3000\\u0B9D\\u034F\\u00AD",
    668     "Anony\\u0020\\u00A0mous\\u3000\\u0B9D\\u034F\\u00AD",
    669 
    670 /**** RFC4518_LDAP ****/
    671     "RFC4518_LDAP",
    672     "Ldap\\uFB01\\u00ADTest\\u0020\\u00A0\\u2062ing",
    673     "LdapfiTest  ing",
    674 
    675 /**** RFC4518_LDAP_CI ****/
    676     "RFC4518_LDAP_CI",
    677     "Ldap\\uFB01\\u00ADTest\\u0020\\u00A0\\u2062ing12345",
    678     "ldapfitest  ing12345",
    679 
    680 /**** RFC3920_RESOURCEPREP ****/
    681     "RFC3920_RESOURCEPREP",
    682     "ServerXM\\u2060\\uFE00\\uFE09PP s p ",
    683     "ServerXMPP s p ",
    684 
    685 /**** RFC3920_NODEPREP ****/
    686     "RFC3920_NODEPREP",
    687     "Server\\u200DXMPPGreEK\\u03D0",
    688     "serverxmppgreek\\u03B2",
    689 
    690 /**** RFC3722_ISCI ****/
    691     "RFC3722_ISCSI",
    692     "InternetSmallComputer\\uFB01\\u0032\\u2075Interface",
    693     "internetsmallcomputerfi25interface",
    694     "FAILThisShouldFailBecauseOfThis\\u002F",
    695     "FAIL",
    696 
    697 /**** RFC3530_NFS4_CS_PREP ****/
    698     "RFC3530_NFS4_CS_PREP",
    699     "\\u00ADUser\\u2060Name@ \\u06DDDOMAIN.com",
    700     "UserName@ \\u06DDDOMAIN.com",
    701 
    702 /**** RFC3530_NFS4_CS_PREP_CI ****/
    703     "RFC3530_NFS4_CS_PREP_CI",
    704     "\\u00ADUser\\u2060Name@ \\u06DDDOMAIN.com",
    705     "username@ \\u06DDdomain.com",
    706 
    707 /**** RFC3530_NFS4_CIS_PREP ****/
    708     "RFC3530_NFS4_CIS_PREP",
    709     "AA\\u200C\\u200D @@DomAin.org",
    710     "aa @@domain.org",
    711 
    712 /**** RFC3530_NFS4_MIXED_PREP_PREFIX ****/
    713     "RFC3530_NFS4_MIXED_PREP_PREFIX",
    714     "PrefixUser \\u007F\\uFB01End",
    715     "PrefixUser \\u007FfiEnd",
    716 
    717 /**** RFC3530_NFS4_MIXED_PREP_SUFFIX ****/
    718     "RFC3530_NFS4_MIXED_PREP_SUFFIX",
    719     "SuffixDomain \\u007F\\uFB01EnD",
    720     "suffixdomain \\u007Ffiend",
    721 };
    722 
    723 UStringPrepProfileType getTypeFromProfileName(const char* profileName) {
    724     if (uprv_strcmp(profileName, "RFC4013_SASLPREP") == 0) {
    725         return USPREP_RFC4013_SASLPREP;
    726     } else if (uprv_strcmp(profileName, "RFC4011_MIB") == 0) {
    727         return USPREP_RFC4011_MIB;
    728     } else if (uprv_strcmp(profileName, "RFC4505_TRACE") == 0) {
    729         return USPREP_RFC4505_TRACE;
    730     } else if (uprv_strcmp(profileName, "RFC4518_LDAP") == 0) {
    731         return USPREP_RFC4518_LDAP;
    732     } else if (uprv_strcmp(profileName, "RFC4518_LDAP_CI") == 0) {
    733         return USPREP_RFC4518_LDAP_CI;
    734     } else if (uprv_strcmp(profileName, "RFC3920_RESOURCEPREP") == 0) {
    735         return USPREP_RFC3920_RESOURCEPREP;
    736     } else if (uprv_strcmp(profileName, "RFC3920_NODEPREP") == 0) {
    737         return USPREP_RFC3920_NODEPREP;
    738     } else if (uprv_strcmp(profileName, "RFC3722_ISCSI") == 0) {
    739         return USPREP_RFC3722_ISCSI;
    740     } else if (uprv_strcmp(profileName, "RFC3530_NFS4_CS_PREP") == 0) {
    741         return USPREP_RFC3530_NFS4_CS_PREP;
    742     } else if (uprv_strcmp(profileName, "RFC3530_NFS4_CS_PREP_CI") == 0) {
    743         return USPREP_RFC3530_NFS4_CS_PREP_CI;
    744     } else if (uprv_strcmp(profileName, "RFC3530_NFS4_CIS_PREP") == 0) {
    745         return USPREP_RFC3530_NFS4_CIS_PREP;
    746     } else if (uprv_strcmp(profileName, "RFC3530_NFS4_MIXED_PREP_PREFIX") == 0) {
    747         return USPREP_RFC3530_NFS4_MIXED_PREP_PREFIX;
    748     } else if (uprv_strcmp(profileName, "RFC3530_NFS4_MIXED_PREP_SUFFIX") == 0) {
    749         return USPREP_RFC3530_NFS4_MIXED_PREP_SUFFIX;
    750     }
    751     /* Should not happen. */
    752     return USPREP_RFC3491_NAMEPREP;
    753 }
    754 static void TestStringPrepProfiles(void) {
    755     UErrorCode status = U_ZERO_ERROR;
    756     const char *profileName = NULL;
    757     UChar src[SPREP_PROFILE_TEST_MAX_LENGTH];
    758     UChar expected[SPREP_PROFILE_TEST_MAX_LENGTH];
    759     UChar result[SPREP_PROFILE_TEST_MAX_LENGTH];
    760     int32_t srcLength, resultLength, expectedLength;
    761     int32_t i, testNum = 0;
    762     UStringPrepProfile *sprep = NULL;
    763 
    764     for (i = 0; i < LENGTHOF(profile_test_case); i++) {
    765         if (uprv_strstr(profile_test_case[i], "RFC")) {
    766             if (sprep != NULL) {
    767                 usprep_close(sprep);
    768                 sprep = NULL;
    769             }
    770             profileName = profile_test_case[i];
    771             sprep = usprep_openByType(getTypeFromProfileName(profileName), &status);
    772             if (U_FAILURE(status)) {
    773                 log_data_err("Unable to open String Prep Profile with: %s\n", profileName);
    774                 break;
    775             }
    776 
    777             testNum = 0;
    778             continue;
    779         }
    780         srcLength = resultLength = expectedLength = SPREP_PROFILE_TEST_MAX_LENGTH;
    781 
    782         testNum++;
    783 
    784         srcLength = u_unescape(profile_test_case[i], src, srcLength);
    785         expectedLength = u_unescape(profile_test_case[++i], expected, expectedLength);
    786 
    787         resultLength = usprep_prepare(sprep, src, srcLength, result, resultLength, USPREP_ALLOW_UNASSIGNED, NULL, &status);
    788         if (U_FAILURE(status)) {
    789             if (uprv_strstr(profile_test_case[i], "FAIL") == NULL) {
    790                 log_err("Error occurred on test[%d] for profile: %s\n", testNum, profileName);
    791             } else {
    792                 /* Error is expected so reset the status. */
    793                 status = U_ZERO_ERROR;
    794             }
    795         } else {
    796             if (uprv_strstr(profile_test_case[i], "FAIL") != NULL) {
    797                 log_err("Error expected on test[%d] for profile: %s\n", testNum, profileName);
    798             }
    799 
    800             if (resultLength != expectedLength || u_strcmp(result, expected) != 0) {
    801                 log_err("Results do not match expected on test[%d] for profile: %s\n", testNum, profileName);
    802             }
    803         }
    804     }
    805 
    806     if (sprep != NULL) {
    807         usprep_close(sprep);
    808     }
    809 }
    810 
    811 #endif
    812 
    813 /*
    814  * Hey, Emacs, please set the following:
    815  *
    816  * Local Variables:
    817  * indent-tabs-mode: nil
    818  * End:
    819  *
    820  */
    821