• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4  *******************************************************************************
5  *
6  *   Copyright (C) 2003-2016, International Business Machines
7  *   Corporation and others.  All Rights Reserved.
8  *
9  *******************************************************************************
10  *   file name:  spreptst.c
11  *   encoding:   UTF-8
12  *   tab size:   8 (not used)
13  *   indentation:4
14  *
15  *   created on: 2003jul11
16  *   created by: Ram Viswanadha
17  */
18 #include <stdlib.h>
19 #include <string.h>
20 #include "unicode/utypes.h"
21 
22 #if !UCONFIG_NO_IDNA
23 
24 #include "unicode/ustring.h"
25 #include "unicode/usprep.h"
26 #include "cstring.h"
27 #include "cintltst.h"
28 #include "cmemory.h"
29 #include "nfsprep.h"
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
addUStringPrepTest(TestNode ** root)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
Test_nfs4_cs_prep_data(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
Test_nfs4_cis_prep_data(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
Test_nfs4_mixed_prep_data(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
unescapeData(const char * src,int32_t srcLen,char * dest,int32_t destCapacity,UErrorCode * status)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 
Test_nfs4_cis_prep(void)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< UPRV_LENGTHOF(conformanceTestCases);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@slip129-37-118-146.nc.us.ibm.net",
390     "\\u0936\\u094d\\u0930\\u0940\\u092e\\u0926\\u094d@saratoga.pe.utexas.edu",
391     "\\u092d\\u0917\\u0935\\u0926\\u094d\\u0917\\u0940\\u0924\\u093e@dial-120-45.ots.utexas.edu",
392     "\\u0905\\u0927\\u094d\\u092f\\u093e\\u092f@woo-085.dorms.waller.net",
393     "\\u0905\\u0930\\u094d\\u091c\\u0941\\u0928@hd30-049.hil.compuserve.com",
394     "\\u0935\\u093f\\u0937\\u093e\\u0926@pem203-31.pe.ttu.edu",
395     "\\u092f\\u094b\\u0917@56K-227.MaxTNT3.pdq.net",
396     "\\u0927\\u0943\\u0924\\u0930\\u093e\\u0937\\u094d\\u091f\\u094d\\u0930@dial-36-2.ots.utexas.edu",
397     "\\u0909\\u0935\\u093E\\u091A\\u0943@slip129-37-23-152.ga.us.ibm.net",
398     "\\u0927\\u0930\\u094d\\u092e\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947@ts45ip119.cadvision.com",
399     "\\u0915\\u0941\\u0930\\u0941\\u0915\\u094d\\u0937\\u0947\\u0924\\u094d\\u0930\\u0947@sdn-ts-004txaustP05.dialsprint.net",
400     "\\u0938\\u092e\\u0935\\u0947\\u0924\\u093e@bar-tnt1s66.erols.com",
401     "\\u092f\\u0941\\u092f\\u0941\\u0924\\u094d\\u0938\\u0935\\u0903@101.st-louis-15.mo.dial-access.att.net",
402     "\\u092e\\u093e\\u092e\\u0915\\u093e\\u0903@h92-245.Arco.COM",
403     "\\u092a\\u093e\\u0923\\u094d\\u0921\\u0935\\u093e\\u0936\\u094d\\u091a\\u0948\\u0935@dial-13-2.ots.utexas.edu",
404     "\\u0915\\u093f\\u092e\\u0915\\u0941\\u0930\\u094d\\u0935\\u0924@net-redynet29.datamarkets.com.ar",
405     "\\u0938\\u0902\\u091c\\u0935@ccs-shiva28.reacciun.net.ve",
406     "\\u0c30\\u0c18\\u0c41\\u0c30\\u0c3e\\u0c2e\\u0c4d@7.houston-11.tx.dial-access.att.net",
407     "\\u0c35\\u0c3f\\u0c36\\u0c4d\\u0c35\\u0c28\\u0c3e\\u0c27@ingw129-37-120-26.mo.us.ibm.net",
408     "\\u0c06\\u0c28\\u0c02\\u0c26\\u0c4d@dialup6.austintx.com",
409     "\\u0C35\\u0C26\\u0C4D\\u0C26\\u0C3F\\u0C30\\u0C3E\\u0C1C\\u0C41@dns2.tpao.gov.tr",
410     "\\u0c30\\u0c3e\\u0c1c\\u0c40\\u0c35\\u0c4d@slip129-37-119-194.nc.us.ibm.net",
411     "\\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26@cs7.dillons.co.uk.203.119.193.in-addr.arpa",
412     "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c35\\u0c4d@swprd1.innovplace.saskatoon.sk.ca",
413     "\\u0c15\\u0c36\\u0c30\\u0c2c\\u0c3e\\u0c26@bikini.bologna.maraut.it",
414     "\\u0c38\\u0c02\\u0c1c\\u0c40\\u0c2c\\u0c4d@node91.subnet159-198-79.baxter.com",
415     "\\u0c38\\u0c46\\u0c28\\u0c4d\\u0c17\\u0c41\\u0c2a\\u0c4d\\u0c24@cust19.max5.new-york.ny.ms.uu.net",
416     "\\u0c05\\u0c2e\\u0c30\\u0c47\\u0c02\\u0c26\\u0c4d\\u0c30@balexander.slip.andrew.cmu.edu",
417     "\\u0c39\\u0c28\\u0c41\\u0c2e\\u0c3e\\u0c28\\u0c41\\u0c32@pool029.max2.denver.co.dynip.alter.net",
418     "\\u0c30\\u0c35\\u0c3f@cust49.max9.new-york.ny.ms.uu.net",
419     "\\u0c15\\u0c41\\u0c2e\\u0c3e\\u0c30\\u0c4d@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
Test_nfs4_mixed_prep(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< UPRV_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@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
Test_nfs4_cs_prep(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 
TestBEAMWarning()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 
TestCoverage(void)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 
getTypeFromProfileName(const char * profileName)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 }
TestStringPrepProfiles(void)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 < UPRV_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