13c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport argparse
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyryimport string
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TestGroup:
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, name, parent = None):
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.parent = parent
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.name = name
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.testGroups = {}
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.testCases = {}
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if parent:
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert not name in parent.testGroups
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			parent.testGroups[name] = self
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getName (self):
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.name
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getPath (self):
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if self.parent:
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return self.parent.getPath() + "." + self.name
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			return self.name
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def hasGroup(self, groupName):
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return groupName in self.testGroups
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getGroup(self, groupName):
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.testGroups[groupName]
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def hasTest(self, testName):
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return testName in self.testCases
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getTest(self, testName):
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.testCases[testName]
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def hasTestCases(self):
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return len(self.testCases) != 0
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def hasTestGroups(self):
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return len(self.testGroups) != 0
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getTestCases(self):
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.testCases.values()
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getTestGroups(self):
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.testGroups.values()
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass TestCase:
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def __init__(self, name, parent):
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.name = name
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.parent = parent
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert not name in self.parent.testCases
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		self.parent.testCases[name] = self
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getPath (self):
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.parent.getPath() + "." + self.name
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	def getName(self):
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		return self.name
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef addGroupToHierarchy(rootGroup, path):
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	pathComponents = string.split(path, ".")
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	currentGroup = rootGroup
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	assert pathComponents[0] == rootGroup.getName()
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for i in range(1, len(pathComponents)):
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		component = pathComponents[i]
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if currentGroup.hasGroup(component):
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			currentGroup = currentGroup.getGroup(component)
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			currentGroup = TestGroup(component, parent=currentGroup)
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef addTestToHierarchy(rootGroup, path):
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	pathComponents = string.split(path, ".")
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	currentGroup = rootGroup
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	assert pathComponents[0] == rootGroup.getName()
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for i in range(1, len(pathComponents)):
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		component = pathComponents[i]
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if i == len(pathComponents) - 1:
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			TestCase(component, currentGroup)
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			if currentGroup.hasGroup(component):
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				currentGroup = currentGroup.getGroup(component)
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			else:
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry				currentGroup = TestGroup(component, parent=currentGroup)
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef loadTestHierarchy (input):
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	line = input.readline()
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rootGroup = None
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if line.startswith("GROUP: "):
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		groupName	= line[len("GROUP: "):-1]
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		rootGroup	= TestGroup(groupName)
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else:
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		assert False
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for line in input:
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if line.startswith("GROUP: "):
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			groupPath = line[len("GROUP: "):-1];
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addGroupToHierarchy(rootGroup, groupPath)
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif line.startswith("TEST: "):
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			testPath = line[len("TEST: "):-1]
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			addTestToHierarchy(rootGroup, testPath)
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		else:
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert False
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return rootGroup
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1156ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvidef hasFilteredCases(group, includeTests):
1166ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    for child in group.getTestCases():
1176ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi        if child.getPath() in includeTests:
1186ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi            return True
1196ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1206ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    for child in group.getTestGroups():
1216ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi        if hasFilteredCases(child, includeTests):
1226ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi            return True
1236ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1246ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    return False
1256ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1266ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvidef addFilteredTest(parent, group, includeTests):
1276ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    for child in group.getTestGroups():
1286ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi        if hasFilteredCases(child, includeTests):
1296ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi            newChild = TestGroup(child.getName(), parent)
1306ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi            addFilteredTest(newChild, child, includeTests)
1316ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1326ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    for child in group.getTestCases():
1336ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi        if child.getPath() in includeTests:
1346ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi            TestCase(child.getName(), parent)
1356ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1366ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvidef filterTests(includeTests, group):
1376ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    root = TestGroup(group.getName())
1386ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1396ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    addFilteredTest(root, group, includeTests)
1406ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1416ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi    return root
1426ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef writeAndroidCTSTest(test, output):
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output.write('<Test name="%s" />\n' % test.getName())
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef writeAndroidCTSTestCase(group, output):
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	assert group.hasTestCases()
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	assert not group.hasTestGroups()
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output.write('<TestCase name="%s">\n' % group.getName())
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for testCase in group.getTestCases():
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		writeAndroidCTSTest(testCase, output)
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output.write('</TestCase>\n')
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyrydef writeAndroidCTSTestSuite(group, output):
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output.write('<TestSuite name="%s">\n' % group.getName())
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for childGroup in group.getTestGroups():
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		if childGroup.hasTestCases():
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			assert not childGroup.hasTestGroups()
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			writeAndroidCTSTestCase(childGroup, output)
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		elif childGroup.hasTestGroups():
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			writeAndroidCTSTestSuite(childGroup, output)
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		# \note Skips groups without testcases or child groups
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output.write('</TestSuite>\n')
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
17062491ab5ef181fda6f37e553adc2077ef6571faaJarkko Pöyrydef writeAndroidCTSFile(rootGroup, output, mustpass, name="dEQP-GLES3", appPackageName="com.drawelements.deqp.gles3"):
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output.write('<?xml version="1.0" encoding="UTF-8"?>\n')
17262491ab5ef181fda6f37e553adc2077ef6571faaJarkko Pöyry	output.write('<TestPackage name="%s" appPackageName="%s" testType="deqpTest">\n' % (name, appPackageName))
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1746ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi	writeAndroidCTSTestSuite(filterTests(mustpass, rootGroup), output)
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	output.write('</TestPackage>\n')
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyryif __name__ == "__main__":
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	parser = argparse.ArgumentParser()
1806ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi	parser.add_argument('input',	    type=argparse.FileType('r'),	help="Input dEQP test hierarchy in txt format.")
1816ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi	parser.add_argument('output',       type=argparse.FileType('w'),	help="Output file for Android CTS test file.")
1826ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi	parser.add_argument('--name',       dest="name",    type=str,	        required=True, help="Name of the test package")
1836ea2de03b6be0410411aae32de5c8592a2631220Mika Isojärvi	parser.add_argument('--package',    dest="package", type=str,		required=True, help="Name of the app package")
18462491ab5ef181fda6f37e553adc2077ef6571faaJarkko Pöyry	parser.add_argument('--must-pass',  dest="mustpass", type=argparse.FileType('r'), required=True, help="Must pass file")
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	args = parser.parse_args()
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	rootGroup = loadTestHierarchy(args.input)
18962491ab5ef181fda6f37e553adc2077ef6571faaJarkko Pöyry	writeAndroidCTSFile(rootGroup, args.output, name=args.name, appPackageName=args.package, mustpass=set(map(lambda x : x.rstrip(), args.mustpass.readlines())))
190