1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2012 Lennart Poettering
7 Copyright 2013 Zbigniew Jędrzejewski-Szmek
8 Copyright 2014 Ronny Chevalier
10 systemd is free software; you can redistribute it and/or modify it
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public License
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
31 #include "unit-name.h"
32 #include "unit-printf.h"
33 #include "specifier.h"
36 #include "test-helper.h"
38 static void test_replacements(void) {
39 #define expect(pattern, repl, expected) \
41 _cleanup_free_ char *t = \
42 unit_name_replace_instance(pattern, repl); \
44 assert_se(streq(t, expected)); \
47 expect("foo@.service", "waldo", "foo@waldo.service");
48 expect("foo@xyz.service", "waldo", "foo@waldo.service");
49 expect("xyz", "waldo", "xyz");
50 expect("", "waldo", "");
51 expect("foo.service", "waldo", "foo.service");
52 expect(".service", "waldo", ".service");
53 expect("foo@", "waldo", "foo@waldo");
54 expect("@bar", "waldo", "@waldo");
56 puts("-------------------------------------------------");
58 #define expect(path, suffix, expected) \
60 _cleanup_free_ char *k, *t = \
61 unit_name_from_path(path, suffix); \
63 k = unit_name_to_path(t); \
65 assert_se(streq(k, expected ? expected : path)); \
68 expect("/waldo", ".mount", NULL);
69 expect("/waldo/quuix", ".mount", NULL);
70 expect("/waldo/quuix/", ".mount", "/waldo/quuix");
71 expect("/", ".mount", NULL);
72 expect("///", ".mount", "/");
74 puts("-------------------------------------------------");
76 #define expect(pattern, path, suffix, expected) \
78 _cleanup_free_ char *t = \
79 unit_name_from_path_instance(pattern, path, suffix); \
81 assert_se(streq(t, expected)); \
84 expect("waldo", "/waldo", ".mount", "waldo@waldo.mount");
85 expect("waldo", "/waldo////quuix////", ".mount", "waldo@waldo-quuix.mount");
86 expect("waldo", "/", ".mount", "waldo@-.mount");
87 expect("wa--ldo", "/--", ".mount", "wa--ldo@\\x2d\\x2d.mount");
89 puts("-------------------------------------------------");
91 #define expect(pattern) \
93 _cleanup_free_ char *k, *t; \
94 assert_se(t = unit_name_mangle(pattern, MANGLE_NOGLOB)); \
95 assert_se(k = unit_name_mangle(t, MANGLE_NOGLOB)); \
97 assert_se(streq(t, k)); \
102 expect("üxknürz.service");
103 expect("foobar-meh...waldi.service");
104 expect("_____####----.....service");
105 expect("_____##@;;;,,,##----.....service");
106 expect("xxx@@@@/////\\\\\\\\\\yyy.service");
111 static int test_unit_printf(void) {
116 _cleanup_free_ char *mid, *bid, *host, *root_uid;
119 assert_se(specifier_machine_id('m', NULL, NULL, &mid) >= 0 && mid);
120 assert_se(specifier_boot_id('b', NULL, NULL, &bid) >= 0 && bid);
121 assert_se((host = gethostname_malloc()));
123 assert_se((root = getpwnam("root")));
124 assert_se(asprintf(&root_uid, "%d", (int) root->pw_uid) > 0);
126 r = manager_new(SYSTEMD_USER, true, &m);
127 if (r == -EPERM || r == -EACCES || r == -EADDRINUSE) {
128 puts("manager_new: Permission denied. Skipping test.");
129 return EXIT_TEST_SKIP;
133 #define expect(unit, pattern, expected) \
136 _cleanup_free_ char *t = NULL; \
137 assert_se(unit_full_printf(unit, pattern, &t) >= 0); \
138 printf("result: %s\nexpect: %s\n", t, expected); \
139 if ((e = endswith(expected, "*"))) \
140 assert_se(strncmp(t, e, e-expected)); \
142 assert_se(streq(t, expected)); \
145 assert_se(setenv("USER", "root", 1) == 0);
146 assert_se(setenv("HOME", "/root", 1) == 0);
147 assert_se(setenv("XDG_RUNTIME_DIR", "/run/user/1/", 1) == 0);
149 assert_se(u = unit_new(m, sizeof(Service)));
150 assert_se(unit_add_name(u, "blah.service") == 0);
151 assert_se(unit_add_name(u, "blah.service") == 0);
154 expect(u, "%%", "%");
155 expect(u, "%%s", "%s");
156 expect(u, "%", ""); // REALLY?
159 expect(u, "%n", "blah.service");
160 expect(u, "%f", "/blah");
161 expect(u, "%N", "blah");
162 expect(u, "%p", "blah");
163 expect(u, "%P", "blah");
165 expect(u, "%u", root->pw_name);
166 expect(u, "%U", root_uid);
167 expect(u, "%h", root->pw_dir);
168 expect(u, "%m", mid);
169 expect(u, "%b", bid);
170 expect(u, "%H", host);
171 expect(u, "%t", "/run/user/*");
174 assert_se(u2 = unit_new(m, sizeof(Service)));
175 assert_se(unit_add_name(u2, "blah@foo-foo.service") == 0);
176 assert_se(unit_add_name(u2, "blah@foo-foo.service") == 0);
178 expect(u2, "%n", "blah@foo-foo.service");
179 expect(u2, "%N", "blah@foo-foo");
180 expect(u2, "%f", "/foo/foo");
181 expect(u2, "%p", "blah");
182 expect(u2, "%P", "blah");
183 expect(u2, "%i", "foo-foo");
184 expect(u2, "%I", "foo/foo");
185 expect(u2, "%u", root->pw_name);
186 expect(u2, "%U", root_uid);
187 expect(u2, "%h", root->pw_dir);
188 expect(u2, "%m", mid);
189 expect(u2, "%b", bid);
190 expect(u2, "%H", host);
191 expect(u2, "%t", "/run/user/*");
199 static void test_unit_instance_is_valid(void) {
200 assert_se(unit_instance_is_valid("fooBar"));
201 assert_se(unit_instance_is_valid("foo-bar"));
202 assert_se(unit_instance_is_valid("foo.stUff"));
203 assert_se(unit_instance_is_valid("fOo123.stuff"));
204 assert_se(unit_instance_is_valid("@f_oo123.Stuff"));
206 assert_se(!unit_instance_is_valid("$¢£"));
207 assert_se(!unit_instance_is_valid(""));
208 assert_se(!unit_instance_is_valid("foo bar"));
209 assert_se(!unit_instance_is_valid("foo/bar"));
212 static void test_unit_prefix_is_valid(void) {
213 assert_se(unit_prefix_is_valid("fooBar"));
214 assert_se(unit_prefix_is_valid("foo-bar"));
215 assert_se(unit_prefix_is_valid("foo.stUff"));
216 assert_se(unit_prefix_is_valid("fOo123.stuff"));
217 assert_se(unit_prefix_is_valid("foo123.Stuff"));
219 assert_se(!unit_prefix_is_valid("$¢£"));
220 assert_se(!unit_prefix_is_valid(""));
221 assert_se(!unit_prefix_is_valid("foo bar"));
222 assert_se(!unit_prefix_is_valid("foo/bar"));
223 assert_se(!unit_prefix_is_valid("@foo-bar"));
226 static void test_unit_name_change_suffix(void) {
229 r = unit_name_change_suffix("foo.bar", ".service");
231 assert_se(streq(r, "foo.service"));
234 r = unit_name_change_suffix("foo@stuff.bar", ".boo");
236 assert_se(streq(r, "foo@stuff.boo"));
240 static void test_unit_name_build(void) {
243 r = unit_name_build("foo", "bar", ".service");
245 assert_se(streq(r, "foo@bar.service"));
248 r = unit_name_build("fo0-stUff_b", "bar", ".mount");
250 assert_se(streq(r, "fo0-stUff_b@bar.mount"));
253 r = unit_name_build("foo", NULL, ".service");
255 assert_se(streq(r, "foo.service"));
259 static void test_unit_name_is_instance(void) {
260 assert_se(unit_name_is_instance("a@b.service"));
261 assert_se(unit_name_is_instance("a-c_c01Aj@b05Dii_-oioi.service"));
263 assert_se(!unit_name_is_instance("a.service"));
264 assert_se(!unit_name_is_instance("a@.service"));
265 assert_se(!unit_name_is_instance("junk"));
266 assert_se(!unit_name_is_instance(""));
269 static void test_build_subslice(void) {
273 assert_se(build_subslice("-.slice", "foo", &a) >= 0);
274 assert_se(build_subslice(a, "bar", &b) >= 0);
276 assert_se(build_subslice(b, "barfoo", &a) >= 0);
278 assert_se(build_subslice(a, "foobar", &b) >= 0);
280 assert_se(streq(b, "foo-bar-barfoo-foobar.slice"));
283 assert_se(build_subslice("foo.service", "bar", &a) < 0);
284 assert_se(build_subslice("foo", "bar", &a) < 0);
287 static void test_unit_name_to_instance(void) {
291 r = unit_name_to_instance("foo@bar.service", &instance);
293 assert_se(streq(instance, "bar"));
296 r = unit_name_to_instance("foo@.service", &instance);
298 assert_se(streq(instance, ""));
301 r = unit_name_to_instance("fo0-stUff_b@b.e", &instance);
303 assert_se(streq(instance, "b"));
306 r = unit_name_to_instance("foo.bar", &instance);
308 assert_se(!instance);
310 r = unit_name_to_instance("fooj@unk", &instance);
313 r = unit_name_to_instance("foo@", &instance);
317 static void test_unit_name_escape(void) {
318 _cleanup_free_ char *r;
320 r = unit_name_escape("ab+-c.a/bc@foo.service");
322 assert_se(streq(r, "ab\\x2b\\x2dc.a-bc\\x40foo.service"));
325 static void test_unit_name_template(void) {
326 #define expect(name, expected) \
328 _cleanup_free_ char *f = NULL; \
329 f = unit_name_template(name); \
331 printf("got: %s, expected: %s\n", f, expected); \
332 assert_se(streq(f, expected)); \
334 expect("foo@bar.service", "foo@.service")
335 expect("foo.mount", "foo.mount")
339 static void test_unit_name_is_template(void) {
340 assert_se(unit_name_is_template("foo@.service"));
341 assert_se(unit_name_is_template("bar@.path"));
343 assert_se(!unit_name_is_template("bar@i.mount"));
344 assert_se(!unit_name_is_template("bar@foobbbb.service"));
345 assert_se(!unit_name_is_template("barfoo.service"));
348 int main(int argc, char* argv[]) {
351 TEST_REQ_RUNNING_SYSTEMD(rc = test_unit_printf());
352 test_unit_instance_is_valid();
353 test_unit_prefix_is_valid();
354 test_unit_name_change_suffix();
355 test_unit_name_build();
356 test_unit_name_is_instance();
357 test_build_subslice();
358 test_unit_name_to_instance();
359 test_unit_name_escape();
360 test_unit_name_template();
361 test_unit_name_is_template();