summaryrefslogtreecommitdiffstats
path: root/test/integration/test-kernel-helper-autoremove
blob: 8cde3432fb47065c25db5164b3a1af5973987439 (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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#!/bin/sh
set -e

TESTDIR="$(readlink -f "$(dirname "$0")")"
. "$TESTDIR/framework"
setupenvironment
configarchitecture 'amd64'

CURRENTKERNEL="linux-image-$(uname -r | tr '[A-Z]' '[a-z]')"
insertinstalledpackage "$CURRENTKERNEL" 'amd64' '5-1'
# debug packages do not need our protection
insertinstalledpackage "${CURRENTKERNEL}-dbg" 'amd64' '5-1'
# but other kernel flavours should be protected
insertinstalledpackage "${CURRENTKERNEL}-686-pae" 'i386' '5-1'
insertinstalledpackage "${CURRENTKERNEL}-rt" 'amd64' '5-1'
# some more versions
insertinstalledpackage 'linux-image-1.0.0-2-generic' 'amd64' '1.0.0-2'
insertinstalledpackage 'linux-image-100.0.0-1-generic' 'amd64' '100.0.0-1'
# kernel metapackages should be ignored
insertinstalledpackage 'linux-image-amd64' 'amd64' '200-1'
insertinstalledpackage 'linux-image-686-pae' 'i386' '300-1'
# ensure that the '.' is really a dot and not a wildcard
insertinstalledpackage 'linux-headers-1000000-1-generic' 'amd64' '100.0.0-1'
# ensure that the '+' is really a plus and not a regexp quantifier
insertinstalledpackage "${CURRENTKERNEL}+variant" 'amd64' '5-1'

testsuccess aptmark auto "$CURRENTKERNEL" "${CURRENTKERNEL}-dbg" "${CURRENTKERNEL}-686-pae:i386" "${CURRENTKERNEL}-rt" \
	'linux-image-1.0.0-2-generic' 'linux-image-100.0.0-1-generic' 'linux-headers-1000000-1-generic' "${CURRENTKERNEL}+variant"
testsuccess aptmark hold "${CURRENTKERNEL}-rt"

testprotected() {
	rm -f rootdir/etc/apt/apt.conf.d/01autoremove-kernels protected.list

	testsuccess runapt sh "${TESTDIR}/../../debian/apt.auto-removal.sh" "$@"
	testfailure test -s rootdir/tmp/testsuccess.output

	msgtest 'Check kernel autoremoval protection list' 'is created'
	testsuccess --nomsg test -e rootdir/etc/apt/apt.conf.d/01autoremove-kernels
	testfilestats 'rootdir/etc/apt/apt.conf.d/01autoremove-kernels' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:444"

	msgtest 'Check kernel autoremoval protection list' 'can be dumped'
	testsuccess --nomsg aptconfig dump --no-empty --format '%v%n' 'APT::NeverAutoRemove'
	cp rootdir/tmp/testsuccess.output protected.list

	msgtest 'Check kernel autoremoval protection list' 'can be parsed'
	testfailure --nomsg grep '^[A-Z]: ' protected.list

	msgtest 'Check kernel autoremoval protection list includes' 'most recent kernel'
	testsuccess --nomsg grep '^\^linux-image-100\\\.0\\\.0-1-generic\$$' protected.list

	msgtest 'Check kernel autoremoval protection list includes' 'running kernel'
	testsuccess --nomsg grep "^\\^linux-image-$(uname -r | tr '[A-Z]' '[a-z]' | sed -e 's#\.#\\\\.#g')\\\$\$" protected.list

	msgtest 'Check kernel autoremoval protection list does not include' 'metapackages'
	testfailure --nomsg grep -e '^\^linux-image-amd64\$$' -e '^\^linux-image-686-pae\$$' -e ':i386' protected.list
}

AUTOREMOVE='apt autoremove'
if [ -n "$SUDO_USER" ]; then
	AUTOREMOVE="sudo $AUTOREMOVE"
fi
testsuccessequal "Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
   linux-headers-1000000-1-generic (100.0.0-1)
   linux-image-1.0.0-2-generic (1.0.0-2)
   linux-image-100.0.0-1-generic (100.0.0-1)
   $CURRENTKERNEL (5-1)
   ${CURRENTKERNEL}+variant (5-1)
   ${CURRENTKERNEL}-686-pae:i386 (5-1)
   ${CURRENTKERNEL}-dbg (5-1)
Use '$AUTOREMOVE' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -sV
testsuccessequal "Reading package lists...
Building dependency tree...
Reading state information...
The following packages were automatically installed and are no longer required:
   linux-headers-1000000-1-generic (100.0.0-1)
   linux-image-1.0.0-2-generic (1.0.0-2)
   linux-image-100.0.0-1-generic (100.0.0-1)
   $CURRENTKERNEL (5-1)
   ${CURRENTKERNEL}+variant (5-1)
   ${CURRENTKERNEL}-686-pae:i386 (5-1)
   ${CURRENTKERNEL}-dbg (5-1)
   ${CURRENTKERNEL}-rt (5-1)
Use '$AUTOREMOVE' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -sV --ignore-hold
testequal "Reading package lists...
Building dependency tree...
Reading state information...
7 packages were automatically installed and are no longer required.
Use '$AUTOREMOVE' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded." aptget install -s -o APT::Get::HideAutoRemove=small
testequal "Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
   linux-headers-1000000-1-generic (100.0.0-1)
   linux-image-1.0.0-2-generic (1.0.0-2)
   linux-image-100.0.0-1-generic (100.0.0-1)
   $CURRENTKERNEL (5-1)
   ${CURRENTKERNEL}+variant (5-1)
   ${CURRENTKERNEL}-686-pae:i386 (5-1)
   ${CURRENTKERNEL}-dbg (5-1)
0 upgraded, 0 newly installed, 7 to remove and 0 not upgraded.
Remv linux-headers-1000000-1-generic [100.0.0-1]
Remv linux-image-1.0.0-2-generic [1.0.0-2]
Remv linux-image-100.0.0-1-generic [100.0.0-1]
Remv $CURRENTKERNEL [5-1]
Remv ${CURRENTKERNEL}+variant [5-1]
Remv ${CURRENTKERNEL}-686-pae:i386 [5-1]
Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -sV

msgmsg "run without parameter"
testprotected
msgtest 'Check kernel autoremoval protection list does not include' 'old kernel'
testfailure --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-generic\$$' protected.list
export COLUMNS=99999
testsuccessequal "Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
  linux-headers-1000000-1-generic linux-image-1.0.0-2-generic ${CURRENTKERNEL}-dbg
0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
Remv linux-headers-1000000-1-generic [100.0.0-1]
Remv linux-image-1.0.0-2-generic [1.0.0-2]
Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s
unset COLUMNS

msgmsg "install unknown kernel"
# even if installed/uname reports a kernel which we can't find via dpkg,
# ensure that we still protect it just in case as these are kernels we
# know for sure without complicated detection mechanisms
testprotected 1.0.0-2-ungeneric
msgtest 'Check kernel autoremoval protection list does not include' 'old kernel'
testfailure --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-generic\$$' protected.list
msgtest 'Check kernel autoremoval protection list does include' 'unknown installed kernel'
testsuccess --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-ungeneric\$$' protected.list
export COLUMNS=9
testsuccessequal "Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
  linux-headers-1000000-1-generic
  linux-image-1.0.0-2-generic
  ${CURRENTKERNEL}-dbg
0 upgraded, 0 newly installed, 3 to remove and 0 not upgraded.
Remv linux-headers-1000000-1-generic [100.0.0-1]
Remv linux-image-1.0.0-2-generic [1.0.0-2]
Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s
unset COLUMNS

msgmsg "install an old kernel"
testprotected 1.0.0-2-generic
msgtest 'Check kernel autoremoval protection list includes' 'installed kernel'
testsuccess --nomsg grep '^\^linux-image-1\\\.0\\\.0-2-generic\$$' protected.list
export COLUMNS=9
testsuccessequal "Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
  linux-headers-1000000-1-generic
  ${CURRENTKERNEL}-dbg
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
Remv linux-headers-1000000-1-generic [100.0.0-1]
Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s
unset COLUMNS

# rt kernel was put on hold while the protected list was generated
testsuccess aptmark unhold "${CURRENTKERNEL}-rt"
export COLUMNS=99999
testsuccessequal "Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be REMOVED:
  linux-headers-1000000-1-generic ${CURRENTKERNEL}-dbg
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
Remv linux-headers-1000000-1-generic [100.0.0-1]
Remv ${CURRENTKERNEL}-dbg [5-1]" aptget autoremove -s
unset COLUMNS