| import os |
| import json |
| import xml.etree.ElementTree as ET |
| import sys |
| |
| |
| STATIC_FILENAME = "tmp.xml" |
| KNOWN_FAILING_FILENAME = "known_failing_names.txt" |
| |
| |
| class FileDownloader(object): |
| |
| def __init__(self, file_url): |
| self.file_url = file_url |
| |
| def __enter__(self): |
| os.system("wget -O %s %s" % (STATIC_FILENAME, self.file_url)) |
| os.system("touch %s" % KNOWN_FAILING_FILENAME) |
| |
| def __exit__(self, *args): |
| os.system("rm %s" % STATIC_FILENAME) |
| |
| |
| class TestCase(object): |
| |
| def __init__(self, xml_test): |
| self._xml_test = xml_test |
| |
| @property |
| def name(self): |
| return self._xml_test.get("name") |
| |
| @property |
| def passed(self): |
| return self._xml_test.get("result") == "pass" |
| |
| def __repr__(self): |
| return "%s: %s" % (self.name, self.passed) |
| |
| |
| def generate_tests_from_file(fname): |
| tree = ET.parse(fname) |
| result = tree.getroot() |
| for module in result: |
| for test_case in module: |
| for test in test_case: |
| yield TestCase(test) |
| |
| |
| def get_failing_tests(fname): |
| return filter( |
| lambda test: not test.passed, |
| generate_tests_from_file(fname), |
| ) |
| |
| |
| def get_failing_test_names(fname): |
| return map( |
| lambda test: test.name, |
| get_failing_tests(fname), |
| ) |
| |
| |
| def get_known_failing_names(): |
| try: |
| with open(KNOWN_FAILING_FILENAME, "rb") as f: |
| return [line for line in f.read().splitlines() if line] |
| except IOError: |
| return [] |
| |
| |
| def new_test_failures(failing_test_names, known_failing_test_names): |
| return sorted( |
| list( |
| set(failing_test_names) - set(known_failing_test_names), |
| ), |
| ) |
| |
| |
| if __name__ == "__main__": |
| print "Any known test failures can be added to %s as a new line" % KNOWN_FAILING_FILENAME |
| try: |
| input_test_url = sys.argv[1] |
| except IndexError: |
| print "Supply *result_*.xml URL from a build from https://partner.android.com/" |
| sys.exit(1) |
| |
| with FileDownloader(input_test_url): |
| print "Current failing tests" |
| print json.dumps( |
| sorted( |
| new_test_failures( |
| get_failing_test_names(STATIC_FILENAME), |
| get_known_failing_names(), |
| ), |
| ), |
| indent=4, |
| ) |