1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2 // -*- Mode: C++ -*-
3 //
4 // Copyright (C) 2013-2022 Red Hat, Inc.
5 //
6 // Author: Sinny Kumari
7 
8 /// @file
9 ///
10 /// This test harness program computes the ABI changes between ELF
11 /// binaries present inside input packages.  Some of the input
12 /// packages have debuginfo, some don't.  The resulting ABI change
13 /// report is then compared with a reference one.
14 ///
15 /// The set of input files and reference reports to consider should be
16 /// present in the source distribution, which means they must be
17 /// referenced in tests/data/Makefile.am by the EXTRA_DIST variable.
18 
19 // For package configuration macros.
20 #include "config.h"
21 #include <sys/wait.h>
22 #include <cassert>
23 #include <cstdlib>
24 #include <cstring>
25 #include <iostream>
26 #include <memory>
27 #include <string>
28 #include <vector>
29 #include "abg-workers.h"
30 #include "test-utils.h"
31 #include "abg-tools-utils.h"
32 
33 using std::string;
34 using std::vector;
35 using std::cerr;
36 using abigail::tests::get_src_dir;
37 using abigail::tools_utils::split_string;
38 
39 struct InOutSpec
40 {
41   const char* first_in_package_path;
42   const char* second_in_package_path;
43   const char* prog_options;
44   const char* suppression_path;
45   const char* first_in_debug_package_path;
46   const char* second_in_debug_package_path;
47   const char* first_in_devel_package_path;
48   const char* second_in_devel_package_path;
49   const char* ref_report_path;
50   const char* out_report_path;
51 };// end struct InOutSpec
52 
53 static InOutSpec in_out_specs[] =
54 {
55   // dir1 contains a suppr spec - it should be ignored.
56   {
57     "data/test-diff-pkg/dirpkg-0-dir1",
58     "data/test-diff-pkg/dirpkg-0-dir2",
59     "--no-default-suppression --no-show-locs",
60     "",
61     "",
62     "",
63     "",
64     "",
65     "data/test-diff-pkg/dirpkg-0-report-0.txt",
66     "output/test-diff-pkg/dirpkg-0-report-0.txt"
67   },
68   // dir2 contains a suppr spec - it should be recognized.
69   {
70     "data/test-diff-pkg/dirpkg-1-dir1",
71     "data/test-diff-pkg/dirpkg-1-dir2",
72     "--no-default-suppression --no-show-locs",
73     "",
74     "",
75     "",
76     "",
77     "",
78     "data/test-diff-pkg/dirpkg-1-report-0.txt",
79     "output/test-diff-pkg/dirpkg-1-report-0.txt"
80   },
81   // dir2 contains a suppr spec but --no-abignore is specified,
82   // the file should be ignored.
83   {
84     "data/test-diff-pkg/dirpkg-1-dir1",
85     "data/test-diff-pkg/dirpkg-1-dir2",
86     "--no-default-suppression --no-abignore --no-show-locs",
87     "",
88     "",
89     "",
90     "",
91     "",
92     "data/test-diff-pkg/dirpkg-1-report-1.txt",
93     "output/test-diff-pkg/dirpkg-1-report-1.txt"
94   },
95   // dir2 contains several suppr spec files, ".abignore" and
96   // "dir.abignore", so the specs should be merged.
97   {
98     "data/test-diff-pkg/dirpkg-2-dir1",
99     "data/test-diff-pkg/dirpkg-2-dir2",
100     "--no-default-suppression --no-show-locs",
101     "",
102     "",
103     "",
104     "",
105     "",
106     "data/test-diff-pkg/dirpkg-2-report-0.txt",
107     "output/test-diff-pkg/dirpkg-2-report-0.txt"
108   },
109   // dir2 contains a suppr spec file, ".abignore" and
110   // an additional suppr file is specified on the command line,
111   // so the specs should be merged.
112   {
113     "data/test-diff-pkg/dirpkg-3-dir1",
114     "data/test-diff-pkg/dirpkg-3-dir2",
115     "--no-default-suppression --no-show-locs",
116     "data/test-diff-pkg/dirpkg-3.suppr",
117     "",
118     "",
119     "",
120     "",
121     "data/test-diff-pkg/dirpkg-3-report-0.txt",
122     "output/test-diff-pkg/dirpkg-3-report-0.txt"
123   },
124   // dir2 contains a suppr spec file, ".abignore", which should
125   // be ignored because of the program options  and
126   // an additional suppr file is specified on the command line,
127   // which should be recognized.
128   {
129     "data/test-diff-pkg/dirpkg-3-dir1",
130     "data/test-diff-pkg/dirpkg-3-dir2",
131     "--no-default-suppression --no-show-locs --no-abignore",
132     "data/test-diff-pkg/dirpkg-3.suppr",
133     "",
134     "",
135     "",
136     "",
137     "data/test-diff-pkg/dirpkg-3-report-1.txt",
138     "output/test-diff-pkg/dirpkg-3-report-1.txt"
139   },
140   { // Just like the previous tests, but loc info is emitted.
141     "data/test-diff-pkg/dirpkg-3-dir1",
142     "data/test-diff-pkg/dirpkg-3-dir2",
143     "--no-default-suppression --no-abignore",
144     "data/test-diff-pkg/dirpkg-3.suppr",
145     "",
146     "",
147     "",
148     "",
149     "data/test-diff-pkg/dirpkg-3-report-2.txt",
150     "output/test-diff-pkg/dirpkg-3-report-2.txt"
151   },
152   {
153     "data/test-diff-pkg/symlink-dir-test1/dir1/symlinks",
154     "data/test-diff-pkg/symlink-dir-test1/dir2/symlinks",
155     "--no-default-suppression ",
156     "",
157     "",
158     "",
159     "",
160     "",
161     "data/test-diff-pkg/symlink-dir-test1-report0.txt ",
162     "output/test-diff-pkg/symlink-dir-test1-report0.txt "
163   },
164 #if WITH_TAR
165   {
166     "data/test-diff-pkg/tarpkg-0-dir1.tar",
167     "data/test-diff-pkg/tarpkg-0-dir2.tar",
168     "--no-default-suppression --no-show-locs",
169     "",
170     "",
171     "",
172     "",
173     "",
174     "data/test-diff-pkg/tarpkg-0-report-0.txt",
175     "output/test-diff-pkg/tarpkg-0-report-0.txt"
176   },
177   {
178     "data/test-diff-pkg/tarpkg-0-dir1.ta",
179     "data/test-diff-pkg/tarpkg-0-dir2.ta",
180     "--no-default-suppression --no-show-locs",
181     "",
182     "",
183     "",
184     "",
185     "",
186     "data/test-diff-pkg/tarpkg-0-report-0.txt",
187     "output/test-diff-pkg/tarpkg-0-report-01.txt"
188   },
189   {
190     "data/test-diff-pkg/tarpkg-0-dir1.tar.gz",
191     "data/test-diff-pkg/tarpkg-0-dir2.tar.gz",
192     "--no-default-suppression --no-show-locs",
193     "",
194     "",
195     "",
196     "",
197     "",
198     "data/test-diff-pkg/tarpkg-0-report-0.txt",
199     "output/test-diff-pkg/tarpkg-0-report-02.txt"
200   },
201   {
202     "data/test-diff-pkg/tarpkg-0-dir1.tar.bz2",
203     "data/test-diff-pkg/tarpkg-0-dir2.tar.bz2",
204     "--no-default-suppression --no-show-locs",
205     "",
206     "",
207     "",
208     "",
209     "",
210     "data/test-diff-pkg/tarpkg-0-report-0.txt",
211     "output/test-diff-pkg/tarpkg-0-report-03.txt"
212   },
213   {
214     "data/test-diff-pkg/tarpkg-1-dir1.tar.gz",
215     "data/test-diff-pkg/tarpkg-1-dir2.tar.gz",
216     "--no-default-suppression --dso-only",
217     "",
218     "",
219     "",
220     "",
221     "",
222     "data/test-diff-pkg/tarpkg-1-report-0.txt",
223     "output/test-diff-pkg/tarpkg-1-report-0.txt"
224   },
225 #endif //WITH_TAR
226 
227 #ifdef WITH_RPM
228   // Two RPM packages with debuginfo available and have ABI changes
229   {
230     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
231     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64.rpm",
232     "--no-default-suppression --private-dso --no-show-locs",
233     "",
234     "data/test-diff-pkg/dbus-glib-debuginfo-0.80-3.fc12.x86_64.rpm",
235     "data/test-diff-pkg/dbus-glib-debuginfo-0.104-3.fc23.x86_64.rpm",
236     "",
237     "",
238     "data/test-diff-pkg/test-rpm-report-0.txt",
239     "output/test-diff-pkg/test-rpm-report-0.txt"
240   },
241   // Two RPM packages with 2nd package debuginfo missing
242   {
243     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
244     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64.rpm",
245     "--no-default-suppression --private-dso --no-show-locs",
246     "",
247     "data/test-diff-pkg/dbus-glib-debuginfo-0.80-3.fc12.x86_64.rpm",
248     "",
249     "",
250     "",
251     "data/test-diff-pkg/test-rpm-report-1.txt",
252     "output/test-diff-pkg/test-rpm-report-1.txt"
253   },
254 
255   // Two RPM packages with first package debuginfo missing
256   {
257     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
258     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64.rpm",
259     "--no-default-suppression --private-dso --no-show-locs",
260     "",
261     "",
262     "data/test-diff-pkg/dbus-glib-debuginfo-0.104-3.fc23.x86_64.rpm",
263     "",
264     "",
265     "data/test-diff-pkg/test-rpm-report-2.txt",
266     "output/test-diff-pkg/test-rpm-report-2.txt"
267   },
268 
269   // Two RPM packages with missing debuginfo
270   {
271     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
272     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64.rpm",
273     "--no-default-suppression --no-show-locs",
274     "",
275     "",
276     "",
277     "",
278     "",
279     "data/test-diff-pkg/test-rpm-report-3.txt",
280     "output/test-diff-pkg/test-rpm-report-3.txt"
281   },
282 
283   // Two RPM packages with no ABI change
284   {
285     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
286     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
287     "--no-default-suppression --no-show-locs",
288     "",
289     "data/test-diff-pkg/dbus-glib-debuginfo-0.80-3.fc12.x86_64.rpm",
290     "data/test-diff-pkg/dbus-glib-debuginfo-0.80-3.fc12.x86_64.rpm",
291     "",
292     "",
293     "data/test-diff-pkg/test-rpm-report-4.txt",
294     "output/test-diff-pkg/test-rpm-report-4.txt"
295   },
296   // Two RPM packages with debuginfo available and we don't want to
297   // see added symbols.
298   {
299     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
300     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64.rpm",
301     "--no-default-suppression --no-show-locs --no-added-syms",
302     "",
303     "data/test-diff-pkg/dbus-glib-debuginfo-0.80-3.fc12.x86_64.rpm",
304     "data/test-diff-pkg/dbus-glib-debuginfo-0.104-3.fc23.x86_64.rpm",
305     "",
306     "",
307     "data/test-diff-pkg/test-rpm-report-5.txt",
308     "output/test-diff-pkg/test-rpm-report-5.txt"
309   },
310   {
311     "data/test-diff-pkg/qemu-img-rhev-2.3.0-7.el7.ppc64.rpm",
312     "data/test-diff-pkg/qemu-img-rhev-2.3.0-20.el7.ppc64.rpm",
313     "--no-default-suppression --no-show-locs --no-added-syms",
314     "",
315     "data/test-diff-pkg/qemu-kvm-rhev-debuginfo-2.3.0-7.el7.ppc64.rpm",
316     "data/test-diff-pkg/qemu-kvm-rhev-debuginfo-2.3.0-20.el7.ppc64.rpm",
317     "",
318     "",
319     "data/test-diff-pkg/qemu-img-rhev-2.3.0-7.el7.ppc64--qemu-img-rhev-2.3.0-20.el7.ppc64-report-0.txt",
320     "output/test-diff-pkg/qemu-img-rhev-2.3.0-7.el7.ppc64--qemu-img-rhev-2.3.0-20.el7.ppc64-report-0.txt"
321   },
322   {
323     "data/test-diff-pkg/empty-pkg-libvirt-0.9.11.3-1.el7.ppc64.rpm",
324     "data/test-diff-pkg/empty-pkg-libvirt-1.2.17-13.el7_2.2.ppc64.rpm",
325     "",
326     "",
327     "",
328     "",
329     "",
330     "",
331     "data/test-diff-pkg/empty-pkg-report-0.txt",
332     "output/test-diff-pkg/empty-pkg-report-0.txt"
333   },
334   {
335     "data/test-diff-pkg/gmp-4.3.1-7.el6_2.2.ppc64.rpm",
336     "data/test-diff-pkg/gmp-4.3.1-10.el6.ppc64.rpm",
337     "",
338     "",
339     "data/test-diff-pkg/gmp-debuginfo-4.3.1-7.el6_2.2.ppc64.rpm",
340     "data/test-diff-pkg/gmp-debuginfo-4.3.1-10.el6.ppc64.rpm",
341     "",
342     "",
343     "data/test-diff-pkg/gmp-4.3.1-7.el6_2.2.ppc64--gmp-4.3.1-10.el6.ppc64-report-0.txt",
344     "output/test-diff-pkg/gmp-4.3.1-7.el6_2.2.ppc64--gmp-4.3.1-10.el6.ppc64-report-0.txt"
345   },
346   {
347     "data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64.rpm",
348     "data/test-diff-pkg/tbb-4.3-3.20141204.fc23.x86_64.rpm",
349     "--no-default-suppression --no-assume-odr-for-cplusplus",
350     "",
351     "data/test-diff-pkg/tbb-debuginfo-4.1-9.20130314.fc22.x86_64.rpm",
352     "data/test-diff-pkg/tbb-debuginfo-4.3-3.20141204.fc23.x86_64.rpm",
353     "",
354     "",
355     "data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt",
356     "output/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt"
357   },
358   {
359     "data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64.rpm",
360     "data/test-diff-pkg/tbb-4.3-3.20141204.fc23.x86_64.rpm",
361     "--no-default-suppression",
362     "",
363     "data/test-diff-pkg/tbb-debuginfo-4.1-9.20130314.fc22.x86_64.rpm",
364     "data/test-diff-pkg/tbb-debuginfo-4.3-3.20141204.fc23.x86_64.rpm",
365     "data/test-diff-pkg/tbb-devel-4.1-9.20130314.fc22.x86_64.rpm",
366     "data/test-diff-pkg/tbb-devel-4.3-3.20141204.fc23.x86_64.rpm",
367     "data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt",
368     "output/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt"
369   },
370   {
371     "data/test-diff-pkg/tbb-2017-8.20161128.fc26.x86_64.rpm",
372     "data/test-diff-pkg/tbb-2017-9.20170118.fc27.x86_64.rpm",
373     "--no-default-suppression",
374     "",
375     "data/test-diff-pkg/tbb-debuginfo-2017-8.20161128.fc26.x86_64.rpm",
376     "data/test-diff-pkg/tbb-debuginfo-2017-9.20170118.fc27.x86_64.rpm",
377     "",
378     "",
379     "data/test-diff-pkg/tbb-2017-8.20161128.fc26.x86_64--tbb-2017-9.20170118.fc27.x86_64.txt",
380     "output/test-diff-pkg/tbb-2017-8.20161128.fc26.x86_64--tbb-2017-9.20170118.fc27.x86_64.txt"
381   },
382   {
383     "data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm",
384     "data/test-diff-pkg/libICE-1.0.9-2.el7.x86_64.rpm",
385     "--no-default-suppression",
386     "",
387     "data/test-diff-pkg/libICE-debuginfo-1.0.6-1.el6.x86_64.rpm",
388     "data/test-diff-pkg/libICE-debuginfo-1.0.9-2.el7.x86_64.rpm",
389     "",
390     "",
391     "data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt",
392     "output/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt"
393   },
394   {
395     "data/test-diff-pkg/gtk2-immodule-xim-2.24.22-5.el7.i686.rpm",
396     "data/test-diff-pkg/gtk2-immodule-xim-2.24.28-8.el7.i686.rpm",
397     "--no-default-suppression",
398     "",
399     "data/test-diff-pkg/gtk2-debuginfo-2.24.22-5.el7.i686.rpm",
400     "data/test-diff-pkg/gtk2-debuginfo-2.24.28-8.el7.i686.rpm",
401     "",
402     "",
403     "data/test-diff-pkg/gtk2-immodule-xim-2.24.22-5.el7.i686--gtk2-immodule-xim-2.24.28-8.el7.i686-report-0.txt",
404     "output/test-diff-pkg/gtk2-immodule-xim-2.24.22-5.el7.i686--gtk2-immodule-xim-2.24.28-8.el7.i686-report-0.txt"
405   },
406   {
407     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
408     "data/test-diff-pkg/dbus-glib-0.80-3.fc12.x86_64.rpm",
409     "--no-default-suppression --show-identical-binaries",
410     "",
411     "data/test-diff-pkg/dbus-glib-debuginfo-0.80-3.fc12.x86_64.rpm",
412     "data/test-diff-pkg/dbus-glib-debuginfo-0.80-3.fc12.x86_64.rpm",
413     "",
414     "",
415     "data/test-diff-pkg/test-dbus-glib-0.80-3.fc12.x86_64-report-0.txt",
416     "output/test-diff-pkg/test-dbus-glib-0.80-3.fc12.x86_64-report-0.txt"
417   },
418   {
419     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64.rpm",
420     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.armv7hl.rpm",
421     "--no-default-suppression",
422     "",
423     "",
424     "",
425     "",
426     "",
427     "data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64--dbus-glib-0.104-3.fc23.armv7hl-report-0.txt",
428     "output/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64--dbus-glib-0.104-3.fc23.armv7hl-report-0.txt"
429   },
430   {
431     "data/test-diff-pkg/nonexistent-0.rpm",
432     "data/test-diff-pkg/nonexistent-1.rpm",
433     "--no-default-suppression --private-dso",
434     "",
435     "",
436     "",
437     "",
438     "",
439     "data/test-diff-pkg/test-nonexistent-report-0.txt",
440     "output/test-diff-pkg/test-nonexistent-report-0.txt"
441   },
442   {
443     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64.rpm",
444     "data/test-diff-pkg/spice-server-0.12.8-1.el7.x86_64.rpm",
445     "--no-default-suppression",
446     "",
447     "data/test-diff-pkg/spice-debuginfo-0.12.4-19.el7.x86_64.rpm",
448     "data/test-diff-pkg/spice-debuginfo-0.12.8-1.el7.x86_64.rpm",
449     "data/test-diff-pkg/spice-server-devel-0.12.4-19.el7.x86_64.rpm",
450     "data/test-diff-pkg/spice-server-devel-0.12.8-1.el7.x86_64.rpm",
451     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt",
452     "output/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt"
453   },
454   {
455     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64.rpm",
456     "data/test-diff-pkg/spice-server-0.12.8-1.el7.x86_64.rpm",
457     "--no-default-suppression --redundant",
458     "",
459     "data/test-diff-pkg/spice-debuginfo-0.12.4-19.el7.x86_64.rpm",
460     "data/test-diff-pkg/spice-debuginfo-0.12.8-1.el7.x86_64.rpm",
461     "data/test-diff-pkg/spice-server-devel-0.12.4-19.el7.x86_64.rpm",
462     "data/test-diff-pkg/spice-server-devel-0.12.8-1.el7.x86_64.rpm",
463     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt",
464     "output/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt"
465   },
466   {
467     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64.rpm",
468     "data/test-diff-pkg/spice-server-0.12.8-1.el7.x86_64.rpm",
469     "--no-default-suppression --redundant",
470     "",
471     "data/test-diff-pkg/spice-debuginfo-0.12.4-19.el7.x86_64.rpm",
472     "data/test-diff-pkg/spice-debuginfo-0.12.8-1.el7.x86_64.rpm",
473     "",
474     "",
475     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt",
476     "output/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt"
477   },
478   {
479     "data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64.rpm",
480     "data/test-diff-pkg/libcdio-0.94-2.fc26.x86_64.rpm",
481     "--no-default-suppression --redundant",
482     "",
483     "data/test-diff-pkg/libcdio-debuginfo-0.94-1.fc26.x86_64.rpm",
484     "data/test-diff-pkg/libcdio-debuginfo-0.94-2.fc26.x86_64.rpm",
485     "",
486     "",
487     "data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt",
488     "output/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt"
489   },
490   {
491     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64.rpm",
492     "data/test-diff-pkg/spice-server-0.12.8-1.el7.x86_64.rpm",
493     "--no-default-suppression --leaf-changes-only --impacted-interfaces",
494     "",
495     "data/test-diff-pkg/spice-debuginfo-0.12.4-19.el7.x86_64.rpm",
496     "data/test-diff-pkg/spice-debuginfo-0.12.8-1.el7.x86_64.rpm",
497     "data/test-diff-pkg/spice-server-devel-0.12.4-19.el7.x86_64.rpm",
498     "data/test-diff-pkg/spice-server-devel-0.12.4-19.el7.x86_64.rpm",
499     "data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt",
500     "output/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt"
501   },
502   {
503     "data/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64.rpm",
504     "data/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64.rpm",
505     "--fail-no-dbg",
506     "",
507     "data/test-diff-pkg/libxfce4ui-devel-debuginfo-4.12.1-8.fc27.ppc64.rpm",
508     "data/test-diff-pkg/libxfce4ui-devel-debuginfo-4.12.1-8.fc27.ppc64.rpm",
509     "",
510     "",
511     "data/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64-self-report-0.txt",
512     "output/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64-self-report-0.txt"
513   },
514   {
515     "data/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64.rpm",
516     "data/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64.rpm",
517     "--fail-no-dbg",
518     "",
519     "data/test-diff-pkg/libxfce4ui-debuginfo-4.12.1-8.fc27.ppc64.rpm "
520     "data/test-diff-pkg/libxfce4ui-devel-debuginfo-4.12.1-8.fc27.ppc64.rpm",
521     "data/test-diff-pkg/libxfce4ui-debuginfo-4.12.1-8.fc27.ppc64.rpm "
522     "data/test-diff-pkg/libxfce4ui-devel-debuginfo-4.12.1-8.fc27.ppc64.rpm",
523     "",
524     "",
525     "data/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64-self-report-ok-0.txt",
526     "output/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64-self-report-ok-0.txt"
527   },
528   {
529     "data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64.rpm",
530     "data/test-diff-pkg/elfutils-libs-0.171-1.el7.x86_64.rpm",
531     "--fail-no-dbg",
532     "",
533     "data/test-diff-pkg/elfutils-debuginfo-0.170-4.el7.x86_64.rpm",
534     "data/test-diff-pkg/elfutils-debuginfo-0.171-1.el7.x86_64.rpm",
535     "data/test-diff-pkg/elfutils-devel-0.170-4.el7.x86_64.rpm",
536     "data/test-diff-pkg/elfutils-devel-0.171-1.el7.x86_64.rpm",
537     "data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt",
538     "output/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt"
539   },
540   {
541     "data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64.rpm",
542     "data/test-diff-pkg/nss-3.24.0-1.0.fc23.x86_64.rpm",
543     "--fail-no-dbg",
544     "",
545     "data/test-diff-pkg/nss-debuginfo-3.23.0-1.0.fc23.x86_64.rpm",
546     "data/test-diff-pkg/nss-debuginfo-3.24.0-1.0.fc23.x86_64.rpm",
547     "data/test-diff-pkg/nss-devel-3.23.0-1.0.fc23.x86_64.rpm",
548     "data/test-diff-pkg/nss-devel-3.24.0-1.0.fc23.x86_64.rpm",
549     "data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt",
550     "output/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt"
551   },
552   {
553     "data/test-diff-pkg/GtkAda-gl-2.24.2-29.fc29.x86_64.rpm",
554     "data/test-diff-pkg/GtkAda-gl-2.24.2-30.fc30.x86_64.rpm",
555     "--fail-no-dbg",
556     "",
557     "data/test-diff-pkg/GtkAda-debuginfo-2.24.2-29.fc29.x86_64.rpm, "
558     "data/test-diff-pkg/GtkAda-gl-debuginfo-2.24.2-29.fc29.x86_64.rpm",
559     "data/test-diff-pkg/GtkAda-debuginfo-2.24.2-30.fc30.x86_64.rpm, "
560     "data/test-diff-pkg/GtkAda-gl-debuginfo-2.24.2-30.fc30.x86_64.rpm",
561     "data/test-diff-pkg/GtkAda-devel-2.24.2-29.fc29.x86_64.rpm",
562     "data/test-diff-pkg/GtkAda-devel-2.24.2-30.fc30.x86_64.rpm",
563     "data/test-diff-pkg/GtkAda-gl-2.24.2-29.fc29.x86_64--2.24.2-30.fc30.x86_64-report-0.txt",
564     "output/test-diff-pkg/GtkAda-gl-2.24.2-29.fc29.x86_64--2.24.2-30.fc30.x86_64-report-0.txt"
565   },
566   {
567     "data/test-diff-pkg/netcdf-fortran-mpich-4.4.4-10.fc29.x86_64.rpm",
568     "data/test-diff-pkg/netcdf-fortran-mpich-4.4.4-11.fc30.x86_64.rpm",
569     "--fail-no-dbg",
570     "",
571     "data/test-diff-pkg/netcdf-fortran-mpich-debuginfo-4.4.4-10.fc29.x86_64.rpm,"
572     "data/test-diff-pkg/netcdf-fortran-debuginfo-4.4.4-10.fc29.x86_64.rpm",
573     "data/test-diff-pkg/netcdf-fortran-mpich-debuginfo-4.4.4-11.fc30.x86_64.rpm,"
574     "data/test-diff-pkg/netcdf-fortran-debuginfo-4.4.4-11.fc30.x86_64.rpm",
575     "data/test-diff-pkg/netcdf-fortran-mpich-devel-4.4.4-10.fc29.x86_64.rpm",
576     "data/test-diff-pkg/netcdf-fortran-mpich-devel-4.4.4-11.fc30.x86_64.rpm",
577     "data/test-diff-pkg/netcdf-fortran-mpich-4.4.4-10.fc29.x86_64-4.4.4-11.fc30.x86_64-report-0.txt",
578     "output/test-diff-pkg/netcdf-fortran-mpich-4.4.4-10.fc29.x86_64-4.4.4-11.fc30.x86_64-report-0.txt"
579   },
580   {
581     "data/test-diff-pkg/PR24410-old/poppler-qt5-0.73.0-4.fc30.x86_64.rpm",
582     "data/test-diff-pkg/PR24410-new/poppler-qt5-0.73.0-8.fc30.x86_64.rpm",
583     "--fail-no-dbg",
584     "",
585     "data/test-diff-pkg/PR24410-old/poppler-debuginfo-0.73.0-4.fc30.x86_64.rpm, "
586     "data/test-diff-pkg/PR24410-old/poppler-qt5-debuginfo-0.73.0-4.fc30.x86_64.rpm",
587     "data/test-diff-pkg/PR24410-new/poppler-debuginfo-0.73.0-8.fc30.x86_64.rpm, "
588     "data/test-diff-pkg/PR24410-new/poppler-qt5-debuginfo-0.73.0-8.fc30.x86_64.rpm",
589     "data/test-diff-pkg/PR24410-old/poppler-qt5-devel-0.73.0-4.fc30.x86_64.rpm",
590     "data/test-diff-pkg/PR24410-new/poppler-qt5-devel-0.73.0-8.fc30.x86_64.rpm",
591     "data/test-diff-pkg/PR24410-report-0.txt",
592     "output/test-diff-pkg/PR24410-report-0.txt"
593   },
594   {
595     "data/test-diff-pkg/PR24690/flatpak-libs-1.2.4-3.fc30.x86_64.rpm",
596     "data/test-diff-pkg/PR24690/flatpak-libs-1.4.0-1.fc30.x86_64.rpm",
597     "--non-reachable-types",
598     "",
599     "data/test-diff-pkg/PR24690/flatpak-debuginfo-1.2.4-3.fc30.x86_64.rpm, "
600     "data/test-diff-pkg/PR24690/flatpak-libs-debuginfo-1.2.4-3.fc30.x86_64.rpm",
601     "data/test-diff-pkg/PR24690/flatpak-debuginfo-1.4.0-1.fc30.x86_64.rpm, "
602     "data/test-diff-pkg/PR24690/flatpak-libs-debuginfo-1.4.0-1.fc30.x86_64.rpm",
603     "data/test-diff-pkg/PR24690/flatpak-devel-1.2.4-3.fc30.x86_64.rpm",
604     "data/test-diff-pkg/PR24690/flatpak-devel-1.4.0-1.fc30.x86_64.rpm",
605     "data/test-diff-pkg/PR24690/PR24690-report-0.txt",
606     "output/test-diff-pkg/PR24690/PR24690-report-0.txt"
607   },
608 #if WITH_RPM_ZSTD
609   // RPMs from Fedora 31 onwards are compressed with zstd.
610   {
611     "data/test-diff-pkg/mesa-libGLU-9.0.1-3.fc33.x86_64.rpm",
612     "data/test-diff-pkg/mesa-libGLU-9.0.1-3.fc33.x86_64.rpm",
613     "--self-check",
614     "",
615     "data/test-diff-pkg/mesa-libGLU-debuginfo-9.0.1-3.fc33.x86_64.rpm",
616     "data/test-diff-pkg/mesa-libGLU-debuginfo-9.0.1-3.fc33.x86_64.rpm",
617     "",
618     "",
619     "data/test-diff-pkg/mesa-libGLU-9.0.1-3.fc33.x86_64.self-check-report-0.txt",
620     "output/test-diff-pkg/mesa-libGLU-9.0.1-3.fc33.x86_64.self-check-report-0.txt"
621   },
622   {
623     "data/test-diff-pkg/hdf5-1.10.6-2.fc33.x86_64.rpm",
624     "data/test-diff-pkg/hdf5-1.10.6-2.fc33.x86_64.rpm",
625     "--self-check",
626     "",
627     "data/test-diff-pkg/hdf5-debuginfo-1.10.6-2.fc33.x86_64.rpm",
628     "data/test-diff-pkg/hdf5-debuginfo-1.10.6-2.fc33.x86_64.rpm",
629     "",
630     "",
631     "data/test-diff-pkg/hdf5-1.10.6-2.fc33.x86_64.self-check-report-0.txt",
632     "output/test-diff-pkg/hdf5-1.10.6-2.fc33.x86_64.self-check-report-0.txt"
633   },
634   {
635     "data/test-diff-pkg/cogl-1.22.8-2.fc33.x86_64.rpm",
636     "data/test-diff-pkg/cogl-1.22.8-2.fc33.x86_64.rpm",
637     "--self-check",
638     "",
639     "data/test-diff-pkg/cogl-debuginfo-1.22.8-2.fc33.x86_64.rpm",
640     "data/test-diff-pkg/cogl-debuginfo-1.22.8-2.fc33.x86_64.rpm",
641     "",
642     "",
643     "data/test-diff-pkg/cogl-1.22.8-2.fc33.x86_64.self-check-report-0.txt",
644     "output/test-diff-pkg/cogl-1.22.8-2.fc33.x86_64.self-check-report-0.txt"
645   }
646   ,
647   {
648     "data/test-diff-pkg/glibc-2.32-3.fc33.aarch64.rpm",
649     "data/test-diff-pkg/glibc-2.32-3.fc33.aarch64.rpm",
650     "--self-check",
651     "",
652     "data/test-diff-pkg/glibc-debuginfo-2.32-3.fc33.aarch64.rpm",
653     "data/test-diff-pkg/glibc-debuginfo-2.32-3.fc33.aarch64.rpm",
654     "",
655     "",
656     "data/test-diff-pkg/glibc-2.32-3.fc33.aarch64-self-check-report-0.txt",
657     "output/test-diff-pkg/glibc-2.32-3.fc33.aarch64-self-check-report-0.txt"
658   }
659   ,
660   {
661     "data/test-diff-pkg/sshpass-1.07-1.fc34.x86_64.rpm",
662     "data/test-diff-pkg/sshpass-1.07-1.fc34.x86_64.rpm",
663     "--self-check",
664     "",
665     "data/test-diff-pkg/sshpass-debuginfo-1.07-1.fc34.x86_64.rpm",
666     "data/test-diff-pkg/sshpass-debuginfo-1.07-1.fc34.x86_64.rpm",
667     "",
668     "",
669     "data/test-diff-pkg/sshpass-1.07-1.fc34.x86_64-self-check-report-0.txt",
670     "output/test-diff-pkg/sshpass-1.07-1.fc34.x86_64-self-check-report-0.txt"
671   },
672   {
673     "data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64.rpm",
674     "data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64.rpm",
675     "--self-check",
676     "",
677     "data/test-diff-pkg/nmap-debuginfo-7.70-5.el8_testjcc.x86_64.rpm",
678     "data/test-diff-pkg/nmap-debuginfo-7.70-5.el8_testjcc.x86_64.rpm",
679     "",
680     "",
681     "data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64-self-check-report-0.txt",
682     "output/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64-self-check-report-0.txt"
683   } ,
684   {
685     "data/test-diff-pkg/elfutils-libs-0.183-1.el9.x86_64.rpm",
686     "data/test-diff-pkg/elfutils-libs-0.183-1.el9.x86_64.rpm",
687     "--self-check",
688     "",
689     "data/test-diff-pkg/elfutils-debuginfo-0.183-1.el9.x86_64.rpm,"
690     "data/test-diff-pkg/elfutils-libs-debuginfo-0.183-1.el9.x86_64.rpm",
691     "data/test-diff-pkg/elfutils-debuginfo-0.183-1.el9.x86_64.rpm,"
692     "data/test-diff-pkg/elfutils-libs-debuginfo-0.183-1.el9.x86_64.rpm",
693     "",
694     "",
695     "data/test-diff-pkg/elfutils-libs-debuginfo-0.183-1.el9.x86_64-self-check-report-0.txt",
696     "output/test-diff-pkg/elfutils-libs-debuginfo-0.183-1.el9.x86_64-self-check-report-0.txt"
697   } ,
698   {
699     "data/test-diff-pkg/graphviz-2.44.0-18.el9.aarch64.rpm",
700     "data/test-diff-pkg/graphviz-2.44.0-18.el9.aarch64.rpm",
701     "--self-check",
702     "",
703     "data/test-diff-pkg/graphviz-debuginfo-2.44.0-18.el9.aarch64.rpm",
704     "data/test-diff-pkg/graphviz-debuginfo-2.44.0-18.el9.aarch64.rpm",
705     "",
706     "",
707     "data/test-diff-pkg/graphviz-2.44.0-18.el9.aarch64-self-check-report-0.txt",
708     "output/test-diff-pkg/graphviz-2.44.0-18.el9.aarch64-self-check-report-0.txt"
709   } ,
710   {
711     "data/test-diff-pkg/libxcrypt-4.1.1-6.el8.x86_64.rpm",
712     "data/test-diff-pkg/libxcrypt-4.4.18-3.el9.x86_64.rpm",
713     "",
714     "",
715     "data/test-diff-pkg/libxcrypt-debuginfo-4.1.1-6.el8.x86_64.rpm",
716     "data/test-diff-pkg/libxcrypt-debuginfo-4.4.18-3.el9.x86_64.rpm",
717     "",
718     "",
719     "data/test-diff-pkg/libxcrypt-4.1.1-6.el8.x86_64--libxcrypt-4.1.1-6.el8.x86_64-output-1.txt",
720     "output/test-diff-pkg/libxcrypt-4.1.1-6.el8.x86_64--libxcrypt-4.1.1-6.el8.x86_64-output-1.txt"
721   } ,
722   {
723     "data/test-diff-pkg/libxcrypt-4.1.1-6.el8.x86_64.rpm",
724     "data/test-diff-pkg/libxcrypt-compat-4.4.18-3.el9.x86_64.rpm",
725     "",
726     "",
727     "data/test-diff-pkg/libxcrypt-debuginfo-4.1.1-6.el8.x86_64.rpm",
728     "data/test-diff-pkg/libxcrypt-debuginfo-4.4.18-3.el9.x86_64.rpm,"
729     "data/test-diff-pkg/libxcrypt-compat-debuginfo-4.4.18-3.el9.x86_64.rpm",
730     "",
731     "",
732     "data/test-diff-pkg/libxcrypt-4.1.1-6.el8.x86_64--libxcrypt-compat-4.4.18-3.el9.x86_64-report-1.txt",
733     "output/test-diff-pkg/libxcrypt-4.1.1-6.el8.x86_64--libxcrypt-compat-4.4.18-3.el9.x86_64-report-1.txt"
734   } ,
735   {
736     "data/test-diff-pkg/wireshark/wireshark-cli-3.4.9-1.fc36.x86_64.rpm",
737     "data/test-diff-pkg/wireshark/wireshark-cli-3.4.9-1.fc36.x86_64.rpm",
738     "--self-check",
739     "",
740     "data/test-diff-pkg/wireshark/wireshark-cli-debuginfo-3.4.9-1.fc36.x86_64.rpm,"
741     "data/test-diff-pkg/wireshark/wireshark-debuginfo-3.4.9-1.fc36.x86_64.rpm",
742     "data/test-diff-pkg/wireshark/wireshark-cli-debuginfo-3.4.9-1.fc36.x86_64.rpm,"
743     "data/test-diff-pkg/wireshark/wireshark-debuginfo-3.4.9-1.fc36.x86_64.rpm",
744     "",
745     "",
746     "data/test-diff-pkg/wireshark/wireshark-cli-3.4.9-1.fc36.x86_64-self-check-report.txt",
747     "output/test-diff-pkg/wireshark/wireshark-cli-3.4.9-1.fc36.x86_64-self-check-report.txt"
748   } ,
749 #endif // WITH_RPM_ZSTD
750 #endif //WITH_RPM
751 
752 #ifdef WITH_DEB
753   // Two debian packages.
754   {
755     "data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64.deb",
756     "data/test-diff-pkg/libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64.deb",
757     "--no-default-suppression --no-show-locs --fail-no-dbg",
758     "",
759     "data/test-diff-pkg/libsigc++-2.0-0c2a-dbgsym_2.4.0-1_amd64.ddeb",
760     "data/test-diff-pkg/libsigc++-2.0-0v5-dbgsym_2.4.1-1ubuntu2_amd64.ddeb",
761     "",
762     "",
763     "data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt",
764     "output/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt"
765   },
766 #endif // WITH_DEB
767 #ifdef WITH_CTF
768   // Specific test entries for CTF.
769 
770   // dir1 contains a suppr spec - it should be ignored.
771   {
772     "data/test-diff-pkg-ctf/dirpkg-0-dir1",
773     "data/test-diff-pkg-ctf/dirpkg-0-dir2",
774     "--ctf --no-default-suppression",
775     "",
776     "",
777     "",
778     "",
779     "",
780     "data/test-diff-pkg-ctf/dirpkg-0-report-0.txt",
781     "output/test-diff-pkg-ctf/dirpkg-0-report-0.txt"
782   },
783   // dir2 contains a suppr spec - it should be recognized.
784   {
785     "data/test-diff-pkg-ctf/dirpkg-1-dir1",
786     "data/test-diff-pkg-ctf/dirpkg-1-dir2",
787     "--ctf --no-default-suppression",
788     "",
789     "",
790     "",
791     "",
792     "",
793     "data/test-diff-pkg-ctf/dirpkg-1-report-0.txt",
794     "output/test-diff-pkg-ctf/dirpkg-1-report-0.txt"
795   },
796   // dir2 contains a suppr spec but --no-abignore is specified,
797   // the file should be ignored.
798   {
799     "data/test-diff-pkg-ctf/dirpkg-1-dir1",
800     "data/test-diff-pkg-ctf/dirpkg-1-dir2",
801     "--ctf --no-default-suppression --no-abignore",
802     "",
803     "",
804     "",
805     "",
806     "",
807     "data/test-diff-pkg-ctf/dirpkg-1-report-1.txt",
808     "output/test-diff-pkg-ctf/dirpkg-1-report-1.txt"
809   },
810   // dir2 contains several suppr spec files, ".abignore" and
811   // "dir.abignore", so the specs should be merged.
812   {
813     "data/test-diff-pkg-ctf/dirpkg-2-dir1",
814     "data/test-diff-pkg-ctf/dirpkg-2-dir2",
815     "--ctf --no-default-suppression",
816     "",
817     "",
818     "",
819     "",
820     "",
821     "data/test-diff-pkg-ctf/dirpkg-2-report-0.txt",
822     "output/test-diff-pkg-ctf/dirpkg-2-report-0.txt"
823   },
824   // dir2 contains a suppr spec file, ".abignore" and
825   // an additional suppr file is specified on the command line,
826   // so the specs should be merged.
827   {
828     "data/test-diff-pkg-ctf/dirpkg-3-dir1",
829     "data/test-diff-pkg-ctf/dirpkg-3-dir2",
830     "--ctf --no-default-suppression",
831     "data/test-diff-pkg-ctf/dirpkg-3.suppr",
832     "",
833     "",
834     "",
835     "",
836     "data/test-diff-pkg-ctf/dirpkg-3-report-0.txt",
837     "output/test-diff-pkg-ctf/dirpkg-3-report-0.txt"
838   },
839   // dir2 contains a suppr spec file, ".abignore", which should
840   // be ignored because of the program options  and
841   // an additional suppr file is specified on the command line,
842   // which should be recognized.
843   {
844     "data/test-diff-pkg-ctf/dirpkg-3-dir1",
845     "data/test-diff-pkg-ctf/dirpkg-3-dir2",
846     "--ctf --no-default-suppression --no-abignore",
847     "data/test-diff-pkg-ctf/dirpkg-3.suppr",
848     "",
849     "",
850     "",
851     "",
852     "data/test-diff-pkg-ctf/dirpkg-3-report-1.txt",
853     "output/test-diff-pkg-ctf/dirpkg-3-report-1.txt"
854   },
855   { // Just like the previous tests, but loc info is emitted.
856     "data/test-diff-pkg-ctf/dirpkg-3-dir1",
857     "data/test-diff-pkg-ctf/dirpkg-3-dir2",
858     "--ctf --no-default-suppression --no-abignore",
859     "data/test-diff-pkg-ctf/dirpkg-3.suppr",
860     "",
861     "",
862     "",
863     "",
864     "data/test-diff-pkg-ctf/dirpkg-3-report-2.txt",
865     "output/test-diff-pkg-ctf/dirpkg-3-report-2.txt"
866   },
867   {
868     "data/test-diff-pkg-ctf/symlink-dir-test1/dir1/symlinks",
869     "data/test-diff-pkg-ctf/symlink-dir-test1/dir2/symlinks",
870     "--ctf --no-default-suppression ",
871     "",
872     "",
873     "",
874     "",
875     "",
876     "data/test-diff-pkg-ctf/symlink-dir-test1-report0.txt ",
877     "output/test-diff-pkg-ctf/symlink-dir-test1-report0.txt "
878   },
879 #if WITH_TAR
880   {
881     "data/test-diff-pkg-ctf/tarpkg-0-dir1.tar",
882     "data/test-diff-pkg-ctf/tarpkg-0-dir2.tar",
883     "--ctf --no-default-suppression",
884     "",
885     "",
886     "",
887     "",
888     "",
889     "data/test-diff-pkg-ctf/tarpkg-0-report-0.txt",
890     "output/test-diff-pkg-ctf/tarpkg-0-report-0.txt"
891   },
892   {
893     "data/test-diff-pkg-ctf/tarpkg-0-dir1.ta",
894     "data/test-diff-pkg-ctf/tarpkg-0-dir2.ta",
895     "--ctf --no-default-suppression",
896     "",
897     "",
898     "",
899     "",
900     "",
901     "data/test-diff-pkg-ctf/tarpkg-0-report-0.txt",
902     "output/test-diff-pkg-ctf/tarpkg-0-report-01.txt"
903   },
904   {
905     "data/test-diff-pkg-ctf/tarpkg-0-dir1.tar.gz",
906     "data/test-diff-pkg-ctf/tarpkg-0-dir2.tar.gz",
907     "--ctf --no-default-suppression",
908     "",
909     "",
910     "",
911     "",
912     "",
913     "data/test-diff-pkg-ctf/tarpkg-0-report-0.txt",
914     "output/test-diff-pkg-ctf/tarpkg-0-report-02.txt"
915   },
916   {
917     "data/test-diff-pkg-ctf/tarpkg-0-dir1.tar.bz2",
918     "data/test-diff-pkg-ctf/tarpkg-0-dir2.tar.bz2",
919     "--ctf --no-default-suppression",
920     "",
921     "",
922     "",
923     "",
924     "",
925     "data/test-diff-pkg-ctf/tarpkg-0-report-0.txt",
926     "output/test-diff-pkg-ctf/tarpkg-0-report-03.txt"
927   },
928   {
929     "data/test-diff-pkg-ctf/tarpkg-1-dir1.tar.gz",
930     "data/test-diff-pkg-ctf/tarpkg-1-dir2.tar.gz",
931     "--ctf --no-default-suppression --dso-only",
932     "",
933     "",
934     "",
935     "",
936     "",
937     "data/test-diff-pkg-ctf/tarpkg-1-report-0.txt",
938     "output/test-diff-pkg-ctf/tarpkg-1-report-0.txt"
939   },
940 #endif //WITH_TAR
941 #ifdef WITH_RPM
942   // Two RPM packages with CTF debuginfo available and have ABI changes
943   {
944     "data/test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm",
945     "data/test-diff-pkg-ctf/libdwarf-20180129-5.x86_64.rpm",
946     "--ctf --no-default-suppression --private-dso",
947     "",
948     "",
949     "",
950     "",
951     "",
952     "data/test-diff-pkg-ctf/test-rpm-report-0.txt",
953     "output/test-diff-pkg-ctf/test-rpm-report-0.txt"
954   },
955   // Two RPM packages with 2nd package debuginfo missing (no -gctf)
956   {
957     "data/test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm",
958     "data/test-diff-pkg-ctf/libdwarf-20180129-5-no-ctf.x86_64.rpm",
959     "--ctf --no-default-suppression --private-dso",
960     "",
961     "",
962     "",
963     "",
964     "",
965     "data/test-diff-pkg-ctf/test-rpm-report-1.txt",
966     "output/test-diff-pkg-ctf/test-rpm-report-1.txt"
967   },
968 
969   // Two RPM packages with first package debuginfo missing (no -gctf)
970   {
971     "data/test-diff-pkg-ctf/libdwarf-20180129-5-no-ctf.x86_64.rpm",
972     "data/test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm",
973     "--ctf --no-default-suppression --private-dso",
974     "",
975     "",
976     "",
977     "",
978     "",
979     "data/test-diff-pkg-ctf/test-rpm-report-2.txt",
980     "output/test-diff-pkg-ctf/test-rpm-report-2.txt"
981   },
982 
983   // Two RPM packages with missing debuginfo
984   {
985     "data/test-diff-pkg-ctf/libdwarf-20180129-5-no-ctf.x86_64.rpm",
986     "data/test-diff-pkg-ctf/libdwarf-20180129-4-no-ctf.x86_64.rpm",
987     "--ctf --no-default-suppression",
988     "",
989     "",
990     "",
991     "",
992     "",
993     "data/test-diff-pkg-ctf/test-rpm-report-3.txt",
994     "output/test-diff-pkg-ctf/test-rpm-report-3.txt"
995   },
996 
997   // Two RPM packages with no ABI change
998   {
999     "data/test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm",
1000     "data/test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm",
1001     "--ctf --no-default-suppression",
1002     "",
1003     "",
1004     "",
1005     "",
1006     "",
1007     "data/test-diff-pkg-ctf/test-rpm-report-4.txt",
1008     "output/test-diff-pkg-ctf/test-rpm-report-4.txt"
1009   },
1010   // Two RPM packages with debuginfo available and we don't want to
1011   // see added symbols.
1012   {
1013     "data/test-diff-pkg-ctf/libdwarf-20180129-4.x86_64.rpm",
1014     "data/test-diff-pkg-ctf/libdwarf-20180129-5.x86_64.rpm",
1015     "--ctf --no-default-suppression --no-added-syms",
1016     "",
1017     "",
1018     "",
1019     "",
1020     "",
1021     "data/test-diff-pkg-ctf/test-rpm-report-5.txt",
1022     "output/test-diff-pkg-ctf/test-rpm-report-5.txt"
1023   },
1024   {
1025     "data/test-diff-pkg-ctf/elfutils-libelf-0.186-1.x86_64.rpm",
1026     "data/test-diff-pkg-ctf/elfutils-libelf-0.186-2.x86_64.rpm",
1027     "--ctf --no-default-suppression --no-added-syms",
1028     "",
1029     "",
1030     "",
1031     "",
1032     "",
1033     "data/test-diff-pkg-ctf/elfutils-libelf-0.186-report-0.txt",
1034     "output/test-diff-pkg-ctf/elfutils-libelf-0.186-report-0.txt"
1035   },
1036   {
1037     "data/test-diff-pkg-ctf/elfutils-libelf-0.186-1.x86_64.rpm",
1038     "data/test-diff-pkg-ctf/elfutils-libelf-0.186-2.x86_64.rpm",
1039     "--ctf",
1040     "",
1041     "",
1042     "",
1043     "",
1044     "",
1045     "data/test-diff-pkg-ctf/elfutils-libelf-0.186-report-1.txt",
1046     "output/test-diff-pkg-ctf/elfutils-libelf-0.186-report-1.txt"
1047   },
1048   {
1049     "data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u0.x86_64.rpm",
1050     "data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8u6.x86_64.rpm",
1051     "--ctf",
1052     "",
1053     "",
1054     "",
1055     "",
1056     "",
1057     "data/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8.x86_64-report-0.txt",
1058     "output/test-diff-pkg-ctf/cracklib-2.9.6-15-ol8.x86_64-report-0.txt"
1059   },
1060   {
1061     "data/test-diff-pkg-ctf/gmp-6.1.2-8-ol8u0.x86_64.rpm",
1062     "data/test-diff-pkg-ctf/gmp-6.2.0-10-ol9u0.x86_64.rpm",
1063     "--ctf --no-default-suppression",
1064     "",
1065     "",
1066     "",
1067     "",
1068     "",
1069     "data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt",
1070     "output/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt"
1071   },
1072   // Even when CTF is thinking to be resided along with binary
1073   // files, it could be stripped out in an external location.
1074   {
1075     "data/test-diff-pkg-ctf/isl-0.16.1-6.x86_64.rpm",
1076     "data/test-diff-pkg-ctf/isl-0.16.1-7.x86_64.rpm",
1077     "--ctf --no-default-suppression",
1078     "",
1079     "data/test-diff-pkg-ctf/isl-debuginfo-0.16.1-6.x86_64.rpm",
1080     "data/test-diff-pkg-ctf/isl-debuginfo-0.16.1-7.x86_64.rpm",
1081     "",
1082     "",
1083     "data/test-diff-pkg-ctf/isl-0.16.1-report-0.txt",
1084     "output/test-diff-pkg-ctf/isl-0.16.1-report-0.txt"
1085   },
1086 #endif //WITH_RPM
1087 #endif //WITH_CTF
1088   // This should be the last entry.
1089   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
1090 };
1091 
1092 /// A task which launches abipkgdiff on the binaries passed to the
1093 /// constructor of the task.  The test also launches gnu diff on the
1094 /// result of abipkdiff to compare it against a reference abipkgdiff
1095 /// result.
1096 struct test_task : public abigail::workers::task
1097 {
1098   InOutSpec spec;
1099   bool is_ok;
1100   string diff_cmd;
1101   string error_message;
1102 
test_tasktest_task1103   test_task(const InOutSpec& s)
1104     : spec(s),
1105       is_ok(true)
1106   {}
1107 
1108   /// This virtual function overload actually performs the job of the
1109   /// task.
1110   ///
1111   /// It actually launches abipkgdiff on the binaries passed to the
1112   /// constructor of the task.  It also launches gnu diff on the
1113   /// result of the abidiff to compare it against a reference abidiff
1114   /// result.
1115   virtual void
performtest_task1116   perform()
1117   {
1118     using abigail::tests::get_build_dir;
1119     using abigail::tools_utils::ensure_parent_dir_created;
1120 
1121     string first_in_package_path, second_in_package_path,
1122       prog_options,
1123       ref_abi_diff_report_path, out_abi_diff_report_path, cmd, abipkgdiff,
1124       first_in_devel_package_path, second_in_devel_package_path,
1125       suppression_path;
1126     vector<string> first_in_debug_package_paths, second_in_debug_package_paths;
1127 
1128     first_in_package_path =
1129       string(get_src_dir()) + "/tests/" + spec.first_in_package_path;
1130     second_in_package_path =
1131       string(get_src_dir()) + "/tests/" + spec.second_in_package_path;
1132 
1133     prog_options = spec.prog_options;
1134 
1135     if (spec.first_in_debug_package_path
1136 	&& strcmp(spec.first_in_debug_package_path, ""))
1137       {
1138 	vector<string> debug_info_pkg_paths;
1139 	split_string(spec.first_in_debug_package_path, ", ",
1140 		     debug_info_pkg_paths);
1141 	ABG_ASSERT(!debug_info_pkg_paths.empty());
1142 	for (vector<string>::const_iterator s = debug_info_pkg_paths.begin();
1143 	     s != debug_info_pkg_paths.end();
1144 	     ++s)
1145 	  first_in_debug_package_paths.push_back(string(get_src_dir()) +
1146 						 "/tests/" + *s);
1147       }
1148     else
1149       first_in_debug_package_paths.clear();
1150 
1151     if (spec.second_in_debug_package_path
1152 	&& strcmp(spec.second_in_debug_package_path, ""))
1153       {
1154 	vector<string> debug_info_pkg_paths;
1155 	split_string(spec.second_in_debug_package_path,
1156 		     ", ",
1157 		     debug_info_pkg_paths);
1158 	ABG_ASSERT(!debug_info_pkg_paths.empty());
1159 	for (vector<string>::const_iterator s = debug_info_pkg_paths.begin();
1160 	     s != debug_info_pkg_paths.end();
1161 	     ++s)
1162 	  second_in_debug_package_paths.push_back(string(get_src_dir()) +
1163 						  "/tests/" + *s);
1164       }
1165     else
1166       second_in_debug_package_paths.clear();
1167 
1168     if (spec.first_in_devel_package_path
1169 	&& strcmp(spec.first_in_devel_package_path, ""))
1170       first_in_devel_package_path =
1171 	string(get_src_dir()) + "/tests/" + spec.first_in_devel_package_path;
1172 
1173     if (spec.second_in_devel_package_path
1174 	&& strcmp(spec.second_in_devel_package_path, ""))
1175       second_in_devel_package_path =
1176 	string(get_src_dir()) + "/tests/" + spec.second_in_devel_package_path;
1177 
1178     if (spec.suppression_path
1179 	&& strcmp(spec.suppression_path, ""))
1180       suppression_path =
1181 	string(get_src_dir()) + "/tests/" + spec.suppression_path;
1182     else
1183       suppression_path.clear();
1184 
1185     ref_abi_diff_report_path =
1186       string(get_src_dir()) + "/tests/" + spec.ref_report_path;
1187     out_abi_diff_report_path =
1188       string(get_build_dir()) + "/tests/" + spec.out_report_path;
1189 
1190     if (!ensure_parent_dir_created(out_abi_diff_report_path))
1191       {
1192 	cerr << "could not create parent directory for "
1193 	     << out_abi_diff_report_path;
1194 	is_ok = false;
1195 	return;
1196       }
1197 
1198     abipkgdiff = string(get_build_dir()) + "/tools/abipkgdiff";
1199 
1200     if (!prog_options.empty())
1201       abipkgdiff +=  " " + prog_options;
1202 
1203     for (vector<string>::const_iterator p =
1204 	   first_in_debug_package_paths.begin();
1205 	 p != first_in_debug_package_paths.end();
1206 	 ++p)
1207       abipkgdiff += " --d1 " + *p;
1208 
1209     for (vector<string>::const_iterator p =
1210 	   second_in_debug_package_paths.begin();
1211 	 p != second_in_debug_package_paths.end();
1212 	 ++p)
1213       abipkgdiff += " --d2 " + *p;
1214 
1215     if (!first_in_devel_package_path.empty())
1216       abipkgdiff += " --devel1 " + first_in_devel_package_path;
1217 
1218     if (!second_in_devel_package_path.empty())
1219       abipkgdiff += " --devel2 " + second_in_devel_package_path;
1220 
1221     if (!suppression_path.empty())
1222       abipkgdiff += " --suppressions " + suppression_path;
1223 
1224     cmd =
1225       abipkgdiff + " " + first_in_package_path + " " + second_in_package_path;
1226     cmd += " > " + out_abi_diff_report_path + " 2>&1";
1227 
1228     bool abipkgdiff_ok = true;
1229     int code = system(cmd.c_str());
1230     if (!WIFEXITED(code))
1231       abipkgdiff_ok = false;
1232 
1233     if (abipkgdiff_ok)
1234       {
1235 	cmd = "diff -u " + ref_abi_diff_report_path + " "
1236 	  + out_abi_diff_report_path;
1237 	if (system(cmd.c_str()))
1238 	  is_ok = false;
1239       }
1240     else
1241       is_ok = false;
1242   }
1243 }; // end struct test_task
1244 
1245 /// A convenience typedef for shared
1246 typedef shared_ptr<test_task> test_task_sptr;
1247 
1248 int
main()1249 main()
1250 {
1251   using std::vector;
1252   using std::dynamic_pointer_cast;
1253   using abigail::workers::queue;
1254   using abigail::workers::task;
1255   using abigail::workers::task_sptr;
1256   using abigail::workers::get_number_of_threads;
1257 
1258   /// Create a task queue.  The max number of worker threads of the
1259   /// queue is the number of the concurrent threads supported by the
1260   /// processor of the machine this code runs on.
1261   const size_t num_tests = sizeof(in_out_specs) / sizeof (InOutSpec) - 1;
1262   size_t num_workers = std::min(get_number_of_threads(), num_tests);
1263   queue task_queue(num_workers);
1264 
1265   bool is_ok = true;
1266 
1267   for (InOutSpec *s = in_out_specs; s->first_in_package_path; ++s)
1268     {
1269       test_task_sptr t(new test_task(*s));
1270       ABG_ASSERT(task_queue.schedule_task(t));
1271     }
1272 
1273   /// Wait for all worker threads to finish their job, and wind down.
1274   task_queue.wait_for_workers_to_complete();
1275 
1276   // Now walk the results and print whatever error messages need to be
1277   // printed.
1278 
1279   const vector<task_sptr>& completed_tasks =
1280     task_queue.get_completed_tasks();
1281   ABG_ASSERT(completed_tasks.size() == num_tests);
1282 
1283   for (vector<task_sptr>::const_iterator ti = completed_tasks.begin();
1284        ti != completed_tasks.end();
1285        ++ti)
1286     {
1287       test_task_sptr t = dynamic_pointer_cast<test_task>(*ti);
1288       if (!t->is_ok)
1289 	{
1290 	  is_ok = false;
1291 	  if (!t->diff_cmd.empty())
1292 	    if (system(t->diff_cmd.c_str()) == -1)
1293 	      cerr << "execution of '" << t->diff_cmd << "' failed\n";
1294 	  if (!t->error_message.empty())
1295 	    cerr << t->error_message << '\n';
1296 	}
1297     }
1298 
1299     return !is_ok;
1300 }
1301