d8bef7568de38fbfb2ff1451550e018fe9b30791
[crypto.git] / lib / silcutil / tests / test_silcstrutil.c
1 /* UTF-8 decoding tests */
2 /* Other string util tests too */
3
4 #include "silc.h"
5
6 #define utf8fail(n, data, len)                  \
7 const unsigned char u##n[] = (data);            \
8 int u##n##l = len;
9
10 #define utf8failc(n)                                                          \
11 do {                                                                          \
12   if (!silc_utf8_valid(u##n, u##n##l))                                        \
13     SILC_LOG_DEBUG(("%d: not valid UTF-8, correctly detected, no error", n)); \
14   else {                                                                      \
15     SILC_LOG_DEBUG(("%d: parser did not detect malformed UTF-8, error", n));  \
16     goto err;                                                                 \
17   }                                                                           \
18 } while(0)
19
20 /* UTF-8 Test vectors that MUST fail */
21 utf8fail(1, "\x80", 1);
22 utf8fail(2, "\xbf", 1);
23 utf8fail(3, "\xfe", 1);
24 utf8fail(4, "\xff", 1);
25 utf8fail(5, "\xfe\xfe\xff\xff", 4);
26 utf8fail(6, "\xc0\xa0", 2);
27 utf8fail(7, "\xe0\x80\xaf", 3);
28 utf8fail(8, "\xf0\x80\x80\xaf", 4);
29 utf8fail(9, "\xf8\x80\x80\x80\xaf", 5);
30 utf8fail(10, "\xfc\x80\x80\x80\x80\xaf", 6);
31 utf8fail(11, "\xc0\x80", 2);
32 utf8fail(12, "\xe0\x80\x80", 3);
33 utf8fail(13, "\xf0\x80\x80\x80", 4);
34 utf8fail(14, "\xf8\x80\x80\x80\x80", 5);
35 utf8fail(15, "\xfc\x80\x80\x80\x80\x80", 6);
36 utf8fail(16, "\xc1\xbf", 2);
37 utf8fail(17, "\xe0\x9f\xbf", 3);
38 utf8fail(18, "\xf0\x8f\xbf\xbf", 4);
39 utf8fail(19, "\xf8\x87\xbf\xbf\xbf", 5);
40 utf8fail(20, "\xfc\x83\xbf\xbf\xbf\xbf", 6);
41 utf8fail(21, "\xed\xa0\x80", 3);
42 utf8fail(22, "\xed\xad\xbf", 3);
43 utf8fail(23, "\xed\xae\x80", 3);
44 utf8fail(24, "\xed\xaf\xbf", 3);
45 utf8fail(25, "\xed\xb0\x80", 3);
46 utf8fail(26, "\xed\xbe\x80", 3);
47 utf8fail(27, "\xed\xbf\xbf", 3);
48 utf8fail(28, "\xfc\x20\xfd\x20", 4);
49 utf8fail(29, "\xf8\xf9\xfa\xfb", 4);
50 utf8fail(30, "\xf0\x20\xf9\x20\xfa\x20\xfb\x20", 8);
51
52 int main(int argc, char **argv)
53 {
54   SilcBool success = FALSE;
55   unsigned char *s1, *s2, *s3, *s4;
56   unsigned char t[16];
57   char h[32 + 1];
58   int l, opt, i;
59   SilcUInt32 len;
60
61   while ((opt = getopt(argc, argv, "hVd:")) != EOF) {
62       switch(opt) {
63         case 'h':
64           printf("usage: test_silcstrutil\n");
65           exit(0);
66           break;
67         case 'V':
68           printf("Secure Internet Live Conferencing\n");
69           exit(0);
70           break;
71         case 'd':
72           silc_log_debug(TRUE);
73           silc_log_debug_hexdump(TRUE);
74           silc_log_quick(TRUE);
75           if (optarg)
76             silc_log_set_debug_string(optarg);
77           else
78             silc_log_set_debug_string("*strutil*");
79           break;
80         default:
81           exit(1);
82           break;
83       }
84   }
85
86   /* Failure tests */
87   utf8failc(1);  utf8failc(2);
88   utf8failc(3);  utf8failc(4);
89   utf8failc(5);  utf8failc(6);
90   utf8failc(7);  utf8failc(8);
91   utf8failc(9);  utf8failc(10);
92   utf8failc(11);  utf8failc(12);
93   utf8failc(13);  utf8failc(14);
94   utf8failc(15);  utf8failc(16);
95   utf8failc(17);  utf8failc(18);
96   utf8failc(19);  utf8failc(20);
97   utf8failc(21);  utf8failc(22);
98   utf8failc(23);  utf8failc(24);
99   utf8failc(25);  utf8failc(26);
100   utf8failc(27);  utf8failc(28);
101   utf8failc(29);  utf8failc(30);
102
103   /* LDAP DN simple test */
104   s1 = "#&?*Pekka, \\Riikonen, <foobar@foobar.com>\xc4\x8d\\ ";
105   SILC_LOG_DEBUG(("s1 = %s", s1));
106
107   /* To LDAP DN */
108   l = silc_utf8_decoded_len(s1, strlen(s1), SILC_STRING_LDAP_DN);
109   if (!l)
110     goto err;
111   s3 = silc_calloc(l + 1, sizeof(*s3));
112   silc_utf8_decode(s1, strlen(s1), SILC_STRING_LDAP_DN, s3, l);
113   SILC_LOG_DEBUG(("ldapdn = %s", s3));
114
115   /* To UTF-8 */
116   l = silc_utf8_encoded_len(s3, strlen(s3), SILC_STRING_LDAP_DN);
117   if (!l)
118     goto err;  
119   s4 = silc_calloc(l + 1, sizeof(*s4));
120   silc_utf8_encode(s3, strlen(s3), SILC_STRING_LDAP_DN, s4, l);
121   SILC_LOG_DEBUG(("utf8 = %s", s4));
122
123   if (memcmp(s4, s1, strlen(s4))) {
124     SILC_LOG_DEBUG(("UTF-8 mismatch"));
125     goto err;
126   }
127   silc_free(s3);
128   silc_free(s4);
129
130   /* UTF-8 strcasecmp test */
131   SILC_LOG_DEBUG(("silc_utf8_strcasecmp test"));
132   s1 = "Päivää vuan Yrjö";
133   s2 = "PÄIVÄÄ VUAN YRJÖ";
134   l = silc_utf8_encoded_len(s1, strlen(s1), SILC_STRING_LOCALE);
135   if (!l)
136     goto err;  
137   s3 = silc_calloc(l + 1, sizeof(*s3));
138   silc_utf8_encode(s1, strlen(s1), SILC_STRING_LOCALE, s3, l);
139
140   l = silc_utf8_encoded_len(s2, strlen(s2), SILC_STRING_LOCALE);
141   if (!l)
142     goto err;  
143   s4 = silc_calloc(l + 1, sizeof(*s4));
144   silc_utf8_encode(s2, strlen(s2), SILC_STRING_LOCALE, s4, l);
145
146   SILC_LOG_DEBUG(("%s == %s", s3, s4));
147   if (!silc_utf8_strcasecmp(s3, s4)) {
148     SILC_LOG_DEBUG(("mismatch"));
149     goto err;
150   }
151   SILC_LOG_DEBUG(("match"));
152
153   silc_free(s3);
154   silc_free(s4);
155
156   /* Regex test */
157   SILC_LOG_DEBUG(("Simple regex test"));
158   s1 = "foo,bar,silc,com";
159   SILC_LOG_DEBUG(("Find 'silc' from %s", s1));
160   if (!silc_string_match(s1, "silc"))
161     goto err;
162   SILC_LOG_DEBUG(("Regex match"));
163   SILC_LOG_DEBUG(("Find 'foobar' from %s", s1));
164   if (silc_string_match(s1, "foobar"))
165     goto err;
166   SILC_LOG_DEBUG(("Regex not found (Ok)"));
167
168   /* HEX to data, data to HEX tests */
169   for (i = 0; i < sizeof(t); i++)
170     t[i] = i;
171   silc_data2hex(t, sizeof(t), h, sizeof(h));
172   silc_hex2data(h, t, sizeof(t), &len);
173   silc_snprintf(h, sizeof(h), "010203ffabdef9ab");
174   silc_hex2data(h, t, sizeof(t), &len);
175   silc_data2hex(t, sizeof(t), h, sizeof(h));
176
177   success = TRUE;
178
179  err:
180   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
181   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
182
183   return success;
184 }