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