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