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 build.common import *
24from build.config import *
25from build.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]
47
48DEFAULT_BUILD_DIR	= os.path.join(tempfile.gettempdir(), "deqp-caselists", "{targetName}-{buildType}")
49DEFAULT_TARGET		= "null"
50
51def getModuleByName (name):
52	for module in MODULES:
53		if module.name == name:
54			return module
55	else:
56		raise Exception("Unknown module %s" % name)
57
58def getBuildConfig (buildPathPtrn, targetName, buildType):
59	buildPath = buildPathPtrn.format(
60		targetName	= targetName,
61		buildType	= buildType)
62
63	return BuildConfig(buildPath, buildType, ["-DDEQP_TARGET=%s" % targetName])
64
65def getModulesPath (buildCfg):
66	return os.path.join(buildCfg.getBuildDir(), "modules")
67
68def getBuiltModules (buildCfg):
69	modules		= []
70	modulesDir	= getModulesPath(buildCfg)
71	modMap		= {m.dirName: m for m in MODULES}
72
73	for entry in os.listdir(modulesDir):
74		fullPath = os.path.join(modulesDir, entry)
75		if os.path.isdir(fullPath) and entry in modMap:
76			modules.append(modMap[entry])
77
78	return modules
79
80def getCaseListFileName (module, caseListType):
81	return "%s-cases.%s" % (module.name, caseListType)
82
83def getCaseListPath (buildCfg, module, caseListType):
84	return os.path.join(getModulesPath(buildCfg), module.dirName, getCaseListFileName(module, caseListType))
85
86def genCaseList (buildCfg, generator, module, caseListType):
87	workDir = os.path.join(getModulesPath(buildCfg), module.dirName)
88
89	pushWorkingDir(workDir)
90
91	try:
92		binPath = generator.getBinaryPath(buildCfg.getBuildType(), os.path.join(".", module.binName))
93		execute([binPath, "--deqp-runmode=%s-caselist" % caseListType])
94	finally:
95		popWorkingDir()
96
97def genAndCopyCaseList (buildCfg, generator, module, dstDir, caseListType):
98	caseListFile	= getCaseListFileName(module, caseListType)
99	srcPath			= getCaseListPath(buildCfg, module, caseListType)
100	dstPath			= os.path.join(dstDir, caseListFile)
101
102	if os.path.exists(srcPath):
103		os.remove(srcPath)
104
105	genCaseList(buildCfg, generator, module, caseListType)
106
107	if not os.path.exists(srcPath):
108		raise Exception("%s not generated" % srcPath)
109
110	shutil.copyfile(srcPath, dstPath)
111
112def parseArgs ():
113	parser = argparse.ArgumentParser(description = "Build test case lists",
114									 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
115	parser.add_argument("-b",
116						"--build-dir",
117						dest="buildDir",
118						default=DEFAULT_BUILD_DIR,
119						help="Temporary build directory")
120	parser.add_argument("-t",
121						"--build-type",
122						dest="buildType",
123						default="Debug",
124						help="Build type")
125	parser.add_argument("-c",
126						"--deqp-target",
127						dest="targetName",
128						default=DEFAULT_TARGET,
129						help="dEQP build target")
130	parser.add_argument("--case-list-type",
131						dest="caseListType",
132						default="xml",
133						help="Case list type (xml, txt)")
134	parser.add_argument("-m",
135						"--modules",
136						dest="modules",
137						help="Comma-separated list of modules to update")
138	parser.add_argument("dst",
139						help="Destination directory for test case lists")
140	return parser.parse_args()
141
142if __name__ == "__main__":
143	args = parseArgs()
144
145	generator	= ANY_GENERATOR
146	buildCfg	= getBuildConfig(args.buildDir, args.targetName, args.buildType)
147	modules		= None
148
149	if args.modules:
150		modules = []
151		for m in args.modules.split(","):
152			modules.append(getModuleByName(m))
153
154	if modules:
155		build(buildCfg, generator, [m.binName for m in modules])
156	else:
157		build(buildCfg, generator)
158		modules = getBuiltModules(buildCfg)
159
160	for module in modules:
161		print "Generating test case list for %s" % module.name
162		genAndCopyCaseList(buildCfg, generator, module, args.dst, args.caseListType)
163