#! /usr/bin/env python ############################################################################# ## ## Copyright (C) 2016 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of the build configuration tools of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:GPL-EXCEPT$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 3 as published by the Free Software ## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import sys; import re; import os; import subprocess; import errno; instructions = "This script can be used as follows:\n\ a) if run from tests/auto without any arguments it runs unit tests and then integration tests\n\ b) if run from tests/auto/unit, it runs unit tests\n\ c) if run from tests/auto/integration, it runs integration tests\n\ d) if run from tests/auto with \"unit\" it runs unit tests, and correspondingly for \"integration\"" # Colors red="\033[41;37m"; redfg="\033[31m"; norm="\033[0m"; green="\033[32m"; grey="\033[37m"; yellow="\033[33m"; # Variables curtest = ""; numpasses = [0]; numfails = [0]; numcrashes = 0; numx = [0]; runTests = [] notRunTests = [] # Do not run the tests in these directories. exclusionList = ["qdeclarativevideo", "qmultimedia_common"] # Helper function for replacing stuffs def print_color_string(string, color, match, index): if index > 0: print string[:match.start(index)] + color + string[match.start(index):match.end(index)] + norm + string[match.end(index):], else: print color + string[:-1] + norm # AWK translation awkfoo = [ (re.compile("\*\*\*\*\*\*\*\*\* Start testing of (\S+)"), yellow, 1, curtest), (re.compile("^(PASS) "), green, 1, numpasses), (re.compile("^(FAIL!) "), red, 0, numfails), (re.compile("^(XFAIL) "), redfg, 1, numx), (re.compile("^(XPASS) "), redfg, 1, numx), (re.compile("^(QFATAL) "), red, 0, numx), (re.compile("^(QDEBUG) "), grey, 0, None), (re.compile("^(QWARN) "), yellow, 1, None), (re.compile("\*\*\*\*\*\*\*\*\* Finished testing of (\S+)"), yellow, 1, curtest), ] # # This method runs the test cases, color codes the output from the test cases and adds up the passes, # fails etc. # def resultSummary(arg): try: pp = subprocess.Popen(arg, shell=False,stderr=subprocess.STDOUT,stdout=subprocess.PIPE); p = pp.stdout; try: while True: line = p.readline() if len(line) == 0: break for (re, color, index, var) in awkfoo: m = re.match(line) if m: break if m: print_color_string(line, color, m, index) if isinstance(var, list): var[0] = var[0] + 1; else: var = m.groups(index) else: print line, finally: rc = p.close(); pp.wait(); if pp.returncode < 0: print red + "Error: '%s' exited with signal %d" % (arg, -pp.returncode) + norm numcrashes = numcrashes + 1 except OSError, e: if e.errno == errno.ENOENT: print red + "Test '%s' not found." % arg + norm; else: print red + "Got an exception running '%s': %s " % (arg, e.strerror) + norm numcrashes = numcrashes + 1 # # This method finds the test cases that should be run and runs them. # def runAllTests(test): for filename in os.listdir(test): if(re.search("^q", filename)): #Skip the dir if it is in the exclusion list. exclude = False for dir in exclusionList: if(re.search(dir, filename)): exclude = True if(not(exclude)): #Set path to this if on Windows if(os.name=="nt"): exePath = test+"\\"+filename+"\\debug\\tst_"+filename+".exe" #Set path on OS X if(sys.platform=="darwin"): exePath = test +"/"+filename+"/tst_"+filename if not (os.path.exists(exePath)): exePath = test + "/"+filename+"/tst_"+filename+".app/Contents/MacOS/tst_"+filename #Set path to this if on Unix else: exePath = test +"/"+filename+"/tst_"+filename if(os.path.exists(exePath)): runTests.append(filename) resultSummary(exePath); else: notRunTests.append(filename) arguments = sys.argv[1:] count = len(arguments) # Find the current working directory. cwd = os.getcwd() if(count == 0): if re.search("auto$", cwd): x = 0 runAllTests("unit") runAllTests("integration") elif re.search("unit$", cwd): runAllTests(cwd) elif re.search("integration$", cwd): runAllTests(cwd) else: print "You are running this script from the wrong directory! " + instructions exit() elif(count == 1): if os.path.exists(sys.argv[1]): runAllTests(sys.argv[1]) else: print sys.argv[1] + " test cases do not exist! " + instructions exit() else: print "You have passed too many arguments! " + instructions exit() print "Total of all tests: %d passes, %d failures, %d unexpected, %d badnesses." % (numpasses[0], numfails[0], numx[0], numcrashes); if runTests: print "The following test cases were run: " for testCase in runTests: print testCase else: print "No test cases were run!" if notRunTests: print "The following test cases could not be run: " for testCase in notRunTests: print testCase else: print "All test cases were run."