ts: refactor run.py script
Conflicts: modules/ts/misc/run.py
This commit is contained in:
164
modules/ts/misc/run_suite.py
Normal file
164
modules/ts/misc/run_suite.py
Normal file
@@ -0,0 +1,164 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import datetime
|
||||
from run_utils import *
|
||||
|
||||
class TestSuite(object):
|
||||
def __init__(self, options, cache):
|
||||
self.options = options
|
||||
self.cache = cache
|
||||
self.nameprefix = "opencv_" + self.options.mode + "_"
|
||||
self.tests = self.cache.gatherTests(self.nameprefix + "*", self.isTest)
|
||||
|
||||
def getOS(self):
|
||||
return getPlatformVersion() or self.cache.getOS()
|
||||
|
||||
def getHardware(self):
|
||||
res = []
|
||||
if self.cache.getArch() in ["x86", "x64"] and self.cache.withCuda():
|
||||
res.append("CUDA")
|
||||
return res
|
||||
|
||||
def getLogName(self, app, timestamp):
|
||||
app = self.getAlias(app)
|
||||
rev = self.cache.getGitVersion()
|
||||
if isinstance(timestamp, datetime.datetime):
|
||||
timestamp = timestamp.strftime("%Y%m%d-%H%M%S")
|
||||
if self.options.longname:
|
||||
small_pieces = [self.getOS(), self.cache.getArch()] + self.cache.getDependencies() + self.getHardware() + [self.cache.getSIMDFeatures()]
|
||||
big_pieces = [app, str(rev), timestamp, "_".join([p for p in small_pieces if p])]
|
||||
l = "__".join(big_pieces)
|
||||
else:
|
||||
pieces = [app, self.cache.getOS(), self.cache.getArch()] + self.getHardware() + [rev, timestamp]
|
||||
lname = "_".join([p for p in pieces if p])
|
||||
lname = re.sub(r'[\(\)\[\]\s,]', '_', lname)
|
||||
l = re.sub(r'_+', '_', lname)
|
||||
return l + ".xml"
|
||||
|
||||
def listTests(self, short = False, main = False):
|
||||
if len(self.tests) == 0:
|
||||
raise Err("No tests found")
|
||||
for t in self.tests:
|
||||
if short:
|
||||
t = self.getAlias(t)
|
||||
if not main or self.cache.isMainModule(t):
|
||||
log.info("%s", t)
|
||||
|
||||
def getAlias(self, fname):
|
||||
return sorted(self.getAliases(fname), key = len)[0]
|
||||
|
||||
def getAliases(self, fname):
|
||||
# input is full path ('/home/.../bin/opencv_test_core') or 'java'
|
||||
res = [fname]
|
||||
fname = os.path.basename(fname)
|
||||
res.append(fname) # filename (opencv_test_core.exe)
|
||||
noext = re.sub(r"\.(exe|apk)$", '', fname)
|
||||
res.append(noext) # filename w/o extension (opencv_test_core)
|
||||
nopref = None
|
||||
if fname.startswith(self.nameprefix):
|
||||
nopref = fname[len(self.nameprefix):]
|
||||
res.append(nopref) # filename w/o prefix (core)
|
||||
if noext.startswith(self.nameprefix):
|
||||
res.append(noext[len(self.nameprefix):])
|
||||
if self.options.configuration == "Debug":
|
||||
res.append(re.sub(r"d$", '', noext)) # MSVC debug config, remove 'd' suffix
|
||||
if nopref:
|
||||
res.append(re.sub(r"d$", '', nopref)) # MSVC debug config, remove 'd' suffix
|
||||
return set(res)
|
||||
|
||||
def getTest(self, name):
|
||||
# return stored test name by provided alias
|
||||
for t in self.tests:
|
||||
if name in self.getAliases(t):
|
||||
return t
|
||||
raise Err("Can not find test: %s", name)
|
||||
|
||||
def getTestList(self, white, black):
|
||||
res = [t for t in white or self.tests if self.getAlias(t) not in black]
|
||||
if len(res) == 0:
|
||||
raise Err("No tests found")
|
||||
return set(res)
|
||||
|
||||
def isTest(self, fullpath):
|
||||
if fullpath == "java":
|
||||
return True
|
||||
if not os.path.isfile(fullpath):
|
||||
return False
|
||||
if self.cache.getOS() == "nt" and not fullpath.endswith(".exe"):
|
||||
return False
|
||||
return os.access(fullpath, os.X_OK)
|
||||
|
||||
def wrapInValgrind(self, cmd = []):
|
||||
if self.options.valgrind:
|
||||
res = ['valgrind']
|
||||
if self.options.valgrind_supp:
|
||||
res.append("--suppressions=%s" % self.options.valgrind_supp)
|
||||
res.extend(self.options.valgrind_opt)
|
||||
return res + cmd
|
||||
return cmd
|
||||
|
||||
def runTest(self, path, logfile, workingDir, args = []):
|
||||
args = args[:]
|
||||
exe = os.path.abspath(path)
|
||||
if path == "java":
|
||||
cfg = self.cache.build_type
|
||||
if self.options.configuration:
|
||||
cfg = self.options.configuration
|
||||
cmd = [self.cache.ant_executable, "-Dopencv.build.type=%s" % cfg, "buildAndTest"]
|
||||
ret = execute(cmd, cwd = self.cache.java_test_binary_dir + "/.build")
|
||||
return None, ret
|
||||
else:
|
||||
if isColorEnabled(args):
|
||||
args.append("--gtest_color=yes")
|
||||
cmd = self.wrapInValgrind([exe] + args)
|
||||
tempDir = TempEnvDir('OPENCV_TEMP_PATH', "__opencv_temp.")
|
||||
tempDir.init()
|
||||
log.warning("Run: %s" % " ".join(cmd))
|
||||
ret = execute(cmd, cwd = workingDir)
|
||||
tempDir.clean()
|
||||
hostlogpath = os.path.join(workingDir, logfile)
|
||||
if os.path.isfile(hostlogpath):
|
||||
return hostlogpath, ret
|
||||
return None, ret
|
||||
|
||||
def checkPrerequisites(self):
|
||||
if self.cache.getArch() == "x64" and hostmachine == "x86":
|
||||
raise Err("Target architecture is incompatible with current platform")
|
||||
|
||||
def runTests(self, tests, black, workingDir, args = []):
|
||||
self.checkPrerequisites()
|
||||
args = args[:]
|
||||
logs = []
|
||||
test_list = self.getTestList(tests, black)
|
||||
date = datetime.datetime.now()
|
||||
if len(test_list) != 1:
|
||||
args = [a for a in args if not a.startswith("--gtest_output=")]
|
||||
ret = 0
|
||||
for test in test_list:
|
||||
more_args = []
|
||||
exe = self.getTest(test)
|
||||
|
||||
userlog = [a for a in args if a.startswith("--gtest_output=")]
|
||||
if len(userlog) == 0:
|
||||
logname = self.getLogName(exe, date)
|
||||
more_args.append("--gtest_output=xml:" + logname)
|
||||
else:
|
||||
logname = userlog[0][userlog[0].find(":")+1:]
|
||||
|
||||
log.debug("Running the test: %s (%s) ==> %s in %s", exe, args + more_args, logname, workingDir)
|
||||
if self.options.dry_run:
|
||||
logfile, r = None, 0
|
||||
else:
|
||||
logfile, r = self.runTest(exe, logname, workingDir, args + more_args)
|
||||
log.debug("Test returned: %s ==> %s", r, logfile)
|
||||
|
||||
if r != 0:
|
||||
ret = r
|
||||
if logfile:
|
||||
logs.append(os.path.relpath(logfile, workingDir))
|
||||
return logs, ret
|
||||
|
||||
#===================================================================================================
|
||||
|
||||
if __name__ == "__main__":
|
||||
log.error("This is utility file, please execute run.py script")
|
Reference in New Issue
Block a user