1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*-
2e5c31af7Sopenharmony_ci
3e5c31af7Sopenharmony_ci#-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci# Quality Program utilities
5e5c31af7Sopenharmony_ci# --------------------------------------
6e5c31af7Sopenharmony_ci#
7e5c31af7Sopenharmony_ci# Copyright 2018
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 copy
25e5c31af7Sopenharmony_ciimport sys
26e5c31af7Sopenharmony_ciimport xml.sax
27e5c31af7Sopenharmony_ciimport xml.sax.handler
28e5c31af7Sopenharmony_cifrom log_parser import BatchResultParser, StatusCode
29e5c31af7Sopenharmony_ci
30e5c31af7Sopenharmony_ciclass TimeOfExecutionGroups() :
31e5c31af7Sopenharmony_ci	def __init__(self):
32e5c31af7Sopenharmony_ci		self.path				= ""
33e5c31af7Sopenharmony_ci		self.numberOfTests		= 0
34e5c31af7Sopenharmony_ci		self.timeOfExecution	= 0
35e5c31af7Sopenharmony_ci
36e5c31af7Sopenharmony_ciclass TimeOfExecutionTests() :
37e5c31af7Sopenharmony_ci	def __init__(self):
38e5c31af7Sopenharmony_ci		self.path				= ""
39e5c31af7Sopenharmony_ci		self.timeOfExecution	= 0
40e5c31af7Sopenharmony_ci
41e5c31af7Sopenharmony_cidef sortKey (element ) :
42e5c31af7Sopenharmony_ci	return int(element.timeOfExecution)
43e5c31af7Sopenharmony_ci
44e5c31af7Sopenharmony_cidef sortKeyTimePerTest (element) :
45e5c31af7Sopenharmony_ci	return int(int(element.timeOfExecution)/int(element.numberOfTests))
46e5c31af7Sopenharmony_ci
47e5c31af7Sopenharmony_ciclass XMLLogHandlerTests(xml.sax.handler.ContentHandler) :
48e5c31af7Sopenharmony_ci	def __init__ (self):
49e5c31af7Sopenharmony_ci		self.list			= []
50e5c31af7Sopenharmony_ci		self.element		= TimeOfExecutionTests()
51e5c31af7Sopenharmony_ci		self.testTime		= False
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ci	def startElement (self, name, attrs):
54e5c31af7Sopenharmony_ci		if name == "TestCaseResult" :
55e5c31af7Sopenharmony_ci			self.element.path = attrs.getValue("CasePath")
56e5c31af7Sopenharmony_ci		if name == "Number" and "TestDuration" == attrs.getValue("Name") :
57e5c31af7Sopenharmony_ci			self.testTime = True
58e5c31af7Sopenharmony_ci
59e5c31af7Sopenharmony_ci	def characters(self, content) :
60e5c31af7Sopenharmony_ci		if self.testTime :
61e5c31af7Sopenharmony_ci			self.testTime = False
62e5c31af7Sopenharmony_ci			self.element.timeOfExecution = content
63e5c31af7Sopenharmony_ci			self.list.append(copy.deepcopy(self.element))
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ci	def bottleneck (self, resultCount) :
66e5c31af7Sopenharmony_ci		print("The biggest tests time of execution")
67e5c31af7Sopenharmony_ci		print('%-4s%12s\t%12s' % ("Index", "Time", "Full name"))
68e5c31af7Sopenharmony_ci		self.list.sort(key = sortKey, reverse = True)
69e5c31af7Sopenharmony_ci		ndx = 1
70e5c31af7Sopenharmony_ci		for test in self.list :
71e5c31af7Sopenharmony_ci			print('%-4i%12i\t%12s' % (int(ndx), int(test.timeOfExecution), test.path))
72e5c31af7Sopenharmony_ci			ndx+=1
73e5c31af7Sopenharmony_ci			if int(ndx) > int(resultCount) :
74e5c31af7Sopenharmony_ci				break
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_ciclass XMLLogHandlerGroups(xml.sax.handler.ContentHandler) :
77e5c31af7Sopenharmony_ci	def __init__ (self, testList) :
78e5c31af7Sopenharmony_ci		self.list			= []
79e5c31af7Sopenharmony_ci		self.testList		= testList
80e5c31af7Sopenharmony_ci		self.element		= TimeOfExecutionGroups()
81e5c31af7Sopenharmony_ci		self.addIt			= False
82e5c31af7Sopenharmony_ci
83e5c31af7Sopenharmony_ci	def startElement (self, name, attrs) :
84e5c31af7Sopenharmony_ci		self.element.numberOfTests = 0
85e5c31af7Sopenharmony_ci		if name == "Number" :
86e5c31af7Sopenharmony_ci			self.element.path = attrs.getValue("Name")
87e5c31af7Sopenharmony_ci			if self.element.path == "dEQP-VK" :
88e5c31af7Sopenharmony_ci				self.addIt = True
89e5c31af7Sopenharmony_ci				self.element.numberOfTests = len(self.testList)
90e5c31af7Sopenharmony_ci			else :
91e5c31af7Sopenharmony_ci				for test in self.testList :
92e5c31af7Sopenharmony_ci					if test.path[:test.path.rfind(".")] in self.element.path :
93e5c31af7Sopenharmony_ci						self.addIt = True
94e5c31af7Sopenharmony_ci						self.element.numberOfTests += 1
95e5c31af7Sopenharmony_ci
96e5c31af7Sopenharmony_ci	def characters(self, content) :
97e5c31af7Sopenharmony_ci		if self.addIt :
98e5c31af7Sopenharmony_ci			self.addIt = False
99e5c31af7Sopenharmony_ci			self.element.timeOfExecution = content
100e5c31af7Sopenharmony_ci			self.list.append(copy.deepcopy(self.element))
101e5c31af7Sopenharmony_ci
102e5c31af7Sopenharmony_ci	def bottleneck (self, resultCount) :
103e5c31af7Sopenharmony_ci		self.list.sort(key = sortKey, reverse = True)
104e5c31af7Sopenharmony_ci		print("\nGroups Statistics")
105e5c31af7Sopenharmony_ci		print("Total time of execution:\t", self.list[0].timeOfExecution)
106e5c31af7Sopenharmony_ci		print("Number of executed tests:\t", self.list[0].numberOfTests)
107e5c31af7Sopenharmony_ci		print("\nThe biggest total time of execution")
108e5c31af7Sopenharmony_ci		print('%-4s%15s%15s\t%-30s' % ("Index", "Time", "Test count", "Full name"))
109e5c31af7Sopenharmony_ci		ndx = 1
110e5c31af7Sopenharmony_ci		for test in self.list :
111e5c31af7Sopenharmony_ci			if test.path == "dEQP-VK" :
112e5c31af7Sopenharmony_ci				continue
113e5c31af7Sopenharmony_ci			print('%-4s%15s%15s\t%-30s' % (ndx, test.timeOfExecution, test.numberOfTests, test.path))
114e5c31af7Sopenharmony_ci			ndx+=1
115e5c31af7Sopenharmony_ci			if int(ndx) > int(resultCount) :
116e5c31af7Sopenharmony_ci				break
117e5c31af7Sopenharmony_ci		self.list.sort(key = sortKeyTimePerTest, reverse = True)
118e5c31af7Sopenharmony_ci		print("\nThe biggest time of execution per test")
119e5c31af7Sopenharmony_ci		print('%-4s%15s%15s%15s\t%-30s' % ("Index", "Time", "Test count", "\tAvg. test time", "Full name"))
120e5c31af7Sopenharmony_ci		ndx = 1
121e5c31af7Sopenharmony_ci		for test in self.list :
122e5c31af7Sopenharmony_ci			if test.path == "dEQP-VK" :
123e5c31af7Sopenharmony_ci				continue
124e5c31af7Sopenharmony_ci			print('%-4s%15s%15s%15i\t%-30s' % (ndx, test.timeOfExecution, test.numberOfTests, int(test.timeOfExecution)/int(test.numberOfTests), test.path))
125e5c31af7Sopenharmony_ci			ndx+=1
126e5c31af7Sopenharmony_ci			if int(ndx) > int(resultCount) :
127e5c31af7Sopenharmony_ci				break
128e5c31af7Sopenharmony_ci
129e5c31af7Sopenharmony_ciclass LogErrorHandler(xml.sax.handler.ErrorHandler) :
130e5c31af7Sopenharmony_ci	def __init__ (self) :
131e5c31af7Sopenharmony_ci		pass
132e5c31af7Sopenharmony_ci
133e5c31af7Sopenharmony_ci	def error (self, err) :
134e5c31af7Sopenharmony_ci		#print("error(%s)" % str(err))
135e5c31af7Sopenharmony_ci		pass
136e5c31af7Sopenharmony_ci
137e5c31af7Sopenharmony_ci	def fatalError (self, err) :
138e5c31af7Sopenharmony_ci		#print("fatalError(%s)" % str(err))
139e5c31af7Sopenharmony_ci		pass
140e5c31af7Sopenharmony_ci
141e5c31af7Sopenharmony_ci	def warning (self, warn) :
142e5c31af7Sopenharmony_ci		#print("warning(%s)" % str(warn))
143e5c31af7Sopenharmony_ci		pass
144e5c31af7Sopenharmony_ci
145e5c31af7Sopenharmony_cidef findFirstElementByName (nodes, name) :
146e5c31af7Sopenharmony_ci	for node in nodes:
147e5c31af7Sopenharmony_ci		if node.nodeName == name :
148e5c31af7Sopenharmony_ci			return node
149e5c31af7Sopenharmony_ci		chFound = findFirstElementByName(node.childNodes, name)
150e5c31af7Sopenharmony_ci		if chFound != None :
151e5c31af7Sopenharmony_ci			return chFound
152e5c31af7Sopenharmony_ci	return None
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_cidef printTimes (inFile, resultCount) :
155e5c31af7Sopenharmony_ci	#Test section
156e5c31af7Sopenharmony_ci	parser	= BatchResultParser()
157e5c31af7Sopenharmony_ci	results	= parser.parseFile(inFile)
158e5c31af7Sopenharmony_ci	handler		= XMLLogHandlerTests()
159e5c31af7Sopenharmony_ci	errHandler	= LogErrorHandler()
160e5c31af7Sopenharmony_ci	for result in results :
161e5c31af7Sopenharmony_ci		xml.sax.parseString(result.log, handler, errHandler)
162e5c31af7Sopenharmony_ci	handler.bottleneck(resultCount)
163e5c31af7Sopenharmony_ci
164e5c31af7Sopenharmony_ci	#Group section
165e5c31af7Sopenharmony_ci	startRecordLines = False
166e5c31af7Sopenharmony_ci	lines = ""
167e5c31af7Sopenharmony_ci	f = open(inFile, 'rb')
168e5c31af7Sopenharmony_ci	for line in f :
169e5c31af7Sopenharmony_ci		if "#endTestsCasesTime" in line :
170e5c31af7Sopenharmony_ci			break
171e5c31af7Sopenharmony_ci		if startRecordLines :
172e5c31af7Sopenharmony_ci			lines += line
173e5c31af7Sopenharmony_ci		if "#beginTestsCasesTime" in line :
174e5c31af7Sopenharmony_ci			startRecordLines = True
175e5c31af7Sopenharmony_ci	f.close()
176e5c31af7Sopenharmony_ci	handlerGroups = XMLLogHandlerGroups(handler.list)
177e5c31af7Sopenharmony_ci	xml.sax.parseString(lines, handlerGroups, errHandler)
178e5c31af7Sopenharmony_ci	handlerGroups.bottleneck(resultCount)
179e5c31af7Sopenharmony_ci
180e5c31af7Sopenharmony_ciif __name__ == "__main__" :
181e5c31af7Sopenharmony_ci	if len(sys.argv) != 3:
182e5c31af7Sopenharmony_ci		print("%s: [test log] [count of result to display]" % sys.argv[0])
183e5c31af7Sopenharmony_ci		print("example: python %s TestResults.qpa 10" % sys.argv[0])
184e5c31af7Sopenharmony_ci		sys.exit(-1)
185e5c31af7Sopenharmony_ci	printTimes(sys.argv[1], sys.argv[2])
186