]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-cgroup-util.c
core: don't reset log level to NOTICE if we get quiet on the kernel cmdline
[thirdparty/systemd.git] / src / test / test-cgroup-util.c
CommitLineData
6c03089c
LP
1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3/***
4 This file is part of systemd.
5
6 Copyright 2013 Zbigniew Jędrzejewski-Szmek
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
96cde13a
ZJS
22#include <assert.h>
23
24#include "util.h"
25#include "cgroup-util.h"
143bfdaf 26#include "test-helper.h"
96cde13a 27
7027ff61 28static void check_p_d_u(const char *path, int code, const char *result) {
6c03089c 29 _cleanup_free_ char *unit = NULL;
d4fffc4b 30 int r;
96cde13a 31
d4fffc4b
ZJS
32 r = cg_path_decode_unit(path, &unit);
33 printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, result, code);
34 assert_se(r == code);
6c03089c
LP
35 assert_se(streq_ptr(unit, result));
36}
96cde13a 37
7027ff61 38static void test_path_decode_unit(void) {
d7bd3de0
LP
39 check_p_d_u("getty@tty2.service", 0, "getty@tty2.service");
40 check_p_d_u("getty@tty2.service/", 0, "getty@tty2.service");
41 check_p_d_u("getty@tty2.service/xxx", 0, "getty@tty2.service");
7027ff61
LP
42 check_p_d_u("getty@.service/", -EINVAL, NULL);
43 check_p_d_u("getty@.service", -EINVAL, NULL);
44 check_p_d_u("getty.service", 0, "getty.service");
45 check_p_d_u("getty", -EINVAL, NULL);
d7bd3de0
LP
46 check_p_d_u("getty/waldo", -EINVAL, NULL);
47 check_p_d_u("_cpu.service", 0, "cpu.service");
6c03089c
LP
48}
49
50static void check_p_g_u(const char *path, int code, const char *result) {
51 _cleanup_free_ char *unit = NULL;
d4fffc4b 52 int r;
6c03089c 53
d4fffc4b
ZJS
54 r = cg_path_get_unit(path, &unit);
55 printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, result, code);
56 assert_se(r == code);
6c03089c
LP
57 assert_se(streq_ptr(unit, result));
58}
59
9444b1f2
LP
60static void test_path_get_unit(void) {
61 check_p_g_u("/system.slice/foobar.service/sdfdsaf", 0, "foobar.service");
d7bd3de0
LP
62 check_p_g_u("/system.slice/getty@tty5.service", 0, "getty@tty5.service");
63 check_p_g_u("/system.slice/getty@tty5.service/aaa/bbb", 0, "getty@tty5.service");
64 check_p_g_u("/system.slice/getty@tty5.service/", 0, "getty@tty5.service");
9444b1f2
LP
65 check_p_g_u("/system.slice/getty@tty6.service/tty5", 0, "getty@tty6.service");
66 check_p_g_u("sadfdsafsda", -EINVAL, NULL);
d7bd3de0 67 check_p_g_u("/system.slice/getty####@tty6.service/xxx", -EINVAL, NULL);
9444b1f2 68 check_p_g_u("/system.slice/system-waldo.slice/foobar.service/sdfdsaf", 0, "foobar.service");
d7bd3de0 69 check_p_g_u("/system.slice/system-waldo.slice/_cpu.service/sdfdsaf", 0, "cpu.service");
d4fffc4b
ZJS
70 check_p_g_u("/user.slice/user-1000.slice/user@1000.service/server.service", 0, "user@1000.service");
71 check_p_g_u("/user.slice/user-1000.slice/user@.service/server.service", -EINVAL, NULL);
9444b1f2
LP
72}
73
6c03089c
LP
74static void check_p_g_u_u(const char *path, int code, const char *result) {
75 _cleanup_free_ char *unit = NULL;
d4fffc4b 76 int r;
6c03089c 77
d4fffc4b
ZJS
78 r = cg_path_get_user_unit(path, &unit);
79 printf("%s: %s → %s %d expected %s %d\n", __func__, path, unit, r, result, code);
80 assert_se(r == code);
6c03089c
LP
81 assert_se(streq_ptr(unit, result));
82}
83
9444b1f2 84static void test_path_get_user_unit(void) {
374ec6ab
LP
85 check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar.service", 0, "foobar.service");
86 check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/waldo.slice/foobar.service", 0, "foobar.service");
87 check_p_g_u_u("/user.slice/user-1002.slice/session-2.scope/foobar.service/waldo", 0, "foobar.service");
88 check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar.service/waldo/uuuux", 0, "foobar.service");
89 check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/waldo/waldo/uuuux", -EINVAL, NULL);
d7bd3de0
LP
90 check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
91 check_p_g_u_u("/session-2.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
92 check_p_g_u_u("/xyz.slice/xyz-waldo.slice/session-77.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
9444b1f2 93 check_p_g_u_u("/meh.service", -ENOENT, NULL);
d7bd3de0 94 check_p_g_u_u("/session-3.scope/_cpu.service", 0, "cpu.service");
d4fffc4b
ZJS
95 check_p_g_u_u("/user.slice/user-1000.slice/user@1000.service/server.service", 0, "server.service");
96 check_p_g_u_u("/user.slice/user-1000.slice/user@.service/server.service", -ENOENT, NULL);
7027ff61 97}
6c03089c 98
9444b1f2
LP
99static void check_p_g_s(const char *path, int code, const char *result) {
100 _cleanup_free_ char *s = NULL;
101
102 assert_se(cg_path_get_session(path, &s) == code);
103 assert_se(streq_ptr(s, result));
96cde13a
ZJS
104}
105
9444b1f2 106static void test_path_get_session(void) {
374ec6ab
LP
107 check_p_g_s("/user.slice/user-1000.slice/session-2.scope/foobar.service", 0, "2");
108 check_p_g_s("/session-3.scope", 0, "3");
a13ee4c7
ZJS
109 check_p_g_s("/session-.scope", -ENOENT, NULL);
110 check_p_g_s("", -ENOENT, NULL);
9444b1f2 111}
7027ff61 112
9444b1f2
LP
113static void check_p_g_o_u(const char *path, int code, uid_t result) {
114 uid_t uid = 0;
7027ff61 115
9444b1f2
LP
116 assert_se(cg_path_get_owner_uid(path, &uid) == code);
117 assert_se(uid == result);
118}
119
120static void test_path_get_owner_uid(void) {
374ec6ab
LP
121 check_p_g_o_u("/user.slice/user-1000.slice/session-2.scope/foobar.service", 0, 1000);
122 check_p_g_o_u("/user.slice/user-1006.slice", 0, 1006);
9444b1f2
LP
123 check_p_g_o_u("", -ENOENT, 0);
124}
7027ff61 125
9444b1f2
LP
126static void test_get_paths(void) {
127 _cleanup_free_ char *a = NULL;
128
129 assert_se(cg_get_root_path(&a) >= 0);
130 log_info("Root = %s", a);
7027ff61
LP
131}
132
aff38e74
LP
133static void test_proc(void) {
134 _cleanup_closedir_ DIR *d = NULL;
135 struct dirent *de;
136 int r;
137
138 d = opendir("/proc");
139 assert_se(d);
140
141 FOREACH_DIRENT(de, d, break) {
e9174f29 142 _cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *slice = NULL;
aff38e74 143 pid_t pid;
fed1e721 144 uid_t uid = UID_INVALID;
aff38e74
LP
145
146 if (de->d_type != DT_DIR &&
147 de->d_type != DT_UNKNOWN)
148 continue;
149
150 r = parse_pid(de->d_name, &pid);
151 if (r < 0)
152 continue;
153
ae018d9b
LP
154 if (is_kernel_thread(pid))
155 continue;
156
aff38e74 157 cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &path);
e9174f29 158 cg_pid_get_path_shifted(pid, NULL, &path_shifted);
ae018d9b 159 cg_pid_get_owner_uid(pid, &uid);
aff38e74
LP
160 cg_pid_get_session(pid, &session);
161 cg_pid_get_unit(pid, &unit);
162 cg_pid_get_user_unit(pid, &user_unit);
163 cg_pid_get_machine_name(pid, &machine);
1021b21b 164 cg_pid_get_slice(pid, &slice);
aff38e74 165
de0671ee
ZJS
166 printf(PID_FMT"\t%s\t%s\t"UID_FMT"\t%s\t%s\t%s\t%s\t%s\n",
167 pid,
aff38e74 168 path,
aff38e74 169 path_shifted,
de0671ee 170 uid,
aff38e74
LP
171 session,
172 unit,
173 user_unit,
1021b21b
LP
174 machine,
175 slice);
aff38e74
LP
176 }
177}
178
ae018d9b
LP
179static void test_escape_one(const char *s, const char *r) {
180 _cleanup_free_ char *b;
181
182 b = cg_escape(s);
183 assert_se(b);
184 assert_se(streq(b, r));
185
186 assert_se(streq(cg_unescape(b), s));
187}
188
189static void test_escape(void) {
190 test_escape_one("foobar", "foobar");
a0ab5665 191 test_escape_one(".foobar", "_.foobar");
ae018d9b
LP
192 test_escape_one("foobar.service", "foobar.service");
193 test_escape_one("cgroup.service", "_cgroup.service");
ae018d9b 194 test_escape_one("tasks", "_tasks");
e13bb5d2
KS
195 if (access("/sys/fs/cgroup/cpu", F_OK) == 0)
196 test_escape_one("cpu.service", "_cpu.service");
ae018d9b 197 test_escape_one("_foobar", "__foobar");
a0ab5665
LP
198 test_escape_one("", "_");
199 test_escape_one("_", "__");
200 test_escape_one(".", "_.");
ae018d9b
LP
201}
202
78edb35a
LP
203static void test_controller_is_valid(void) {
204 assert_se(cg_controller_is_valid("foobar", false));
205 assert_se(cg_controller_is_valid("foo_bar", false));
206 assert_se(cg_controller_is_valid("name=foo", true));
207 assert_se(!cg_controller_is_valid("", false));
208 assert_se(!cg_controller_is_valid("name=", true));
209 assert_se(!cg_controller_is_valid("=", false));
210 assert_se(!cg_controller_is_valid("cpu,cpuacct", false));
211 assert_se(!cg_controller_is_valid("_", false));
212 assert_se(!cg_controller_is_valid("_foobar", false));
213 assert_se(!cg_controller_is_valid("tatü", false));
214}
215
a016b922
LP
216static void test_slice_to_path_one(const char *unit, const char *path, int error) {
217 _cleanup_free_ char *ret = NULL;
218
219 assert_se(cg_slice_to_path(unit, &ret) == error);
220 assert_se(streq_ptr(ret, path));
221}
222
223static void test_slice_to_path(void) {
224
225 test_slice_to_path_one("foobar.slice", "foobar.slice", 0);
226 test_slice_to_path_one("foobar-waldo.slice", "foobar.slice/foobar-waldo.slice", 0);
227 test_slice_to_path_one("foobar-waldo.service", NULL, -EINVAL);
228 test_slice_to_path_one("-.slice", NULL, -EINVAL);
229 test_slice_to_path_one("-foo-.slice", NULL, -EINVAL);
230 test_slice_to_path_one("-foo.slice", NULL, -EINVAL);
231 test_slice_to_path_one("a-b.slice", "a.slice/a-b.slice", 0);
232 test_slice_to_path_one("a-b-c-d-e.slice", "a.slice/a-b.slice/a-b-c.slice/a-b-c-d.slice/a-b-c-d-e.slice", 0);
233}
234
751bc6ac
LP
235static void test_shift_path_one(const char *raw, const char *root, const char *shifted) {
236 const char *s = NULL;
237
238 assert_se(cg_shift_path(raw, root, &s) >= 0);
239 assert_se(streq(s, shifted));
240}
241
242static void test_shift_path(void) {
243
244 test_shift_path_one("/foobar/waldo", "/", "/foobar/waldo");
245 test_shift_path_one("/foobar/waldo", "", "/foobar/waldo");
246 test_shift_path_one("/foobar/waldo", "/foobar", "/waldo");
247 test_shift_path_one("/foobar/waldo", "/fuckfuck", "/foobar/waldo");
248}
249
96cde13a 250int main(void) {
7027ff61 251 test_path_decode_unit();
6c03089c 252 test_path_get_unit();
7027ff61 253 test_path_get_user_unit();
9444b1f2
LP
254 test_path_get_session();
255 test_path_get_owner_uid();
143bfdaf 256 TEST_REQ_RUNNING_SYSTEMD(test_get_paths());
aff38e74 257 test_proc();
143bfdaf 258 TEST_REQ_RUNNING_SYSTEMD(test_escape());
78edb35a 259 test_controller_is_valid();
a016b922 260 test_slice_to_path();
751bc6ac 261 test_shift_path();
96cde13a
ZJS
262
263 return 0;
264}