xref: /aosp_15_r20/external/libxkbcommon/test/context.c (revision 2b949d0487e80d67f1fda82db69e101e761f8064)
1*2b949d04SAndroid Build Coastguard Worker /*
2*2b949d04SAndroid Build Coastguard Worker  * Copyright © 2012 Intel Corporation
3*2b949d04SAndroid Build Coastguard Worker  *
4*2b949d04SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*2b949d04SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*2b949d04SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*2b949d04SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*2b949d04SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*2b949d04SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*2b949d04SAndroid Build Coastguard Worker  *
11*2b949d04SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*2b949d04SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*2b949d04SAndroid Build Coastguard Worker  * Software.
14*2b949d04SAndroid Build Coastguard Worker  *
15*2b949d04SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*2b949d04SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*2b949d04SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*2b949d04SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*2b949d04SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*2b949d04SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*2b949d04SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
22*2b949d04SAndroid Build Coastguard Worker  *
23*2b949d04SAndroid Build Coastguard Worker  * Author: Daniel Stone <[email protected]>
24*2b949d04SAndroid Build Coastguard Worker  */
25*2b949d04SAndroid Build Coastguard Worker 
26*2b949d04SAndroid Build Coastguard Worker #include "config.h"
27*2b949d04SAndroid Build Coastguard Worker 
28*2b949d04SAndroid Build Coastguard Worker #include "test.h"
29*2b949d04SAndroid Build Coastguard Worker #include "context.h"
30*2b949d04SAndroid Build Coastguard Worker 
31*2b949d04SAndroid Build Coastguard Worker #include <sys/stat.h>
32*2b949d04SAndroid Build Coastguard Worker #include <sys/types.h>
33*2b949d04SAndroid Build Coastguard Worker #ifdef _MSC_VER
34*2b949d04SAndroid Build Coastguard Worker # include <io.h>
35*2b949d04SAndroid Build Coastguard Worker # include <direct.h>
36*2b949d04SAndroid Build Coastguard Worker # ifndef S_ISDIR
37*2b949d04SAndroid Build Coastguard Worker #  define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
38*2b949d04SAndroid Build Coastguard Worker # endif
39*2b949d04SAndroid Build Coastguard Worker #else
40*2b949d04SAndroid Build Coastguard Worker # include <unistd.h>
41*2b949d04SAndroid Build Coastguard Worker #endif
42*2b949d04SAndroid Build Coastguard Worker 
43*2b949d04SAndroid Build Coastguard Worker /* keeps a cache of all makedir/maketmpdir directories so we can free and
44*2b949d04SAndroid Build Coastguard Worker  * rmdir them in one go, see unmakedirs() */
45*2b949d04SAndroid Build Coastguard Worker char *dirnames[64];
46*2b949d04SAndroid Build Coastguard Worker int ndirs;
47*2b949d04SAndroid Build Coastguard Worker 
48*2b949d04SAndroid Build Coastguard Worker /* keeps a cache of all buffered env vars so we can restore
49*2b949d04SAndroid Build Coastguard Worker  * them in one go, see restore_env() */
50*2b949d04SAndroid Build Coastguard Worker struct env {
51*2b949d04SAndroid Build Coastguard Worker     char *key;
52*2b949d04SAndroid Build Coastguard Worker     char *value;
53*2b949d04SAndroid Build Coastguard Worker } environment[64];
54*2b949d04SAndroid Build Coastguard Worker int nenviron;
55*2b949d04SAndroid Build Coastguard Worker 
buffer_env(const char * key)56*2b949d04SAndroid Build Coastguard Worker static void buffer_env(const char *key)
57*2b949d04SAndroid Build Coastguard Worker {
58*2b949d04SAndroid Build Coastguard Worker     char *v = getenv(key);
59*2b949d04SAndroid Build Coastguard Worker 
60*2b949d04SAndroid Build Coastguard Worker     environment[nenviron].key = strdup(key);
61*2b949d04SAndroid Build Coastguard Worker     environment[nenviron].value = v ? strdup(v) : NULL;
62*2b949d04SAndroid Build Coastguard Worker     nenviron++;
63*2b949d04SAndroid Build Coastguard Worker }
64*2b949d04SAndroid Build Coastguard Worker 
restore_env(void)65*2b949d04SAndroid Build Coastguard Worker static void restore_env(void)
66*2b949d04SAndroid Build Coastguard Worker {
67*2b949d04SAndroid Build Coastguard Worker     for (int i = 0; i < nenviron; i++) {
68*2b949d04SAndroid Build Coastguard Worker         char *key = environment[i].key,
69*2b949d04SAndroid Build Coastguard Worker              *value = environment[i].value;
70*2b949d04SAndroid Build Coastguard Worker 
71*2b949d04SAndroid Build Coastguard Worker         if (value)
72*2b949d04SAndroid Build Coastguard Worker             setenv(key, value, 1);
73*2b949d04SAndroid Build Coastguard Worker         else
74*2b949d04SAndroid Build Coastguard Worker             unsetenv(key);
75*2b949d04SAndroid Build Coastguard Worker 
76*2b949d04SAndroid Build Coastguard Worker         free(key);
77*2b949d04SAndroid Build Coastguard Worker         free(value);
78*2b949d04SAndroid Build Coastguard Worker     }
79*2b949d04SAndroid Build Coastguard Worker     nenviron = 0;
80*2b949d04SAndroid Build Coastguard Worker     memset(environment, 0, sizeof(environment));
81*2b949d04SAndroid Build Coastguard Worker }
82*2b949d04SAndroid Build Coastguard Worker 
makedir(const char * parent,const char * path)83*2b949d04SAndroid Build Coastguard Worker static const char *makedir(const char *parent, const char *path)
84*2b949d04SAndroid Build Coastguard Worker {
85*2b949d04SAndroid Build Coastguard Worker     char *dirname;
86*2b949d04SAndroid Build Coastguard Worker     int err;
87*2b949d04SAndroid Build Coastguard Worker 
88*2b949d04SAndroid Build Coastguard Worker     dirname = asprintf_safe("%s/%s", parent, path);
89*2b949d04SAndroid Build Coastguard Worker     assert(dirname);
90*2b949d04SAndroid Build Coastguard Worker     err = mkdir(dirname, 0777);
91*2b949d04SAndroid Build Coastguard Worker     assert(err == 0);
92*2b949d04SAndroid Build Coastguard Worker 
93*2b949d04SAndroid Build Coastguard Worker     dirnames[ndirs++] = dirname;
94*2b949d04SAndroid Build Coastguard Worker 
95*2b949d04SAndroid Build Coastguard Worker     return dirname;
96*2b949d04SAndroid Build Coastguard Worker }
97*2b949d04SAndroid Build Coastguard Worker 
maketmpdir(void)98*2b949d04SAndroid Build Coastguard Worker static const char *maketmpdir(void)
99*2b949d04SAndroid Build Coastguard Worker {
100*2b949d04SAndroid Build Coastguard Worker     const char *template = "/tmp/xkbcommon-test.XXXXXX";
101*2b949d04SAndroid Build Coastguard Worker     char *tmpdir = strdup(template);
102*2b949d04SAndroid Build Coastguard Worker 
103*2b949d04SAndroid Build Coastguard Worker     tmpdir = mkdtemp(tmpdir);
104*2b949d04SAndroid Build Coastguard Worker     assert(tmpdir != NULL);
105*2b949d04SAndroid Build Coastguard Worker 
106*2b949d04SAndroid Build Coastguard Worker     dirnames[ndirs++] = tmpdir;
107*2b949d04SAndroid Build Coastguard Worker 
108*2b949d04SAndroid Build Coastguard Worker     return tmpdir;
109*2b949d04SAndroid Build Coastguard Worker }
110*2b949d04SAndroid Build Coastguard Worker 
unmakedirs(void)111*2b949d04SAndroid Build Coastguard Worker static void unmakedirs(void)
112*2b949d04SAndroid Build Coastguard Worker {
113*2b949d04SAndroid Build Coastguard Worker     /* backwards order for rmdir to work */
114*2b949d04SAndroid Build Coastguard Worker     for (int i = ndirs - 1; i >= 0; i--) {
115*2b949d04SAndroid Build Coastguard Worker         char *dir = dirnames[i];
116*2b949d04SAndroid Build Coastguard Worker         if (!dir)
117*2b949d04SAndroid Build Coastguard Worker             break;
118*2b949d04SAndroid Build Coastguard Worker         rmdir(dir);
119*2b949d04SAndroid Build Coastguard Worker         free(dir);
120*2b949d04SAndroid Build Coastguard Worker     }
121*2b949d04SAndroid Build Coastguard Worker     ndirs = 0;
122*2b949d04SAndroid Build Coastguard Worker     memset(dirnames, 0, sizeof(dirnames));
123*2b949d04SAndroid Build Coastguard Worker }
124*2b949d04SAndroid Build Coastguard Worker 
125*2b949d04SAndroid Build Coastguard Worker static void
test_config_root_include_path(void)126*2b949d04SAndroid Build Coastguard Worker test_config_root_include_path(void)
127*2b949d04SAndroid Build Coastguard Worker {
128*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *ctx;
129*2b949d04SAndroid Build Coastguard Worker     const char *tmpdir;
130*2b949d04SAndroid Build Coastguard Worker     const char *context_path;
131*2b949d04SAndroid Build Coastguard Worker     int nincludes;
132*2b949d04SAndroid Build Coastguard Worker 
133*2b949d04SAndroid Build Coastguard Worker     buffer_env("XKB_CONFIG_ROOT");
134*2b949d04SAndroid Build Coastguard Worker     buffer_env("HOME");
135*2b949d04SAndroid Build Coastguard Worker     buffer_env("XDG_CONFIG_HOME");
136*2b949d04SAndroid Build Coastguard Worker 
137*2b949d04SAndroid Build Coastguard Worker     tmpdir = maketmpdir();
138*2b949d04SAndroid Build Coastguard Worker     setenv("XKB_CONFIG_ROOT", tmpdir, 1);
139*2b949d04SAndroid Build Coastguard Worker     unsetenv("HOME");
140*2b949d04SAndroid Build Coastguard Worker     unsetenv("XDG_CONFIG_HOME");
141*2b949d04SAndroid Build Coastguard Worker 
142*2b949d04SAndroid Build Coastguard Worker     /* built-in path is last */
143*2b949d04SAndroid Build Coastguard Worker     ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
144*2b949d04SAndroid Build Coastguard Worker     nincludes = xkb_context_num_include_paths(ctx);
145*2b949d04SAndroid Build Coastguard Worker     assert(nincludes >= 1);
146*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, nincludes - 1);
147*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, tmpdir) == 0);
148*2b949d04SAndroid Build Coastguard Worker     xkb_context_unref(ctx);
149*2b949d04SAndroid Build Coastguard Worker 
150*2b949d04SAndroid Build Coastguard Worker     unmakedirs();
151*2b949d04SAndroid Build Coastguard Worker     restore_env();
152*2b949d04SAndroid Build Coastguard Worker }
153*2b949d04SAndroid Build Coastguard Worker 
154*2b949d04SAndroid Build Coastguard Worker static void
test_config_root_include_path_fallback(void)155*2b949d04SAndroid Build Coastguard Worker test_config_root_include_path_fallback(void)
156*2b949d04SAndroid Build Coastguard Worker {
157*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *ctx;
158*2b949d04SAndroid Build Coastguard Worker     const char *xkbdir = DFLT_XKB_CONFIG_ROOT;
159*2b949d04SAndroid Build Coastguard Worker     const char *context_path;
160*2b949d04SAndroid Build Coastguard Worker     int nincludes;
161*2b949d04SAndroid Build Coastguard Worker 
162*2b949d04SAndroid Build Coastguard Worker     /* quick and dirty check that the default directory exists.
163*2b949d04SAndroid Build Coastguard Worker      * It may not on a vanilla test box if we just run the test
164*2b949d04SAndroid Build Coastguard Worker      * suite, so where it's not there just skip this test. */
165*2b949d04SAndroid Build Coastguard Worker     struct stat stat_buf;
166*2b949d04SAndroid Build Coastguard Worker     int err = stat(xkbdir, &stat_buf);
167*2b949d04SAndroid Build Coastguard Worker     if (err != 0)
168*2b949d04SAndroid Build Coastguard Worker         return;
169*2b949d04SAndroid Build Coastguard Worker     if (!S_ISDIR(stat_buf.st_mode))
170*2b949d04SAndroid Build Coastguard Worker         return;
171*2b949d04SAndroid Build Coastguard Worker 
172*2b949d04SAndroid Build Coastguard Worker     buffer_env("XKB_CONFIG_ROOT");
173*2b949d04SAndroid Build Coastguard Worker     buffer_env("HOME");
174*2b949d04SAndroid Build Coastguard Worker     buffer_env("XDG_CONFIG_HOME");
175*2b949d04SAndroid Build Coastguard Worker 
176*2b949d04SAndroid Build Coastguard Worker     unsetenv("XKB_CONFIG_ROOT");
177*2b949d04SAndroid Build Coastguard Worker     unsetenv("HOME");
178*2b949d04SAndroid Build Coastguard Worker     unsetenv("XDG_CONFIG_HOME");
179*2b949d04SAndroid Build Coastguard Worker 
180*2b949d04SAndroid Build Coastguard Worker     /* built-in path is last */
181*2b949d04SAndroid Build Coastguard Worker     ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
182*2b949d04SAndroid Build Coastguard Worker     nincludes = xkb_context_num_include_paths(ctx);
183*2b949d04SAndroid Build Coastguard Worker     assert(nincludes >= 1);
184*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, nincludes - 1);
185*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, xkbdir) == 0);
186*2b949d04SAndroid Build Coastguard Worker     xkb_context_unref(ctx);
187*2b949d04SAndroid Build Coastguard Worker 
188*2b949d04SAndroid Build Coastguard Worker     unmakedirs();
189*2b949d04SAndroid Build Coastguard Worker     restore_env();
190*2b949d04SAndroid Build Coastguard Worker }
191*2b949d04SAndroid Build Coastguard Worker 
192*2b949d04SAndroid Build Coastguard Worker static void
test_xkbdir_include_path(void)193*2b949d04SAndroid Build Coastguard Worker test_xkbdir_include_path(void)
194*2b949d04SAndroid Build Coastguard Worker {
195*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *ctx;
196*2b949d04SAndroid Build Coastguard Worker     const char *tmpdir;
197*2b949d04SAndroid Build Coastguard Worker     const char *xkb_path;
198*2b949d04SAndroid Build Coastguard Worker     const char *context_path;
199*2b949d04SAndroid Build Coastguard Worker 
200*2b949d04SAndroid Build Coastguard Worker     buffer_env("HOME");
201*2b949d04SAndroid Build Coastguard Worker     buffer_env("XDG_CONFIG_HOME");
202*2b949d04SAndroid Build Coastguard Worker 
203*2b949d04SAndroid Build Coastguard Worker     tmpdir = maketmpdir();
204*2b949d04SAndroid Build Coastguard Worker     xkb_path = makedir(tmpdir, ".xkb");
205*2b949d04SAndroid Build Coastguard Worker     setenv("HOME", tmpdir, 1);
206*2b949d04SAndroid Build Coastguard Worker     setenv("XDG_CONFIG_HOME", tmpdir, 1);
207*2b949d04SAndroid Build Coastguard Worker 
208*2b949d04SAndroid Build Coastguard Worker     /* No XDG directory in our tmpdir, so we expect
209*2b949d04SAndroid Build Coastguard Worker      * the $HOME/.xkb to be the first include path */
210*2b949d04SAndroid Build Coastguard Worker     ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
211*2b949d04SAndroid Build Coastguard Worker     assert(xkb_context_num_include_paths(ctx) >= 1);
212*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, 0);
213*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, xkb_path) == 0);
214*2b949d04SAndroid Build Coastguard Worker     xkb_context_unref(ctx);
215*2b949d04SAndroid Build Coastguard Worker 
216*2b949d04SAndroid Build Coastguard Worker     unmakedirs();
217*2b949d04SAndroid Build Coastguard Worker     restore_env();
218*2b949d04SAndroid Build Coastguard Worker }
219*2b949d04SAndroid Build Coastguard Worker 
220*2b949d04SAndroid Build Coastguard Worker static void
test_xdg_include_path(void)221*2b949d04SAndroid Build Coastguard Worker test_xdg_include_path(void)
222*2b949d04SAndroid Build Coastguard Worker {
223*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *ctx;
224*2b949d04SAndroid Build Coastguard Worker     const char *tmpdir;
225*2b949d04SAndroid Build Coastguard Worker     const char *xdg_path;
226*2b949d04SAndroid Build Coastguard Worker     const char *context_path;
227*2b949d04SAndroid Build Coastguard Worker 
228*2b949d04SAndroid Build Coastguard Worker     buffer_env("XDG_CONFIG_HOME");
229*2b949d04SAndroid Build Coastguard Worker 
230*2b949d04SAndroid Build Coastguard Worker     tmpdir = maketmpdir();
231*2b949d04SAndroid Build Coastguard Worker     xdg_path = makedir(tmpdir, "xkb");
232*2b949d04SAndroid Build Coastguard Worker     setenv("XDG_CONFIG_HOME", tmpdir, 1);
233*2b949d04SAndroid Build Coastguard Worker 
234*2b949d04SAndroid Build Coastguard Worker     /* XDG path is always first */
235*2b949d04SAndroid Build Coastguard Worker     ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
236*2b949d04SAndroid Build Coastguard Worker     assert(xkb_context_num_include_paths(ctx) >= 1);
237*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, 0);
238*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, xdg_path) == 0);
239*2b949d04SAndroid Build Coastguard Worker     xkb_context_unref(ctx);
240*2b949d04SAndroid Build Coastguard Worker 
241*2b949d04SAndroid Build Coastguard Worker     unmakedirs();
242*2b949d04SAndroid Build Coastguard Worker     restore_env();
243*2b949d04SAndroid Build Coastguard Worker }
244*2b949d04SAndroid Build Coastguard Worker 
245*2b949d04SAndroid Build Coastguard Worker static void
test_xdg_include_path_fallback(void)246*2b949d04SAndroid Build Coastguard Worker test_xdg_include_path_fallback(void)
247*2b949d04SAndroid Build Coastguard Worker {
248*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *ctx;
249*2b949d04SAndroid Build Coastguard Worker     const char *tmpdir;
250*2b949d04SAndroid Build Coastguard Worker     const char *xdg_root, *xdg_path;
251*2b949d04SAndroid Build Coastguard Worker     const char *context_path;
252*2b949d04SAndroid Build Coastguard Worker 
253*2b949d04SAndroid Build Coastguard Worker     buffer_env("XDG_CONFIG_HOME");
254*2b949d04SAndroid Build Coastguard Worker     buffer_env("HOME");
255*2b949d04SAndroid Build Coastguard Worker 
256*2b949d04SAndroid Build Coastguard Worker     tmpdir = maketmpdir();
257*2b949d04SAndroid Build Coastguard Worker     xdg_root = makedir(tmpdir, ".config");
258*2b949d04SAndroid Build Coastguard Worker     xdg_path = makedir(xdg_root, "xkb");
259*2b949d04SAndroid Build Coastguard Worker     setenv("HOME", tmpdir, 1);
260*2b949d04SAndroid Build Coastguard Worker     unsetenv("XDG_CONFIG_HOME");
261*2b949d04SAndroid Build Coastguard Worker 
262*2b949d04SAndroid Build Coastguard Worker     /* XDG path is always first, even if fallback */
263*2b949d04SAndroid Build Coastguard Worker     ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
264*2b949d04SAndroid Build Coastguard Worker     assert(xkb_context_num_include_paths(ctx) >= 1);
265*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, 0);
266*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, xdg_path) == 0);
267*2b949d04SAndroid Build Coastguard Worker     xkb_context_unref(ctx);
268*2b949d04SAndroid Build Coastguard Worker 
269*2b949d04SAndroid Build Coastguard Worker     unmakedirs();
270*2b949d04SAndroid Build Coastguard Worker     restore_env();
271*2b949d04SAndroid Build Coastguard Worker }
272*2b949d04SAndroid Build Coastguard Worker 
273*2b949d04SAndroid Build Coastguard Worker static void
test_include_order(void)274*2b949d04SAndroid Build Coastguard Worker test_include_order(void)
275*2b949d04SAndroid Build Coastguard Worker {
276*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *ctx;
277*2b949d04SAndroid Build Coastguard Worker     const char *tmpdir;
278*2b949d04SAndroid Build Coastguard Worker     const char *xdg_path;
279*2b949d04SAndroid Build Coastguard Worker     const char *xkb_home_path;
280*2b949d04SAndroid Build Coastguard Worker     const char *xkb_root_path;
281*2b949d04SAndroid Build Coastguard Worker     const char *context_path;
282*2b949d04SAndroid Build Coastguard Worker 
283*2b949d04SAndroid Build Coastguard Worker     buffer_env("XKB_CONFIG_ROOT");
284*2b949d04SAndroid Build Coastguard Worker     buffer_env("XDG_CONFIG_HOME");
285*2b949d04SAndroid Build Coastguard Worker     buffer_env("HOME");
286*2b949d04SAndroid Build Coastguard Worker 
287*2b949d04SAndroid Build Coastguard Worker     tmpdir = maketmpdir();
288*2b949d04SAndroid Build Coastguard Worker     xdg_path = makedir(tmpdir, "xkb");
289*2b949d04SAndroid Build Coastguard Worker     xkb_home_path = makedir(tmpdir, ".xkb");
290*2b949d04SAndroid Build Coastguard Worker     xkb_root_path = makedir(tmpdir, "xkbroot");
291*2b949d04SAndroid Build Coastguard Worker     setenv("HOME", tmpdir, 1);
292*2b949d04SAndroid Build Coastguard Worker     setenv("XDG_CONFIG_HOME", tmpdir, 1);
293*2b949d04SAndroid Build Coastguard Worker     setenv("XKB_CONFIG_ROOT", xkb_root_path, 1);
294*2b949d04SAndroid Build Coastguard Worker 
295*2b949d04SAndroid Build Coastguard Worker     ctx = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
296*2b949d04SAndroid Build Coastguard Worker     assert(xkb_context_num_include_paths(ctx) >= 3);
297*2b949d04SAndroid Build Coastguard Worker     /* XDG is first */
298*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, 0);
299*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, xdg_path) == 0);
300*2b949d04SAndroid Build Coastguard Worker     /* $HOME/.xkb is second */
301*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, 1);
302*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, xkb_home_path) == 0);
303*2b949d04SAndroid Build Coastguard Worker     /* CONFIG_ROOT is last */
304*2b949d04SAndroid Build Coastguard Worker     context_path = xkb_context_include_path_get(ctx, 2);
305*2b949d04SAndroid Build Coastguard Worker     assert(strcmp(context_path, xkb_root_path) == 0);
306*2b949d04SAndroid Build Coastguard Worker 
307*2b949d04SAndroid Build Coastguard Worker     xkb_context_unref(ctx);
308*2b949d04SAndroid Build Coastguard Worker 
309*2b949d04SAndroid Build Coastguard Worker     unmakedirs();
310*2b949d04SAndroid Build Coastguard Worker     restore_env();
311*2b949d04SAndroid Build Coastguard Worker }
312*2b949d04SAndroid Build Coastguard Worker 
313*2b949d04SAndroid Build Coastguard Worker int
main(void)314*2b949d04SAndroid Build Coastguard Worker main(void)
315*2b949d04SAndroid Build Coastguard Worker {
316*2b949d04SAndroid Build Coastguard Worker     struct xkb_context *context = test_get_context(0);
317*2b949d04SAndroid Build Coastguard Worker     xkb_atom_t atom;
318*2b949d04SAndroid Build Coastguard Worker 
319*2b949d04SAndroid Build Coastguard Worker     assert(context);
320*2b949d04SAndroid Build Coastguard Worker 
321*2b949d04SAndroid Build Coastguard Worker     assert(xkb_context_num_include_paths(context) == 1);
322*2b949d04SAndroid Build Coastguard Worker     assert(!xkb_context_include_path_append(context, "¡NONSENSE!"));
323*2b949d04SAndroid Build Coastguard Worker     assert(xkb_context_num_include_paths(context) == 1);
324*2b949d04SAndroid Build Coastguard Worker 
325*2b949d04SAndroid Build Coastguard Worker     atom = xkb_atom_intern(context, "HELLOjunkjunkjunk", 5);
326*2b949d04SAndroid Build Coastguard Worker     assert(atom != XKB_ATOM_NONE);
327*2b949d04SAndroid Build Coastguard Worker     assert(streq(xkb_atom_text(context, atom), "HELLO"));
328*2b949d04SAndroid Build Coastguard Worker 
329*2b949d04SAndroid Build Coastguard Worker     atom = xkb_atom_intern_literal(context, "HELLOjunkjunkjunk");
330*2b949d04SAndroid Build Coastguard Worker     assert(atom != XKB_ATOM_NONE);
331*2b949d04SAndroid Build Coastguard Worker     assert(streq(xkb_atom_text(context, atom), "HELLOjunkjunkjunk"));
332*2b949d04SAndroid Build Coastguard Worker 
333*2b949d04SAndroid Build Coastguard Worker     xkb_context_unref(context);
334*2b949d04SAndroid Build Coastguard Worker 
335*2b949d04SAndroid Build Coastguard Worker     test_config_root_include_path();
336*2b949d04SAndroid Build Coastguard Worker     test_config_root_include_path_fallback();
337*2b949d04SAndroid Build Coastguard Worker     test_xkbdir_include_path();
338*2b949d04SAndroid Build Coastguard Worker     test_xdg_include_path();
339*2b949d04SAndroid Build Coastguard Worker     test_xdg_include_path_fallback();
340*2b949d04SAndroid Build Coastguard Worker     test_include_order();
341*2b949d04SAndroid Build Coastguard Worker 
342*2b949d04SAndroid Build Coastguard Worker     return 0;
343*2b949d04SAndroid Build Coastguard Worker }
344