blob: c1b58dc04cbce2c95470af33161456959b689c3e [file] [log] [blame]
#!/usr/bin/env @PYTHON@
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
'''Runs tests for the default suppression specifications of libabigail.
This program tries to exercise the reading of default suppression
files by the abidiff and abipkgdiff programs.
It reads a set of input files to ABI-compare, along with a
suppressions specification and a reference output. The test points
the environment variables LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE
and LIBABIGAIL_USER_SYSTEM_SUPPRESSION_FILE environment variables at
the suppression specification and runs abidiff to compare the two
input binary files. The result of the comparison should be equal to
the reference output, meaning that the suppression specification was
taken into account.
'''
import sys
import os
import subprocess
abidiff = '@abs_top_builddir@/tools/abidiff'
abipkgdiff = '@abs_top_builddir@/tools/abipkgdiff'
test_src_dir = '@top_srcdir@/tests'
test_build_dir = '@abs_top_builddir@/tests'
input_dir = '@top_srcdir@/tests/data/test-default-supprs'
output_dir = '@abs_top_builddir@/tests/output/test-default-supprs'
# This variable named is a list of 5-uples. Here is the meaning of
# the elements of each 5-uples:
#
# (first binary to compare,
# second binary to compare,
# suppression specification,
# reference output file,
# where to store the result of the comparison)
#
abidiff_test_specs = [('data/test-default-supprs/test0-type-suppr-v0.o',
'data/test-default-supprs/test0-type-suppr-v1.o',
'data/test-default-supprs/test0-type-suppr-0.suppr',
'data/test-default-supprs/test0-type-suppr-report-0.txt',
'output/test-default-supprs/test0-type-suppr-report-0.txt'),]
# This variable named is a list of 5-uples. Here is the meaning of
# the elements of each 5-uples:
#
# (first package to compare,
# second package to compare,
# suppression specification,
# reference output file,
# where to store the result of the comparison)
#
abipkgdiff_test_specs = [('data/test-default-supprs/dirpkg-1-dir1',
'data/test-default-supprs/dirpkg-1-dir2',
'data/test-default-supprs/dirpkg-1-dir2/dir.abignore',
'data/test-default-supprs/dirpkg-1-dir-report-0.txt',
'output/test-default-supprs/dirpkg-1-dir-report-0.txt')]
def ensure_output_dir_created():
'''Create output dir if it's not already created.'''
try:
os.makedirs(output_dir)
except:
pass
if not os.path.exists(output_dir):
sys.exit(1);
def run_abidiff_tests():
"""Run the abidiff default suppression tests.
Loop through the test inputs in the abidiff_test_specs global
variable and for each of the test input, launch a comparison using
abidiff and setting LIBABIGAIL_SYSTEM_SUPPRESSION_FILE and
LIBABIGAIL_USER_SYSTEM_SUPPRESSION_FILE environment variables.
Note that if LIBABIGAIL_SYSTEM_SUPPRESSION_FILE is not set,
libabigail tries to load the file
$libdir/libabigail/defaul-libabigail.abignore, and then tries to
load the file $HOME/.abignore. This program does not test the
case where LIBABIGAIL_SYSTEM_SUPPRESSION_FILE and
LIBABIGAIL_USER_SYSTEM_SUPPRESSION_FILE are not set.
This function returns the exit code of the abidiff program.
"""
default_suppression = output_dir + "/default.abignore"
with open(default_suppression, 'w') as out:
out.write('\n');
result = 0;
for test_spec in abidiff_test_specs:
binary1 = test_spec[0]
binary2 = test_spec[1]
suppressions = test_spec[2]
reference_report_path = test_spec[3]
output_path = test_spec[4]
binary1 = test_src_dir + "/" + binary1
binary2 = test_src_dir + "/" + binary2
suppressions = test_src_dir + "/" + suppressions if suppressions else ''
reference_report_path = test_src_dir + "/" + reference_report_path
output_path = test_build_dir + "/" + output_path
cmd = [abidiff, binary1, binary2]
# The environment variables that say where to find the default
# suppression specifications loaded by libabigail.
envs = {
'LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE' : default_suppression,
'LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE' : default_suppression
}
# Initialize the environment variables above to their default
# value.
for name, value in envs.items():
os.environ[name] = value;
for env_name in envs:
env_vars = os.environ
if suppressions:
env_vars[env_name] = suppressions
with open(output_path, 'w') as out_file:
subprocess.call(cmd, env=env_vars, stdout=out_file)
diffcmd = ['diff', '-u', reference_report_path, output_path]
return_code = subprocess.call(diffcmd)
if return_code:
result = return_code
sys.stderr.write("failed abidiff test "
"for env var '" + env_name + "'\n");
del env_vars[env_name];
try:
os.remove(default_suppression)
except:
pass
return result;
def run_abipkgdiff_tests():
"""Run the abipkgdiff default suppression tests.
Loop through the test inputs in the abipkgdiff_test_specs global
variable and for each of the input packages, launch a comparison
using abipkgdiff and setting LIBABIGAIL_SYSTEM_SUPPRESSION_FILE
and LIBABIGAIL_USER_SYSTEM_SUPPRESSION_FILE environment variables.
Note that if LIBABIGAIL_SYSTEM_SUPPRESSION_FILE is not set,
libabigail tries to load the file
$libdir/libabigail/defaul-libabigail.abignore, and then tries to
load the file $HOME/.abignore. This program does not test the
case where LIBABIGAIL_SYSTEM_SUPPRESSION_FILE and
LIBABIGAIL_USER_SYSTEM_SUPPRESSION_FILE are not set.
This function returns the exit code of the abipkgdiff program.
"""
default_suppression = output_dir + "/default.abignore"
with open(default_suppression, 'w') as out:
out.write('\n');
result = 0;
for test_spec in abipkgdiff_test_specs:
pkg1 = test_spec[0]
pkg2 = test_spec[1]
suppressions = test_spec[2]
reference_report_path = test_spec[3]
output_path = test_spec[4]
pkg1 = test_src_dir + "/" + pkg1
pkg2 = test_src_dir + "/" + pkg2
suppressions = test_src_dir + "/" + suppressions if suppressions else ''
reference_report_path = test_src_dir + "/" + reference_report_path
output_path = test_build_dir + "/" + output_path
cmd = [abipkgdiff, '--no-abignore', pkg1, pkg2]
# The environment variables that say where to find the default
# suppression specifications loaded by libabigail.
envs = {
'LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE' : default_suppression,
'LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE' : default_suppression
}
# Initialize the environment variables above to their default
# value.
for name, value in envs.items():
os.environ[name] = value;
for env_name in envs:
env_vars = os.environ
if suppressions:
env_vars[env_name] = suppressions
with open(output_path, 'w') as out_file:
subprocess.call(cmd, env=env_vars, stdout=out_file)
diffcmd = ['diff', '-u', reference_report_path, output_path]
return_code = subprocess.call(diffcmd)
if return_code:
result = return_code
sys.stderr.write("failed abipkgdiff test "
"for env var '" + e + "'\n");
del env_vars[env_name];
try:
os.remove(default_suppression)
except:
pass
return result;
def main():
"""The main entry point of this program.
This creates the output directory and launches the tests for the
abidiff and abipkgdiff probrams. It the abidiff programs returns
with a non-zero exit code, this function returns that exit code
immediatly. Otherwise, it runs the abipkgdiff tests and returns
its exit code.
"""
ensure_output_dir_created()
result = 0;
result = run_abidiff_tests()
if result:
return result;
result = run_abipkgdiff_tests()
return result;
if __name__ == '__main__':
exit_code = main()
sys.exit(exit_code)