]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-watch-pid.c
core: reduce the number of stalled PIDs from the watched processes list when possible
[thirdparty/systemd.git] / src / test / test-watch-pid.c
CommitLineData
62a76913
LP
1/* SPDX-License-Identifier: LGPL-2.1+ */
2
3#include "log.h"
4#include "manager.h"
5#include "rm-rf.h"
57b7a260 6#include "service.h"
62a76913
LP
7#include "test-helper.h"
8#include "tests.h"
9
10int main(int argc, char *argv[]) {
11 _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL;
c70cac54 12 _cleanup_(manager_freep) Manager *m = NULL;
62a76913 13 Unit *a, *b, *c, *u;
62a76913
LP
14 int r;
15
6d7c4033 16 test_setup_logging(LOG_DEBUG);
62a76913 17
317bb217
ZJS
18 if (getuid() != 0)
19 return log_tests_skipped("not root");
62a76913 20 r = enter_cgroup_subroot();
317bb217
ZJS
21 if (r == -ENOMEDIUM)
22 return log_tests_skipped("cgroupfs not available");
62a76913 23
55890a40 24 assert_se(set_unit_path(get_testdata_dir()) >= 0);
62a76913
LP
25 assert_se(runtime_dir = setup_fake_runtime_dir());
26
ed4ac965 27 assert_se(manager_new(UNIT_FILE_USER, MANAGER_TEST_RUN_BASIC, &m) >= 0);
62a76913
LP
28 assert_se(manager_startup(m, NULL, NULL) >= 0);
29
30 assert_se(a = unit_new(m, sizeof(Service)));
31 assert_se(unit_add_name(a, "a.service") >= 0);
32 assert_se(set_isempty(a->pids));
33
34 assert_se(b = unit_new(m, sizeof(Service)));
35 assert_se(unit_add_name(b, "b.service") >= 0);
36 assert_se(set_isempty(b->pids));
37
38 assert_se(c = unit_new(m, sizeof(Service)));
39 assert_se(unit_add_name(c, "c.service") >= 0);
40 assert_se(set_isempty(c->pids));
41
42 assert_se(hashmap_isempty(m->watch_pids));
43 assert_se(manager_get_unit_by_pid(m, 4711) == NULL);
44
f75f613d 45 assert_se(unit_watch_pid(a, 4711, false) >= 0);
62a76913
LP
46 assert_se(manager_get_unit_by_pid(m, 4711) == a);
47
f75f613d 48 assert_se(unit_watch_pid(a, 4711, false) >= 0);
62a76913
LP
49 assert_se(manager_get_unit_by_pid(m, 4711) == a);
50
f75f613d 51 assert_se(unit_watch_pid(b, 4711, false) >= 0);
62a76913
LP
52 u = manager_get_unit_by_pid(m, 4711);
53 assert_se(u == a || u == b);
54
f75f613d 55 assert_se(unit_watch_pid(b, 4711, false) >= 0);
62a76913
LP
56 u = manager_get_unit_by_pid(m, 4711);
57 assert_se(u == a || u == b);
58
f75f613d 59 assert_se(unit_watch_pid(c, 4711, false) >= 0);
62a76913
LP
60 u = manager_get_unit_by_pid(m, 4711);
61 assert_se(u == a || u == b || u == c);
62
f75f613d 63 assert_se(unit_watch_pid(c, 4711, false) >= 0);
62a76913
LP
64 u = manager_get_unit_by_pid(m, 4711);
65 assert_se(u == a || u == b || u == c);
66
67 unit_unwatch_pid(b, 4711);
68 u = manager_get_unit_by_pid(m, 4711);
69 assert_se(u == a || u == c);
70
71 unit_unwatch_pid(b, 4711);
72 u = manager_get_unit_by_pid(m, 4711);
73 assert_se(u == a || u == c);
74
75 unit_unwatch_pid(a, 4711);
76 assert_se(manager_get_unit_by_pid(m, 4711) == c);
77
78 unit_unwatch_pid(a, 4711);
79 assert_se(manager_get_unit_by_pid(m, 4711) == c);
80
81 unit_unwatch_pid(c, 4711);
82 assert_se(manager_get_unit_by_pid(m, 4711) == NULL);
83
84 unit_unwatch_pid(c, 4711);
85 assert_se(manager_get_unit_by_pid(m, 4711) == NULL);
86
62a76913
LP
87 return 0;
88}