1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /********************************************************************
4 * COPYRIGHT:
5 * Copyright (c) 2009-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 ********************************************************************/
8 /********************************************************************************
9 *
10 * File spooftest.c
11 *
12 *********************************************************************************/
13 /*C API TEST for the uspoof Unicode Indentifier Spoofing and Security API */
14 /**
15 * This is an API test for ICU spoof detection in plain C. It doesn't test very many cases, and doesn't
16 * try to test the full functionality. It just calls each function and verifies that it
17 * works on a basic level.
18 *
19 * More complete testing of spoof detection functionality is done with the C++ tests.
20 **/
21
22 #include "unicode/utypes.h"
23 #if !UCONFIG_NO_REGULAR_EXPRESSIONS && !UCONFIG_NO_NORMALIZATION
24
25 #include <stdlib.h>
26 #include <stdio.h>
27 #include <string.h>
28 #include "unicode/uspoof.h"
29 #include "unicode/ustring.h"
30 #include "unicode/uset.h"
31 #include "cintltst.h"
32 #include "cmemory.h"
33
34 #define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
35 log_err_status(status, "Failure at file %s, line %d, error = %s\n", __FILE__, __LINE__, u_errorName(status));}}
36
37 #define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
38 log_err("Test Failure at file %s, line %d: \"%s\" is false.\n", __FILE__, __LINE__, #expr);};}
39
40 #define TEST_ASSERT_EQ(a, b) { if ((a) != (b)) { \
41 log_err("Test Failure at file %s, line %d: \"%s\" (%d) != \"%s\" (%d) \n", \
42 __FILE__, __LINE__, #a, (a), #b, (b)); }}
43
44 #define TEST_ASSERT_NE(a, b) { if ((a) == (b)) { \
45 log_err("Test Failure at file %s, line %d: \"%s\" (%d) == \"%s\" (%d) \n", \
46 __FILE__, __LINE__, #a, (a), #b, (b)); }}
47
48
49 /*
50 * TEST_SETUP and TEST_TEARDOWN
51 * macros to handle the boilerplate around setting up test case.
52 * Put arbitrary test code between SETUP and TEARDOWN.
53 * "sc" is the ready-to-go SpoofChecker for use in the tests.
54 */
55 #define TEST_SETUP { \
56 UErrorCode status = U_ZERO_ERROR; \
57 USpoofChecker *sc; \
58 sc = uspoof_open(&status); \
59 TEST_ASSERT_SUCCESS(status); \
60 if (U_SUCCESS(status)){
61
62 #define TEST_TEARDOWN \
63 } \
64 TEST_ASSERT_SUCCESS(status); \
65 uspoof_close(sc); \
66 }
67
68 static void TestOpenFromSource(void);
69 static void TestUSpoofCAPI(void);
70
71 void addUSpoofTest(TestNode** root);
72
addUSpoofTest(TestNode ** root)73 void addUSpoofTest(TestNode** root)
74 {
75 #if !UCONFIG_NO_FILE_IO
76 addTest(root, &TestOpenFromSource, "uspoof/TestOpenFromSource");
77 #endif
78 addTest(root, &TestUSpoofCAPI, "uspoof/TestUSpoofCAPI");
79 }
80
81 /*
82 * Identifiers for verifying that spoof checking is minimally alive and working.
83 */
84 const UChar goodLatin[] = {(UChar)0x75, (UChar)0x7a, 0}; /* "uz", all ASCII */
85 /* (not confusable) */
86 const UChar scMixed[] = {(UChar)0x73, (UChar)0x0441, 0}; /* "sc", with Cyrillic 'c' */
87 /* (mixed script, confusable */
88
89 const UChar scLatin[] = {(UChar)0x73, (UChar)0x63, 0}; /* "sc", plain ascii. */
90 const UChar goodCyrl[] = {(UChar)0x438, (UChar)0x43B, 0}; /* Plain lower case Cyrillic letters,
91 no latin confusables */
92
93 const UChar goodGreek[] = {(UChar)0x3c0, (UChar)0x3c6, 0}; /* Plain lower case Greek letters */
94
95 const UChar lll_Latin_a[] = {(UChar)0x6c, (UChar)0x49, (UChar)0x31, 0}; /* lI1, all ASCII */
96
97 /* Full-width I, Small Roman Numeral fifty, Latin Cap Letter IOTA*/
98 const UChar lll_Latin_b[] = {(UChar)0xff29, (UChar)0x217c, (UChar)0x196, 0};
99
100 const UChar lll_Cyrl[] = {(UChar)0x0406, (UChar)0x04C0, (UChar)0x31, 0};
101
102 /* The skeleton transform for all of thes 'lll' lookalikes is all lower case l. */
103 const UChar lll_Skel[] = {(UChar)0x6c, (UChar)0x6c, (UChar)0x6c, 0};
104
105 const UChar han_Hiragana[] = {(UChar)0x3086, (UChar)0x308A, (UChar)0x0020, (UChar)0x77F3, (UChar)0x7530, 0};
106
107 /* Provide better code coverage */
108 const char goodLatinUTF8[] = {0x75, 0x77, 0};
109
110 // Test open from source rules.
111 // Run this in isolation to verify initialization.
TestOpenFromSource()112 static void TestOpenFromSource() {
113 // No TEST_SETUP because that calls uspoof_open().
114 UErrorCode status = U_ZERO_ERROR;
115 const char *dataSrcDir;
116 char *fileName;
117 char *confusables;
118 int confusablesLength = 0;
119 char *confusablesWholeScript;
120 int confusablesWholeScriptLength = 0;
121 FILE *f;
122 UParseError pe;
123 int32_t errType;
124 int32_t checkResults;
125 USpoofChecker *rsc;
126
127 dataSrcDir = ctest_dataSrcDir();
128 fileName = malloc(strlen(dataSrcDir) + 100);
129 strcpy(fileName, dataSrcDir);
130 strcat(fileName, U_FILE_SEP_STRING "unidata" U_FILE_SEP_STRING "confusables.txt");
131 f = fopen(fileName, "rb");
132 TEST_ASSERT_NE(f, NULL);
133 confusables = malloc(3000000);
134 if (f != NULL) {
135 confusablesLength = fread(confusables, 1, 3000000, f);
136 fclose(f);
137 }
138
139 strcpy(fileName, dataSrcDir);
140 strcat(fileName, U_FILE_SEP_STRING "unidata" U_FILE_SEP_STRING "confusablesWholeScript.txt");
141 f = fopen(fileName, "rb");
142 TEST_ASSERT_NE(f, NULL);
143 confusablesWholeScript = malloc(1000000);
144 if (f != NULL) {
145 confusablesWholeScriptLength = fread(confusablesWholeScript, 1, 1000000, f);
146 fclose(f);
147 }
148
149 rsc = uspoof_openFromSource(confusables, confusablesLength,
150 confusablesWholeScript, confusablesWholeScriptLength,
151 &errType, &pe, &status);
152 TEST_ASSERT_SUCCESS(status);
153
154 // Ticket #11860: uspoof_openFromSource() did not initialize for use.
155 // Verify that the spoof checker does not crash.
156 checkResults = uspoof_check(rsc, goodLatin, -1, NULL, &status);
157 TEST_ASSERT_SUCCESS(status);
158 TEST_ASSERT_EQ(0, checkResults);
159
160 free(confusablesWholeScript);
161 free(confusables);
162 free(fileName);
163 uspoof_close(rsc);
164 /* printf("ParseError Line is %d\n", pe.line); */
165 }
166
167 /*
168 * Spoof Detection C API Tests
169 */
TestUSpoofCAPI(void)170 static void TestUSpoofCAPI(void) {
171
172 /*
173 * basic uspoof_open().
174 */
175 {
176 USpoofChecker *sc;
177 UErrorCode status = U_ZERO_ERROR;
178 sc = uspoof_open(&status);
179 TEST_ASSERT_SUCCESS(status);
180 if (U_FAILURE(status)) {
181 /* If things are so broken that we can't even open a default spoof checker, */
182 /* don't even try the rest of the tests. They would all fail. */
183 return;
184 }
185 uspoof_close(sc);
186 }
187
188 /*
189 * openFromSerialized and serialize
190 */
191 TEST_SETUP
192 int32_t serializedSize = 0;
193 int32_t actualLength = 0;
194 char *buf;
195 USpoofChecker *sc2;
196 int32_t checkResults;
197
198
199 serializedSize = uspoof_serialize(sc, NULL, 0, &status);
200 TEST_ASSERT_EQ(status, U_BUFFER_OVERFLOW_ERROR);
201 TEST_ASSERT(serializedSize > 0);
202
203 /* Serialize the default spoof checker */
204 status = U_ZERO_ERROR;
205 buf = (char *)malloc(serializedSize + 10);
206 TEST_ASSERT(buf != NULL);
207 buf[serializedSize] = 42;
208 uspoof_serialize(sc, buf, serializedSize, &status);
209 TEST_ASSERT_SUCCESS(status);
210 TEST_ASSERT_EQ(42, buf[serializedSize]);
211
212 /* Create a new spoof checker from the freshly serialized data */
213 sc2 = uspoof_openFromSerialized(buf, serializedSize+10, &actualLength, &status);
214 TEST_ASSERT_SUCCESS(status);
215 TEST_ASSERT_NE(NULL, sc2);
216 TEST_ASSERT_EQ(serializedSize, actualLength);
217
218 /* Verify that the new spoof checker at least wiggles */
219 checkResults = uspoof_check(sc2, goodLatin, -1, NULL, &status);
220 TEST_ASSERT_SUCCESS(status);
221 TEST_ASSERT_EQ(0, checkResults);
222
223 checkResults = uspoof_check(sc2, scMixed, -1, NULL, &status);
224 TEST_ASSERT_SUCCESS(status);
225 TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT, checkResults);
226
227 uspoof_close(sc2);
228 free(buf);
229 TEST_TEARDOWN;
230
231
232
233 /*
234 * Set & Get Check Flags
235 */
236 TEST_SETUP
237 int32_t t;
238 uspoof_setChecks(sc, USPOOF_ALL_CHECKS, &status);
239 TEST_ASSERT_SUCCESS(status);
240 t = uspoof_getChecks(sc, &status);
241 TEST_ASSERT_EQ(t, USPOOF_ALL_CHECKS);
242
243 uspoof_setChecks(sc, 0, &status);
244 TEST_ASSERT_SUCCESS(status);
245 t = uspoof_getChecks(sc, &status);
246 TEST_ASSERT_EQ(0, t);
247
248 uspoof_setChecks(sc,
249 USPOOF_WHOLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_ANY_CASE,
250 &status);
251 TEST_ASSERT_SUCCESS(status);
252 t = uspoof_getChecks(sc, &status);
253 TEST_ASSERT_SUCCESS(status);
254 TEST_ASSERT_EQ(USPOOF_WHOLE_SCRIPT_CONFUSABLE | USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_ANY_CASE, t);
255 TEST_TEARDOWN;
256
257 /*
258 * get & setAllowedChars
259 */
260 TEST_SETUP
261 USet *us;
262 const USet *uset;
263
264 uset = uspoof_getAllowedChars(sc, &status);
265 TEST_ASSERT_SUCCESS(status);
266 TEST_ASSERT(uset_isFrozen(uset));
267 us = uset_open((UChar32)0x41, (UChar32)0x5A); /* [A-Z] */
268 uspoof_setAllowedChars(sc, us, &status);
269 TEST_ASSERT_SUCCESS(status);
270 TEST_ASSERT_NE(us, uspoof_getAllowedChars(sc, &status));
271 TEST_ASSERT(uset_equals(us, uspoof_getAllowedChars(sc, &status)));
272 TEST_ASSERT_SUCCESS(status);
273 uset_close(us);
274 TEST_TEARDOWN;
275
276 /*
277 * clone()
278 */
279
280 TEST_SETUP
281 USpoofChecker *clone1 = NULL;
282 USpoofChecker *clone2 = NULL;
283 int32_t checkResults = 0;
284
285 clone1 = uspoof_clone(sc, &status);
286 TEST_ASSERT_SUCCESS(status);
287 TEST_ASSERT_NE(clone1, sc);
288
289 clone2 = uspoof_clone(clone1, &status);
290 TEST_ASSERT_SUCCESS(status);
291 TEST_ASSERT_NE(clone2, clone1);
292
293 uspoof_close(clone1);
294
295 /* Verify that the cloned spoof checker is alive */
296 checkResults = uspoof_check(clone2, goodLatin, -1, NULL, &status);
297 TEST_ASSERT_SUCCESS(status);
298 TEST_ASSERT_EQ(0, checkResults);
299
300 checkResults = uspoof_check(clone2, scMixed, -1, NULL, &status);
301 TEST_ASSERT_SUCCESS(status);
302 TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT, checkResults);
303 uspoof_close(clone2);
304 TEST_TEARDOWN;
305
306 /*
307 * basic uspoof_check()
308 */
309 TEST_SETUP
310 int32_t result;
311 result = uspoof_check(sc, goodLatin, -1, NULL, &status);
312 TEST_ASSERT_SUCCESS(status);
313 TEST_ASSERT_EQ(0, result);
314
315 result = uspoof_check(sc, han_Hiragana, -1, NULL, &status);
316 TEST_ASSERT_SUCCESS(status);
317 TEST_ASSERT_EQ(0, result);
318
319 result = uspoof_check(sc, scMixed, -1, NULL, &status);
320 TEST_ASSERT_SUCCESS(status);
321 TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT, result);
322 TEST_TEARDOWN
323
324
325 /*
326 * get & set Checks
327 */
328 TEST_SETUP
329 int32_t checks;
330 int32_t checks2;
331 int32_t checkResults;
332
333 checks = uspoof_getChecks(sc, &status);
334 TEST_ASSERT_SUCCESS(status);
335 TEST_ASSERT_EQ(USPOOF_ALL_CHECKS, checks);
336
337 checks &= ~(USPOOF_SINGLE_SCRIPT | USPOOF_MIXED_SCRIPT_CONFUSABLE);
338 uspoof_setChecks(sc, checks, &status);
339 TEST_ASSERT_SUCCESS(status);
340 checks2 = uspoof_getChecks(sc, &status);
341 TEST_ASSERT_EQ(checks, checks2);
342
343 /* The checks that were disabled just above are the same ones that the "scMixed" test fails.
344 So with those tests gone checking that Identifier should now succeed */
345 checkResults = uspoof_check(sc, scMixed, -1, NULL, &status);
346 TEST_ASSERT_SUCCESS(status);
347 TEST_ASSERT_EQ(0, checkResults);
348 TEST_TEARDOWN;
349
350 /*
351 * AllowedLoacles
352 */
353
354 TEST_SETUP
355 const char *allowedLocales;
356 int32_t checkResults;
357
358 /* Default allowed locales list should be empty */
359 allowedLocales = uspoof_getAllowedLocales(sc, &status);
360 TEST_ASSERT_SUCCESS(status);
361 TEST_ASSERT(strcmp("", allowedLocales) == 0)
362
363 /* Allow en and ru, which should enable Latin and Cyrillic only to pass */
364 uspoof_setAllowedLocales(sc, "en, ru_RU", &status);
365 TEST_ASSERT_SUCCESS(status);
366 allowedLocales = uspoof_getAllowedLocales(sc, &status);
367 TEST_ASSERT_SUCCESS(status);
368 TEST_ASSERT(strstr(allowedLocales, "en") != NULL);
369 TEST_ASSERT(strstr(allowedLocales, "ru") != NULL);
370
371 /* Limit checks to USPOOF_CHAR_LIMIT. Some of the test data has whole script confusables also,
372 * which we don't want to see in this test. */
373 uspoof_setChecks(sc, USPOOF_CHAR_LIMIT, &status);
374 TEST_ASSERT_SUCCESS(status);
375
376 checkResults = uspoof_check(sc, goodLatin, -1, NULL, &status);
377 TEST_ASSERT_SUCCESS(status);
378 TEST_ASSERT_EQ(0, checkResults);
379
380 checkResults = uspoof_check(sc, goodGreek, -1, NULL, &status);
381 TEST_ASSERT_SUCCESS(status);
382 TEST_ASSERT_EQ(USPOOF_CHAR_LIMIT, checkResults);
383
384 checkResults = uspoof_check(sc, goodCyrl, -1, NULL, &status);
385 TEST_ASSERT_SUCCESS(status);
386 TEST_ASSERT_EQ(0, checkResults);
387
388 /* Reset with an empty locale list, which should allow all characters to pass */
389 uspoof_setAllowedLocales(sc, " ", &status);
390 TEST_ASSERT_SUCCESS(status);
391
392 checkResults = uspoof_check(sc, goodGreek, -1, NULL, &status);
393 TEST_ASSERT_SUCCESS(status);
394 TEST_ASSERT_EQ(0, checkResults);
395 TEST_TEARDOWN;
396
397 /*
398 * AllowedChars set/get the USet of allowed characters.
399 */
400 TEST_SETUP
401 const USet *set;
402 USet *tmpSet;
403 int32_t checkResults;
404
405 /* By default, we should see no restriction; the USet should allow all characters. */
406 set = uspoof_getAllowedChars(sc, &status);
407 TEST_ASSERT_SUCCESS(status);
408 tmpSet = uset_open(0, 0x10ffff);
409 TEST_ASSERT(uset_equals(tmpSet, set));
410
411 /* Setting the allowed chars should enable the check. */
412 uspoof_setChecks(sc, USPOOF_ALL_CHECKS & ~USPOOF_CHAR_LIMIT, &status);
413 TEST_ASSERT_SUCCESS(status);
414
415 /* Remove a character that is in our good Latin test identifier from the allowed chars set. */
416 uset_remove(tmpSet, goodLatin[1]);
417 uspoof_setAllowedChars(sc, tmpSet, &status);
418 TEST_ASSERT_SUCCESS(status);
419 uset_close(tmpSet);
420
421 /* Latin Identifier should now fail; other non-latin test cases should still be OK
422 * Note: fail of CHAR_LIMIT also causes the restriction level to be USPOOF_UNRESTRICTIVE
423 * which will give us a USPOOF_RESTRICTION_LEVEL failure.
424 */
425 checkResults = uspoof_check(sc, goodLatin, -1, NULL, &status);
426 TEST_ASSERT_SUCCESS(status);
427 TEST_ASSERT_EQ(USPOOF_CHAR_LIMIT | USPOOF_RESTRICTION_LEVEL, checkResults);
428
429 checkResults = uspoof_check(sc, goodGreek, -1, NULL, &status);
430 TEST_ASSERT_SUCCESS(status);
431 TEST_ASSERT_EQ(0, checkResults);
432 TEST_TEARDOWN;
433
434 /*
435 * check UTF-8
436 */
437 TEST_SETUP
438 char utf8buf[200];
439 int32_t checkResults, checkResults2;
440 int32_t position;
441
442 u_strToUTF8(utf8buf, sizeof(utf8buf), NULL, goodLatin, -1, &status);
443 TEST_ASSERT_SUCCESS(status);
444 position = 666;
445 checkResults = uspoof_checkUTF8(sc, utf8buf, -1, &position, &status);
446 TEST_ASSERT_SUCCESS(status);
447 TEST_ASSERT_EQ(0, checkResults);
448 TEST_ASSERT_EQ(0, position);
449
450 u_strToUTF8(utf8buf, sizeof(utf8buf), NULL, goodCyrl, -1, &status);
451 TEST_ASSERT_SUCCESS(status);
452 checkResults = uspoof_checkUTF8(sc, utf8buf, -1, &position, &status);
453 TEST_ASSERT_SUCCESS(status);
454 TEST_ASSERT_EQ(0, checkResults);
455
456 u_strToUTF8(utf8buf, sizeof(utf8buf), NULL, scMixed, -1, &status);
457 TEST_ASSERT_SUCCESS(status);
458 position = 666;
459 checkResults = uspoof_checkUTF8(sc, utf8buf, -1, &position, &status);
460 checkResults2 = uspoof_check(sc, scMixed, -1, NULL, &status);
461 TEST_ASSERT_SUCCESS(status);
462 TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT , checkResults);
463 TEST_ASSERT_EQ(0, position);
464 TEST_ASSERT_EQ(checkResults , checkResults2);
465
466 TEST_TEARDOWN;
467
468 /*
469 * uspoof_check2 variants
470 */
471 TEST_SETUP
472 int32_t result1, result2;
473 char utf8buf[200];
474 uspoof_setChecks(sc, USPOOF_ALL_CHECKS | USPOOF_AUX_INFO, &status);
475 USpoofCheckResult* checkResult = uspoof_openCheckResult(&status);
476 TEST_ASSERT_SUCCESS(status);
477
478 const UChar* tests[] = { goodLatin, scMixed, scLatin,
479 goodCyrl, goodGreek, lll_Latin_a, lll_Latin_b, han_Hiragana };
480
481 for (int32_t i=0; i<UPRV_LENGTHOF(tests); i++) {
482 const UChar* str = tests[i];
483
484 // Basic test
485 result1 = uspoof_check(sc, str, -1, NULL, &status);
486 result2 = uspoof_check2(sc, str, -1, NULL, &status);
487 TEST_ASSERT_SUCCESS(status);
488 TEST_ASSERT_EQ(result1, result2);
489
490 // With check result parameter
491 result1 = uspoof_check(sc, str, -1, NULL, &status);
492 result2 = uspoof_check2(sc, str, -1, checkResult, &status);
493 TEST_ASSERT_SUCCESS(status);
494 TEST_ASSERT_EQ(result1, result2);
495
496 // Checks from checkResult should be same as those from bitmask
497 TEST_ASSERT_EQ(result1 & USPOOF_ALL_CHECKS, uspoof_getCheckResultChecks(checkResult, &status));
498
499 // Restriction level from checkResult should be same as that from bitmask
500 URestrictionLevel restrictionLevel = uspoof_getCheckResultRestrictionLevel(checkResult, &status);
501 TEST_ASSERT_EQ(result1 & restrictionLevel, restrictionLevel);
502
503 // UTF8 endpoint
504 u_strToUTF8(utf8buf, sizeof(utf8buf), NULL, goodLatin, -1, &status);
505 TEST_ASSERT_SUCCESS(status);
506 result1 = uspoof_checkUTF8(sc, utf8buf, -1, NULL, &status);
507 result2 = uspoof_check2UTF8(sc, utf8buf, -1, NULL, &status);
508 TEST_ASSERT_SUCCESS(status);
509 TEST_ASSERT_EQ(result1, result2);
510 }
511
512 uspoof_closeCheckResult(checkResult);
513 TEST_TEARDOWN;
514
515 /*
516 * uspoof_areConfusable()
517 */
518 TEST_SETUP
519 int32_t checkResults;
520
521 checkResults = uspoof_areConfusable(sc, scLatin, -1, scMixed, -1, &status);
522 TEST_ASSERT_SUCCESS(status);
523 TEST_ASSERT_EQ(USPOOF_MIXED_SCRIPT_CONFUSABLE, checkResults);
524
525 checkResults = uspoof_areConfusable(sc, goodGreek, -1, scLatin, -1, &status);
526 TEST_ASSERT_SUCCESS(status);
527 TEST_ASSERT_EQ(0, checkResults);
528
529 checkResults = uspoof_areConfusable(sc, lll_Latin_a, -1, lll_Latin_b, -1, &status);
530 TEST_ASSERT_SUCCESS(status);
531 TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT_CONFUSABLE, checkResults);
532
533 TEST_TEARDOWN;
534
535 /*
536 * areConfusableUTF8
537 */
538 TEST_SETUP
539 int32_t checkResults;
540 char s1[200];
541 char s2[200];
542
543
544 u_strToUTF8(s1, sizeof(s1), NULL, scLatin, -1, &status);
545 u_strToUTF8(s2, sizeof(s2), NULL, scMixed, -1, &status);
546 TEST_ASSERT_SUCCESS(status);
547 checkResults = uspoof_areConfusableUTF8(sc, s1, -1, s2, -1, &status);
548 TEST_ASSERT_SUCCESS(status);
549 TEST_ASSERT_EQ(USPOOF_MIXED_SCRIPT_CONFUSABLE, checkResults);
550
551 u_strToUTF8(s1, sizeof(s1), NULL, goodGreek, -1, &status);
552 u_strToUTF8(s2, sizeof(s2), NULL, scLatin, -1, &status);
553 TEST_ASSERT_SUCCESS(status);
554 checkResults = uspoof_areConfusableUTF8(sc, s1, -1, s2, -1, &status);
555 TEST_ASSERT_SUCCESS(status);
556 TEST_ASSERT_EQ(0, checkResults);
557
558 u_strToUTF8(s1, sizeof(s1), NULL, lll_Latin_a, -1, &status);
559 u_strToUTF8(s2, sizeof(s2), NULL, lll_Latin_b, -1, &status);
560 TEST_ASSERT_SUCCESS(status);
561 checkResults = uspoof_areConfusableUTF8(sc, s1, -1, s2, -1, &status);
562 TEST_ASSERT_SUCCESS(status);
563 TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT_CONFUSABLE, checkResults);
564
565 TEST_TEARDOWN;
566
567
568 /*
569 * getSkeleton
570 */
571
572 TEST_SETUP
573 UChar dest[100];
574 int32_t skelLength;
575
576 skelLength = uspoof_getSkeleton(sc, USPOOF_ANY_CASE, lll_Latin_a, -1, dest, UPRV_LENGTHOF(dest), &status);
577 TEST_ASSERT_SUCCESS(status);
578 TEST_ASSERT_EQ(0, u_strcmp(lll_Skel, dest));
579 TEST_ASSERT_EQ(u_strlen(lll_Skel), skelLength);
580
581 skelLength = uspoof_getSkeletonUTF8(sc, USPOOF_ANY_CASE, goodLatinUTF8, -1, (char*)dest,
582 UPRV_LENGTHOF(dest), &status);
583 TEST_ASSERT_SUCCESS(status);
584
585 skelLength = uspoof_getSkeleton(sc, USPOOF_ANY_CASE, lll_Latin_a, -1, NULL, 0, &status);
586 TEST_ASSERT_EQ(U_BUFFER_OVERFLOW_ERROR, status);
587 TEST_ASSERT_EQ(3, skelLength);
588 status = U_ZERO_ERROR;
589
590 TEST_TEARDOWN;
591
592 /*
593 * get Inclusion and Recommended sets
594 */
595 TEST_SETUP
596 const USet *inclusions = NULL;
597 const USet *recommended = NULL;
598
599 inclusions = uspoof_getInclusionSet(&status);
600 TEST_ASSERT_SUCCESS(status);
601 TEST_ASSERT_EQ(TRUE, uset_isFrozen(inclusions));
602
603 status = U_ZERO_ERROR;
604 recommended = uspoof_getRecommendedSet(&status);
605 TEST_ASSERT_SUCCESS(status);
606 TEST_ASSERT_EQ(TRUE, uset_isFrozen(recommended));
607 TEST_TEARDOWN;
608
609 }
610
611 #endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */
612