1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# drawElements Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2015 The Android Open Source Project
8e5c31af7Sopenharmony_ci#
9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci#
13e5c31af7Sopenharmony_ci#      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci#
15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci# limitations under the License.
20e5c31af7Sopenharmony_ci#
21e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
22e5c31af7Sopenharmony_ci
23e5c31af7Sopenharmony_ciimport os
24e5c31af7Sopenharmony_ciimport sys
25e5c31af7Sopenharmony_ciimport shutil
26e5c31af7Sopenharmony_ciimport random
27e5c31af7Sopenharmony_ciimport subprocess
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_cidef die (msg):
30e5c31af7Sopenharmony_ci	print(msg)
31e5c31af7Sopenharmony_ci	exit(-1)
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_cidef shellquote(s):
34e5c31af7Sopenharmony_ci	return '"%s"' % s.replace('\\', '\\\\').replace('"', '\"').replace('$', '\$').replace('`', '\`')
35e5c31af7Sopenharmony_ci
36e5c31af7Sopenharmony_cidef execute (args, workDir = None):
37e5c31af7Sopenharmony_ci	curPath = os.getcwd()
38e5c31af7Sopenharmony_ci	if workDir != None:
39e5c31af7Sopenharmony_ci		os.chdir(workDir)
40e5c31af7Sopenharmony_ci	retcode	= subprocess.call(args)
41e5c31af7Sopenharmony_ci	os.chdir(curPath)
42e5c31af7Sopenharmony_ci	if retcode != 0:
43e5c31af7Sopenharmony_ci		raise Exception("Failed to execute %s, got %d" % (str(args), retcode))
44e5c31af7Sopenharmony_ci
45e5c31af7Sopenharmony_ciclass Config:
46e5c31af7Sopenharmony_ci	def __init__ (self, name, srcPath, buildPath, genParams, buildParams, testBinaryName, executor = 'executor', execserver = 'execserver', junitTool = 'testlog-to-junit'):
47e5c31af7Sopenharmony_ci		self.name				= name
48e5c31af7Sopenharmony_ci		self.srcPath			= srcPath
49e5c31af7Sopenharmony_ci		self.buildPath			= buildPath
50e5c31af7Sopenharmony_ci		self.genParams			= genParams
51e5c31af7Sopenharmony_ci		self.buildParams		= buildParams
52e5c31af7Sopenharmony_ci		self.testBinaryName		= testBinaryName
53e5c31af7Sopenharmony_ci		self.executor			= executor
54e5c31af7Sopenharmony_ci		self.execserver			= execserver
55e5c31af7Sopenharmony_ci		self.junitTool			= junitTool
56e5c31af7Sopenharmony_ci
57e5c31af7Sopenharmony_cidef initBuildDir (config):
58e5c31af7Sopenharmony_ci	if os.path.exists(config.buildPath):
59e5c31af7Sopenharmony_ci		shutil.rmtree(config.buildPath)
60e5c31af7Sopenharmony_ci
61e5c31af7Sopenharmony_ci	os.makedirs(config.buildPath)
62e5c31af7Sopenharmony_ci	execute(["cmake", os.path.realpath(config.srcPath)] + config.genParams, workDir = config.buildPath)
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_cidef prepareBuildDir (config):
65e5c31af7Sopenharmony_ci	# If build dir exists, try to refresh
66e5c31af7Sopenharmony_ci	if os.path.exists(config.buildPath):
67e5c31af7Sopenharmony_ci		try:
68e5c31af7Sopenharmony_ci			execute(["cmake", "."], workDir = config.buildPath)
69e5c31af7Sopenharmony_ci		except:
70e5c31af7Sopenharmony_ci			print("WARNING: Failed to refresh build dir, recreating")
71e5c31af7Sopenharmony_ci			initBuildDir(config)
72e5c31af7Sopenharmony_ci	else:
73e5c31af7Sopenharmony_ci		initBuildDir(config)
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_cidef build (config):
76e5c31af7Sopenharmony_ci	prepareBuildDir(config)
77e5c31af7Sopenharmony_ci	execute(["cmake", "--build", "."] + config.buildParams, workDir = config.buildPath)
78e5c31af7Sopenharmony_ci
79e5c31af7Sopenharmony_cidef runInternalTests (config):
80e5c31af7Sopenharmony_ci	batchResultFile	= config.name + ".qpa"
81e5c31af7Sopenharmony_ci	infoLogFile		= config.name + ".txt"
82e5c31af7Sopenharmony_ci	junitFile		= config.name + ".xml"
83e5c31af7Sopenharmony_ci
84e5c31af7Sopenharmony_ci	testWorkDir		= os.path.join(config.buildPath, "modules", "internal")
85e5c31af7Sopenharmony_ci	junitToolPath	= os.path.join(config.buildPath, 'executor', config.junitTool)
86e5c31af7Sopenharmony_ci
87e5c31af7Sopenharmony_ci	# Remove old files
88e5c31af7Sopenharmony_ci	for file in [batchResultFile, junitFile]:
89e5c31af7Sopenharmony_ci		if os.path.exists(file):
90e5c31af7Sopenharmony_ci			os.remove(file)
91e5c31af7Sopenharmony_ci
92e5c31af7Sopenharmony_ci	build(config)
93e5c31af7Sopenharmony_ci
94e5c31af7Sopenharmony_ci	# Dump case list
95e5c31af7Sopenharmony_ci	execute([config.testBinaryName, "--deqp-runmode=xml-caselist"], workDir = testWorkDir)
96e5c31af7Sopenharmony_ci
97e5c31af7Sopenharmony_ci	# Run test binary using executor
98e5c31af7Sopenharmony_ci	args = [
99e5c31af7Sopenharmony_ci		os.path.join(config.buildPath, 'executor', config.executor),
100e5c31af7Sopenharmony_ci		'--port=%d' % random.randint(50000, 60000),
101e5c31af7Sopenharmony_ci		'--start-server=%s' % os.path.join(config.buildPath, 'execserver', config.execserver),
102e5c31af7Sopenharmony_ci		'--binaryname=%s' % config.testBinaryName,
103e5c31af7Sopenharmony_ci		'--cmdline=--deqp-crashhandler=enable --deqp-watchdog=enable',
104e5c31af7Sopenharmony_ci		'--workdir=%s' % testWorkDir,
105e5c31af7Sopenharmony_ci		'--caselistdir=%s' % os.path.join(testWorkDir),
106e5c31af7Sopenharmony_ci		'--testset=dE-IT.*',
107e5c31af7Sopenharmony_ci		'--out=%s' % batchResultFile,
108e5c31af7Sopenharmony_ci		'--info=%s' % infoLogFile
109e5c31af7Sopenharmony_ci	]
110e5c31af7Sopenharmony_ci	execute(args)
111e5c31af7Sopenharmony_ci
112e5c31af7Sopenharmony_ci	# Convert log to junit format
113e5c31af7Sopenharmony_ci	execute([junitToolPath, batchResultFile, junitFile])
114e5c31af7Sopenharmony_ci
115e5c31af7Sopenharmony_ciSRC_PATH		= os.path.normpath(os.path.join(os.path.dirname(__file__), ".."))
116e5c31af7Sopenharmony_ciBASE_BUILD_PATH	= os.path.normpath(os.path.join(SRC_PATH, "..", "de-internal-tests"))
117e5c31af7Sopenharmony_ci
118e5c31af7Sopenharmony_ciCONFIGS = [
119e5c31af7Sopenharmony_ci	Config(
120e5c31af7Sopenharmony_ci		"win32-vs10-debug",
121e5c31af7Sopenharmony_ci		SRC_PATH,
122e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "win32-vs10-debug"),
123e5c31af7Sopenharmony_ci		['-GVisual Studio 10', '-DDEQP_TARGET=no_modules'],
124e5c31af7Sopenharmony_ci		['--config', 'Debug', '--', '/m'],
125e5c31af7Sopenharmony_ci		'Debug\\de-internal-tests.exe',
126e5c31af7Sopenharmony_ci		'Debug\\executor.exe',
127e5c31af7Sopenharmony_ci		'Debug\\execserver.exe',
128e5c31af7Sopenharmony_ci		'Debug\\testlog-to-junit.exe'
129e5c31af7Sopenharmony_ci	),
130e5c31af7Sopenharmony_ci	Config(
131e5c31af7Sopenharmony_ci		"win32-vs10-release",
132e5c31af7Sopenharmony_ci		SRC_PATH,
133e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "win32-vs10-release"),
134e5c31af7Sopenharmony_ci		['-GVisual Studio 10', '-DDEQP_TARGET=no_modules'],
135e5c31af7Sopenharmony_ci		['--config', 'Release', '--', '/m'],
136e5c31af7Sopenharmony_ci		'Release\\de-internal-tests.exe',
137e5c31af7Sopenharmony_ci		'Release\\executor.exe',
138e5c31af7Sopenharmony_ci		'Release\\execserver.exe',
139e5c31af7Sopenharmony_ci		'Release\\testlog-to-junit.exe'
140e5c31af7Sopenharmony_ci	),
141e5c31af7Sopenharmony_ci	Config(
142e5c31af7Sopenharmony_ci		"win64-vs10-debug",
143e5c31af7Sopenharmony_ci		SRC_PATH,
144e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "win64-vs10-debug"),
145e5c31af7Sopenharmony_ci		['-GVisual Studio 10 Win64', '-DDEQP_TARGET=no_modules'],
146e5c31af7Sopenharmony_ci		['--config', 'Debug', '--', '/m'],
147e5c31af7Sopenharmony_ci		'Debug\\de-internal-tests.exe',
148e5c31af7Sopenharmony_ci		'Debug\\executor.exe',
149e5c31af7Sopenharmony_ci		'Debug\\execserver.exe',
150e5c31af7Sopenharmony_ci		'Debug\\testlog-to-junit.exe'
151e5c31af7Sopenharmony_ci	),
152e5c31af7Sopenharmony_ci	Config(
153e5c31af7Sopenharmony_ci		"win64-vs10-release",
154e5c31af7Sopenharmony_ci		SRC_PATH,
155e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "win64-vs10-release"),
156e5c31af7Sopenharmony_ci		['-GVisual Studio 10 Win64', '-DDEQP_TARGET=no_modules'],
157e5c31af7Sopenharmony_ci		['--config', 'Release', '--', '/m'],
158e5c31af7Sopenharmony_ci		'Release\\de-internal-tests.exe',
159e5c31af7Sopenharmony_ci		'Release\\executor.exe',
160e5c31af7Sopenharmony_ci		'Release\\execserver.exe',
161e5c31af7Sopenharmony_ci		'Release\\testlog-to-junit.exe'
162e5c31af7Sopenharmony_ci	),
163e5c31af7Sopenharmony_ci
164e5c31af7Sopenharmony_ci	# GCC configs
165e5c31af7Sopenharmony_ci	Config(
166e5c31af7Sopenharmony_ci		"linux32-gcc-debug",
167e5c31af7Sopenharmony_ci		SRC_PATH,
168e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux32-gcc-debug"),
169e5c31af7Sopenharmony_ci		['-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'],
170e5c31af7Sopenharmony_ci		['--', '-j', '2'],
171e5c31af7Sopenharmony_ci		'./de-internal-tests'
172e5c31af7Sopenharmony_ci	),
173e5c31af7Sopenharmony_ci	Config(
174e5c31af7Sopenharmony_ci		"linux32-gcc-release",
175e5c31af7Sopenharmony_ci		SRC_PATH,
176e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux32-gcc-release"),
177e5c31af7Sopenharmony_ci		['-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'],
178e5c31af7Sopenharmony_ci		['--', '-j', '2'],
179e5c31af7Sopenharmony_ci		'./de-internal-tests'
180e5c31af7Sopenharmony_ci	),
181e5c31af7Sopenharmony_ci	Config(
182e5c31af7Sopenharmony_ci		"linux64-gcc-debug",
183e5c31af7Sopenharmony_ci		SRC_PATH,
184e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux64-gcc-debug"),
185e5c31af7Sopenharmony_ci		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'],
186e5c31af7Sopenharmony_ci		['--', '-j', '2'],
187e5c31af7Sopenharmony_ci		'./de-internal-tests'
188e5c31af7Sopenharmony_ci	),
189e5c31af7Sopenharmony_ci	Config(
190e5c31af7Sopenharmony_ci		"linux64-gcc-release",
191e5c31af7Sopenharmony_ci		SRC_PATH,
192e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux64-gcc-release"),
193e5c31af7Sopenharmony_ci		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'],
194e5c31af7Sopenharmony_ci		['--', '-j', '2'],
195e5c31af7Sopenharmony_ci		'./de-internal-tests'
196e5c31af7Sopenharmony_ci	),
197e5c31af7Sopenharmony_ci
198e5c31af7Sopenharmony_ci	# Clang configs
199e5c31af7Sopenharmony_ci	Config(
200e5c31af7Sopenharmony_ci		"linux32-clang-debug",
201e5c31af7Sopenharmony_ci		SRC_PATH,
202e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux32-clang-debug"),
203e5c31af7Sopenharmony_ci		['-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'],
204e5c31af7Sopenharmony_ci		['--', '-j', '2'],
205e5c31af7Sopenharmony_ci		'./de-internal-tests'
206e5c31af7Sopenharmony_ci	),
207e5c31af7Sopenharmony_ci	Config(
208e5c31af7Sopenharmony_ci		"linux32-clang-release",
209e5c31af7Sopenharmony_ci		SRC_PATH,
210e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux32-clang-release"),
211e5c31af7Sopenharmony_ci		['-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'],
212e5c31af7Sopenharmony_ci		['--', '-j', '2'],
213e5c31af7Sopenharmony_ci		'./de-internal-tests'
214e5c31af7Sopenharmony_ci	),
215e5c31af7Sopenharmony_ci	Config(
216e5c31af7Sopenharmony_ci		"linux64-clang-debug",
217e5c31af7Sopenharmony_ci		SRC_PATH,
218e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux64-clang-debug"),
219e5c31af7Sopenharmony_ci		['-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'],
220e5c31af7Sopenharmony_ci		['--', '-j', '2'],
221e5c31af7Sopenharmony_ci		'./de-internal-tests'
222e5c31af7Sopenharmony_ci	),
223e5c31af7Sopenharmony_ci	Config(
224e5c31af7Sopenharmony_ci		"linux64-clang-release",
225e5c31af7Sopenharmony_ci		SRC_PATH,
226e5c31af7Sopenharmony_ci		os.path.join(BASE_BUILD_PATH, "linux64-clang-release"),
227e5c31af7Sopenharmony_ci		['-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'],
228e5c31af7Sopenharmony_ci		['--', '-j', '2'],
229e5c31af7Sopenharmony_ci		'./de-internal-tests'
230e5c31af7Sopenharmony_ci	)
231e5c31af7Sopenharmony_ci]
232e5c31af7Sopenharmony_ci
233e5c31af7Sopenharmony_cidef findConfig (name):
234e5c31af7Sopenharmony_ci	for config in CONFIGS:
235e5c31af7Sopenharmony_ci		if config.name == name:
236e5c31af7Sopenharmony_ci			return config
237e5c31af7Sopenharmony_ci	return None
238e5c31af7Sopenharmony_ci
239e5c31af7Sopenharmony_ciif __name__ == "__main__":
240e5c31af7Sopenharmony_ci	if len(sys.argv) != 2:
241e5c31af7Sopenharmony_ci		die("%s: [config]" % sys.argv[0])
242e5c31af7Sopenharmony_ci
243e5c31af7Sopenharmony_ci	config = findConfig(sys.argv[1])
244e5c31af7Sopenharmony_ci	if config == None:
245e5c31af7Sopenharmony_ci		die("Config '%s' not found" % sys.argv[1])
246e5c31af7Sopenharmony_ci
247e5c31af7Sopenharmony_ci	random.seed()
248e5c31af7Sopenharmony_ci	runInternalTests(config)
249