1 /* SPDX-License-Identifier: LGPL-2.1+ */
10 #include "test-helper.h"
13 int main(int argc
, char *argv
[]) {
14 _cleanup_(rm_rf_physical_and_freep
) char *runtime_dir
= NULL
;
15 _cleanup_(sd_bus_error_free
) sd_bus_error err
= SD_BUS_ERROR_NULL
;
16 _cleanup_(manager_freep
) Manager
*m
= NULL
;
17 Unit
*a
= NULL
, *b
= NULL
, *c
= NULL
, *d
= NULL
, *e
= NULL
, *g
= NULL
, *h
= NULL
, *unit_with_multiple_dashes
= NULL
;
21 test_setup_logging(LOG_DEBUG
);
23 r
= enter_cgroup_subroot();
25 return log_tests_skipped("cgroupfs not available");
27 /* prepare the test */
28 assert_se(set_unit_path(get_testdata_dir()) >= 0);
29 assert_se(runtime_dir
= setup_fake_runtime_dir());
30 r
= manager_new(UNIT_FILE_USER
, MANAGER_TEST_RUN_BASIC
, &m
);
31 if (MANAGER_SKIP_TEST(r
))
32 return log_tests_skipped_errno(r
, "manager_new");
34 assert_se(manager_startup(m
, NULL
, NULL
) >= 0);
37 assert_se(manager_load_startable_unit_or_warn(m
, "a.service", NULL
, &a
) >= 0);
38 assert_se(manager_load_startable_unit_or_warn(m
, "b.service", NULL
, &b
) >= 0);
39 assert_se(manager_load_startable_unit_or_warn(m
, "c.service", NULL
, &c
) >= 0);
40 manager_dump_units(m
, stdout
, "\t");
42 printf("Test1: (Trivial)\n");
43 r
= manager_add_job(m
, JOB_START
, c
, JOB_REPLACE
, NULL
, &err
, &j
);
44 if (sd_bus_error_is_set(&err
))
45 log_error("error: %s: %s", err
.name
, err
.message
);
47 manager_dump_jobs(m
, stdout
, "\t");
50 manager_clear_jobs(m
);
51 assert_se(manager_load_startable_unit_or_warn(m
, "d.service", NULL
, &d
) >= 0);
52 assert_se(manager_load_startable_unit_or_warn(m
, "e.service", NULL
, &e
) >= 0);
53 manager_dump_units(m
, stdout
, "\t");
55 printf("Test2: (Cyclic Order, Unfixable)\n");
56 assert_se(manager_add_job(m
, JOB_START
, d
, JOB_REPLACE
, NULL
, NULL
, &j
) == -EDEADLK
);
57 manager_dump_jobs(m
, stdout
, "\t");
59 printf("Test3: (Cyclic Order, Fixable, Garbage Collector)\n");
60 assert_se(manager_add_job(m
, JOB_START
, e
, JOB_REPLACE
, NULL
, NULL
, &j
) == 0);
61 manager_dump_jobs(m
, stdout
, "\t");
63 printf("Test4: (Identical transaction)\n");
64 assert_se(manager_add_job(m
, JOB_START
, e
, JOB_FAIL
, NULL
, NULL
, &j
) == 0);
65 manager_dump_jobs(m
, stdout
, "\t");
68 assert_se(manager_load_startable_unit_or_warn(m
, "g.service", NULL
, &g
) >= 0);
69 manager_dump_units(m
, stdout
, "\t");
71 printf("Test5: (Colliding transaction, fail)\n");
72 assert_se(manager_add_job(m
, JOB_START
, g
, JOB_FAIL
, NULL
, NULL
, &j
) == -EDEADLK
);
74 printf("Test6: (Colliding transaction, replace)\n");
75 assert_se(manager_add_job(m
, JOB_START
, g
, JOB_REPLACE
, NULL
, NULL
, &j
) == 0);
76 manager_dump_jobs(m
, stdout
, "\t");
78 printf("Test7: (Unmergeable job type, fail)\n");
79 assert_se(manager_add_job(m
, JOB_STOP
, g
, JOB_FAIL
, NULL
, NULL
, &j
) == -EDEADLK
);
81 printf("Test8: (Mergeable job type, fail)\n");
82 assert_se(manager_add_job(m
, JOB_RESTART
, g
, JOB_FAIL
, NULL
, NULL
, &j
) == 0);
83 manager_dump_jobs(m
, stdout
, "\t");
85 printf("Test9: (Unmergeable job type, replace)\n");
86 assert_se(manager_add_job(m
, JOB_STOP
, g
, JOB_REPLACE
, NULL
, NULL
, &j
) == 0);
87 manager_dump_jobs(m
, stdout
, "\t");
90 assert_se(manager_load_startable_unit_or_warn(m
, "h.service", NULL
, &h
) >= 0);
91 manager_dump_units(m
, stdout
, "\t");
93 printf("Test10: (Unmergeable job type of auxiliary job, fail)\n");
94 assert_se(manager_add_job(m
, JOB_START
, h
, JOB_FAIL
, NULL
, NULL
, &j
) == 0);
95 manager_dump_jobs(m
, stdout
, "\t");
97 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
98 assert_se(!hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
99 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
100 assert_se(!hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
102 assert_se(unit_add_dependency(a
, UNIT_PROPAGATES_RELOAD_TO
, b
, true, UNIT_DEPENDENCY_UDEV
) == 0);
103 assert_se(unit_add_dependency(a
, UNIT_PROPAGATES_RELOAD_TO
, c
, true, UNIT_DEPENDENCY_PROC_SWAP
) == 0);
105 assert_se(hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
106 assert_se(hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
107 assert_se(hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
108 assert_se(hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
110 unit_remove_dependencies(a
, UNIT_DEPENDENCY_UDEV
);
112 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
113 assert_se(!hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
114 assert_se(hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
115 assert_se(hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
117 unit_remove_dependencies(a
, UNIT_DEPENDENCY_PROC_SWAP
);
119 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], b
));
120 assert_se(!hashmap_get(b
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
121 assert_se(!hashmap_get(a
->dependencies
[UNIT_PROPAGATES_RELOAD_TO
], c
));
122 assert_se(!hashmap_get(c
->dependencies
[UNIT_RELOAD_PROPAGATED_FROM
], a
));
124 assert_se(manager_load_unit(m
, "unit-with-multiple-dashes.service", NULL
, NULL
, &unit_with_multiple_dashes
) >= 0);
126 assert_se(strv_equal(unit_with_multiple_dashes
->documentation
, STRV_MAKE("man:test", "man:override2", "man:override3")));
127 assert_se(streq_ptr(unit_with_multiple_dashes
->description
, "override4"));