1*f5c631daSSadaf Ebrahimi# Copyright 2019, VIXL authors 2*f5c631daSSadaf Ebrahimi# All rights reserved. 3*f5c631daSSadaf Ebrahimi# 4*f5c631daSSadaf Ebrahimi# Redistribution and use in source and binary forms, with or without 5*f5c631daSSadaf Ebrahimi# modification, are permitted provided that the following conditions are met: 6*f5c631daSSadaf Ebrahimi# 7*f5c631daSSadaf Ebrahimi# * Redistributions of source code must retain the above copyright notice, 8*f5c631daSSadaf Ebrahimi# this list of conditions and the following disclaimer. 9*f5c631daSSadaf Ebrahimi# * Redistributions in binary form must reproduce the above copyright notice, 10*f5c631daSSadaf Ebrahimi# this list of conditions and the following disclaimer in the documentation 11*f5c631daSSadaf Ebrahimi# and/or other materials provided with the distribution. 12*f5c631daSSadaf Ebrahimi# * Neither the name of ARM Limited nor the names of its contributors may be 13*f5c631daSSadaf Ebrahimi# used to endorse or promote products derived from this software without 14*f5c631daSSadaf Ebrahimi# specific prior written permission. 15*f5c631daSSadaf Ebrahimi# 16*f5c631daSSadaf Ebrahimi# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17*f5c631daSSadaf Ebrahimi# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18*f5c631daSSadaf Ebrahimi# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19*f5c631daSSadaf Ebrahimi# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20*f5c631daSSadaf Ebrahimi# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*f5c631daSSadaf Ebrahimi# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22*f5c631daSSadaf Ebrahimi# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23*f5c631daSSadaf Ebrahimi# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24*f5c631daSSadaf Ebrahimi# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25*f5c631daSSadaf Ebrahimi# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*f5c631daSSadaf Ebrahimi 27*f5c631daSSadaf Ebrahimiimport re 28*f5c631daSSadaf Ebrahimiimport subprocess 29*f5c631daSSadaf Ebrahimi 30*f5c631daSSadaf Ebrahimifrom known_test_failures import FilterKnownTestFailures 31*f5c631daSSadaf Ebrahimiimport printer 32*f5c631daSSadaf Ebrahimiimport threaded_tests 33*f5c631daSSadaf Ebrahimifrom threaded_tests import Test 34*f5c631daSSadaf Ebrahimiimport util 35*f5c631daSSadaf Ebrahimi 36*f5c631daSSadaf Ebrahimi# Scan matching tests and return a test manifest. 37*f5c631daSSadaf Ebrahimidef GetTests(runner, filters = []): 38*f5c631daSSadaf Ebrahimi cmd = runner + ' --list' 39*f5c631daSSadaf Ebrahimi rc, output = util.getstatusoutput(cmd) 40*f5c631daSSadaf Ebrahimi if rc != 0: util.abort("Failed to list all tests. Output of " + cmd + ":\n" + output) 41*f5c631daSSadaf Ebrahimi 42*f5c631daSSadaf Ebrahimi tests = output.split() 43*f5c631daSSadaf Ebrahimi for f in filters: 44*f5c631daSSadaf Ebrahimi tests = filter(re.compile(f).search, tests) 45*f5c631daSSadaf Ebrahimi 46*f5c631daSSadaf Ebrahimi return tests 47*f5c631daSSadaf Ebrahimi 48*f5c631daSSadaf Ebrahimidef RunTest(test): 49*f5c631daSSadaf Ebrahimi command = test.args['command'] 50*f5c631daSSadaf Ebrahimi p = subprocess.Popen(command, 51*f5c631daSSadaf Ebrahimi stdout=subprocess.PIPE, 52*f5c631daSSadaf Ebrahimi stderr=subprocess.STDOUT) 53*f5c631daSSadaf Ebrahimi p_out, p_err = p.communicate() 54*f5c631daSSadaf Ebrahimi rc = p.poll() 55*f5c631daSSadaf Ebrahimi 56*f5c631daSSadaf Ebrahimi if rc == 0: 57*f5c631daSSadaf Ebrahimi skipped = False 58*f5c631daSSadaf Ebrahimi lines = p_out.split('\n') 59*f5c631daSSadaf Ebrahimi skipped_id = "SKIPPED: " 60*f5c631daSSadaf Ebrahimi for i in range(len(lines)): 61*f5c631daSSadaf Ebrahimi if lines[i].startswith(skipped_id): 62*f5c631daSSadaf Ebrahimi skipped = True 63*f5c631daSSadaf Ebrahimi reason = lines[i][len(skipped_id):] 64*f5c631daSSadaf Ebrahimi with Test.n_tests_skipped.get_lock(): 65*f5c631daSSadaf Ebrahimi Test.n_tests_skipped.value += 1 66*f5c631daSSadaf Ebrahimi test.shared.tests_skipped.setdefault(reason, 0) 67*f5c631daSSadaf Ebrahimi test.shared.tests_skipped[reason] += 1 68*f5c631daSSadaf Ebrahimi break 69*f5c631daSSadaf Ebrahimi if not skipped: 70*f5c631daSSadaf Ebrahimi with Test.n_tests_passed.get_lock(): Test.n_tests_passed.value += 1 71*f5c631daSSadaf Ebrahimi else: 72*f5c631daSSadaf Ebrahimi with Test.n_tests_failed.get_lock(): Test.n_tests_failed.value += 1 73*f5c631daSSadaf Ebrahimi 74*f5c631daSSadaf Ebrahimi printer.__print_lock__.acquire() 75*f5c631daSSadaf Ebrahimi 76*f5c631daSSadaf Ebrahimi printer.UpdateProgress(test.shared.start_time, 77*f5c631daSSadaf Ebrahimi Test.n_tests_passed.value, 78*f5c631daSSadaf Ebrahimi Test.n_tests_failed.value, 79*f5c631daSSadaf Ebrahimi test.shared.n_tests, 80*f5c631daSSadaf Ebrahimi Test.n_tests_skipped.value, 81*f5c631daSSadaf Ebrahimi test.shared.n_known_failures, 82*f5c631daSSadaf Ebrahimi test.name, 83*f5c631daSSadaf Ebrahimi prevent_next_overwrite = (rc != 0), 84*f5c631daSSadaf Ebrahimi has_lock = True, 85*f5c631daSSadaf Ebrahimi prefix = test.shared.progress_prefix) 86*f5c631daSSadaf Ebrahimi 87*f5c631daSSadaf Ebrahimi if rc != 0: 88*f5c631daSSadaf Ebrahimi printer.Print('FAILED: ' + test.name, has_lock = True) 89*f5c631daSSadaf Ebrahimi printer.Print(printer.COLOUR_RED + ' '.join(command) + printer.NO_COLOUR, 90*f5c631daSSadaf Ebrahimi has_lock = True) 91*f5c631daSSadaf Ebrahimi printer.Print(p_out, has_lock = True) 92*f5c631daSSadaf Ebrahimi 93*f5c631daSSadaf Ebrahimi printer.__print_lock__.release() 94*f5c631daSSadaf Ebrahimi 95*f5c631daSSadaf Ebrahimiclass TestQueue(threaded_tests.TestQueue): 96*f5c631daSSadaf Ebrahimi def __init__(self): 97*f5c631daSSadaf Ebrahimi super(TestQueue, self).__init__('test_runner: ') 98*f5c631daSSadaf Ebrahimi 99*f5c631daSSadaf Ebrahimi def AddTests(self, test_runner_command, filters, runtime_options, under_valgrind): 100*f5c631daSSadaf Ebrahimi tests = GetTests(test_runner_command, filters) 101*f5c631daSSadaf Ebrahimi n_tests_total = len(tests) 102*f5c631daSSadaf Ebrahimi tests, skipped = FilterKnownTestFailures(tests, under_valgrind = under_valgrind) 103*f5c631daSSadaf Ebrahimi for n_tests, reason in skipped: 104*f5c631daSSadaf Ebrahimi if n_tests > 0: 105*f5c631daSSadaf Ebrahimi self.AddKnownFailures(reason, n_tests) 106*f5c631daSSadaf Ebrahimi 107*f5c631daSSadaf Ebrahimi if len(tests) == 0: 108*f5c631daSSadaf Ebrahimi printer.Print('No tests to run.') 109*f5c631daSSadaf Ebrahimi return 110*f5c631daSSadaf Ebrahimi 111*f5c631daSSadaf Ebrahimi base_command = [] 112*f5c631daSSadaf Ebrahimi if under_valgrind: 113*f5c631daSSadaf Ebrahimi base_command += ['valgrind'] 114*f5c631daSSadaf Ebrahimi base_command += [test_runner_command] 115*f5c631daSSadaf Ebrahimi for test in tests: 116*f5c631daSSadaf Ebrahimi command = base_command + [test] + runtime_options 117*f5c631daSSadaf Ebrahimi self.AddTest(test, command = command) 118*f5c631daSSadaf Ebrahimi 119*f5c631daSSadaf Ebrahimi def Run(self, jobs, verbose): 120*f5c631daSSadaf Ebrahimi return super(TestQueue, self).Run(jobs, verbose, RunTest) 121