pacemaker 3.0.1-16e74fc4da
Scalable High-Availability cluster resource manager
Loading...
Searching...
No Matches
pcmk__xml_is_name_char_test.c
Go to the documentation of this file.
1/*
2 * Copyright 2024 the Pacemaker project contributors
3 *
4 * The version control history for this file may have further details.
5 *
6 * This source code is licensed under the GNU General Public License version 2
7 * or later (GPLv2+) WITHOUT ANY WARRANTY.
8 */
9
10#include <crm_internal.h>
11
12#include <glib.h> // gchar, g_ascii_isalnum(), etc.
13
16
17#include "crmcommon_private.h" // pcmk__xml_is_name_char()
18
27static void
28assert_name_char(int c, bool reference)
29{
30 gchar utf8_buf[6] = { 0, };
31 int len = 4;
32 int ref_len = g_unichar_to_utf8(c, utf8_buf);
33 bool result = pcmk__xml_is_name_char(utf8_buf, &len);
34
35 if (reference) {
36 assert_true(result);
37 } else {
38 assert_false(result);
39 }
40
41 if ((c < 0xD800) || (c > 0xDFFF)) {
42 /* Unicode code points in the range D800 to DFFF are UTF-16 surrogate
43 * pair halves. They can be represented in UTF-8, but they shouldn't
44 * appear in valid UTF-8-encoded text. RFC 3629 (Nov 2003) says they
45 * should be treated as invalid:
46 * https://en.wikipedia.org/wiki/UTF-8#Invalid_sequences_and_error_handling.
47 *
48 * GLib treats these characters as valid and returns a length of 3
49 * bytes. So did libxml until v2.12 (commit 845bd99). Since that commit,
50 * libxml treats these characters as invalid and returns a length of 0.
51 * To avoid version-dependent testing behavior, skip the length check
52 * for code points in that range.
53 */
54 assert_int_equal(len, ref_len);
55 }
56}
57
58static void
59null_len(void **state)
60{
61 assert_true(pcmk__xml_is_name_char("a", NULL));
62 assert_false(pcmk__xml_is_name_char("@", NULL));
63}
64
65static void
66ascii(void **state)
67{
68 for (int c = 0x00; c <= 0x7F; c++) {
69 if (g_ascii_isalnum(c)
70 || c == ':' || c == '_' || c == '-' || c == '.') {
71
72 assert_name_char(c, true);
73 } else {
74 assert_name_char(c, false);
75 }
76 }
77}
78
79static void
80unicode_0x80_to_0xB6(void **state)
81{
82 for (int c = 0x80; c <= 0xB6; c++) {
83 assert_name_char(c, false);
84 }
85}
86
87static void
88unicode_0xB7(void **state)
89{
90 assert_name_char(0xB7, true);
91}
92
93static void
94unicode_0xB8_to_0xBF(void **state)
95{
96 for (int c = 0xB8; c <= 0xBF; c++) {
97 assert_name_char(c, false);
98 }
99}
100
101static void
102unicode_0xC0_to_0xD6(void **state)
103{
104 for (int c = 0xC0; c <= 0xD6; c++) {
105 assert_name_char(c, true);
106 }
107}
108
109static void
110unicode_0xD7(void **state)
111{
112 assert_name_char(0xD7, false);
113}
114
115static void
116unicode_0xD8_to_0xF6(void **state)
117{
118 for (int c = 0xD8; c <= 0xF6; c++) {
119 assert_name_char(c, true);
120 }
121}
122
123static void
124unicode_0xF7(void **state)
125{
126 assert_name_char(0xF7, false);
127}
128
129static void
130unicode_0xF8_to_0x2FF(void **state)
131{
132 for (int c = 0xF8; c <= 0x2FF; c++) {
133 assert_name_char(c, true);
134 }
135}
136
137static void
138unicode_0x300_to_0x36F(void **state)
139{
140 for (int c = 0x300; c <= 0x36F; c++) {
141 assert_name_char(c, true);
142 }
143}
144
145static void
146unicode_0x370_to_0x37D(void **state)
147{
148 for (int c = 0x370; c <= 0x37D; c++) {
149 assert_name_char(c, true);
150 }
151}
152
153static void
154unicode_0x37E(void **state)
155{
156 assert_name_char(0x37E, false);
157}
158
159static void
160unicode_0x37F_to_0x1FFF(void **state)
161{
162 for (int c = 0x37F; c <= 0x1FFF; c++) {
163 assert_name_char(c, true);
164 }
165}
166
167static void
168unicode_0x2000_to_0x200B(void **state)
169{
170 for (int c = 0x2000; c <= 0x200B; c++) {
171 assert_name_char(c, false);
172 }
173}
174
175static void
176unicode_0x200C_to_0x200D(void **state)
177{
178 for (int c = 0x200C; c <= 0x200D; c++) {
179 assert_name_char(c, true);
180 }
181}
182
183static void
184unicode_0x200E_to_0x203E(void **state)
185{
186 for (int c = 0x200E; c <= 0x203E; c++) {
187 assert_name_char(c, false);
188 }
189}
190
191static void
192unicode_0x203F_to_0x2040(void **state)
193{
194 for (int c = 0x203F; c <= 0x2040; c++) {
195 assert_name_char(c, true);
196 }
197}
198
199static void
200unicode_0x2041_to_0x206F(void **state)
201{
202 for (int c = 0x2041; c <= 0x206F; c++) {
203 assert_name_char(c, false);
204 }
205}
206
207static void
208unicode_0x2070_to_0x218F(void **state)
209{
210 for (int c = 0x2070; c <= 0x218F; c++) {
211 assert_name_char(c, true);
212 }
213}
214
215static void
216unicode_0x2190_to_0x2BFF(void **state)
217{
218 for (int c = 0x2190; c <= 0x2BFF; c++) {
219 assert_name_char(c, false);
220 }
221}
222
223static void
224unicode_0x2C00_to_0x2FEF(void **state)
225{
226 for (int c = 0x2C00; c <= 0x2FEF; c++) {
227 assert_name_char(c, true);
228 }
229}
230
231static void
232unicode_0x2FF0_to_0x3000(void **state)
233{
234 for (int c = 0x2FF0; c <= 0x3000; c++) {
235 assert_name_char(c, false);
236 }
237}
238
239static void
240unicode_0x3001_to_0xD7FF(void **state)
241{
242 for (int c = 0x3001; c <= 0xD7FF; c++) {
243 assert_name_char(c, true);
244 }
245}
246
247static void
248unicode_0xD800_to_0xF8FF(void **state)
249{
250 for (int c = 0xD800; c <= 0xF8FF; c++) {
251 assert_name_char(c, false);
252 }
253}
254
255static void
256unicode_0xF900_to_0xFDCF(void **state)
257{
258 for (int c = 0xF900; c <= 0xFDCF; c++) {
259 assert_name_char(c, true);
260 }
261}
262
263static void
264unicode_0xFDD0_to_0xFDEF(void **state)
265{
266 for (int c = 0xFDD0; c <= 0xFDEF; c++) {
267 assert_name_char(c, false);
268 }
269}
270
271static void
272unicode_0xFDF0_to_0xFFFD(void **state)
273{
274 for (int c = 0xFDF0; c <= 0xFFFD; c++) {
275 assert_name_char(c, true);
276 }
277}
278
279static void
280unicode_0xFFFE_to_0xFFFF(void **state)
281{
282 for (int c = 0xFFFE; c <= 0xFFFF; c++) {
283 assert_name_char(c, false);
284 }
285}
286
287static void
288unicode_0x10000_to_0xEFFFF(void **state)
289{
290 for (int c = 0x10000; c <= 0xEFFFF; c++) {
291 assert_name_char(c, true);
292 }
293}
294
295static void
296unicode_0xF0000_to_0x10FFFF(void **state)
297{
298 for (int c = 0xF0000; c <= 0x10FFFF; c++) {
299 assert_name_char(c, false);
300 }
301}
302
303PCMK__UNIT_TEST(NULL, NULL,
304 cmocka_unit_test(null_len),
305 cmocka_unit_test(ascii),
306 cmocka_unit_test(unicode_0x80_to_0xB6),
307 cmocka_unit_test(unicode_0xB7),
308 cmocka_unit_test(unicode_0xB8_to_0xBF),
309 cmocka_unit_test(unicode_0xC0_to_0xD6),
310 cmocka_unit_test(unicode_0xD7),
311 cmocka_unit_test(unicode_0xD8_to_0xF6),
312 cmocka_unit_test(unicode_0xF7),
313 cmocka_unit_test(unicode_0xF8_to_0x2FF),
314 cmocka_unit_test(unicode_0x300_to_0x36F),
315 cmocka_unit_test(unicode_0x370_to_0x37D),
316 cmocka_unit_test(unicode_0x37E),
317 cmocka_unit_test(unicode_0x37F_to_0x1FFF),
318 cmocka_unit_test(unicode_0x2000_to_0x200B),
319 cmocka_unit_test(unicode_0x200C_to_0x200D),
320 cmocka_unit_test(unicode_0x200E_to_0x203E),
321 cmocka_unit_test(unicode_0x203F_to_0x2040),
322 cmocka_unit_test(unicode_0x2041_to_0x206F),
323 cmocka_unit_test(unicode_0x2070_to_0x218F),
324 cmocka_unit_test(unicode_0x2190_to_0x2BFF),
325 cmocka_unit_test(unicode_0x2C00_to_0x2FEF),
326 cmocka_unit_test(unicode_0x2FF0_to_0x3000),
327 cmocka_unit_test(unicode_0x3001_to_0xD7FF),
328 cmocka_unit_test(unicode_0xD800_to_0xF8FF),
329 cmocka_unit_test(unicode_0xF900_to_0xFDCF),
330 cmocka_unit_test(unicode_0xFDD0_to_0xFDEF),
331 cmocka_unit_test(unicode_0xFDF0_to_0xFFFD),
332 cmocka_unit_test(unicode_0xFFFE_to_0xFFFF),
333 cmocka_unit_test(unicode_0x10000_to_0xEFFFF),
334 cmocka_unit_test(unicode_0xF0000_to_0x10FFFF))
G_GNUC_INTERNAL bool pcmk__xml_is_name_char(const char *utf8, int *len)
Definition xml.c:611
pcmk__action_result_t result
Definition pcmk_fence.c:37
#define PCMK__UNIT_TEST(group_setup, group_teardown,...)