summaryrefslogtreecommitdiffstats
path: root/t/003-deb-systemd-helper-complex.t
blob: 47d8fb4a485b1fc13ecc2165d596d50279c64c16 (plain)
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;