summaryrefslogtreecommitdiff
path: root/t/dh_installsystemd/dh_installsystemd.t
diff options
context:
space:
mode:
Diffstat (limited to 't/dh_installsystemd/dh_installsystemd.t')
-rwxr-xr-xt/dh_installsystemd/dh_installsystemd.t167
1 files changed, 116 insertions, 51 deletions
diff --git a/t/dh_installsystemd/dh_installsystemd.t b/t/dh_installsystemd/dh_installsystemd.t
index 70133b97..7029c615 100755
--- a/t/dh_installsystemd/dh_installsystemd.t
+++ b/t/dh_installsystemd/dh_installsystemd.t
@@ -8,17 +8,17 @@ use Test::DH;
use File::Path qw(remove_tree make_path);
use Debian::Debhelper::Dh_Lib qw(!dirname);
-our @TEST_DH_EXTRA_TEMPLATE_FILES = (qw(
- debian/changelog
- debian/control
- debian/foo.service
- debian/foo2.service
-));
+plan(tests => 2);
-if (uid_0_test_is_ok()) {
- plan(tests => 2);
-} else {
- plan skip_all => 'fakeroot required';
+sub write_file {
+ my ($path, $content) = @_;
+
+ my $dir = dirname($path);
+ install_dir($dir);
+
+ open(my $fd, '>>', $path) or error("open($path) failed: $!");
+ print {$fd} $content . '\n';
+ close($fd) or error("close($path) failed: $!");
}
sub unit_is_enabled {
@@ -26,31 +26,84 @@ sub unit_is_enabled {
my @output;
my $matches;
$num_masks = $num_masks // $num_enables;
- @output=`cat debian/$package.postinst.debhelper`;
- $matches = grep { m{^if deb-systemd-helper .* was-enabled .*'\Q$unit\E\.service'} } @output;
+ my @postinst_snippets = find_script($package, 'postinst');
+ @output=`cat @postinst_snippets` if @postinst_snippets;
+ # Match exactly one tab; the "dont-enable" script has an "enable"
+ # line for re-enabling the service if the admin had it enabled.
+ # But we do not want to include that in our count.
+ $matches = grep { m{^\tif deb-systemd-helper .* was-enabled .*'\Q$unit\E\.service'} } @output;
ok($matches == $num_enables) or diag("$unit appears to have been enabled $matches times (expected $num_enables)");
- @output=`cat debian/$package.postrm.debhelper`;
+ my @postrm_snippets = find_script($package, 'postrm');
+ @output=`cat @postrm_snippets` if @postrm_snippets;
$matches = grep { m{deb-systemd-helper mask.*'\Q$unit\E\.service'} } @output;
ok($matches == $num_masks) or diag("$unit appears to have been masked $matches times (expected $num_masks)");
}
+
sub unit_is_started {
my ($package, $unit, $num_starts, $num_stops) = @_;
my @output;
my $matches;
$num_stops = $num_stops // $num_starts;
- @output=`cat debian/$package.postinst.debhelper`;
+ my @postinst_snippets = find_script($package, 'postinst');
+ @output=`cat @postinst_snippets` if @postinst_snippets;
$matches = grep { m{deb-systemd-invoke \$_dh_action .*'\Q$unit\E.service'} } @output;
ok($matches == $num_starts) or diag("$unit appears to have been started $matches times (expected $num_starts)");
- @output=`cat debian/$package.prerm.debhelper`;
+ my @prerm_snippets = find_script($package, 'prerm');
+ @output=`cat @prerm_snippets` if @prerm_snippets;
$matches = grep { m{deb-systemd-invoke stop .*'\Q$unit\E.service'} } @output;
ok($matches == $num_stops) or diag("$unit appears to have been stopped $matches times (expected $num_stops)");
}
-# Units are installed and enabled
-each_compat_from_and_above_subtest(11, sub {
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd'));
- ok(-e "debian/foo/lib/systemd/system/foo.service");
- ok(-e "debian/foo.postinst.debhelper");
+
+#
+# Test a simple source package defining a single binary package
+#
+our $TEST_DH_FIXTURE_DIR = 'simple';
+our @TEST_DH_EXTRA_TEMPLATE_FILES = (qw(
+ debian/changelog
+ debian/control
+ debian/foo.service
+));
+
+each_compat_subtest {
+ ok(run_dh_tool('dh_installsystemd'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
+ unit_is_enabled('foo', 'foo', 1);
+ unit_is_started('foo', 'foo', 1);
+ ok(run_dh_tool('dh_clean'));
+
+ ok(run_dh_tool('dh_installsystemd', '--no-start'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
+ unit_is_enabled('foo', 'foo', 1);
+ unit_is_started('foo', 'foo', 0, 1);
+ ok(run_dh_tool('dh_clean'));
+
+ ok(run_dh_tool('dh_installsystemd', '--no-start', 'foo.service'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
+ unit_is_enabled('foo', 'foo', 1);
+ unit_is_started('foo', 'foo', 0, 1);
+ ok(run_dh_tool('dh_clean'));
+};
+
+
+#
+# Test a more complex source package defining three binary packages
+#
+$TEST_DH_FIXTURE_DIR = '.';
+@TEST_DH_EXTRA_TEMPLATE_FILES = (qw(
+ debian/changelog
+ debian/control
+ debian/foo.service
+ debian/foo2.service
+));
+
+each_compat_subtest {
+ ok(run_dh_tool( 'dh_installsystemd'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
unit_is_enabled('foo', 'foo', 1);
unit_is_started('foo', 'foo', 1);
unit_is_enabled('foo', 'foo2', 0);
@@ -59,9 +112,9 @@ each_compat_from_and_above_subtest(11, sub {
make_path('debian/foo/lib/systemd/system/');
install_file('debian/foo2.service', 'debian/foo/lib/systemd/system/foo2.service');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd'));
- ok(-e "debian/foo/lib/systemd/system/foo.service");
- ok(-e "debian/foo.postinst.debhelper");
+ ok(run_dh_tool('dh_installsystemd'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
unit_is_enabled('foo', 'foo', 1);
unit_is_started('foo', 'foo', 1);
unit_is_enabled('foo', 'foo2', 1);
@@ -70,9 +123,9 @@ each_compat_from_and_above_subtest(11, sub {
make_path('debian/foo/lib/systemd/system/');
install_file('debian/foo2.service', 'debian/foo/lib/systemd/system/foo2.service');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '--no-start'));
- ok(-e "debian/foo/lib/systemd/system/foo.service");
- ok(-e "debian/foo.postinst.debhelper");
+ ok(run_dh_tool('dh_installsystemd', '--no-start'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
unit_is_enabled('foo', 'foo', 1);
unit_is_started('foo', 'foo', 0, 1); # present units are stopped on remove even if no start
unit_is_enabled('foo', 'foo2', 1);
@@ -81,10 +134,10 @@ each_compat_from_and_above_subtest(11, sub {
make_path('debian/foo/lib/systemd/system/');
install_file('debian/foo2.service', 'debian/foo/lib/systemd/system/foo2.service');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '--no-start', 'debian/foo.service'));
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '-p', 'foo', 'foo2.service'));
- ok(-e "debian/foo/lib/systemd/system/foo.service");
- ok(-e "debian/foo.postinst.debhelper");
+ ok(run_dh_tool('dh_installsystemd', '-p', 'foo', '--no-start', 'foo.service'));
+ ok(run_dh_tool('dh_installsystemd', '-p', 'foo', 'foo2.service'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
unit_is_enabled('foo', 'foo', 1);
unit_is_started('foo', 'foo', 0, 1);
unit_is_enabled('foo', 'foo2', 1);
@@ -93,10 +146,10 @@ each_compat_from_and_above_subtest(11, sub {
make_path('debian/foo/lib/systemd/system/');
install_file('debian/foo2.service', 'debian/foo/lib/systemd/system/foo2.service');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '--no-enable', 'debian/foo.service'));
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '-p', 'foo', 'foo2.service'));
- ok(-e "debian/foo/lib/systemd/system/foo.service");
- ok(-e "debian/foo.postinst.debhelper");
+ ok(run_dh_tool('dh_installsystemd', '-p', 'foo', '--no-enable', 'foo.service'));
+ ok(run_dh_tool('dh_installsystemd', '-p', 'foo', 'foo2.service'));
+ ok(-e 'debian/foo/lib/systemd/system/foo.service');
+ ok(find_script('foo', 'postinst'));
unit_is_enabled('foo', 'foo', 0, 1); # Disabled units are still masked on removal
unit_is_started('foo', 'foo', 1, 1);
unit_is_enabled('foo', 'foo2', 1);
@@ -104,15 +157,17 @@ each_compat_from_and_above_subtest(11, sub {
ok(run_dh_tool('dh_clean'));
make_path('debian/foo/lib/systemd/system/');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '--no-restart-after-upgrade'));
- my $matches = grep { m{deb-systemd-invoke start .*foo.service} } `cat debian/foo.postinst.debhelper`;
+ ok(run_dh_tool('dh_installsystemd', '--no-restart-after-upgrade'));
+ my @foo_postinst = find_script('foo', 'postinst');
+ ok(@foo_postinst);
+ my $matches = @foo_postinst ? grep { m{deb-systemd-invoke start .*foo.service} } `cat @foo_postinst` : -1;
ok($matches == 1);
ok(run_dh_tool('dh_clean'));
# Quoting #764730
make_path('debian/foo/lib/systemd/system/');
install_file('debian/foo.service', 'debian/foo/lib/systemd/system/foo\x2dfuse.service');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd'));
+ ok(run_dh_tool('dh_installsystemd'));
unit_is_enabled('foo', 'foo\x2dfuse', 1);
unit_is_started('foo', 'foo\x2dfuse', 1);
ok(run_dh_tool('dh_clean'));
@@ -120,30 +175,40 @@ each_compat_from_and_above_subtest(11, sub {
# --name flag #870768
make_path('debian/foo/lib/systemd/system/');
install_file('debian/foo2.service', 'debian/foo/lib/systemd/system/foo2.service');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '--name=foo'));
+ ok(run_dh_tool('dh_installsystemd', '--name=foo'));
unit_is_enabled('foo', 'foo', 1);
unit_is_started('foo', 'foo', 1);
unit_is_enabled('foo', 'foo2', 0);
unit_is_started('foo', 'foo2', 0);
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd', '--name=foo2'));
+ ok(run_dh_tool('dh_installsystemd', '--name=foo2'));
unit_is_enabled('foo', 'foo', 1);
unit_is_started('foo', 'foo', 1);
unit_is_enabled('foo', 'foo2', 1);
unit_is_started('foo', 'foo2', 1);
ok(run_dh_tool('dh_clean'));
-});
-
-each_compat_up_to_and_incl_subtest(10, sub {
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd'));
- ok(! -e "debian/foo/lib/systemd/system/foo.service");
- ok(! -e "debian/foo.postinst.debhelper");
+ make_path('debian/foo/lib/systemd/system/');
+ install_file('debian/foo.service', 'debian/foo/lib/systemd/system/target.service');
+ make_symlink_raw_target('target.service', 'debian/foo/lib/systemd/system/source.service');
+ ok(run_dh_tool('dh_installsystemd'));
+ unit_is_enabled('foo', 'foo', 1);
+ # Alias= realized by symlinks are not enabled in maintaner scripts
+ unit_is_enabled('foo', 'source', 0);
+ unit_is_enabled('foo', 'target', 1);
ok(run_dh_tool('dh_clean'));
- make_path(qw(debian/foo/lib/systemd/system/));
- install_file('debian/foo.service', 'debian/foo/lib/systemd/system/foo.service');
- ok(run_dh_tool({ 'needs_root' => 1 }, 'dh_installsystemd'));
- ok(! -e "debian/foo.postinst.debhelper");
+ make_path('debian/foo/lib/systemd/system/');
+ make_path('debian/foo/etc/init.d/');
+ install_file('debian/foo.service', 'debian/foo/lib/systemd/system/target.service');
+ make_symlink_raw_target('target.service', 'debian/foo/lib/systemd/system/source.service');
+ write_file('debian/foo/etc/init.d/source', '# something');
+ ok(run_dh_tool('dh_installsystemd'));
+ unit_is_enabled('foo', 'foo', 1);
+ # Alias= realized by symlinks are not enabled in maintaner scripts
+ unit_is_enabled('foo', 'source', 0);
+ unit_is_enabled('foo', 'target', 1);
+ # The presence of a sysvinit script for the alias unit inhibits start of both
+ unit_is_started('foo', 'source', 0);
+ unit_is_started('foo', 'target', 0);
ok(run_dh_tool('dh_clean'));
-});
-
+};