| #!/usr/bin/env python |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| # -*- coding: utf-8 -*- |
| # -*- Mode: Python |
| # |
| # Author: Chenxiong Qi |
| |
| '''Runs tests for the fedabipkgdiff program |
| |
| This program runs the fedabipkgdiff tool (via the mockfedabipkgdiff |
| tool) repeatedly and compares its output against a set of reference |
| output files. |
| |
| ''' |
| |
| import sys |
| import os |
| import subprocess |
| |
| FEDABIPKGDIFF = '@abs_top_builddir@/tests/mockfedabipkgdiff' |
| TEST_SRC_DIR = '@abs_top_srcdir@/tests' |
| TEST_BUILD_DIR = '@abs_top_builddir@/tests' |
| INPUT_DIR = '@abs_top_srcdir@/tests/data/test-fedabipkgdiff' |
| OUTPUT_DIR = '@abs_top_builddir@/tests/output/test-fedabipkgdiff' |
| |
| # This variable is a list of 3-uples. Here is the meaning of |
| # the elements of each 3-uples: |
| # |
| # (arguments to pass to fedabipkgdiff, |
| # reference output file, |
| # where to store the result of the comparison) |
| # |
| # Note that after fedabipkgdiff is run (using the arguments that are |
| # the first element of the tuple) the result of the comparison is |
| # going to be compared against the reference output file, and both |
| # must be equal. |
| # |
| # If a user wants to add a new test, she must add a new tuple to the |
| # variable below, and also add a new reference output to the source |
| # distribution. |
| # |
| FEDABIPKGDIFF_TEST_SPECS = [ |
| (['--from', 'fc20', '--to', 'fc23', 'dbus-glib'], |
| 'data/test-fedabipkgdiff/test0-from-fc20-to-fc23-dbus-glib-report-0.txt', |
| 'output/test-fedabipkgdiff/test0-type-suppr-report-0.txt'), |
| |
| (['--from', 'fc20', os.path.join(INPUT_DIR, |
| 'packages/dbus-glib/0.106/1.fc23/x86_64/' |
| 'dbus-glib-0.106-1.fc23.x86_64.rpm')], |
| 'data/test-fedabipkgdiff/test1-from-fc20-to-dbus-glib-0.106-1.fc23.x86_64-report-0.txt', |
| 'output/test-fedabipkgdiff/test1-from-fc20-to-dbus-glib-0.106-1.fc23.x86_64-report-0.txt'), |
| |
| (['dbus-glib-0.100.2-2.fc20', 'dbus-glib-0.106-1.fc23'], |
| 'data/test-fedabipkgdiff/test2-dbus-glib-0.100.2-2.fc20--dbus-glib-0.106-1.fc23-report-0.txt', |
| 'output/test-fedabipkgdiff/test2-dbus-glib-0.100.2-2.fc20--dbus-glib-0.106-1.fc23-report-0.txt'), |
| |
| (['dbus-glib-0.100.2-2.fc20.i686', 'dbus-glib-0.106-1.fc23.i686'], |
| 'data/test-fedabipkgdiff/test3-dbus-glib-0.100.2-2.fc20.i686--dbus-glib-0.106-1.fc23.i686-report-0.txt', |
| 'output/test-fedabipkgdiff/test3-dbus-glib-0.100.2-2.fc20.i686--dbus-glib-0.106-1.fc23.i686-report-0.txt'), |
| |
| (['vte291-0.39.1-1.fc22.x86_64', 'vte291-0.39.90-1.fc22.x86_64'], |
| 'data/test-fedabipkgdiff/vte291-0.39.1-1.fc22.x86_64--vte291-0.39.90-1.fc22.x86_64-report-0.txt', |
| 'output/test-fedabipkgdiff/vte291-0.39.1-1.fc22.x86_64--vte291-0.39.90-1.fc22.x86_64-report-0.txt'), |
| |
| ([os.path.join(INPUT_DIR, 'packages/dbus-glib/0.100.2/2.fc20/x86_64/dbus-glib-0.100.2-2.fc20.x86_64.rpm'), |
| os.path.join(INPUT_DIR, 'packages/dbus-glib/0.106/1.fc23/x86_64/dbus-glib-0.106-1.fc23.x86_64.rpm')], |
| 'data/test-fedabipkgdiff/test4-glib-0.100.2-2.fc20.x86_64.rpm-glib-0.106-1.fc23.x86_64.rpm-report-0.txt', |
| 'output/test-fedabipkgdiff/test4-glib-0.100.2-2.fc20.x86_64.rpm-glib-0.106-1.fc23.x86_64.rpm-report-0.txt'), |
| |
| ([os.path.join(INPUT_DIR, 'dbus-glib/dbus-glib-0.100.2-2.fc20.x86_64.rpm'), |
| os.path.join(INPUT_DIR, 'dbus-glib/dbus-glib-0.106-1.fc23.x86_64.rpm')], |
| 'data/test-fedabipkgdiff/test5-same-dir-dbus-glib-0.100.2-2.fc20.x86_64--dbus-glib-0.106-1.fc23.x86_64-report-0.txt', |
| 'output/test-fedabipkgdiff/test5-same-dir-dbus-glib-0.100.2-2.fc20.x86_64--dbus-glib-0.106-1.fc23.x86_64-report-0.txt'), |
| |
| ([os.path.join(INPUT_DIR, 'nss-util/nss-util-3.12.6-1.fc14.x86_64.rpm'), |
| os.path.join(INPUT_DIR, 'nss-util/nss-util-3.24.0-2.0.fc25.x86_64.rpm')], |
| 'data/test-fedabipkgdiff/test6-nss-util-3.12.6-1.fc14.x86_64--nss-util-3.24.0-2.0.fc25.x86_64-report-0.txt', |
| 'output/test-fedabipkgdiff/test6-nss-util-3.12.6-1.fc14.x86_64--nss-util-3.24.0-2.0.fc25.x86_64-report-0.txt'), |
| |
| (['--self-compare', '-a', '--from', 'fc23', 'dbus-glib'], |
| 'data/test-fedabipkgdiff/test7-self-compare-from-fc23-dbus-glib-report-0.txt', |
| 'output/test-fedabipkgdiff/test7-self-compare-from-fc23-dbus-glib-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_fedabipkgdiff_tests(): |
| """Run the fedabipkgdiff tests |
| |
| Loop through the test inputs in the FEDABIPKGDIFF_TEST_SPECS global |
| variable and for each of the test input, launch a comparison using |
| mockfedabipkgdiff, which calls fedabipkgdiff by making sure it |
| doesn't use the network. |
| |
| The result of the comparison is stored in an output file, and that |
| output file is compared (using GNU diff) against the reference |
| output file specified in the FEDABIPKGDIFF_TEST_SPECS global |
| variable. |
| |
| This function returns True iff all comparison specified by |
| FEDABIPKGDIFF_TEST_SPECS succeed. |
| """ |
| |
| result = True |
| for args, reference_report_path, output_path in FEDABIPKGDIFF_TEST_SPECS: |
| reference_report_path = os.path.join(TEST_SRC_DIR, reference_report_path) |
| output_path = os.path.join(TEST_BUILD_DIR, output_path) |
| cmd = [FEDABIPKGDIFF, |
| '--no-default-suppression', |
| '--show-identical-binaries', |
| '--clean-cache'] + args |
| |
| with open(output_path, 'w') as out_file: |
| subprocess.call(cmd, stdout=out_file) |
| |
| if not os.path.exists(reference_report_path): |
| sys.stderr.write('file not found: ' + reference_report_path + '\n') |
| return_code = -1 |
| else: |
| diffcmd = ['diff', '-u', reference_report_path, output_path] |
| return_code = subprocess.call(diffcmd) |
| if return_code: |
| sys.stderr.write('fedabipkgdiff test failed for ' + |
| reference_report_path + '\n') |
| sys.stderr.write('command was: ' + ' '.join(cmd) + '\n'); |
| result &= not return_code |
| |
| return result |
| |
| |
| def main(): |
| """The main entry point of this program. |
| |
| This creates the output directory and launches the tests for the |
| fedabipkgdiff program. |
| |
| :return: 0 upon success, 1 otherwise. |
| """ |
| |
| ensure_output_dir_created() |
| result = 0 |
| result = run_fedabipkgdiff_tests() |
| return not result |
| |
| |
| if __name__ == '__main__': |
| exit_code = main() |
| sys.exit(exit_code) |