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
33using std::string;
34using std::vector;
35using std::cerr;
36using abigail::tests::get_src_dir;
37using abigail::tools_utils::split_string;
38
39struct 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
53static 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.
1096struct test_task : public abigail::workers::task
1097{
1098  InOutSpec spec;
1099  bool is_ok;
1100  string diff_cmd;
1101  string error_message;
1102
1103  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
1116  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
1246typedef shared_ptr<test_task> test_task_sptr;
1247
1248int
1249main()
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