# -*- coding: utf-8 -*- #------------------------------------------------------------------------- # drawElements Quality Program utilities # -------------------------------------- # # Copyright 2015 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # #------------------------------------------------------------------------- import os import sys import shutil import random import subprocess def die (msg): print msg exit(-1) def shellquote(s): return '"%s"' % s.replace('\\', '\\\\').replace('"', '\"').replace('$', '\$').replace('`', '\`') def execute (args, workDir = None): curPath = os.getcwd() if workDir != None: os.chdir(workDir) retcode = subprocess.call(args) os.chdir(curPath) if retcode != 0: raise Exception("Failed to execute %s, got %d" % (str(args), retcode)) class Config: def __init__ (self, name, srcPath, buildPath, genParams, buildParams, testBinaryName, executor = 'executor', execserver = 'execserver', junitTool = 'testlog-to-junit'): self.name = name self.srcPath = srcPath self.buildPath = buildPath self.genParams = genParams self.buildParams = buildParams self.testBinaryName = testBinaryName self.executor = executor self.execserver = execserver self.junitTool = junitTool def initBuildDir (config): if os.path.exists(config.buildPath): shutil.rmtree(config.buildPath) os.makedirs(config.buildPath) execute(["cmake", os.path.realpath(config.srcPath)] + config.genParams, workDir = config.buildPath) def prepareBuildDir (config): # If build dir exists, try to refresh if os.path.exists(config.buildPath): try: execute(["cmake", "."], workDir = config.buildPath) except: print "WARNING: Failed to refresh build dir, recreating" initBuildDir(config) else: initBuildDir(config) def build (config): prepareBuildDir(config) execute(["cmake", "--build", "."] + config.buildParams, workDir = config.buildPath) def runInternalTests (config): batchResultFile = config.name + ".qpa" infoLogFile = config.name + ".txt" junitFile = config.name + ".xml" testWorkDir = os.path.join(config.buildPath, "modules", "internal") junitToolPath = os.path.join(config.buildPath, 'executor', config.junitTool) # Remove old files for file in [batchResultFile, junitFile]: if os.path.exists(file): os.remove(file) build(config) # Dump case list execute([config.testBinaryName, "--deqp-runmode=xml-caselist"], workDir = testWorkDir) # Run test binary using executor args = [ os.path.join(config.buildPath, 'executor', config.executor), '--port=%d' % random.randint(50000, 60000), '--start-server=%s' % os.path.join(config.buildPath, 'execserver', config.execserver), '--binaryname=%s' % config.testBinaryName, '--cmdline=--deqp-crashhandler=enable --deqp-watchdog=enable', '--workdir=%s' % testWorkDir, '--caselistdir=%s' % os.path.join(testWorkDir), '--testset=dE-IT.*', '--out=%s' % batchResultFile, '--info=%s' % infoLogFile ] execute(args) # Convert log to junit format execute([junitToolPath, batchResultFile, junitFile]) SRC_PATH = os.path.normpath(os.path.join(os.path.dirname(__file__), "..")) BASE_BUILD_PATH = os.path.normpath(os.path.join(SRC_PATH, "..", "de-internal-tests")) CONFIGS = [ Config( "win32-vs10-debug", SRC_PATH, os.path.join(BASE_BUILD_PATH, "win32-vs10-debug"), ['-GVisual Studio 10', '-DDEQP_TARGET=no_modules'], ['--config', 'Debug', '--', '/m'], 'Debug\\de-internal-tests.exe', 'Debug\\executor.exe', 'Debug\\execserver.exe', 'Debug\\testlog-to-junit.exe' ), Config( "win32-vs10-release", SRC_PATH, os.path.join(BASE_BUILD_PATH, "win32-vs10-release"), ['-GVisual Studio 10', '-DDEQP_TARGET=no_modules'], ['--config', 'Release', '--', '/m'], 'Release\\de-internal-tests.exe', 'Release\\executor.exe', 'Release\\execserver.exe', 'Release\\testlog-to-junit.exe' ), Config( "win64-vs10-debug", SRC_PATH, os.path.join(BASE_BUILD_PATH, "win64-vs10-debug"), ['-GVisual Studio 10 Win64', '-DDEQP_TARGET=no_modules'], ['--config', 'Debug', '--', '/m'], 'Debug\\de-internal-tests.exe', 'Debug\\executor.exe', 'Debug\\execserver.exe', 'Debug\\testlog-to-junit.exe' ), Config( "win64-vs10-release", SRC_PATH, os.path.join(BASE_BUILD_PATH, "win64-vs10-release"), ['-GVisual Studio 10 Win64', '-DDEQP_TARGET=no_modules'], ['--config', 'Release', '--', '/m'], 'Release\\de-internal-tests.exe', 'Release\\executor.exe', 'Release\\execserver.exe', 'Release\\testlog-to-junit.exe' ), # GCC configs Config( "linux32-gcc-debug", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux32-gcc-debug"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu'], ['--', '-j', '2'], './de-internal-tests' ), Config( "linux32-gcc-release", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux32-gcc-release"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu'], ['--', '-j', '2'], './de-internal-tests' ), Config( "linux64-gcc-debug", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux64-gcc-debug"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'], ['--', '-j', '2'], './de-internal-tests' ), Config( "linux64-gcc-release", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux64-gcc-release"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'], ['--', '-j', '2'], './de-internal-tests' ), # Clang configs Config( "linux32-clang-debug", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux32-clang-debug"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'], ['--', '-j', '2'], './de-internal-tests' ), Config( "linux32-clang-release", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux32-clang-release"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'], ['--', '-j', '2'], './de-internal-tests' ), Config( "linux64-clang-debug", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux64-clang-debug"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'], ['--', '-j', '2'], './de-internal-tests' ), Config( "linux64-clang-release", SRC_PATH, os.path.join(BASE_BUILD_PATH, "linux64-clang-release"), ['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'], ['--', '-j', '2'], './de-internal-tests' ) ] def findConfig (name): for config in CONFIGS: if config.name == name: return config return None if __name__ == "__main__": if len(sys.argv) != 2: die("%s: [config]" % sys.argv[0]) config = findConfig(sys.argv[1]) if config == None: die("Config '%s' not found" % sys.argv[1]) random.seed() runInternalTests(config)