From a246ad72418321c9e5f3bfc600a01b2433080cb0 Mon Sep 17 00:00:00 2001 From: Scott Lobdell Date: Thu, 12 Apr 2018 14:35:49 -0700 Subject: [PATCH] Add tool to simplify identification of failing tests Test: Tested against XML files from partner.android.com Change-Id: I79be39e6be97892df66663dfa74a6e3b1c08c985 --- tools/ops/android_test_parser.py | 98 ++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 tools/ops/android_test_parser.py diff --git a/tools/ops/android_test_parser.py b/tools/ops/android_test_parser.py new file mode 100644 index 000000000..485f25f50 --- /dev/null +++ b/tools/ops/android_test_parser.py @@ -0,0 +1,98 @@ +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, + )