]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-cgroup.c
ASSERT_STREQ for simple cases
[thirdparty/systemd.git] / src / test / test-cgroup.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
8c6db833 2
07630cea 3#include <unistd.h>
8c6db833 4
fdb3deca 5#include "cgroup-setup.h"
8c6db833 6#include "cgroup-util.h"
67da3323 7#include "errno-util.h"
3b287495 8#include "fd-util.h"
9eb977db 9#include "path-util.h"
dccca82b 10#include "process-util.h"
07630cea 11#include "string-util.h"
b35e9974 12#include "tests.h"
8c6db833 13
4f7452a8 14TEST(cg_split_spec) {
35d2e7ec 15 char *c, *p;
8c6db833 16
b35e9974 17 assert_se(cg_split_spec("foobar:/", &c, &p) == 0);
c79e88b3
IK
18 ASSERT_STREQ(c, "foobar");
19 ASSERT_STREQ(p, "/");
b35e9974
ZJS
20 c = mfree(c);
21 p = mfree(p);
22
23 assert_se(cg_split_spec("foobar:", &c, &p) == 0);
1c132196
ZJS
24 c = mfree(c);
25 p = mfree(p);
26
b35e9974
ZJS
27 assert_se(cg_split_spec("foobar:asdfd", &c, &p) < 0);
28 assert_se(cg_split_spec(":///", &c, &p) < 0);
29 assert_se(cg_split_spec(":", &c, &p) < 0);
30 assert_se(cg_split_spec("", &c, &p) < 0);
31 assert_se(cg_split_spec("fo/obar:/", &c, &p) < 0);
32
33 assert_se(cg_split_spec("/", &c, &p) >= 0);
5152b845 34 ASSERT_NULL(c);
c79e88b3 35 ASSERT_STREQ(p, "/");
b35e9974
ZJS
36 p = mfree(p);
37
38 assert_se(cg_split_spec("foo", &c, &p) >= 0);
c79e88b3 39 ASSERT_STREQ(c, "foo");
5152b845 40 ASSERT_NULL(p);
b35e9974
ZJS
41 c = mfree(c);
42}
43
4f7452a8 44TEST(cg_create) {
af5654d3
DS
45 int r;
46
47 r = cg_unified_cached(false);
a412a1b9
DDM
48 if (IN_SET(r, -ENOMEDIUM, -ENOENT)) {
49 log_tests_skipped("cgroupfs is not mounted");
af5654d3
DS
50 return;
51 }
b66789a9 52 assert_se(r >= 0);
67da3323
ZJS
53
54 _cleanup_free_ char *here = NULL;
55 assert_se(cg_pid_get_path_shifted(0, NULL, &here) >= 0);
56
57 const char *test_a = prefix_roota(here, "/test-a"),
58 *test_b = prefix_roota(here, "/test-b"),
59 *test_c = prefix_roota(here, "/test-b/test-c"),
60 *test_d = prefix_roota(here, "/test-b/test-d");
b35e9974
ZJS
61 char *path;
62
67da3323
ZJS
63 log_info("Paths for test:\n%s\n%s", test_a, test_b);
64
d0547385
LP
65 /* Possibly clean up left-overs from aboted previous runs */
66 (void) cg_trim(SYSTEMD_CGROUP_CONTROLLER, test_a, /* delete_root= */ true);
67 (void) cg_trim(SYSTEMD_CGROUP_CONTROLLER, test_b, /* delete_root= */ true);
68
67da3323
ZJS
69 r = cg_create(SYSTEMD_CGROUP_CONTROLLER, test_a);
70 if (IN_SET(r, -EPERM, -EACCES, -EROFS)) {
71 log_info_errno(r, "Skipping %s: %m", __func__);
72 return;
73 }
b35e9974 74
67da3323
ZJS
75 assert_se(r == 1);
76 assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, test_a) == 0);
77 assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, test_b) == 1);
78 assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, test_c) == 1);
79 assert_se(cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, test_b, 0) == 0);
8c6db833 80
df0ff127 81 assert_se(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path) == 0);
c79e88b3 82 ASSERT_STREQ(path, test_b);
8c6db833
LP
83 free(path);
84
67da3323 85 assert_se(cg_attach(SYSTEMD_CGROUP_CONTROLLER, test_a, 0) == 0);
8c6db833 86
df0ff127 87 assert_se(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path) == 0);
67da3323 88 assert_se(path_equal(path, test_a));
8c6db833
LP
89 free(path);
90
67da3323 91 assert_se(cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, test_d, 0) == 1);
8c6db833 92
df0ff127 93 assert_se(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path) == 0);
67da3323 94 assert_se(path_equal(path, test_d));
8c6db833
LP
95 free(path);
96
67da3323
ZJS
97 assert_se(cg_get_path(SYSTEMD_CGROUP_CONTROLLER, test_d, NULL, &path) == 0);
98 log_debug("test_d: %s", path);
99 const char *full_d;
100 if (cg_all_unified())
101 full_d = strjoina("/sys/fs/cgroup", test_d);
102 else if (cg_hybrid_unified())
103 full_d = strjoina("/sys/fs/cgroup/unified", test_d);
104 else
105 full_d = strjoina("/sys/fs/cgroup/systemd", test_d);
106 assert_se(path_equal(path, full_d));
8c6db833
LP
107 free(path);
108
67da3323
ZJS
109 assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, test_a) > 0);
110 assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, test_b) > 0);
111 assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a) > 0);
112 assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b) == 0);
8c6db833 113
bd1791b5
LP
114 assert_se(cg_kill_recursive(test_a, 0, 0, NULL, NULL, NULL) == 0);
115 assert_se(cg_kill_recursive(test_b, 0, 0, NULL, NULL, NULL) > 0);
8c6db833 116
67da3323 117 assert_se(cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b, SYSTEMD_CGROUP_CONTROLLER, test_a, 0) > 0);
8c6db833 118
67da3323
ZJS
119 assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a) == 0);
120 assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b) > 0);
8c6db833 121
bd1791b5
LP
122 assert_se(cg_kill_recursive(test_a, 0, 0, NULL, NULL, NULL) > 0);
123 assert_se(cg_kill_recursive(test_b, 0, 0, NULL, NULL, NULL) == 0);
8c6db833 124
bd1791b5 125 (void) cg_trim(SYSTEMD_CGROUP_CONTROLLER, test_b, false);
8c6db833 126
67da3323
ZJS
127 assert_se(cg_rmdir(SYSTEMD_CGROUP_CONTROLLER, test_b) == 0);
128 assert_se(cg_rmdir(SYSTEMD_CGROUP_CONTROLLER, test_a) < 0);
129 assert_se(cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a, SYSTEMD_CGROUP_CONTROLLER, here, 0) > 0);
130 assert_se(cg_rmdir(SYSTEMD_CGROUP_CONTROLLER, test_a) == 0);
b35e9974 131}
35d2e7ec 132
3b287495
LP
133TEST(id) {
134 _cleanup_free_ char *p = NULL, *p2 = NULL;
135 _cleanup_close_ int fd = -EBADF, fd2 = -EBADF;
136 uint64_t id, id2;
137 int r;
138
139 r = cg_all_unified();
140 if (r == 0) {
141 log_tests_skipped("skipping cgroupid test, not running in unified mode");
142 return;
143 }
144 if (IN_SET(r, -ENOMEDIUM, -ENOENT)) {
145 log_tests_skipped("cgroupfs is not mounted");
146 return;
147 }
148 assert_se(r > 0);
149
150 fd = cg_path_open(SYSTEMD_CGROUP_CONTROLLER, "/");
151 assert_se(fd >= 0);
152
153 assert_se(fd_get_path(fd, &p) >= 0);
154 assert_se(path_equal(p, "/sys/fs/cgroup"));
155
156 assert_se(cg_fd_get_cgroupid(fd, &id) >= 0);
157
158 fd2 = cg_cgroupid_open(fd, id);
159
160 if (ERRNO_IS_NEG_PRIVILEGE(fd2))
161 log_notice("Skipping open-by-cgroup-id test because lacking privs.");
162 else {
163 assert_se(fd2 >= 0);
164
165 assert_se(fd_get_path(fd2, &p2) >= 0);
166 assert_se(path_equal(p2, "/sys/fs/cgroup"));
167
168 assert_se(cg_fd_get_cgroupid(fd2, &id2) >= 0);
169
170 assert_se(id == id2);
171
172 assert_se(inode_same_at(fd, NULL, fd2, NULL, AT_EMPTY_PATH) > 0);
173 }
174}
175
4f7452a8 176DEFINE_TEST_MAIN(LOG_DEBUG);