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