1*b7c941bbSAndroid Build Coastguard Worker#!/usr/bin/env python 2*b7c941bbSAndroid Build Coastguard Worker# 3*b7c941bbSAndroid Build Coastguard Worker# Copyright (C) 2012 The Android Open Source Project 4*b7c941bbSAndroid Build Coastguard Worker# 5*b7c941bbSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the 'License'); 6*b7c941bbSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*b7c941bbSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*b7c941bbSAndroid Build Coastguard Worker# 9*b7c941bbSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*b7c941bbSAndroid Build Coastguard Worker# 11*b7c941bbSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*b7c941bbSAndroid Build Coastguard Worker# distributed under the License is distributed on an 'AS IS' BASIS, 13*b7c941bbSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*b7c941bbSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*b7c941bbSAndroid Build Coastguard Worker# limitations under the License. 16*b7c941bbSAndroid Build Coastguard Worker# 17*b7c941bbSAndroid Build Coastguard Workerimport os 18*b7c941bbSAndroid Build Coastguard Workerimport sys 19*b7c941bbSAndroid Build Coastguard Workerfrom xml.dom import Node 20*b7c941bbSAndroid Build Coastguard Workerfrom xml.dom import minidom 21*b7c941bbSAndroid Build Coastguard Worker 22*b7c941bbSAndroid Build Coastguard Workerdef getChildrenWithTag(parent, tagName): 23*b7c941bbSAndroid Build Coastguard Worker children = [] 24*b7c941bbSAndroid Build Coastguard Worker for child in parent.childNodes: 25*b7c941bbSAndroid Build Coastguard Worker if (child.nodeType == Node.ELEMENT_NODE) and (child.tagName == tagName): 26*b7c941bbSAndroid Build Coastguard Worker #print "parent " + parent.getAttribute("name") + " " + tagName +\ 27*b7c941bbSAndroid Build Coastguard Worker # " " + child.getAttribute("name") 28*b7c941bbSAndroid Build Coastguard Worker children.append(child) 29*b7c941bbSAndroid Build Coastguard Worker return children 30*b7c941bbSAndroid Build Coastguard Worker 31*b7c941bbSAndroid Build Coastguard Workerdef parseSuite(suite, parentName): 32*b7c941bbSAndroid Build Coastguard Worker if parentName != "": 33*b7c941bbSAndroid Build Coastguard Worker parentName += '.' 34*b7c941bbSAndroid Build Coastguard Worker failedCases = [] 35*b7c941bbSAndroid Build Coastguard Worker childSuites = getChildrenWithTag(suite, "TestSuite") 36*b7c941bbSAndroid Build Coastguard Worker for child in childSuites: 37*b7c941bbSAndroid Build Coastguard Worker for failure in parseSuite(child, parentName + child.getAttribute("name")): 38*b7c941bbSAndroid Build Coastguard Worker failedCases.append(failure) 39*b7c941bbSAndroid Build Coastguard Worker childTestCases = getChildrenWithTag(suite, "TestCase") 40*b7c941bbSAndroid Build Coastguard Worker for child in childTestCases: 41*b7c941bbSAndroid Build Coastguard Worker className = parentName + child.getAttribute("name") 42*b7c941bbSAndroid Build Coastguard Worker for test in getChildrenWithTag(child, "Test"): 43*b7c941bbSAndroid Build Coastguard Worker if test.getAttribute("result") != "pass": 44*b7c941bbSAndroid Build Coastguard Worker failureName = className + "#" + test.getAttribute("name") 45*b7c941bbSAndroid Build Coastguard Worker failedCases.append(failureName) 46*b7c941bbSAndroid Build Coastguard Worker #if len(failedCases) > 0: 47*b7c941bbSAndroid Build Coastguard Worker # print failedCases 48*b7c941bbSAndroid Build Coastguard Worker return failedCases 49*b7c941bbSAndroid Build Coastguard Worker 50*b7c941bbSAndroid Build Coastguard Workerdef getFailedCases(resultXml): 51*b7c941bbSAndroid Build Coastguard Worker failedCases = [] 52*b7c941bbSAndroid Build Coastguard Worker doc = minidom.parse(resultXml) 53*b7c941bbSAndroid Build Coastguard Worker testResult = doc.getElementsByTagName("TestResult")[0] 54*b7c941bbSAndroid Build Coastguard Worker packages = getChildrenWithTag(testResult, "TestPackage") 55*b7c941bbSAndroid Build Coastguard Worker for package in packages: 56*b7c941bbSAndroid Build Coastguard Worker casesFromChild = parseSuite(package, "") 57*b7c941bbSAndroid Build Coastguard Worker for case in casesFromChild: 58*b7c941bbSAndroid Build Coastguard Worker if case not in failedCases: 59*b7c941bbSAndroid Build Coastguard Worker failedCases.append(case) 60*b7c941bbSAndroid Build Coastguard Worker 61*b7c941bbSAndroid Build Coastguard Worker return failedCases 62*b7c941bbSAndroid Build Coastguard Worker 63*b7c941bbSAndroid Build Coastguard Workerdef main(argv): 64*b7c941bbSAndroid Build Coastguard Worker if len(argv) < 3: 65*b7c941bbSAndroid Build Coastguard Worker print "rerun.py cts_path result_xml [-s serial]" 66*b7c941bbSAndroid Build Coastguard Worker print " cts_path should end with android-cts" 67*b7c941bbSAndroid Build Coastguard Worker sys.exit(1) 68*b7c941bbSAndroid Build Coastguard Worker ctsPath = os.path.abspath(argv[1]) 69*b7c941bbSAndroid Build Coastguard Worker resultXml = os.path.abspath(argv[2]) 70*b7c941bbSAndroid Build Coastguard Worker deviceSerial = "" 71*b7c941bbSAndroid Build Coastguard Worker if len(argv) > 3: 72*b7c941bbSAndroid Build Coastguard Worker if argv[3] == "-s": 73*b7c941bbSAndroid Build Coastguard Worker deviceSerial = argv[4] 74*b7c941bbSAndroid Build Coastguard Worker 75*b7c941bbSAndroid Build Coastguard Worker failedCases = getFailedCases(resultXml) 76*b7c941bbSAndroid Build Coastguard Worker print "Re-run follwong cases:" 77*b7c941bbSAndroid Build Coastguard Worker for failure in failedCases: 78*b7c941bbSAndroid Build Coastguard Worker print " " + failure 79*b7c941bbSAndroid Build Coastguard Worker for failure in failedCases: 80*b7c941bbSAndroid Build Coastguard Worker [className, methodName] = failure.split('#') 81*b7c941bbSAndroid Build Coastguard Worker command = ctsPath + "/tools/cts-tradefed run singleCommand cts" 82*b7c941bbSAndroid Build Coastguard Worker if deviceSerial != "": 83*b7c941bbSAndroid Build Coastguard Worker command += " --serial " + deviceSerial 84*b7c941bbSAndroid Build Coastguard Worker command += " --class " + className + " --method " + methodName 85*b7c941bbSAndroid Build Coastguard Worker print command 86*b7c941bbSAndroid Build Coastguard Worker os.system(command) 87*b7c941bbSAndroid Build Coastguard Worker 88*b7c941bbSAndroid Build Coastguard Workerif __name__ == '__main__': 89*b7c941bbSAndroid Build Coastguard Worker main(sys.argv) 90