]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/locale/test-localed-util.c
locale: split out XKB settings to X11Context
[thirdparty/systemd.git] / src / locale / test-localed-util.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "alloc-util.h"
4 #include "localed-util.h"
5 #include "log.h"
6 #include "string-util.h"
7 #include "tests.h"
8
9 TEST(find_language_fallback) {
10 _cleanup_free_ char *ans = NULL, *ans2 = NULL;
11
12 assert_se(find_language_fallback("foobar", &ans) == 0);
13 assert_se(ans == NULL);
14
15 assert_se(find_language_fallback("csb", &ans) == 0);
16 assert_se(ans == NULL);
17
18 assert_se(find_language_fallback("csb_PL", &ans) == 1);
19 assert_se(streq(ans, "csb:pl"));
20
21 assert_se(find_language_fallback("szl_PL", &ans2) == 1);
22 assert_se(streq(ans2, "szl:pl"));
23 }
24
25 TEST(find_converted_keymap) {
26 _cleanup_free_ char *ans = NULL, *ans2 = NULL;
27 int r;
28
29 assert_se(find_converted_keymap(
30 &(X11Context) {
31 .layout = (char*) "pl",
32 .variant = (char*) "foobar",
33 }, &ans) == 0);
34 assert_se(ans == NULL);
35
36 r = find_converted_keymap(
37 &(X11Context) {
38 .layout = (char*) "pl",
39 }, &ans);
40 if (r == 0) {
41 log_info("Skipping rest of %s: keymaps are not installed", __func__);
42 return;
43 }
44
45 assert_se(r == 1);
46 assert_se(streq(ans, "pl"));
47
48 assert_se(find_converted_keymap(
49 &(X11Context) {
50 .layout = (char*) "pl",
51 .variant = (char*) "dvorak",
52 }, &ans2) == 1);
53 assert_se(streq(ans2, "pl-dvorak"));
54 }
55
56 TEST(find_legacy_keymap) {
57 X11Context xc = {};
58 _cleanup_free_ char *ans = NULL, *ans2 = NULL;
59
60 xc.layout = (char*) "foobar";
61 assert_se(find_legacy_keymap(&xc, &ans) == 0);
62 assert_se(ans == NULL);
63
64 xc.layout = (char*) "pl";
65 assert_se(find_legacy_keymap(&xc, &ans) == 1);
66 assert_se(streq(ans, "pl2"));
67
68 xc.layout = (char*) "pl,ru";
69 assert_se(find_legacy_keymap(&xc, &ans2) == 1);
70 assert_se(streq(ans, "pl2"));
71 }
72
73 TEST(vconsole_convert_to_x11) {
74 _cleanup_(context_clear) Context c = {};
75 X11Context *xc = &c.x11_from_xorg;
76
77 log_info("/* test emptying first (:) */");
78 assert_se(free_and_strdup(&xc->layout, "foo") >= 0);
79 assert_se(free_and_strdup(&xc->variant, "bar") >= 0);
80 assert_se(vconsole_convert_to_x11(&c) == 1);
81 assert_se(xc->layout == NULL);
82 assert_se(xc->variant == NULL);
83
84 log_info("/* test emptying second (:) */");
85
86 assert_se(vconsole_convert_to_x11(&c) == 0);
87 assert_se(xc->layout == NULL);
88 assert_se(xc->variant == NULL);
89
90 log_info("/* test without variant, new mapping (es:) */");
91 assert_se(free_and_strdup(&c.vc_keymap, "es") >= 0);
92
93 assert_se(vconsole_convert_to_x11(&c) == 1);
94 assert_se(streq(xc->layout, "es"));
95 assert_se(xc->variant == NULL);
96
97 log_info("/* test with known variant, new mapping (es:dvorak) */");
98 assert_se(free_and_strdup(&c.vc_keymap, "es-dvorak") >= 0);
99
100 assert_se(vconsole_convert_to_x11(&c) == 1);
101 assert_se(streq(xc->layout, "es"));
102 assert_se(streq(xc->variant, "dvorak"));
103
104 log_info("/* test with old mapping (fr:latin9) */");
105 assert_se(free_and_strdup(&c.vc_keymap, "fr-latin9") >= 0);
106
107 assert_se(vconsole_convert_to_x11(&c) == 1);
108 assert_se(streq(xc->layout, "fr"));
109 assert_se(streq(xc->variant, "latin9"));
110
111 log_info("/* test with a compound mapping (ru,us) */");
112 assert_se(free_and_strdup(&c.vc_keymap, "ru") >= 0);
113
114 assert_se(vconsole_convert_to_x11(&c) == 1);
115 assert_se(streq(xc->layout, "ru,us"));
116 assert_se(xc->variant == NULL);
117
118 log_info("/* test with a simple mapping (us) */");
119 assert_se(free_and_strdup(&c.vc_keymap, "us") >= 0);
120
121 assert_se(vconsole_convert_to_x11(&c) == 1);
122 assert_se(streq(xc->layout, "us"));
123 assert_se(xc->variant == NULL);
124 }
125
126 TEST(x11_convert_to_vconsole) {
127 _cleanup_(context_clear) Context c = {};
128 X11Context *xc = &c.x11_from_xorg;
129 int r;
130
131 log_info("/* test emptying first (:) */");
132 assert_se(free_and_strdup(&c.vc_keymap, "foobar") >= 0);
133 assert_se(x11_convert_to_vconsole(&c) == 1);
134 assert_se(c.vc_keymap == NULL);
135
136 log_info("/* test emptying second (:) */");
137
138 assert_se(x11_convert_to_vconsole(&c) == 0);
139 assert_se(c.vc_keymap == NULL);
140
141 log_info("/* test without variant, new mapping (es:) */");
142 assert_se(free_and_strdup(&xc->layout, "es") >= 0);
143
144 assert_se(x11_convert_to_vconsole(&c) == 1);
145 assert_se(streq(c.vc_keymap, "es"));
146
147 log_info("/* test with unknown variant, new mapping (es:foobar) */");
148 assert_se(free_and_strdup(&xc->variant, "foobar") >= 0);
149
150 assert_se(x11_convert_to_vconsole(&c) == 0);
151 assert_se(streq(c.vc_keymap, "es"));
152
153 log_info("/* test with known variant, new mapping (es:dvorak) */");
154 assert_se(free_and_strdup(&xc->variant, "dvorak") >= 0);
155
156 r = x11_convert_to_vconsole(&c);
157 if (r == 0) {
158 log_info("Skipping rest of %s: keymaps are not installed", __func__);
159 return;
160 }
161
162 assert_se(r == 1);
163 assert_se(streq(c.vc_keymap, "es-dvorak"));
164
165 log_info("/* test with old mapping (fr:latin9) */");
166 assert_se(free_and_strdup(&xc->layout, "fr") >= 0);
167 assert_se(free_and_strdup(&xc->variant, "latin9") >= 0);
168
169 assert_se(x11_convert_to_vconsole(&c) == 1);
170 assert_se(streq(c.vc_keymap, "fr-latin9"));
171
172 log_info("/* test with a compound mapping (us,ru:) */");
173 assert_se(free_and_strdup(&xc->layout, "us,ru") >= 0);
174 assert_se(free_and_strdup(&xc->variant, NULL) >= 0);
175
176 assert_se(x11_convert_to_vconsole(&c) == 1);
177 assert_se(streq(c.vc_keymap, "us"));
178
179 log_info("/* test with a compound mapping (ru,us:) */");
180 assert_se(free_and_strdup(&xc->layout, "ru,us") >= 0);
181 assert_se(free_and_strdup(&xc->variant, NULL) >= 0);
182
183 assert_se(x11_convert_to_vconsole(&c) == 1);
184 assert_se(streq(c.vc_keymap, "ru"));
185
186 /* https://bugzilla.redhat.com/show_bug.cgi?id=1333998 */
187 log_info("/* test with a simple new mapping (ru:) */");
188 assert_se(free_and_strdup(&xc->layout, "ru") >= 0);
189 assert_se(free_and_strdup(&xc->variant, NULL) >= 0);
190
191 assert_se(x11_convert_to_vconsole(&c) == 0);
192 assert_se(streq(c.vc_keymap, "ru"));
193 }
194
195 static int intro(void) {
196 _cleanup_free_ char *map = NULL;
197
198 assert_se(get_testdata_dir("test-keymap-util/kbd-model-map", &map) >= 0);
199 assert_se(setenv("SYSTEMD_KBD_MODEL_MAP", map, 1) == 0);
200
201 return EXIT_SUCCESS;
202 }
203
204 DEFINE_TEST_MAIN_WITH_INTRO(LOG_DEBUG, intro);