1 /* tst_tld.c --- Self tests for tld_*().
2 * Copyright (C) 2004-2016 Simon Josefsson
3 *
4 * This file is part of GNU Libidn.
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21 #ifdef HAVE_CONFIG_H
22 # include "config.h"
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <stdarg.h>
28 #include <string.h>
29
30 #include <stringprep.h>
31 #include <idn-free.h>
32 #include <tld.h>
33
34 #include "utils.h"
35
36 struct tld
37 {
38 const char *name;
39 const char *tld;
40 const char *example;
41 size_t inlen;
42 uint32_t in[100];
43 int rc;
44 size_t errpos;
45 };
46
47 static const struct tld tld[] = {
48 {
49 "Simple valid French domain",
50 "fr",
51 "example.fr",
52 3,
53 {0x00E0, 0x00E2, 0x00E6},
54 TLD_SUCCESS},
55 {
56 "Simple invalid French domain",
57 "fr",
58 "ªexample.fr",
59 5,
60 {0x00E0, 0x00E2, 0x00E6, 0x4711, 0x0042},
61 TLD_INVALID,
62 3}
63 };
64
65 static const Tld_table _tld_fr_override =
66 {
67 "fr",
68 "2.0",
69 0,
70 NULL
71 };
72
73 /* Main array */
74 const Tld_table * my_tld_tables[] =
75 {
76 &_tld_fr_override,
77 NULL
78 };
79
80 void
doit(void)81 doit (void)
82 {
83 unsigned i;
84 const Tld_table *tldtable;
85 char *out;
86 size_t errpos;
87 int rc;
88
89 tldtable = tld_get_table (NULL, NULL);
90 if (tldtable != NULL)
91 fail ("FAIL: tld_get_table (NULL, NULL) != NULL\n");
92
93 tldtable = tld_get_table ("nonexisting", NULL);
94 if (tldtable != NULL)
95 fail ("FAIL: tld_get_table (\"nonexisting\", NULL) != NULL\n");
96
97 tldtable = tld_default_table (NULL, NULL);
98 if (tldtable != NULL)
99 fail ("FAIL: tld_default_table (NULL, NULL) != NULL\n");
100
101 tldtable = tld_default_table (NULL, NULL);
102 if (tldtable != NULL)
103 fail ("FAIL: tld_default_table (NULL, NULL) != NULL\n");
104
105 tldtable = tld_default_table ("fr", NULL);
106 if (tldtable == NULL)
107 fail ("FAIL: tld_default_table (\"fr\", NULL) == NULL\n");
108 else if (tldtable->version == NULL)
109 fail ("FAIL: tld_default_table (\"fr\", NULL)->version == NULL\n");
110 else if (tldtable->name && strcmp (tldtable->version, "1.0") != 0)
111 fail ("FAIL: tld_default_table (\"fr\", NULL)->version = \"%s\""
112 " != \"1.0\"\n", tldtable->version);
113
114 tldtable = tld_default_table ("fr", my_tld_tables);
115 if (tldtable == NULL)
116 fail ("FAIL: tld_default_table (\"fr\", NULL) == NULL\n");
117 else if (tldtable->version == NULL)
118 fail ("FAIL: tld_default_table (\"fr\", NULL)->version == NULL\n");
119 else if (tldtable->name && strcmp (tldtable->version, "2.0") != 0)
120 fail ("FAIL: tld_default_table (\"fr\", NULL)->version = \"%s\""
121 " != \"2.0\"\n", tldtable->version);
122
123 rc = tld_get_4 (NULL, 42, &out);
124 if (rc != TLD_NODATA)
125 fail ("FAIL: tld_get_4 (NULL, 42, &out) != TLD_NODATA: %d\n", rc);
126
127 rc = tld_get_4 (tld[0].in, 0, &out);
128 if (rc != TLD_NODATA)
129 fail ("FAIL: tld_get_4 (NULL, 42, &out) != TLD_NODATA: %d\n", rc);
130
131 rc = tld_check_4t (tld[0].in, tld[0].inlen, NULL, NULL);
132 if (rc != TLD_SUCCESS)
133 fail ("FAIL: tld_check_4t (tld=NULL) != TLD_SUCCESS: %d\n", rc);
134
135 rc = tld_check_4z (NULL, NULL, NULL);
136 if (rc != TLD_NODATA)
137 fail ("FAIL: tld_check_4z (NULL) != TLD_NODATA: %d\n", rc);
138
139 rc = tld_check_4z (tld[0].in, NULL, NULL);
140 if (rc != TLD_SUCCESS)
141 fail ("FAIL: tld_check_4z (in) != TLD_SUCCESS: %d\n", rc);
142
143 rc = tld_check_8z (NULL, NULL, NULL);
144 if (rc != TLD_NODATA)
145 fail ("FAIL: tld_check_8z (NULL) != TLD_NODATA: %d\n", rc);
146
147 rc = tld_check_lz (NULL, NULL, NULL);
148 if (rc != TLD_NODATA)
149 fail ("FAIL: tld_check_lz (NULL) != TLD_NODATA: %d\n", rc);
150
151 rc = tld_check_lz ("foo", NULL, NULL);
152 if (rc != TLD_SUCCESS)
153 fail ("FAIL: tld_check_lz (\"foo\") != TLD_SUCCESS: %d\n", rc);
154
155 {
156 uint32_t in[] = { 0x73, 0x6a, 0x64, 0x2e, 0x73, 0x65, 0x00 };
157 const char *p;
158
159 rc = tld_get_4 (in, 6, &out);
160 if (rc != TLD_SUCCESS)
161 fail ("FAIL: tld_get_4 (in, 6, &out) != TLD_OK: %d\n", rc);
162 if (strcmp ("se", out) != 0)
163 fail ("FAIL: tld_get_4 (in, 6, &out): %s\n", out);
164 idn_free (out);
165
166 rc = tld_get_4z (in, &out);
167 if (rc != TLD_SUCCESS)
168 fail ("FAIL: tld_get_4z (in, &out) != TLD_OK: %d\n", rc);
169 if (strcmp ("se", out) != 0)
170 fail ("FAIL: tld_get_4z (in, &out): %s\n", out);
171 idn_free (out);
172
173 p = "sjd.se";
174 rc = tld_get_z (p, &out);
175 if (rc != TLD_SUCCESS)
176 fail ("FAIL: tld_get_z (\"%s\", &out) != TLD_OK: %d\n", p, rc);
177 if (strcmp ("se", out) != 0)
178 fail ("FAIL: tld_get_z (\"%s\", &out): %s\n", p, out);
179 idn_free (out);
180
181 p = "foo.bar.baz.sjd.se";
182 rc = tld_get_z (p, &out);
183 if (rc != TLD_SUCCESS)
184 fail ("FAIL: tld_get_z (\"%s\", &out) != TLD_OK: %d\n", p, rc);
185 if (strcmp ("se", out) != 0)
186 fail ("FAIL: tld_get_z (\"%s\", &out): %s\n", p, out);
187 idn_free (out);
188
189 p = ".sjd.se";
190 rc = tld_get_z (p, &out);
191 if (rc != TLD_SUCCESS)
192 fail ("FAIL: tld_get_z (\"%s\", &out) != TLD_OK: %d\n", p, rc);
193 if (strcmp ("se", out) != 0)
194 fail ("FAIL: tld_get_z (\"%s\", &out): %s\n", p, out);
195 idn_free (out);
196
197 p = ".se";
198 rc = tld_get_z (p, &out);
199 if (rc != TLD_SUCCESS)
200 fail ("FAIL: tld_get_z (\"%s\", &out) != TLD_OK: %d\n", p, rc);
201 if (strcmp ("se", out) != 0)
202 fail ("FAIL: tld_get_z (\"%s\", &out): %s\n", p, out);
203 idn_free (out);
204 }
205
206 for (i = 0; i < sizeof (tld) / sizeof (tld[0]); i++)
207 {
208 if (debug)
209 printf ("TLD entry %u: %s\n", i, tld[i].name);
210
211 if (debug)
212 {
213 printf ("in:\n");
214 ucs4print (tld[i].in, tld[i].inlen);
215 }
216
217 tldtable = tld_default_table (tld[i].tld, NULL);
218 if (tldtable == NULL)
219 {
220 fail ("TLD entry %u tld_get_table (%s)\n", i, tld[i].tld);
221 if (debug)
222 printf ("FATAL\n");
223 continue;
224 }
225
226 rc = tld_check_4t (tld[i].in, tld[i].inlen, &errpos, tldtable);
227 if (rc != tld[i].rc)
228 {
229 fail ("TLD entry %u failed: %d\n", i, rc);
230 if (debug)
231 printf ("FATAL\n");
232 continue;
233 }
234
235 if (debug)
236 printf ("returned %d expected %d\n", rc, tld[i].rc);
237
238 if (rc != tld[i].rc)
239 {
240 fail ("TLD entry %u failed\n", i);
241 if (debug)
242 printf ("ERROR\n");
243 }
244 else if (rc == TLD_INVALID)
245 {
246 if (debug)
247 printf ("returned errpos %ld expected errpos %ld\n",
248 (long) errpos, (long) tld[i].errpos);
249
250 if (tld[i].errpos != errpos)
251 {
252 fail ("TLD entry %u failed because errpos %ld != %ld\n", i,
253 (long) tld[i].errpos, (long) errpos);
254 if (debug)
255 printf ("ERROR\n");
256 }
257 }
258 else if (debug)
259 printf ("OK\n");
260
261 {
262 rc = tld_check_8z (tld[i].example, &errpos, NULL);
263 if (rc != tld[i].rc)
264 {
265 fail ("TLD entry %u failed\n", i);
266 if (debug)
267 printf ("ERROR\n");
268 }
269 if (debug)
270 printf ("TLD entry %u tld_check_8z (%s)\n", i, tld[i].example);
271 }
272 }
273 }
274