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