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