xref: /aosp_15_r20/cts/tools/utils/rerun.py (revision b7c941bb3fa97aba169d73cee0bed2de8ac964bf)
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