]>
Commit | Line | Data |
---|---|---|
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" |
9eb977db | 8 | #include "path-util.h" |
dccca82b | 9 | #include "process-util.h" |
07630cea | 10 | #include "string-util.h" |
b35e9974 | 11 | #include "tests.h" |
8c6db833 | 12 | |
b35e9974 | 13 | static void test_cg_split_spec(void) { |
35d2e7ec | 14 | char *c, *p; |
8c6db833 | 15 | |
b35e9974 ZJS |
16 | log_info("/* %s */", __func__); |
17 | ||
18 | assert_se(cg_split_spec("foobar:/", &c, &p) == 0); | |
19 | assert_se(streq(c, "foobar")); | |
20 | assert_se(streq(p, "/")); | |
21 | c = mfree(c); | |
22 | p = mfree(p); | |
23 | ||
24 | assert_se(cg_split_spec("foobar:", &c, &p) == 0); | |
1c132196 ZJS |
25 | c = mfree(c); |
26 | p = mfree(p); | |
27 | ||
b35e9974 ZJS |
28 | assert_se(cg_split_spec("foobar:asdfd", &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("", &c, &p) < 0); | |
32 | assert_se(cg_split_spec("fo/obar:/", &c, &p) < 0); | |
33 | ||
34 | assert_se(cg_split_spec("/", &c, &p) >= 0); | |
35 | assert_se(c == NULL); | |
36 | assert_se(streq(p, "/")); | |
37 | p = mfree(p); | |
38 | ||
39 | assert_se(cg_split_spec("foo", &c, &p) >= 0); | |
40 | assert_se(streq(c, "foo")); | |
41 | assert_se(p == NULL); | |
42 | c = mfree(c); | |
43 | } | |
44 | ||
45 | static void test_cg_create(void) { | |
67da3323 | 46 | log_info("/* %s */", __func__); |
af5654d3 DS |
47 | int r; |
48 | ||
49 | r = cg_unified_cached(false); | |
50 | if (r < 0) { | |
51 | log_info_errno(r, "Skipping %s: %m", __func__); | |
52 | return; | |
53 | } | |
67da3323 ZJS |
54 | |
55 | _cleanup_free_ char *here = NULL; | |
56 | assert_se(cg_pid_get_path_shifted(0, NULL, &here) >= 0); | |
57 | ||
58 | const char *test_a = prefix_roota(here, "/test-a"), | |
59 | *test_b = prefix_roota(here, "/test-b"), | |
60 | *test_c = prefix_roota(here, "/test-b/test-c"), | |
61 | *test_d = prefix_roota(here, "/test-b/test-d"); | |
b35e9974 ZJS |
62 | char *path; |
63 | ||
67da3323 ZJS |
64 | log_info("Paths for test:\n%s\n%s", test_a, test_b); |
65 | ||
66 | r = cg_create(SYSTEMD_CGROUP_CONTROLLER, test_a); | |
67 | if (IN_SET(r, -EPERM, -EACCES, -EROFS)) { | |
68 | log_info_errno(r, "Skipping %s: %m", __func__); | |
69 | return; | |
70 | } | |
b35e9974 | 71 | |
67da3323 ZJS |
72 | assert_se(r == 1); |
73 | assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, test_a) == 0); | |
74 | assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, test_b) == 1); | |
75 | assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, test_c) == 1); | |
76 | assert_se(cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, test_b, 0) == 0); | |
8c6db833 | 77 | |
df0ff127 | 78 | assert_se(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path) == 0); |
67da3323 | 79 | assert_se(streq(path, test_b)); |
8c6db833 LP |
80 | free(path); |
81 | ||
67da3323 | 82 | assert_se(cg_attach(SYSTEMD_CGROUP_CONTROLLER, test_a, 0) == 0); |
8c6db833 | 83 | |
df0ff127 | 84 | assert_se(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path) == 0); |
67da3323 | 85 | assert_se(path_equal(path, test_a)); |
8c6db833 LP |
86 | free(path); |
87 | ||
67da3323 | 88 | assert_se(cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, test_d, 0) == 1); |
8c6db833 | 89 | |
df0ff127 | 90 | assert_se(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid_cached(), &path) == 0); |
67da3323 | 91 | assert_se(path_equal(path, test_d)); |
8c6db833 LP |
92 | free(path); |
93 | ||
67da3323 ZJS |
94 | assert_se(cg_get_path(SYSTEMD_CGROUP_CONTROLLER, test_d, NULL, &path) == 0); |
95 | log_debug("test_d: %s", path); | |
96 | const char *full_d; | |
97 | if (cg_all_unified()) | |
98 | full_d = strjoina("/sys/fs/cgroup", test_d); | |
99 | else if (cg_hybrid_unified()) | |
100 | full_d = strjoina("/sys/fs/cgroup/unified", test_d); | |
101 | else | |
102 | full_d = strjoina("/sys/fs/cgroup/systemd", test_d); | |
103 | assert_se(path_equal(path, full_d)); | |
8c6db833 LP |
104 | free(path); |
105 | ||
67da3323 ZJS |
106 | assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, test_a) > 0); |
107 | assert_se(cg_is_empty(SYSTEMD_CGROUP_CONTROLLER, test_b) > 0); | |
108 | assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a) > 0); | |
109 | assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b) == 0); | |
8c6db833 | 110 | |
67da3323 ZJS |
111 | assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a, 0, 0, NULL, NULL, NULL) == 0); |
112 | assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b, 0, 0, NULL, NULL, NULL) > 0); | |
8c6db833 | 113 | |
67da3323 | 114 | assert_se(cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b, SYSTEMD_CGROUP_CONTROLLER, test_a, 0) > 0); |
8c6db833 | 115 | |
67da3323 ZJS |
116 | assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a) == 0); |
117 | assert_se(cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b) > 0); | |
8c6db833 | 118 | |
67da3323 ZJS |
119 | assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a, 0, 0, NULL, NULL, NULL) > 0); |
120 | assert_se(cg_kill_recursive(SYSTEMD_CGROUP_CONTROLLER, test_b, 0, 0, NULL, NULL, NULL) == 0); | |
8c6db833 | 121 | |
67da3323 | 122 | cg_trim(SYSTEMD_CGROUP_CONTROLLER, test_b, false); |
8c6db833 | 123 | |
67da3323 ZJS |
124 | assert_se(cg_rmdir(SYSTEMD_CGROUP_CONTROLLER, test_b) == 0); |
125 | assert_se(cg_rmdir(SYSTEMD_CGROUP_CONTROLLER, test_a) < 0); | |
126 | assert_se(cg_migrate_recursive(SYSTEMD_CGROUP_CONTROLLER, test_a, SYSTEMD_CGROUP_CONTROLLER, here, 0) > 0); | |
127 | assert_se(cg_rmdir(SYSTEMD_CGROUP_CONTROLLER, test_a) == 0); | |
b35e9974 | 128 | } |
35d2e7ec | 129 | |
b35e9974 ZJS |
130 | int main(int argc, char *argv[]) { |
131 | test_setup_logging(LOG_DEBUG); | |
35d2e7ec | 132 | |
b35e9974 ZJS |
133 | test_cg_split_spec(); |
134 | test_cg_create(); | |
8c6db833 LP |
135 | |
136 | return 0; | |
137 | } |