1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2010 Lennart Poettering
15 #include "test-helper.h"
18 int main(int argc
, char *argv
[]) {
19 _cleanup_(rm_rf_physical_and_freep
) char *runtime_dir
= NULL
;
20 _cleanup_(sd_bus_error_free
) sd_bus_error err
= SD_BUS_ERROR_NULL
;
21 _cleanup_(manager_freep
) Manager
*m
= NULL
;
22 Unit
*a
= NULL
, *b
= NULL
, *c
= NULL
, *d
= NULL
, *e
= NULL
, *g
= NULL
, *h
= NULL
, *unit_with_multiple_dashes
= NULL
;
28 log_set_max_level(LOG_DEBUG
);
29 log_parse_environment();
32 r
= enter_cgroup_subroot();
33 if (r
== -ENOMEDIUM
) {
34 log_notice_errno(r
, "Skipping test: cgroupfs not available");
35 return EXIT_TEST_SKIP
;
38 /* prepare the test */
39 assert_se(set_unit_path(get_testdata_dir("")) >= 0);
40 assert_se(runtime_dir
= setup_fake_runtime_dir());
41 r
= manager_new(UNIT_FILE_USER
, MANAGER_TEST_RUN_BASIC
, &m
);
42 if (MANAGER_SKIP_TEST(r
)) {
43 log_notice_errno(r
, "Skipping test: manager_new: %m");
44 return EXIT_TEST_SKIP
;
47 assert_se(manager_startup(m
, serial
, fdset
) >= 0);
50 assert_se(manager_load_startable_unit_or_warn(m
, "a.service", NULL
, &a
) >= 0);
51 assert_se(manager_load_startable_unit_or_warn(m
, "b.service", NULL
, &b
) >= 0);
52 assert_se(manager_load_startable_unit_or_warn(m
, "c.service", NULL
, &c
) >= 0);
53 manager_dump_units(m
, stdout
, "\t");
55 printf("Test1: (Trivial)\n");
56 r
= manager_add_job(m
, JOB_START
, c
, JOB_REPLACE
, &err
, &j
);
57 if (sd_bus_error_is_set(&err
))
58 log_error("error: %s: %s", err
.name
, err
.message
);
60 manager_dump_jobs(m
, stdout
, "\t");
63 manager_clear_jobs(m
);
64 assert_se(manager_load_startable_unit_or_warn(m
, "d.service", NULL
, &d
) >= 0);
65 assert_se(manager_load_startable_unit_or_warn(m
, "e.service", NULL
, &e
) >= 0);
66 manager_dump_units(m
, stdout
, "\t");
68 printf("Test2: (Cyclic Order, Unfixable)\n");
69 assert_se(manager_add_job(m
, JOB_START
, d
, JOB_REPLACE
, NULL
, &j
) == -EDEADLK
);
70 manager_dump_jobs(m
, stdout
, "\t");
72 printf("Test3: (Cyclic Order, Fixable, Garbage Collector)\n");
73 assert_se(manager_add_job(m
, JOB_START
, e
, JOB_REPLACE
, NULL
, &j
) == 0);
74 manager_dump_jobs(m
, stdout
, "\t");
76 printf("Test4: (Identical transaction)\n");
77 assert_se(manager_add_job(m
, JOB_START
, e
, JOB_FAIL
, NULL
, &j
) == 0);
78 manager_dump_jobs(m
, stdout
, "\t");
81 assert_se(manager_load_startable_unit_or_warn(m
, "g.service", NULL
, &g
) >= 0);
82 manager_dump_units(m
, stdout
, "\t");
84 printf("Test5: (Colliding transaction, fail)\n");
85 assert_se(manager_add_job(m
, JOB_START
, g
, JOB_FAIL
, NULL
, &j
) == -EDEADLK
);
87 printf("Test6: (Colliding transaction, replace)\n");
88 assert_se(manager_add_job(m
, JOB_START
, g
, JOB_REPLACE
, NULL
, &j
) == 0);
89 manager_dump_jobs(m
, stdout
, "\t");
91 printf("Test7: (Unmergeable job type, fail)\n");
92 assert_se(manager_add_job(m
, JOB_STOP
, g
, JOB_FAIL
, NULL
, &j
) == -EDEADLK
);
94 printf("Test8: (Mergeable job type, fail)\n");
95 assert_se(manager_add_job(m
, JOB_RESTART
, g
, JOB_FAIL
, NULL
, &j
) == 0);
96 manager_dump_jobs(m
, stdout
, "\t");
98 printf("Test9: (Unmergeable job type, replace)\n");
99 assert_se(manager_add_job(m
, JOB_STOP
, g
, JOB_REPLACE
, NULL
, &j
) == 0);
100 manager_dump_jobs(m
, stdout
, "\t");
103 assert_se(manager_load_startable_unit_or_warn(m
, "h.service", NULL
, &h
) >= 0);
104 manager_dump_units(m
, stdout
, "\t");
106 printf("Test10: (Unmergeable job type of auxiliary job, fail)\n");
107 assert_se(manager_add_job(m
, JOB_START
, h
, JOB_FAIL
, NULL
, &j
) == 0);
108 manager_dump_jobs(m
, stdout
, "\t");
110 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
111 assert_se(!hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
112 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
113 assert_se(!hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
115 assert_se(unit_add_dependency(a
, UNIT_PROPAGATES_RELOAD_TO
, b
, true, UNIT_DEPENDENCY_UDEV
) == 0);
116 assert_se(unit_add_dependency(a
, UNIT_PROPAGATES_RELOAD_TO
, c
, true, UNIT_DEPENDENCY_PROC_SWAP
) == 0);
118 assert_se(hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
119 assert_se(hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
120 assert_se(hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
121 assert_se(hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
123 unit_remove_dependencies(a
, UNIT_DEPENDENCY_UDEV
);
125 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
126 assert_se(!hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
127 assert_se(hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
128 assert_se(hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
130 unit_remove_dependencies(a
, UNIT_DEPENDENCY_PROC_SWAP
);
132 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
133 assert_se(!hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
134 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
135 assert_se(!hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
137 assert_se(manager_load_unit(m
, "unit-with-multiple-dashes.service", NULL
, NULL
, &unit_with_multiple_dashes
) >= 0);
139 assert_se(strv_equal(unit_with_multiple_dashes
->documentation
, STRV_MAKE("man:test", "man:override2", "man:override3")));
140 assert_se(streq_ptr(unit_with_multiple_dashes
->description
, "override4"));