Home | History | Annotate | Download | only in utils
      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