1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2013 David Strauss
11 #include "string-util.h"
12 #include "test-helper.h"
16 static int test_cgroup_mask(void) {
17 _cleanup_(rm_rf_physical_and_freep
) char *runtime_dir
= NULL
;
18 _cleanup_(manager_freep
) Manager
*m
= NULL
;
19 Unit
*son
, *daughter
, *parent
, *root
, *grandchild
, *parent_deep
;
24 r
= enter_cgroup_subroot();
25 if (r
== -ENOMEDIUM
) {
26 puts("Skipping test: cgroupfs not available");
27 return EXIT_TEST_SKIP
;
30 /* Prepare the manager. */
31 assert_se(set_unit_path(get_testdata_dir("")) >= 0);
32 assert_se(runtime_dir
= setup_fake_runtime_dir());
33 r
= manager_new(UNIT_FILE_USER
, MANAGER_TEST_RUN_BASIC
, &m
);
34 if (IN_SET(r
, -EPERM
, -EACCES
)) {
35 puts("manager_new: Permission denied. Skipping test.");
36 return EXIT_TEST_SKIP
;
40 /* Turn off all kinds of default accouning, so that we can
41 * verify the masks resulting of our configuration and nothing
43 m
->default_cpu_accounting
=
44 m
->default_memory_accounting
=
45 m
->default_blockio_accounting
=
46 m
->default_io_accounting
=
47 m
->default_tasks_accounting
= false;
48 m
->default_tasks_max
= (uint64_t) -1;
51 assert_se(manager_startup(m
, serial
, fdset
) >= 0);
53 /* Load units and verify hierarchy. */
54 assert_se(manager_load_startable_unit_or_warn(m
, "parent.slice", NULL
, &parent
) >= 0);
55 assert_se(manager_load_startable_unit_or_warn(m
, "son.service", NULL
, &son
) >= 0);
56 assert_se(manager_load_startable_unit_or_warn(m
, "daughter.service", NULL
, &daughter
) >= 0);
57 assert_se(manager_load_startable_unit_or_warn(m
, "grandchild.service", NULL
, &grandchild
) >= 0);
58 assert_se(manager_load_startable_unit_or_warn(m
, "parent-deep.slice", NULL
, &parent_deep
) >= 0);
59 assert_se(UNIT_DEREF(son
->slice
) == parent
);
60 assert_se(UNIT_DEREF(daughter
->slice
) == parent
);
61 assert_se(UNIT_DEREF(parent_deep
->slice
) == parent
);
62 assert_se(UNIT_DEREF(grandchild
->slice
) == parent_deep
);
63 root
= UNIT_DEREF(parent
->slice
);
65 /* Verify per-unit cgroups settings. */
66 assert_se(unit_get_own_mask(son
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
));
67 assert_se(unit_get_own_mask(daughter
) == 0);
68 assert_se(unit_get_own_mask(grandchild
) == 0);
69 assert_se(unit_get_own_mask(parent_deep
) == CGROUP_MASK_MEMORY
);
70 assert_se(unit_get_own_mask(parent
) == (CGROUP_MASK_IO
| CGROUP_MASK_BLKIO
));
71 assert_se(unit_get_own_mask(root
) == 0);
73 /* Verify aggregation of member masks */
74 assert_se(unit_get_members_mask(son
) == 0);
75 assert_se(unit_get_members_mask(daughter
) == 0);
76 assert_se(unit_get_members_mask(grandchild
) == 0);
77 assert_se(unit_get_members_mask(parent_deep
) == 0);
78 assert_se(unit_get_members_mask(parent
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_MEMORY
));
79 assert_se(unit_get_members_mask(root
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_IO
| CGROUP_MASK_BLKIO
| CGROUP_MASK_MEMORY
));
81 /* Verify aggregation of sibling masks. */
82 assert_se(unit_get_siblings_mask(son
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_MEMORY
));
83 assert_se(unit_get_siblings_mask(daughter
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_MEMORY
));
84 assert_se(unit_get_siblings_mask(grandchild
) == 0);
85 assert_se(unit_get_siblings_mask(parent_deep
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_MEMORY
));
86 assert_se(unit_get_siblings_mask(parent
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_IO
| CGROUP_MASK_BLKIO
| CGROUP_MASK_MEMORY
));
87 assert_se(unit_get_siblings_mask(root
) == (CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_IO
| CGROUP_MASK_BLKIO
| CGROUP_MASK_MEMORY
));
89 /* Verify aggregation of target masks. */
90 assert_se(unit_get_target_mask(son
) == ((CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_MEMORY
) & m
->cgroup_supported
));
91 assert_se(unit_get_target_mask(daughter
) == ((CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_MEMORY
) & m
->cgroup_supported
));
92 assert_se(unit_get_target_mask(grandchild
) == 0);
93 assert_se(unit_get_target_mask(parent_deep
) == ((CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_MEMORY
) & m
->cgroup_supported
));
94 assert_se(unit_get_target_mask(parent
) == ((CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_IO
| CGROUP_MASK_BLKIO
| CGROUP_MASK_MEMORY
) & m
->cgroup_supported
));
95 assert_se(unit_get_target_mask(root
) == ((CGROUP_MASK_CPU
| CGROUP_MASK_CPUACCT
| CGROUP_MASK_IO
| CGROUP_MASK_BLKIO
| CGROUP_MASK_MEMORY
) & m
->cgroup_supported
));
100 static void test_cg_mask_to_string_one(CGroupMask mask
, const char *t
) {
101 _cleanup_free_
char *b
= NULL
;
103 assert_se(cg_mask_to_string(mask
, &b
) >= 0);
104 assert_se(streq_ptr(b
, t
));
107 static void test_cg_mask_to_string(void) {
108 test_cg_mask_to_string_one(0, NULL
);
109 test_cg_mask_to_string_one(_CGROUP_MASK_ALL
, "cpu cpuacct io blkio memory devices pids");
110 test_cg_mask_to_string_one(CGROUP_MASK_CPU
, "cpu");
111 test_cg_mask_to_string_one(CGROUP_MASK_CPUACCT
, "cpuacct");
112 test_cg_mask_to_string_one(CGROUP_MASK_IO
, "io");
113 test_cg_mask_to_string_one(CGROUP_MASK_BLKIO
, "blkio");
114 test_cg_mask_to_string_one(CGROUP_MASK_MEMORY
, "memory");
115 test_cg_mask_to_string_one(CGROUP_MASK_DEVICES
, "devices");
116 test_cg_mask_to_string_one(CGROUP_MASK_PIDS
, "pids");
117 test_cg_mask_to_string_one(CGROUP_MASK_CPU
|CGROUP_MASK_CPUACCT
, "cpu cpuacct");
118 test_cg_mask_to_string_one(CGROUP_MASK_CPU
|CGROUP_MASK_PIDS
, "cpu pids");
119 test_cg_mask_to_string_one(CGROUP_MASK_CPUACCT
|CGROUP_MASK_PIDS
, "cpuacct pids");
120 test_cg_mask_to_string_one(CGROUP_MASK_DEVICES
|CGROUP_MASK_PIDS
, "devices pids");
121 test_cg_mask_to_string_one(CGROUP_MASK_IO
|CGROUP_MASK_BLKIO
, "io blkio");
124 int main(int argc
, char* argv
[]) {
127 log_parse_environment();
130 TEST_REQ_RUNNING_SYSTEMD(rc
= test_cgroup_mask());
131 test_cg_mask_to_string();