diff options
author | José Fonseca <jfonseca@vmware.com> | 2014-11-21 21:20:51 +0000 |
---|---|---|
committer | José Fonseca <jfonseca@vmware.com> | 2014-11-21 22:25:24 +0000 |
commit | 5bcbc84e7c2a644e94905c68681e03dfc588dd7a (patch) | |
tree | 7f47b37c0df539c970a4650e740a9c7aedd1d1e0 | |
parent | 8fe4fea9cc51fab1187dabb5b3e74cc8c6c861e6 (diff) |
framework/summary/junit: Remove.
Deprecated by JUnit backend.
Tested with json backend + summary html to ensure nothing's broken.
Reviewed-by: Dylan Baker <dylanx.c.baker@intel.com>
-rw-r--r-- | framework/junit.py | 377 | ||||
-rw-r--r-- | framework/programs/summary.py | 111 | ||||
-rwxr-xr-x | piglit | 4 | ||||
-rwxr-xr-x | piglit-summary-junit.py | 28 |
4 files changed, 0 insertions, 520 deletions
diff --git a/framework/junit.py b/framework/junit.py deleted file mode 100644 index 791673150..000000000 --- a/framework/junit.py +++ /dev/null @@ -1,377 +0,0 @@ -########################################################################### -# -# Copyright 2010-2011 VMware, Inc. -# All Rights Reserved. -# -# Permission is hereby granted, free of charge, to any person obtaining a -# copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sub license, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice (including the -# next paragraph) shall be included in all copies or substantial portions -# of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -# IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR -# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -########################################################################### - -"""Testing framework that assists invoking external programs and outputing -results in ANT's junit XML format, used by Jenkins-CI.""" - - -import locale -import optparse -import os.path -import shutil -import string -import sys -import time - - -__all__ = [ - 'Error', - 'Failure', - 'Main', - 'Report', - 'Test', - 'TestSuite', -] - - -class Failure(Exception): - pass - - -class Error(Exception): - pass - - -# Not all valid Unicode characters are valid XML. -# See http://www.w3.org/TR/xml/#charsets -_validXmlAscii = ''.join([((_c >= 0x20 and _c < 0x80) or _c in (0x9, 0xA, 0xD)) and chr(_c) or '?' for _c in range(256)]) -_validXmlUnicode = {} -for _c in range(0x20): - if _c not in (0x9, 0xA, 0xD): - _validXmlUnicode[_c] = ord('?') -del _c - - -def escape(s): - '''Escape and encode a XML string.''' - if isinstance(s, unicode): - s = s.translate(_validXmlUnicode) - else: - #s = s.decode(locale.getpreferredencoding(), 'replace') - s = s.translate(_validXmlAscii) - s = s.decode('ascii', 'ignore') - s = s.replace('&', '&') - s = s.replace('<', '<') - s = s.replace('>', '>') - s = s.replace('"', '"') - s = s.replace("'", ''') - s = s.encode('UTF-8') - return s - - -# same as string.printable, but without '\v\f' -_printable = string.digits + string.letters + string.punctuation + ' \t\n\r' -_printable = ''.join([chr(_c) in _printable and chr(_c) or '?' for _c in range(256)]) -del _c - - -class Report: - """Write test results in ANT's junit XML format. - - See also: - - https://github.com/jenkinsci/jenkins/tree/master/test/src/test/resources/hudson/tasks/junit - - http://www.junit.org/node/399 - - http://wiki.apache.org/ant/Proposals/EnhancedTestReports - """ - - def __init__(self, filename, time = True): - self.path = os.path.dirname(os.path.abspath(filename)) - if not os.path.exists(self.path): - os.makedirs(self.path) - - self.stream = open(filename, 'wt') - self.testsuites = [] - self.inside_testsuite = False - self.inside_testcase = False - self.time = time - - def start(self): - self.stream.write('<?xml version="1.0" encoding="UTF-8" ?>\n') - self.stream.write('<testsuites>\n') - - def stop(self): - if self.inside_testcase: - self.stream.write('</testcase>\n') - self.inside_testcase = False - if self.inside_testsuite: - self.stream.write('</testsuite>\n') - self.inside_testsuite = False - self.stream.write('</testsuites>\n') - self.stream.flush() - self.stream.close() - - def escapeName(self, name): - '''Dots are special for junit, so escape them with underscores.''' - name = name.replace('.', '_') - return name - - def startSuite(self, name): - self.testsuites.append(self.escapeName(name)) - - def stopSuite(self): - if self.inside_testsuite: - self.stream.write('</testsuite>\n') - self.inside_testsuite = False - self.testsuites.pop(-1) - - def startCase(self, name): - assert not self.inside_testcase - self.inside_testcase = True - - if not self.inside_testsuite: - self.stream.write('<testsuite name="%s">\n' % escape('.'.join(self.testsuites[:1]))) - self.inside_testsuite = True - - self.case_name = name - self.buffer = [] - self.stdout = [] - self.stderr = [] - self.start_time = time.time() - - def stopCase(self, duration = None): - assert self.inside_testcase - self.inside_testcase = False - - if len(self.testsuites) == 1: - classname = self.testsuites[0] + '.' + self.testsuites[0] - else: - classname = '.'.join(self.testsuites) - name = self.case_name - - self.stream.write('<testcase classname="%s" name="%s"' % (escape(classname), escape(name))) - if duration is None: - if self.time: - stop_time = time.time() - duration = stop_time - self.start_time - if duration is not None: - self.stream.write(' time="%f"' % duration) - - if not self.buffer and not self.stdout and not self.stderr: - self.stream.write('/>\n') - else: - self.stream.write('>') - - for entry in self.buffer: - self.stream.write(entry) - if self.stdout: - self.stream.write('<system-out>') - for text in self.stdout: - self.stream.write(escape(text)) - self.stream.write('</system-out>') - if self.stderr: - self.stream.write('<system-err>') - for text in self.stderr: - self.stream.write(escape(text)) - self.stream.write('</system-err>') - - self.stream.write('</testcase>\n') - - self.stream.flush() - - def addStdout(self, text): - if isinstance(text, str): - text = text.translate(_printable) - self.stdout.append(text) - - def addStderr(self, text): - if isinstance(text, str): - text = text.translate(_printable) - self.stderr.append(text) - - def addSkipped(self): - self.buffer.append('<skipped/>\n') - - def addError(self, message, stacktrace=""): - self.buffer.append('<error message="%s"' % escape(message)) - if not stacktrace: - self.buffer.append('/>') - else: - self.buffer.append('>') - self.buffer.append(escape(stacktrace)) - self.buffer.append('</error>') - - def addFailure(self, message, stacktrace=""): - self.buffer.append('<failure message="%s"' % escape(message)) - if not stacktrace: - self.buffer.append('/>') - else: - self.buffer.append('>') - self.buffer.append(escape(stacktrace)) - self.buffer.append('</failure>') - - def addMeasurement(self, name, value): - '''Embedded a measurement in the standard output. - - https://wiki.jenkins-ci.org/display/JENKINS/Measurement+Plots+Plugin - ''' - - if value is not None: - message = '<measurement><name>%s</name><value>%f</value></measurement>\n' % (name, value) - self.addStdout(message) - - def addAttachment(self, path): - '''Attach a file. - - https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Attachments+Plugin - ''' - - attach_dir = os.path.join(self.path, '.'.join(self.testsuites + [self.case_name])) - if not os.path.exists(attach_dir): - os.makedirs(attach_dir) - shutil.copy2(path, attach_dir) - - def addWorkspaceURL(self, path): - import urlparse - try: - workspace_path = os.environ['WORKSPACE'] - job_url = os.environ['JOB_URL'] - except KeyError: - self.addStdout(path + '\n') - else: - rel_path = os.path.relpath(path, workspace_path) - workspace_url = urlparse.urljoin(job_url, 'ws/') - url = urlparse.urljoin(workspace_url, rel_path) - if os.path.isdir(path): - url += '/' - self.addStdout(url + '\n') - - -class BaseTest: - - def _visit(self, report): - raise NotImplementedError - - def fail(self, *args): - raise Failure(*args) - - def error(self, *args): - raise Error(*args) - - - -class TestSuite(BaseTest): - - def __init__(self, name, tests=()): - self.name = name - self.tests = [] - self.addTests(tests) - - def addTest(self, test): - self.tests.append(test) - - def addTests(self, tests): - for test in tests: - self.addTest(test) - - def run(self, filename = None, report = None): - if report is None: - if filename is None: - filename = self.name + '.xml' - report = Report(filename) - report.start() - try: - self._visit(report) - finally: - report.stop() - - def _visit(self, report): - report.startSuite(self.name) - try: - self.test(report) - finally: - report.stopSuite() - - def test(self, report): - for test in self.tests: - test._visit(report) - - -class Test(BaseTest): - - def __init__(self, name): - self.name = name - - def _visit(self, report): - report.startCase(self.name) - try: - try: - return self.test(report) - except Failure as ex: - report.addFailure(*ex.args) - except Error as ex: - report.addError(*ex.args) - except KeyboardInterrupt: - raise - except: - report.addError(str(sys.exc_value)) - finally: - report.stopCase() - - def test(self, report): - raise NotImplementedError - - -class Main: - - default_timeout = 5*60 - - def __init__(self, name): - self.name = name - - def optparser(self): - optparser = optparse.OptionParser(usage="\n\t%prog [options] ...") - optparser.add_option( - '-n', '--dry-run', - action="store_true", - dest="dry_run", default=False, - help="perform a trial run without executing") - optparser.add_option( - '-t', '--timeout', metavar='SECONDS', - type="float", dest="timeout", default = self.default_timeout, - help="timeout in seconds [default: %default]") - #optparser.add_option( - # '-f', '--filter', - # action='append', - # type="choice", metevar='GLOB', - # dest="filters", default=[], - # help="filter") - return optparser - - def create_suite(self): - raise NotImplementedError - - def run_suite(self, suite): - filename = self.name + '.xml' - report = Report(filename) - suite.run() - - def main(self): - optparser = self.optparser() - (self.options, self.args) = optparser.parse_args(sys.argv[1:]) - - suite = self.create_suite() - self.run_suite(suite) diff --git a/framework/programs/summary.py b/framework/programs/summary.py index 98b5e66ca..a27391845 100644 --- a/framework/programs/summary.py +++ b/framework/programs/summary.py @@ -28,10 +28,8 @@ import framework.summary as summary import framework.status as status import framework.core as core import framework.results -import framework.junit __all__ = ['html', - 'junit', 'console', 'csv'] @@ -100,115 +98,6 @@ def html(input_): output.generate_html(args.summaryDir, args.exclude_details) -class _Writer: - - def __init__(self, filename): - self.report = framework.junit.Report(filename) - self.path = [] - - def write(self, arg): - testrun = framework.results.load_results(arg) - - self.report.start() - self.report.startSuite('piglit') - try: - for name, result in testrun.tests.iteritems(): - self.write_test(testrun, name, result) - finally: - self.enter_path([]) - self.report.stopSuite() - self.report.stop() - - def write_test(self, testrun, test_path, result): - test_path = test_path.replace('\\', '/').split('/') - test_name = test_path.pop() - self.enter_path(test_path) - - self.report.startCase(test_name) - duration = None - try: - try: - command = result['command'] - except KeyError: - pass - else: - self.report.addStdout(command + '\n') - - try: - stdout = result['out'] - except KeyError: - pass - else: - if stdout: - self.report.addStdout(stdout + '\n') - - try: - stderr = result['err'] - except KeyError: - pass - else: - if stderr: - self.report.addStderr(stderr + '\n') - - try: - returncode = result['returncode'] - except KeyError: - pass - else: - if returncode: - self.report.addStderr('returncode = %s\n' % returncode) - - success = result.get('result') - if success in (status.PASS, status.WARN): - pass - elif success == status.SKIP: - self.report.addSkipped() - elif success == status.CRASH: - self.report.addError(success.name) - else: - self.report.addFailure(success.name) - - try: - duration = float(result['time']) - except KeyError: - pass - finally: - self.report.stopCase(duration) - - def enter_path(self, path): - ancestor = 0 - try: - while self.path[ancestor] == path[ancestor]: - ancestor += 1 - except IndexError: - pass - - for dirname in self.path[ancestor:]: - self.report.stopSuite() - - for dirname in path[ancestor:]: - self.report.startSuite(dirname) - - self.path = path - - -def junit(input_): - parser = argparse.ArgumentParser() - parser.add_argument("-o", "--output", - metavar="<Output File>", - action="store", - dest="output", - default="piglit.xml", - help="Output filename") - parser.add_argument("testResults", - metavar="<Input Files>", - help="JSON results file to be converted") - args = parser.parse_args(input_) - - writer = _Writer(args.output) - writer.write(args.testResults) - - def console(input_): parser = argparse.ArgumentParser() @@ -131,10 +131,6 @@ def main(): add_help=False, help='print results to terminal') console.set_defaults(func=summary.console) - junit = summary_parser.add_parser('junit', - add_help=False, - help='generate junit xml from results') - junit.set_defaults(func=summary.junit) csv = summary_parser.add_parser('csv', add_help=False, help='generate csv from results') diff --git a/piglit-summary-junit.py b/piglit-summary-junit.py deleted file mode 100755 index 5c40a73dd..000000000 --- a/piglit-summary-junit.py +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env python2 - -# Copyright (c) 2014 Intel Corporation - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -""" Deprecated compatability wrapper for junit summary """ - -import sys -from framework.programs.summary import junit - -junit(sys.argv[1:]) |