#!/usr/bin/env python # # Copyright (C) 2012 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the 'License'); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an 'AS IS' BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import os import sys from xml.dom import Node from xml.dom import minidom def getChildrenWithTag(parent, tagName): children = [] for child in parent.childNodes: if (child.nodeType == Node.ELEMENT_NODE) and (child.tagName == tagName): #print "parent " + parent.getAttribute("name") + " " + tagName +\ # " " + child.getAttribute("name") children.append(child) return children def parseSuite(suite, parentName): if parentName != "": parentName += '.' failedCases = [] childSuites = getChildrenWithTag(suite, "TestSuite") for child in childSuites: for failure in parseSuite(child, parentName + child.getAttribute("name")): failedCases.append(failure) childTestCases = getChildrenWithTag(suite, "TestCase") for child in childTestCases: className = parentName + child.getAttribute("name") for test in getChildrenWithTag(child, "Test"): if test.getAttribute("result") != "pass": failureName = className + "#" + test.getAttribute("name") failedCases.append(failureName) #if len(failedCases) > 0: # print failedCases return failedCases def getFailedCases(resultXml): failedCases = [] doc = minidom.parse(resultXml) testResult = doc.getElementsByTagName("TestResult")[0] packages = getChildrenWithTag(testResult, "TestPackage") for package in packages: casesFromChild = parseSuite(package, "") for case in casesFromChild: if case not in failedCases: failedCases.append(case) return failedCases def main(argv): if len(argv) < 3: print "rerun.py cts_path result_xml [-s serial]" print " cts_path should end with android-cts" sys.exit(1) ctsPath = os.path.abspath(argv[1]) resultXml = os.path.abspath(argv[2]) deviceSerial = "" if len(argv) > 3: if argv[3] == "-s": deviceSerial = argv[4] failedCases = getFailedCases(resultXml) print "Re-run follwong cases:" for failure in failedCases: print " " + failure for failure in failedCases: [className, methodName] = failure.split('#') command = ctsPath + "/tools/cts-tradefed run singleCommand cts" if deviceSerial != "": command += " --serial " + deviceSerial command += " --class " + className + " --method " + methodName print command os.system(command) if __name__ == '__main__': main(sys.argv)