Imported Upstream version 17.25.4
[platform/upstream/libzypp.git] / tests / zypp / PurgeKernels_test.cc
1 #include "TestSetup.h"
2 #include <zypp/PurgeKernels.h>
3
4 #include <boost/test/data/test_case.hpp>
5
6 using namespace zypp;
7 using namespace boost::unit_test;
8
9 namespace boost { namespace test_tools { namespace tt_detail {
10 template<>
11 struct print_log_value< std::map<std::string, bool> > {
12 void operator()( std::ostream& ostr,
13     std::map<std::string, bool> const& set)
14 {
15   ostr << "{" << std::endl;
16   for( const auto &elem : set ) ostr << "'" << elem.first << "'," << std::endl;
17   ostr << "}" << std::endl;
18 }
19 };
20 }}}
21
22 namespace  {
23   std::string makeNVRA( const PoolItem &pck ) {
24     return pck.name() + "-" + pck.edition().asString() + "." + pck.arch().asString();
25   }
26
27   using TestSample = std::tuple<
28     Pathname,    // repoPath
29     std::string, // uname_r
30     zypp::Arch,  // arch
31     std::string, // keepSpec
32     std::map<std::string, bool> // expectedRems
33     >;
34
35   std::vector<TestSample>  maketestdata() {
36     return {
37       TestSample {
38         TESTS_SRC_DIR"/zypp/data/PurgeKernels/simple",
39         "1-3-default",
40         Arch("x86_64"),
41         "oldest,running,latest",
42         {
43           { "kernel-default-1-2.x86_64", false },
44           { "kernel-default-devel-1-2.x86_64", false },
45           { "kernel-default-devel-debuginfo-1-2.x86_64", false },
46           { "kernel-devel-1-2.noarch", false },
47           { "kernel-livepatch-default-1-2.x86_64", false },
48           { "kernel-syms-1-2.x86_64", false },
49           { "kernel-default-1-4.x86_64", false },
50           { "kernel-default-devel-1-4.x86_64", false },
51           { "kernel-default-devel-debuginfo-1-4.x86_64", false },
52           { "kernel-devel-1-4.noarch", false },
53           { "kernel-syms-1-4.x86_64", false },
54           // left over devel packages that need to go away too
55           { "kernel-devel-1-1.2.noarch", false },
56           { "kernel-source-1-1.2.noarch", false },
57           { "kernel-default-devel-1-3.x86_64", false },
58           { "kernel-default-devel-debuginfo-1-3.x86_64", false },
59           { "kernel-devel-1-3.noarch", false },
60         }
61       },
62       //test that keeps only the running kernel
63       TestSample {
64         TESTS_SRC_DIR"/zypp/data/PurgeKernels/simple",
65         "1-3-default",
66         Arch("x86_64"),
67         "running",
68         {
69           { "kernel-default-1-1.x86_64", false },
70           { "kernel-default-devel-1-1.x86_64", false },
71           { "kernel-default-devel-debuginfo-1-1.x86_64", false },
72           { "kernel-livepatch-default-1-1.x86_64", false },
73           { "kernel-devel-1-1.noarch", false },
74           { "kernel-syms-1-1.x86_64", false },
75           { "kernel-source-1-1.noarch", false },
76           { "kernel-default-1-2.x86_64", false },
77           { "kernel-default-devel-1-2.x86_64", false },
78           { "kernel-default-devel-debuginfo-1-2.x86_64", false },
79           { "kernel-devel-1-2.noarch", false },
80           { "kernel-livepatch-default-1-2.x86_64", false },
81           { "kernel-syms-1-2.x86_64", false },
82           { "kernel-default-1-4.x86_64", false },
83           { "kernel-default-devel-1-4.x86_64", false },
84           { "kernel-default-devel-debuginfo-1-4.x86_64", false },
85           { "kernel-devel-1-4.noarch", false },
86           { "kernel-syms-1-4.x86_64", false },
87           { "kernel-default-1-5.x86_64", false },
88           { "kernel-default-devel-1-5.x86_64", false },
89           { "kernel-default-devel-debuginfo-1-5.x86_64", false },
90           { "kernel-devel-1-5.noarch", false },
91           { "kernel-syms-1-5.x86_64", false },
92           { "dummy-kmp-default-1-0.x86_64", false },
93           // left over devel packages that need to go away too
94           { "kernel-devel-1-1.2.noarch", false },
95           { "kernel-source-1-1.2.noarch", false },
96           { "kernel-default-devel-1-3.x86_64", false },
97           { "kernel-devel-1-3.noarch", false },
98           { "kernel-default-devel-1-3.x86_64", false },
99           { "kernel-default-devel-debuginfo-1-3.x86_64", false },
100         }
101       },
102       TestSample {
103         TESTS_SRC_DIR"/zypp/data/PurgeKernels/simple",
104         "1-3-default",
105         Arch("x86_64"),
106         "oldest+1,running,latest-1",
107         {
108           { "kernel-default-1-1.x86_64", false },
109           { "kernel-livepatch-default-1-1.x86_64", false },
110           { "kernel-default-devel-1-1.x86_64", false },
111           { "kernel-default-devel-debuginfo-1-1.x86_64", false },
112           { "kernel-devel-1-1.noarch", false },
113           { "kernel-syms-1-1.x86_64", false },
114           { "kernel-source-1-1.noarch", false },
115           { "kernel-default-1-5.x86_64", false },
116           { "kernel-default-devel-1-5.x86_64", false },
117           { "kernel-default-devel-debuginfo-1-5.x86_64", false },
118           { "kernel-devel-1-5.noarch", false },
119           { "kernel-syms-1-5.x86_64", false },
120           { "dummy-kmp-default-1-0.x86_64", false },
121           // left over devel packages that need to go away too
122           { "kernel-default-devel-1-3.x86_64", false },
123           { "kernel-default-devel-debuginfo-1-3.x86_64", false },
124           { "kernel-devel-1-3.noarch", false },
125         }
126       },
127       TestSample {
128         //kernel-1-1 has a non kernel package depending on it, it should not be removed
129         TESTS_SRC_DIR"/zypp/data/PurgeKernels/withdeps",
130         "1-5-default",
131         Arch("x86_64"),
132         "running",
133         {
134           { "kernel-default-1-2.x86_64", false },
135           { "kernel-default-devel-1-2.x86_64", false },
136           { "kernel-default-devel-debuginfo-1-2.x86_64", false },
137           { "kernel-devel-1-2.noarch", false },
138           { "kernel-livepatch-default-1-2.x86_64", false },
139           { "kernel-syms-1-2.x86_64", false },
140           // the following packages are not held back because they do not fit keep spec and no deps are keeping them
141           { "kernel-default-devel-1-1.x86_64", false },
142           { "kernel-default-devel-debuginfo-1-1.x86_64", false },
143           { "kernel-devel-1-1.noarch", false},
144           { "kernel-syms-1-1.x86_64", false},
145         }
146       },
147       TestSample {
148         //kernel-1-5 provides a symbol for a kmp that has a non kernel package depending on it, it should not be removed
149         TESTS_SRC_DIR"/zypp/data/PurgeKernels/withdeps",
150         "1-1-default",
151         Arch("x86_64"),
152         "running",
153         {
154           { "kernel-default-1-2.x86_64", false },
155           { "kernel-default-devel-1-2.x86_64", false },
156           { "kernel-default-devel-debuginfo-1-2.x86_64", false },
157           { "kernel-devel-1-2.noarch", false },
158           { "kernel-livepatch-default-1-2.x86_64", false },
159           { "kernel-syms-1-2.x86_64", false },
160           { "kernel-default-devel-1-5.x86_64", false },
161           { "kernel-default-devel-debuginfo-1-5.x86_64", false },
162           { "kernel-devel-1-5.noarch", false },
163           { "kernel-syms-1-5.x86_64", false },
164         }
165       },
166       TestSample {
167         //kernel-1-2 is explicitely in the keep spec, it should not be removed
168         //kernel-1-5 provides a symbol for a kmp that has a non kernel package depending on it, it should not be removed
169         TESTS_SRC_DIR"/zypp/data/PurgeKernels/withdeps",
170         "1-1-default",
171         Arch("x86_64"),
172         "running,1-2",
173         {
174           { "kernel-default-devel-1-5.x86_64", false },
175           { "kernel-default-devel-debuginfo-1-5.x86_64", false },
176           { "kernel-devel-1-5.noarch", false },
177           { "kernel-syms-1-5.x86_64", false },
178         }
179       },
180       TestSample {
181         //kernel-default-1-1.x86_64 is the running kernel it should not be removed,
182         //in all sets with different arch only the latest should be kept
183         TESTS_SRC_DIR"/zypp/data/PurgeKernels/arch",
184         "1-1-default",
185         Arch("x86_64"),
186         "latest,running",
187         {
188           { "kernel-default-1-1.aarch64", false },
189           { "kernel-default-1-1.i686", false },
190
191           //{ "kernel-syms-1-1.x86_64", false },
192           //{ "kernel-default-devel-1-1.x86_64", false },
193           //{ "kernel-default-devel-debuginfo-1-1.x86_64", false },
194
195           { "kernel-default-1-2.aarch64", false },
196           { "kernel-default-1-2.i686", false },
197           { "kernel-default-1-2.x86_64", false },
198
199           { "kernel-default-devel-1-1.aarch64", false },
200           { "kernel-default-devel-1-1.i686", false },
201           { "kernel-default-devel-1-2.aarch64", false },
202           { "kernel-default-devel-1-2.i686", false },
203           { "kernel-default-devel-1-2.x86_64", false },
204
205           { "kernel-default-devel-debuginfo-1-1.aarch64", false },
206           { "kernel-default-devel-debuginfo-1-1.i686", false },
207           { "kernel-default-devel-debuginfo-1-2.aarch64", false },
208           { "kernel-default-devel-debuginfo-1-2.i686", false },
209           { "kernel-default-devel-debuginfo-1-2.x86_64", false },
210
211           { "kernel-devel-1-2.noarch", false },
212
213           { "kernel-livepatch-default-1-2.aarch64", false },
214           { "kernel-livepatch-default-1-2.i686", false },
215           { "kernel-livepatch-default-1-2.x86_64", false },
216
217           { "kernel-syms-1-1.aarch64", false },
218           { "kernel-syms-1-1.i686", false },
219
220           { "kernel-syms-1-2.aarch64", false },
221           { "kernel-syms-1-2.i686", false },
222           { "kernel-syms-1-2.x86_64", false },
223         }
224       },
225       TestSample {
226         TESTS_SRC_DIR"/zypp/data/PurgeKernels/rebuild",
227         "1-1-default",
228         Arch("x86_64"),
229         "running",
230         {
231           { "kernel-source-1-1.noarch", false },
232         }
233       },
234       TestSample {
235         TESTS_SRC_DIR"/zypp/data/PurgeKernels/fancybuildnr",
236         "5.8.1-3.g846658e-default",
237         Arch("x86_64"),
238         "latest,latest-1,running",
239         {
240           { "kernel-default-5.7.8-1.1.g8f507a0.x86_64", false },
241           { "kernel-default-5.7.9-1.1.ga010166.x86_64", false },
242           { "kernel-default-5.7.10-1.1.g6a1b5cf.x86_64", false },
243           { "kernel-default-5.7.10-3.1.gd1148b9.x86_64", false },
244           { "kernel-default-5.7.11-1.1.g5015994.x86_64", false },
245           { "kernel-default-5.7.12-1.1.g9c98feb.x86_64", false },
246           { "kernel-default-5.8.0-1.1.gd3bf2d6.x86_64", false },
247           { "kernel-default-5.8.0-2.1.g9bc0044.x86_64", false },
248           { "kernel-default-5.8.0-3.1.gd4e7682.x86_64", false },
249           { "kernel-default-5.8.1-1.1.ge6658c9.x86_64", false },
250           // those are running, latest and latest-1 , they should stay
251           //{ "kernel-default-5.8.1-2.1.g553537d.x86_64", false },
252           //{ "kernel-default-5.8.1-3.1.g846658e.x86_64", false },
253           }
254       },
255       TestSample {
256         TESTS_SRC_DIR"/zypp/data/PurgeKernels/kernel-base",
257         "5.7.8-3-default",
258         Arch("x86_64"),
259         "running",
260         {
261           { "kernel-default-base-5.7.8-1.1.1.1.x86_64", false },
262           { "kernel-default-base-5.7.8-2.1.1.1.x86_64", false },
263           //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64", false },
264           { "kernel-default-base-5.8.8-2.1.1.1.x86_64", false },
265           }
266       },
267       TestSample {
268         TESTS_SRC_DIR"/zypp/data/PurgeKernels/kernel-base",
269         "5.7.8-3-default",
270         Arch("x86_64"),
271         "running, 5.7.8-2.1.1",
272         {
273           { "kernel-default-base-5.7.8-1.1.1.1.x86_64", false },
274           { "kernel-default-base-5.8.8-2.1.1.1.x86_64", false },
275           //{ "kernel-default-base-5.7.8-2.1.1.1.x86_64", false },
276           //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64", false },
277           }
278       },
279       TestSample {
280         TESTS_SRC_DIR"/zypp/data/PurgeKernels/flavour",
281         "1-3-rt",
282         Arch("x86_64"),
283         "running",
284         {
285           { "kernel-rt-1-1.x86_64", false },
286           { "kernel-rt-devel-1-1.x86_64", false },
287           { "kernel-rt-devel-debuginfo-1-1.x86_64", false },
288           { "kernel-devel-rt-1-1.noarch", false },
289           { "kernel-syms-rt-1-1.x86_64", false },
290           { "kernel-source-rt-1-1.noarch", false },
291           { "kernel-rt-1-2.x86_64", false },
292           { "kernel-rt-devel-1-2.x86_64", false },
293           { "kernel-rt-devel-debuginfo-1-2.x86_64", false },
294           { "kernel-devel-rt-1-2.noarch", false },
295           { "kernel-syms-rt-1-2.x86_64", false },
296           { "kernel-rt-1-4.x86_64", false },
297           { "kernel-rt-devel-1-4.x86_64", false },
298           { "kernel-rt-devel-debuginfo-1-4.x86_64", false },
299           { "kernel-devel-rt-1-4.noarch", false },
300           { "kernel-syms-rt-1-4.x86_64", false },
301           { "kernel-rt-1-5.x86_64", false },
302           { "kernel-rt-devel-1-5.x86_64", false },
303           { "kernel-rt-devel-debuginfo-1-5.x86_64", false },
304           { "kernel-devel-rt-1-5.noarch", false },
305           { "kernel-syms-rt-1-5.x86_64", false },
306           // left over devel packages that need to go away too
307           { "kernel-devel-rt-1-1.2.noarch", false },
308           { "kernel-source-rt-1-1.2.noarch", false },
309           { "kernel-rt-devel-1-3.x86_64", false },
310           { "kernel-devel-rt-1-3.noarch", false },
311           { "kernel-rt-devel-1-3.x86_64", false },
312           { "kernel-rt-devel-debuginfo-1-3.x86_64", false },
313         }
314       },
315     };
316   }
317 }
318
319 namespace bdata = boost::unit_test::data;
320
321 BOOST_DATA_TEST_CASE(purge_kernels, bdata::make( maketestdata() ), repoPath, uname_r, arch, keepSpec, expectedRems )
322 {
323   TestSetup test( Arch_x86_64 );
324   test.loadTestcaseRepos( repoPath );
325
326   auto expectedRemovals = expectedRems;
327
328   PurgeKernels krnls;
329   krnls.setUnameR( uname_r );
330   krnls.setKernelArch( arch );
331   krnls.setKeepSpec( keepSpec );
332   krnls.markObsoleteKernels();
333
334   auto pool = ResPool::instance();
335   BOOST_REQUIRE( pool.resolver().resolvePool() );
336
337   unsigned removeCount = 0;
338   const filter::ByStatus toBeUninstalledFilter( &ResStatus::isToBeUninstalled );
339   for ( auto it = pool.byStatusBegin( toBeUninstalledFilter ); it != pool.byStatusEnd( toBeUninstalledFilter );  it++  ) {
340     removeCount++;
341
342     auto pck = expectedRemovals.find( makeNVRA(*it) );
343     BOOST_REQUIRE_MESSAGE(  pck != expectedRemovals.end(), std::string("Unexpected package removed: ") + makeNVRA(*it) + (it->status().isByUser() ? " (by user)" : " (autoremoved)") );
344
345     pck->second = true;
346   }
347
348   for ( const auto &rem : expectedRemovals ) {
349     if (!rem.second)
350       std::cout << std::string( "Expected package removal did not happen for: ") + rem.first  << std::endl;
351     //BOOST_REQUIRE_MESSAGE( rem.second, std::string( "Expected package removal did not happen for: ") + rem.first );
352   }
353
354   BOOST_REQUIRE_EQUAL( expectedRemovals.size(), removeCount );
355 }