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