1e01aa904Sopenharmony_ci// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
2e01aa904Sopenharmony_ci// -*- Mode: C++ -*-
3e01aa904Sopenharmony_ci//
4e01aa904Sopenharmony_ci// Copyright (C) 2016-2022 Red Hat, Inc.
5e01aa904Sopenharmony_ci//
6e01aa904Sopenharmony_ci// Author: Dodji Seketeli
7e01aa904Sopenharmony_ci
8e01aa904Sopenharmony_ci/// @file
9e01aa904Sopenharmony_ci///
10e01aa904Sopenharmony_ci/// This program runs abidiff between input files and checks that
11e01aa904Sopenharmony_ci/// the exit code of the abidiff is the one we expect.
12e01aa904Sopenharmony_ci///
13e01aa904Sopenharmony_ci/// The set of input files and reference reports to consider should be
14e01aa904Sopenharmony_ci/// present in the source distribution.
15e01aa904Sopenharmony_ci
16e01aa904Sopenharmony_ci/// This is an aggregate that specifies where a test shall get its
17e01aa904Sopenharmony_ci/// input from and where it shall write its ouput to.
18e01aa904Sopenharmony_ci
19e01aa904Sopenharmony_ci#include <sys/wait.h>
20e01aa904Sopenharmony_ci#include <cstring>
21e01aa904Sopenharmony_ci#include <string>
22e01aa904Sopenharmony_ci#include <vector>
23e01aa904Sopenharmony_ci#include <fstream>
24e01aa904Sopenharmony_ci#include <iostream>
25e01aa904Sopenharmony_ci#include <cstdlib>
26e01aa904Sopenharmony_ci#include "abg-tools-utils.h"
27e01aa904Sopenharmony_ci#include "test-utils.h"
28e01aa904Sopenharmony_ci
29e01aa904Sopenharmony_ciusing abigail::tools_utils::abidiff_status;
30e01aa904Sopenharmony_ciusing abigail::tests::emit_test_status_and_update_counters;
31e01aa904Sopenharmony_ciusing abigail::tests::emit_test_summary;
32e01aa904Sopenharmony_ci
33e01aa904Sopenharmony_cistruct InOutSpec
34e01aa904Sopenharmony_ci{
35e01aa904Sopenharmony_ci  const char*	in_elfv0_path;
36e01aa904Sopenharmony_ci  const char*	in_elfv1_path;
37e01aa904Sopenharmony_ci  const char*	in_suppr_path;
38e01aa904Sopenharmony_ci  const char*   in_elfv0_headers_dirs;
39e01aa904Sopenharmony_ci  const char*   in_elfv1_headers_dirs;
40e01aa904Sopenharmony_ci  const char*	abidiff_options;
41e01aa904Sopenharmony_ci  abidiff_status status;
42e01aa904Sopenharmony_ci  const char*	in_report_path;
43e01aa904Sopenharmony_ci  const char*	out_report_path;
44e01aa904Sopenharmony_ci};// end struct InOutSpec;
45e01aa904Sopenharmony_ci
46e01aa904Sopenharmony_ciInOutSpec in_out_specs[] =
47e01aa904Sopenharmony_ci{
48e01aa904Sopenharmony_ci  {
49e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test1-voffset-change-v0.o",
50e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test1-voffset-change-v1.o",
51e01aa904Sopenharmony_ci    "",
52e01aa904Sopenharmony_ci    "",
53e01aa904Sopenharmony_ci    "",
54e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs",
55e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE
56e01aa904Sopenharmony_ci    | abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
57e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test1-voffset-change-report0.txt",
58e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test1-voffset-change-report0.txt"
59e01aa904Sopenharmony_ci  },
60e01aa904Sopenharmony_ci  {
61e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test1-voffset-change-v0.o",
62e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test1-voffset-change-v1.o",
63e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test1-voffset-change.abignore",
64e01aa904Sopenharmony_ci    "",
65e01aa904Sopenharmony_ci    "",
66e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs",
67e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
68e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test1-voffset-change-report1.txt",
69e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test1-voffset-change-report1.txt"
70e01aa904Sopenharmony_ci  },
71e01aa904Sopenharmony_ci  {
72e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test2-filtered-removed-fns-v0.o",
73e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test2-filtered-removed-fns-v1.o",
74e01aa904Sopenharmony_ci    "",
75e01aa904Sopenharmony_ci    "",
76e01aa904Sopenharmony_ci    "",
77e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs",
78e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE
79e01aa904Sopenharmony_ci    | abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
80e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test2-filtered-removed-fns-report0.txt",
81e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test2-filtered-removed-fns-report0.txt"
82e01aa904Sopenharmony_ci  },
83e01aa904Sopenharmony_ci  {
84e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test2-filtered-removed-fns-v0.o",
85e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test2-filtered-removed-fns-v1.o",
86e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test2-filtered-removed-fns.abignore",
87e01aa904Sopenharmony_ci    "",
88e01aa904Sopenharmony_ci    "",
89e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs",
90e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
91e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test2-filtered-removed-fns-report1.txt",
92e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test2-filtered-removed-fns-report1.txt"
93e01aa904Sopenharmony_ci  },
94e01aa904Sopenharmony_ci  {
95e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-loc-v0.bi",
96e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-loc-v1.bi",
97e01aa904Sopenharmony_ci    "",
98e01aa904Sopenharmony_ci    "",
99e01aa904Sopenharmony_ci    "",
100e01aa904Sopenharmony_ci    "",
101e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
102e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-loc-with-locs-report.txt",
103e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-loc-with-locs-report.txt"
104e01aa904Sopenharmony_ci  },
105e01aa904Sopenharmony_ci  {
106e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-loc-v0.bi",
107e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-loc-v1.bi",
108e01aa904Sopenharmony_ci    "",
109e01aa904Sopenharmony_ci    "",
110e01aa904Sopenharmony_ci    "",
111e01aa904Sopenharmony_ci    "--no-show-locs",
112e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
113e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-loc-without-locs-report.txt",
114e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-loc-without-locs-report.txt"
115e01aa904Sopenharmony_ci  },
116e01aa904Sopenharmony_ci  {
117e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-no-stray-comma-v0.o",
118e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-no-stray-comma-v1.o",
119e01aa904Sopenharmony_ci    "",
120e01aa904Sopenharmony_ci    "",
121e01aa904Sopenharmony_ci    "",
122e01aa904Sopenharmony_ci    "--leaf-changes-only",
123e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
124e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-no-stray-comma-report.txt",
125e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-no-stray-comma-report.txt"
126e01aa904Sopenharmony_ci  },
127e01aa904Sopenharmony_ci  {
128e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-stats-v0.o",
129e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-stats-v1.o",
130e01aa904Sopenharmony_ci    "",
131e01aa904Sopenharmony_ci    "",
132e01aa904Sopenharmony_ci    "",
133e01aa904Sopenharmony_ci    "--no-show-locs --leaf-changes-only",
134e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
135e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-stats-report.txt",
136e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-leaf-stats-report.txt"
137e01aa904Sopenharmony_ci  },
138e01aa904Sopenharmony_ci  {
139e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-more-v0.o",
140e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-more-v1.o",
141e01aa904Sopenharmony_ci    "",
142e01aa904Sopenharmony_ci    "",
143e01aa904Sopenharmony_ci    "",
144e01aa904Sopenharmony_ci    "--no-show-locs --leaf-changes-only",
145e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE
146e01aa904Sopenharmony_ci    | abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
147e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-more-report.txt",
148e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-leaf-more-report.txt"
149e01aa904Sopenharmony_ci  },
150e01aa904Sopenharmony_ci  {
151e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-fun-type-v0.o",
152e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-fun-type-v1.o",
153e01aa904Sopenharmony_ci    "",
154e01aa904Sopenharmony_ci    "",
155e01aa904Sopenharmony_ci    "",
156e01aa904Sopenharmony_ci    "--no-show-locs --leaf-changes-only",
157e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
158e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-fun-type-report.txt",
159e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-leaf-fun-type-report.txt"
160e01aa904Sopenharmony_ci  },
161e01aa904Sopenharmony_ci  {
162e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-redundant-v0.o",
163e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-redundant-v1.o",
164e01aa904Sopenharmony_ci    "",
165e01aa904Sopenharmony_ci    "",
166e01aa904Sopenharmony_ci    "",
167e01aa904Sopenharmony_ci    "--leaf-changes-only",
168e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
169e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-redundant-report.txt",
170e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-leaf-redundant-report.txt"
171e01aa904Sopenharmony_ci  },
172e01aa904Sopenharmony_ci  {
173e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-peeling-v0.o",
174e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-peeling-v1.o",
175e01aa904Sopenharmony_ci    "",
176e01aa904Sopenharmony_ci    "",
177e01aa904Sopenharmony_ci    "",
178e01aa904Sopenharmony_ci    "--leaf-changes-only",
179e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
180e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-peeling-report.txt",
181e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-leaf-peeling-report.txt"
182e01aa904Sopenharmony_ci  },
183e01aa904Sopenharmony_ci  {
184e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-cxx-members-v0.o",
185e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-cxx-members-v1.o",
186e01aa904Sopenharmony_ci    "",
187e01aa904Sopenharmony_ci    "",
188e01aa904Sopenharmony_ci    "",
189e01aa904Sopenharmony_ci    "--leaf-changes-only",
190e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE
191e01aa904Sopenharmony_ci    | abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
192e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-leaf-cxx-members-report.txt",
193e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-leaf-cxx-members-report.txt"
194e01aa904Sopenharmony_ci  },
195e01aa904Sopenharmony_ci  {
196e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-member-size-v0.o",
197e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-member-size-v1.o",
198e01aa904Sopenharmony_ci    "",
199e01aa904Sopenharmony_ci    "",
200e01aa904Sopenharmony_ci    "",
201e01aa904Sopenharmony_ci    "",
202e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
203e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-member-size-report0.txt",
204e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-member-size-report0.txt"
205e01aa904Sopenharmony_ci  },
206e01aa904Sopenharmony_ci  {
207e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-member-size-v0.o",
208e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-member-size-v1.o",
209e01aa904Sopenharmony_ci    "",
210e01aa904Sopenharmony_ci    "",
211e01aa904Sopenharmony_ci    "",
212e01aa904Sopenharmony_ci    "--leaf-changes-only",
213e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
214e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-member-size-report1.txt",
215e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-member-size-report1.txt"
216e01aa904Sopenharmony_ci  },
217e01aa904Sopenharmony_ci  {
218e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-struct-v0.o",
219e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-struct-v1.o",
220e01aa904Sopenharmony_ci    "",
221e01aa904Sopenharmony_ci    "",
222e01aa904Sopenharmony_ci    "",
223e01aa904Sopenharmony_ci    "--harmless",
224e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
225e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-struct-report.txt",
226e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-decl-struct-report.txt"
227e01aa904Sopenharmony_ci  },
228e01aa904Sopenharmony_ci  {
229e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-fun-param-v0.abi",
230e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-fun-param-v1.abi",
231e01aa904Sopenharmony_ci    "",
232e01aa904Sopenharmony_ci    "",
233e01aa904Sopenharmony_ci    "",
234e01aa904Sopenharmony_ci    "",
235e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
236e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-fun-param-report.txt",
237e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-fun-param-report.txt"
238e01aa904Sopenharmony_ci  },
239e01aa904Sopenharmony_ci  {
240e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-v0.o",
241e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-v1.o",
242e01aa904Sopenharmony_ci    "",
243e01aa904Sopenharmony_ci    "",
244e01aa904Sopenharmony_ci    "",
245e01aa904Sopenharmony_ci    "--harmless",
246e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
247e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-report.txt",
248e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-decl-enum-report.txt"
249e01aa904Sopenharmony_ci  },
250e01aa904Sopenharmony_ci  {
251e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-v0.o",
252e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-v1.o",
253e01aa904Sopenharmony_ci    "",
254e01aa904Sopenharmony_ci    "",
255e01aa904Sopenharmony_ci    "",
256e01aa904Sopenharmony_ci    "",
257e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
258e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-report-2.txt",
259e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-decl-enum-report-2.txt"
260e01aa904Sopenharmony_ci  },
261e01aa904Sopenharmony_ci  {
262e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-v0.o",
263e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-v1.o",
264e01aa904Sopenharmony_ci    "",
265e01aa904Sopenharmony_ci    "",
266e01aa904Sopenharmony_ci    "",
267e01aa904Sopenharmony_ci    "--leaf-changes-only",
268e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
269e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-decl-enum-report-3.txt",
270e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-decl-enum-report-3.txt"
271e01aa904Sopenharmony_ci  },
272e01aa904Sopenharmony_ci  {
273e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v0.o",
274e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v1.o",
275e01aa904Sopenharmony_ci    "",
276e01aa904Sopenharmony_ci    "",
277e01aa904Sopenharmony_ci    "",
278e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs",
279e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE
280e01aa904Sopenharmony_ci    | abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
281e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-report0.txt",
282e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-net-change-report0.txt"
283e01aa904Sopenharmony_ci  },
284e01aa904Sopenharmony_ci  {
285e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v0.o",
286e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v1.o",
287e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change.abignore",
288e01aa904Sopenharmony_ci    "",
289e01aa904Sopenharmony_ci    "",
290e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs",
291e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
292e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-report1.txt",
293e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-net-change-report1.txt"
294e01aa904Sopenharmony_ci  },
295e01aa904Sopenharmony_ci  {
296e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v0.o",
297e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v1.o",
298e01aa904Sopenharmony_ci    "",
299e01aa904Sopenharmony_ci    "",
300e01aa904Sopenharmony_ci    "",
301e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs --leaf-changes-only",
302e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE
303e01aa904Sopenharmony_ci    | abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
304e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-report2.txt",
305e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-net-change-report2.txt"
306e01aa904Sopenharmony_ci  },
307e01aa904Sopenharmony_ci  {
308e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v0.o",
309e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-v1.o",
310e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change.abignore",
311e01aa904Sopenharmony_ci    "",
312e01aa904Sopenharmony_ci    "",
313e01aa904Sopenharmony_ci    "--no-default-suppression --no-show-locs --leaf-changes-only",
314e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
315e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-net-change-report3.txt",
316e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-net-change-report3.txt"
317e01aa904Sopenharmony_ci  },
318e01aa904Sopenharmony_ci  {
319e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/test-headers-dir-v0.o",
320e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/test-headers-dir-v1.o",
321e01aa904Sopenharmony_ci    "",
322e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/headers-a",
323e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/headers-a",
324e01aa904Sopenharmony_ci    "--no-default-suppression",
325e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
326e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-1.txt",
327e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-1.txt"
328e01aa904Sopenharmony_ci  },
329e01aa904Sopenharmony_ci  {
330e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/test-headers-dir-v0.o",
331e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/test-headers-dir-v1.o",
332e01aa904Sopenharmony_ci    "",
333e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/headers-a, "
334e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/headers-b",
335e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/headers-a, "
336e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/headers-b",
337e01aa904Sopenharmony_ci    "--no-default-suppression",
338e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
339e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-2.txt",
340e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-2.txt"
341e01aa904Sopenharmony_ci  },
342e01aa904Sopenharmony_ci  {
343e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
344e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
345e01aa904Sopenharmony_ci    "",
346e01aa904Sopenharmony_ci    "",
347e01aa904Sopenharmony_ci    "",
348e01aa904Sopenharmony_ci    "",
349e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
350e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-report-0.txt",
351e01aa904Sopenharmony_ci    "output/test-abidiff-exit/qualifier-typedef-array-report-0.txt"
352e01aa904Sopenharmony_ci  },
353e01aa904Sopenharmony_ci  {
354e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
355e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
356e01aa904Sopenharmony_ci    "",
357e01aa904Sopenharmony_ci    "",
358e01aa904Sopenharmony_ci    "",
359e01aa904Sopenharmony_ci    "--harmless",
360e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
361e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-report-1.txt",
362e01aa904Sopenharmony_ci    "output/test-abidiff-exit/qualifier-typedef-array-report-1.txt"
363e01aa904Sopenharmony_ci  },
364e01aa904Sopenharmony_ci  {
365e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
366e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
367e01aa904Sopenharmony_ci    "",
368e01aa904Sopenharmony_ci    "",
369e01aa904Sopenharmony_ci    "",
370e01aa904Sopenharmony_ci    "--leaf-changes-only",
371e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
372e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-report-2.txt",
373e01aa904Sopenharmony_ci    "output/test-abidiff-exit/qualifier-typedef-array-report-2.txt"
374e01aa904Sopenharmony_ci  },
375e01aa904Sopenharmony_ci  {
376e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v0.o",
377e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-v1.o",
378e01aa904Sopenharmony_ci    "",
379e01aa904Sopenharmony_ci    "",
380e01aa904Sopenharmony_ci    "",
381e01aa904Sopenharmony_ci    "--harmless --leaf-changes-only",
382e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
383e01aa904Sopenharmony_ci    "data/test-abidiff-exit/qualifier-typedef-array-report-3.txt",
384e01aa904Sopenharmony_ci    "output/test-abidiff-exit/qualifier-typedef-array-report-3.txt"
385e01aa904Sopenharmony_ci  },
386e01aa904Sopenharmony_ci  {
387e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-non-leaf-array-v0.o",
388e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-non-leaf-array-v1.o",
389e01aa904Sopenharmony_ci    "",
390e01aa904Sopenharmony_ci    "",
391e01aa904Sopenharmony_ci    "",
392e01aa904Sopenharmony_ci    "--leaf-changes-only",
393e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
394e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-non-leaf-array-report.txt",
395e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-non-leaf-array-report.txt"
396e01aa904Sopenharmony_ci  },
397e01aa904Sopenharmony_ci  {
398e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-crc-v0.abi",
399e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-crc-v1.abi",
400e01aa904Sopenharmony_ci    "",
401e01aa904Sopenharmony_ci    "",
402e01aa904Sopenharmony_ci    "",
403e01aa904Sopenharmony_ci    "",
404e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
405e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-crc-report.txt",
406e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-crc-report.txt"
407e01aa904Sopenharmony_ci  },
408e01aa904Sopenharmony_ci  {
409e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-missing-alias.abi",
410e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-missing-alias.abi",
411e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-missing-alias.suppr",
412e01aa904Sopenharmony_ci    "",
413e01aa904Sopenharmony_ci    "",
414e01aa904Sopenharmony_ci    "",
415e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_OK,
416e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-missing-alias-report.txt",
417e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-missing-alias-report.txt"
418e01aa904Sopenharmony_ci  },
419e01aa904Sopenharmony_ci  {
420e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR28316-v0.o",
421e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR28316-v1.o",
422e01aa904Sopenharmony_ci    "",
423e01aa904Sopenharmony_ci    "",
424e01aa904Sopenharmony_ci    "",
425e01aa904Sopenharmony_ci    "--no-default-suppression --harmless",
426e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
427e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR28316-report.txt",
428e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-PR28316-report.txt"
429e01aa904Sopenharmony_ci  },
430e01aa904Sopenharmony_ci  {
431e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR29144-v0.o",
432e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR29144-v1.o",
433e01aa904Sopenharmony_ci    "",
434e01aa904Sopenharmony_ci    "",
435e01aa904Sopenharmony_ci    "",
436e01aa904Sopenharmony_ci    "--no-default-suppression --harmless",
437e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
438e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR29144-report.txt",
439e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-PR29144-report.txt"
440e01aa904Sopenharmony_ci  },
441e01aa904Sopenharmony_ci  {
442e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR29144-v0.o",
443e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR29144-v1.o",
444e01aa904Sopenharmony_ci    "",
445e01aa904Sopenharmony_ci    "",
446e01aa904Sopenharmony_ci    "",
447e01aa904Sopenharmony_ci    "--leaf-changes-only --no-default-suppression --harmless",
448e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
449e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-PR29144-report-2.txt",
450e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-PR29144-report-2.txt"
451e01aa904Sopenharmony_ci  },
452e01aa904Sopenharmony_ci  {
453e01aa904Sopenharmony_ci    "data/test-abidiff-exit/ld-2.28-210.so",
454e01aa904Sopenharmony_ci    "data/test-abidiff-exit/ld-2.28-211.so",
455e01aa904Sopenharmony_ci    "",
456e01aa904Sopenharmony_ci    "",
457e01aa904Sopenharmony_ci    "",
458e01aa904Sopenharmony_ci    "--no-default-suppression",
459e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
460e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-ld-2.28-210.so--ld-2.28-211.so.txt",
461e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-ld-2.28-210.so--ld-2.28-211.so.txt"
462e01aa904Sopenharmony_ci  },
463e01aa904Sopenharmony_ci  {
464e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-rhbz2114909-v0.o",
465e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-rhbz2114909-v1.o",
466e01aa904Sopenharmony_ci    "",
467e01aa904Sopenharmony_ci    "",
468e01aa904Sopenharmony_ci    "",
469e01aa904Sopenharmony_ci    "--no-default-suppression",
470e01aa904Sopenharmony_ci    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
471e01aa904Sopenharmony_ci    "data/test-abidiff-exit/test-rhbz2114909-report-1.txt",
472e01aa904Sopenharmony_ci    "output/test-abidiff-exit/test-rhbz2114909-report-1.txt"
473e01aa904Sopenharmony_ci  },
474e01aa904Sopenharmony_ci  {0, 0, 0 ,0, 0, 0, abigail::tools_utils::ABIDIFF_OK, 0, 0}
475e01aa904Sopenharmony_ci};
476e01aa904Sopenharmony_ci
477e01aa904Sopenharmony_ci/// Prefix the strings in a vector of string.
478e01aa904Sopenharmony_ci///
479e01aa904Sopenharmony_ci/// @param strings the strings to prefix.
480e01aa904Sopenharmony_ci///
481e01aa904Sopenharmony_ci/// @param prefix the prefix to use.
482e01aa904Sopenharmony_cistatic void
483e01aa904Sopenharmony_cido_prefix_strings(std::vector<std::string> &strings,
484e01aa904Sopenharmony_ci		  const std::string& prefix)
485e01aa904Sopenharmony_ci{
486e01aa904Sopenharmony_ci  for (std::vector<std::string>::size_type i = 0; i < strings.size(); ++i)
487e01aa904Sopenharmony_ci    strings[i] = prefix + strings[i];
488e01aa904Sopenharmony_ci}
489e01aa904Sopenharmony_ci
490e01aa904Sopenharmony_ciint
491e01aa904Sopenharmony_cimain()
492e01aa904Sopenharmony_ci{
493e01aa904Sopenharmony_ci  using std::string;
494e01aa904Sopenharmony_ci  using std::vector;
495e01aa904Sopenharmony_ci  using std::cerr;
496e01aa904Sopenharmony_ci  using abigail::tests::get_src_dir;
497e01aa904Sopenharmony_ci  using abigail::tests::get_build_dir;
498e01aa904Sopenharmony_ci  using abigail::tools_utils::ensure_parent_dir_created;
499e01aa904Sopenharmony_ci  using abigail::tools_utils::split_string;
500e01aa904Sopenharmony_ci  using abigail::tools_utils::abidiff_status;
501e01aa904Sopenharmony_ci
502e01aa904Sopenharmony_ci  unsigned int total_count = 0, passed_count = 0, failed_count = 0;
503e01aa904Sopenharmony_ci
504e01aa904Sopenharmony_ci  string in_elfv0_path, in_elfv1_path,
505e01aa904Sopenharmony_ci    in_suppression_path, abidiff_options, abidiff, cmd, diff_cmd,
506e01aa904Sopenharmony_ci    ref_diff_report_path, out_diff_report_path;
507e01aa904Sopenharmony_ci  vector<string> in_elfv0_headers_dirs, in_elfv1_headers_dirs;
508e01aa904Sopenharmony_ci  string source_dir_prefix = string(get_src_dir()) + "/tests/";
509e01aa904Sopenharmony_ci  string build_dir_prefix = string(get_build_dir()) + "/tests/";
510e01aa904Sopenharmony_ci
511e01aa904Sopenharmony_ci    for (InOutSpec* s = in_out_specs; s->in_elfv0_path; ++s)
512e01aa904Sopenharmony_ci      {
513e01aa904Sopenharmony_ci	bool is_ok = true;
514e01aa904Sopenharmony_ci	in_elfv0_path = source_dir_prefix + s->in_elfv0_path;
515e01aa904Sopenharmony_ci	in_elfv1_path = source_dir_prefix + s->in_elfv1_path;
516e01aa904Sopenharmony_ci	split_string(s->in_elfv0_headers_dirs, ",", in_elfv0_headers_dirs);
517e01aa904Sopenharmony_ci	split_string(s->in_elfv1_headers_dirs, ",", in_elfv1_headers_dirs);
518e01aa904Sopenharmony_ci	do_prefix_strings(in_elfv0_headers_dirs, source_dir_prefix);
519e01aa904Sopenharmony_ci	do_prefix_strings(in_elfv1_headers_dirs, source_dir_prefix);
520e01aa904Sopenharmony_ci
521e01aa904Sopenharmony_ci	if (s->in_suppr_path && strcmp(s->in_suppr_path, ""))
522e01aa904Sopenharmony_ci	  in_suppression_path = source_dir_prefix + s->in_suppr_path;
523e01aa904Sopenharmony_ci	else
524e01aa904Sopenharmony_ci	  in_suppression_path.clear();
525e01aa904Sopenharmony_ci
526e01aa904Sopenharmony_ci	abidiff_options = s->abidiff_options;
527e01aa904Sopenharmony_ci	ref_diff_report_path = source_dir_prefix + s->in_report_path;
528e01aa904Sopenharmony_ci	out_diff_report_path = build_dir_prefix + s->out_report_path;
529e01aa904Sopenharmony_ci
530e01aa904Sopenharmony_ci	if (!ensure_parent_dir_created(out_diff_report_path))
531e01aa904Sopenharmony_ci	  {
532e01aa904Sopenharmony_ci	    cerr << "could not create parent directory for "
533e01aa904Sopenharmony_ci		 << out_diff_report_path;
534e01aa904Sopenharmony_ci	    is_ok = false;
535e01aa904Sopenharmony_ci	    continue;
536e01aa904Sopenharmony_ci	  }
537e01aa904Sopenharmony_ci
538e01aa904Sopenharmony_ci	abidiff = string(get_build_dir()) + "/tools/abidiff";
539e01aa904Sopenharmony_ci	if (!abidiff_options.empty())
540e01aa904Sopenharmony_ci	  abidiff += " " + abidiff_options;
541e01aa904Sopenharmony_ci
542e01aa904Sopenharmony_ci	if (!in_elfv0_headers_dirs.empty())
543e01aa904Sopenharmony_ci	  for (vector<string>::const_iterator s = in_elfv0_headers_dirs.begin();
544e01aa904Sopenharmony_ci	       s != in_elfv0_headers_dirs.end();
545e01aa904Sopenharmony_ci	       ++s)
546e01aa904Sopenharmony_ci	    abidiff += " --headers-dir1 " + *s;
547e01aa904Sopenharmony_ci
548e01aa904Sopenharmony_ci	if (!in_elfv1_headers_dirs.empty())
549e01aa904Sopenharmony_ci	  for (vector<string>::const_iterator s = in_elfv1_headers_dirs.begin();
550e01aa904Sopenharmony_ci	       s != in_elfv1_headers_dirs.end();
551e01aa904Sopenharmony_ci	       ++s)
552e01aa904Sopenharmony_ci	    abidiff += " --headers-dir2 " + *s;
553e01aa904Sopenharmony_ci
554e01aa904Sopenharmony_ci	if (!in_suppression_path.empty())
555e01aa904Sopenharmony_ci	  abidiff += " --suppressions " + in_suppression_path;
556e01aa904Sopenharmony_ci
557e01aa904Sopenharmony_ci	cmd = abidiff + " " + in_elfv0_path + " " + in_elfv1_path;
558e01aa904Sopenharmony_ci	cmd += " > " + out_diff_report_path;
559e01aa904Sopenharmony_ci
560e01aa904Sopenharmony_ci	bool abidiff_ok = true;
561e01aa904Sopenharmony_ci	int code = system(cmd.c_str());
562e01aa904Sopenharmony_ci	if (!WIFEXITED(code))
563e01aa904Sopenharmony_ci	  abidiff_ok = false;
564e01aa904Sopenharmony_ci	else
565e01aa904Sopenharmony_ci	  {
566e01aa904Sopenharmony_ci	    abigail::tools_utils::abidiff_status status =
567e01aa904Sopenharmony_ci	      static_cast<abidiff_status>(WEXITSTATUS(code));
568e01aa904Sopenharmony_ci	    if (status != s->status)
569e01aa904Sopenharmony_ci	      {
570e01aa904Sopenharmony_ci		cerr << "for command '"
571e01aa904Sopenharmony_ci		     << cmd
572e01aa904Sopenharmony_ci		     << "', expected abidiff status to be " << s->status
573e01aa904Sopenharmony_ci		     << " but instead, got " << status << "\n";
574e01aa904Sopenharmony_ci		abidiff_ok = false;
575e01aa904Sopenharmony_ci	      }
576e01aa904Sopenharmony_ci	  }
577e01aa904Sopenharmony_ci
578e01aa904Sopenharmony_ci	if (abidiff_ok)
579e01aa904Sopenharmony_ci	  {
580e01aa904Sopenharmony_ci	    diff_cmd = "diff -u " + ref_diff_report_path
581e01aa904Sopenharmony_ci	      + " " + out_diff_report_path;
582e01aa904Sopenharmony_ci	    if (system(diff_cmd.c_str()))
583e01aa904Sopenharmony_ci	      is_ok = false;
584e01aa904Sopenharmony_ci	  }
585e01aa904Sopenharmony_ci	else
586e01aa904Sopenharmony_ci	  is_ok = false;
587e01aa904Sopenharmony_ci
588e01aa904Sopenharmony_ci	emit_test_status_and_update_counters(is_ok,
589e01aa904Sopenharmony_ci					     cmd,
590e01aa904Sopenharmony_ci					     passed_count,
591e01aa904Sopenharmony_ci					     failed_count,
592e01aa904Sopenharmony_ci					     total_count);
593e01aa904Sopenharmony_ci      }
594e01aa904Sopenharmony_ci
595e01aa904Sopenharmony_ci    emit_test_summary(total_count, passed_count, failed_count);
596e01aa904Sopenharmony_ci
597e01aa904Sopenharmony_ci
598e01aa904Sopenharmony_ci    return failed_count;
599e01aa904Sopenharmony_ci}
600