]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-watch-pid.c
core: undo the dependency inversion between unit.h and all unit types
[thirdparty/systemd.git] / src / test / test-watch-pid.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2
3 #include "log.h"
4 #include "manager.h"
5 #include "rm-rf.h"
6 #include "service.h"
7 #include "test-helper.h"
8 #include "tests.h"
9
10 int main(int argc, char *argv[]) {
11 _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL;
12 _cleanup_(manager_freep) Manager *m = NULL;
13 Unit *a, *b, *c, *u;
14 int r;
15
16 log_set_max_level(LOG_DEBUG);
17 log_parse_environment();
18 log_open();
19
20 if (getuid() != 0) {
21 log_notice("Not running as root, skipping kernel related tests.");
22 return EXIT_TEST_SKIP;
23 }
24
25 r = enter_cgroup_subroot();
26 if (r == -ENOMEDIUM) {
27 log_notice("cgroupfs not available, skipping tests");
28 return EXIT_TEST_SKIP;
29 }
30
31 assert_se(set_unit_path(get_testdata_dir("")) >= 0);
32 assert_se(runtime_dir = setup_fake_runtime_dir());
33
34 assert_se(manager_new(UNIT_FILE_USER, true, &m) >= 0);
35 assert_se(manager_startup(m, NULL, NULL) >= 0);
36
37 assert_se(a = unit_new(m, sizeof(Service)));
38 assert_se(unit_add_name(a, "a.service") >= 0);
39 assert_se(set_isempty(a->pids));
40
41 assert_se(b = unit_new(m, sizeof(Service)));
42 assert_se(unit_add_name(b, "b.service") >= 0);
43 assert_se(set_isempty(b->pids));
44
45 assert_se(c = unit_new(m, sizeof(Service)));
46 assert_se(unit_add_name(c, "c.service") >= 0);
47 assert_se(set_isempty(c->pids));
48
49 assert_se(hashmap_isempty(m->watch_pids));
50 assert_se(manager_get_unit_by_pid(m, 4711) == NULL);
51
52 assert_se(unit_watch_pid(a, 4711) >= 0);
53 assert_se(manager_get_unit_by_pid(m, 4711) == a);
54
55 assert_se(unit_watch_pid(a, 4711) >= 0);
56 assert_se(manager_get_unit_by_pid(m, 4711) == a);
57
58 assert_se(unit_watch_pid(b, 4711) >= 0);
59 u = manager_get_unit_by_pid(m, 4711);
60 assert_se(u == a || u == b);
61
62 assert_se(unit_watch_pid(b, 4711) >= 0);
63 u = manager_get_unit_by_pid(m, 4711);
64 assert_se(u == a || u == b);
65
66 assert_se(unit_watch_pid(c, 4711) >= 0);
67 u = manager_get_unit_by_pid(m, 4711);
68 assert_se(u == a || u == b || u == c);
69
70 assert_se(unit_watch_pid(c, 4711) >= 0);
71 u = manager_get_unit_by_pid(m, 4711);
72 assert_se(u == a || u == b || u == c);
73
74 unit_unwatch_pid(b, 4711);
75 u = manager_get_unit_by_pid(m, 4711);
76 assert_se(u == a || u == c);
77
78 unit_unwatch_pid(b, 4711);
79 u = manager_get_unit_by_pid(m, 4711);
80 assert_se(u == a || u == c);
81
82 unit_unwatch_pid(a, 4711);
83 assert_se(manager_get_unit_by_pid(m, 4711) == c);
84
85 unit_unwatch_pid(a, 4711);
86 assert_se(manager_get_unit_by_pid(m, 4711) == c);
87
88 unit_unwatch_pid(c, 4711);
89 assert_se(manager_get_unit_by_pid(m, 4711) == NULL);
90
91 unit_unwatch_pid(c, 4711);
92 assert_se(manager_get_unit_by_pid(m, 4711) == NULL);
93
94 return 0;
95 }