1# -*- coding: utf-8 -*-
2
3#-------------------------------------------------------------------------
4# drawElements Quality Program utilities
5# --------------------------------------
6#
7# Copyright 2015 The Android Open Source Project
8#
9# Licensed under the Apache License, Version 2.0 (the "License");
10# you may not use this file except in compliance with the License.
11# You may obtain a copy of the License at
12#
13#      http://www.apache.org/licenses/LICENSE-2.0
14#
15# Unless required by applicable law or agreed to in writing, software
16# distributed under the License is distributed on an "AS IS" BASIS,
17# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18# See the License for the specific language governing permissions and
19# limitations under the License.
20#
21#-------------------------------------------------------------------------
22
23from ctsbuild.common import *
24from ctsbuild.config import *
25from ctsbuild.build import *
26
27import os
28import sys
29import string
30import argparse
31import tempfile
32import shutil
33
34class Module:
35	def __init__ (self, name, dirName, binName):
36		self.name		= name
37		self.dirName	= dirName
38		self.binName	= binName
39
40MODULES = [
41	Module("dE-IT",			"internal",								"de-internal-tests"),
42	Module("dEQP-EGL",		"egl",									"deqp-egl"),
43	Module("dEQP-GLES2",	"gles2",								"deqp-gles2"),
44	Module("dEQP-GLES3",	"gles3",								"deqp-gles3"),
45	Module("dEQP-GLES31",	"gles31",								"deqp-gles31"),
46	Module("dEQP-VK",		"../external/vulkancts/modules/vulkan",	"deqp-vk"),
47	Module("dEQP-VKSC",		"../external/vulkancts/modules/vulkan",	"deqp-vksc"),
48]
49
50DEFAULT_BUILD_DIR	= os.path.join(tempfile.gettempdir(), "deqp-caselists", "{targetName}-{buildType}")
51DEFAULT_TARGET		= "null"
52
53def getModuleByName (name):
54	for module in MODULES:
55		if module.name == name:
56			return module
57	else:
58		raise Exception("Unknown module %s" % name)
59
60def getBuildConfig (buildPathPtrn, targetName, buildType):
61	buildPath = buildPathPtrn.format(
62		targetName	= targetName,
63		buildType	= buildType)
64
65	return BuildConfig(buildPath, buildType, ["-DDEQP_TARGET=%s" % targetName])
66
67def getModulesPath (buildCfg):
68	return os.path.join(buildCfg.getBuildDir(), "modules")
69
70def getBuiltModules (buildCfg):
71	modules		= []
72	modulesDir	= getModulesPath(buildCfg)
73
74	for module in MODULES:
75		fullPath = os.path.join(modulesDir, module.dirName)
76		if os.path.exists(fullPath) and os.path.isdir(fullPath):
77			modules.append(module)
78
79	return modules
80
81def getCaseListFileName (module, caseListType):
82	return "%s-cases.%s" % (module.name, caseListType)
83
84def getCaseListPath (buildCfg, module, caseListType):
85	return os.path.join(getModulesPath(buildCfg), module.dirName, getCaseListFileName(module, caseListType))
86
87def genCaseList (buildCfg, generator, module, caseListType):
88	workDir = os.path.join(getModulesPath(buildCfg), module.dirName)
89
90	pushWorkingDir(workDir)
91
92	try:
93		binPath = generator.getBinaryPath(buildCfg.getBuildType(), os.path.join(".", module.binName))
94		execute([binPath, "--deqp-runmode=%s-caselist" % caseListType])
95	finally:
96		popWorkingDir()
97
98def genAndCopyCaseList (buildCfg, generator, module, dstDir, caseListType):
99	caseListFile	= getCaseListFileName(module, caseListType)
100	srcPath			= getCaseListPath(buildCfg, module, caseListType)
101	dstPath			= os.path.join(dstDir, caseListFile)
102
103	if os.path.exists(srcPath):
104		os.remove(srcPath)
105
106	genCaseList(buildCfg, generator, module, caseListType)
107
108	if not os.path.exists(srcPath):
109		raise Exception("%s not generated" % srcPath)
110
111	shutil.copyfile(srcPath, dstPath)
112
113def parseArgs ():
114	parser = argparse.ArgumentParser(description = "Build test case lists",
115									 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
116	parser.add_argument("-b",
117						"--build-dir",
118						dest="buildDir",
119						default=DEFAULT_BUILD_DIR,
120						help="Temporary build directory")
121	parser.add_argument("-t",
122						"--build-type",
123						dest="buildType",
124						default="Debug",
125						help="Build type")
126	parser.add_argument("-c",
127						"--deqp-target",
128						dest="targetName",
129						default=DEFAULT_TARGET,
130						help="dEQP build target")
131	parser.add_argument("--case-list-type",
132						dest="caseListType",
133						default="xml",
134						help="Case list type (xml, txt)")
135	parser.add_argument("-m",
136						"--modules",
137						dest="modules",
138						help="Comma-separated list of modules to update")
139	parser.add_argument("dst",
140						help="Destination directory for test case lists")
141	return parser.parse_args()
142
143if __name__ == "__main__":
144	args = parseArgs()
145
146	generator	= ANY_GENERATOR
147	buildCfg	= getBuildConfig(args.buildDir, args.targetName, args.buildType)
148	modules		= None
149
150	if args.modules:
151		modules = []
152		for m in args.modules.split(","):
153			modules.append(getModuleByName(m))
154
155	if modules:
156		build(buildCfg, generator, [m.binName for m in modules])
157	else:
158		build(buildCfg, generator)
159		modules = getBuiltModules(buildCfg)
160
161	for module in modules:
162		print("Generating test case list for %s" % module.name)
163		genAndCopyCaseList(buildCfg, generator, module, args.dst, args.caseListType)
164