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