blob: 86853a191230ba254849bbce0681d8fce63dc0a5 [file] [log] [blame]
Keun young Parkd46fef22012-07-10 18:14:52 -07001#!/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#
17import os
18import sys
19from xml.dom import Node
20from xml.dom import minidom
21
22def 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
31def 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
50def 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
63def 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
88if __name__ == '__main__':
89 main(sys.argv)