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