• 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  * 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