1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
#!perl
# vim:ts=4:sw=4:et
use strict;
use warnings;
use Test::More;
use Test::Deep qw(:preload cmp_bag);
use File::Temp qw(tempfile tempdir); # in core since perl 5.6.1
use File::Path qw(make_path); # in core since Perl 5.001
use File::Basename; # in core since Perl 5
use FindBin; # in core since Perl 5.00307
use lib "$FindBin::Bin/.";
use helpers;
test_setup();
my $dpkg_root = $ENV{DPKG_ROOT} // '';
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ Create two unit files with random names; they refer to each other (Also=).┃
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
my ($fh1, $random_unit1) = tempfile('unitXXXXX',
SUFFIX => '.service',
TMPDIR => 1,
UNLINK => 1);
close($fh1);
$random_unit1 = basename($random_unit1);
my ($fh2, $random_unit2) = tempfile('unitXXXXX',
SUFFIX => '.service',
TMPDIR => 1,
UNLINK => 1);
close($fh2);
$random_unit2 = basename($random_unit2);
my $servicefile_path1 = "$dpkg_root/lib/systemd/system/$random_unit1";
my $servicefile_path2 = "$dpkg_root/lib/systemd/system/$random_unit2";
make_path("$dpkg_root/lib/systemd/system");
open($fh1, '>', $servicefile_path1);
print $fh1 <<EOT;
[Unit]
Description=test unit
[Service]
ExecStart=/bin/sleep 1
[Install]
WantedBy=multi-user.target
Also=$random_unit2
EOT
close($fh1);
open($fh2, '>', $servicefile_path2);
print $fh2 <<EOT;
[Unit]
Description=test unit
[Service]
ExecStart=/bin/sleep 1
[Install]
WantedBy=multi-user.target
Alias=alias2.service
Also=$random_unit1
EOT
close($fh2);
isnt_enabled($random_unit1);
isnt_enabled($random_unit2);
isnt_debian_installed($random_unit1);
isnt_debian_installed($random_unit2);
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ Verify “enable” creates all symlinks. ┃
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
unless ($ENV{'TEST_ON_REAL_SYSTEM'}) {
# This might already exist if we don't start from a fresh directory
ok(! -d "$dpkg_root/etc/systemd/system/multi-user.target.wants",
'multi-user.target.wants does not exist yet');
}
my $retval = dsh('enable', $random_unit1);
my %links = map { (basename($_), $dpkg_root . readlink($_)) }
("$dpkg_root/etc/systemd/system/multi-user.target.wants/$random_unit1",
"$dpkg_root/etc/systemd/system/multi-user.target.wants/$random_unit2");
is_deeply(
\%links,
{
$random_unit1 => $servicefile_path1,
$random_unit2 => $servicefile_path2,
},
'All expected links present');
my $alias_path = "$dpkg_root/etc/systemd/system/alias2.service";
ok(-l $alias_path, 'alias created');
is($dpkg_root . readlink($alias_path), $servicefile_path2,
'alias points to the correct service file');
cmp_bag(
[ state_file_entries("$dpkg_root/var/lib/systemd/deb-systemd-helper-enabled/$random_unit1.dsh-also") ],
[ "$dpkg_root/etc/systemd/system/multi-user.target.wants/$random_unit1",
"$dpkg_root/etc/systemd/system/multi-user.target.wants/$random_unit2",
"$dpkg_root/etc/systemd/system/alias2.service" ],
'state file updated');
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
# ┃ Verify “is-enabled” now returns true. ┃
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
is_enabled($random_unit1);
is_enabled($random_unit2);
is_debian_installed($random_unit1);
# $random_unit2 was only enabled _because of_ $random_unit1’s Also= statement
# and thus does not have its own state file.
isnt_debian_installed($random_unit2);
# TODO: cleanup tests?
done_testing;
|