[Piglit] [PATCH 3/4] framework: move executable functions to modules

Dylan Baker baker.dylan.c at gmail.com
Fri May 2 18:31:30 PDT 2014


This moves piglit-run and piglit-resume main() functions to
framework.programs.run as run() and resume() respectively, and moves
piglit-summary-* to framework.programs.summary. It then creates
compatibility wrappers as piglit-*.py for the functions.

This is groundwork for a combined piglit interface. The original files
could not be imported directly since they have dash (-) in their name,
and python considered dash an illegal character for function, class, and
modules names, and python would raise an ImportError.

Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
 framework/programs/__init__.py |   0
 framework/programs/run.py      | 242 ++++++++++++++++++++++++++++++++++++++++
 framework/programs/summary.py  | 243 +++++++++++++++++++++++++++++++++++++++++
 piglit-resume.py               | 108 ++++--------------
 piglit-run.py                  | 199 ++++-----------------------------
 piglit-summary-html.py         | 113 ++++---------------
 piglit-summary-junit.py        | 161 ++++-----------------------
 piglit-summary.py              |  93 ++++------------
 8 files changed, 589 insertions(+), 570 deletions(-)
 create mode 100644 framework/programs/__init__.py
 create mode 100644 framework/programs/run.py
 create mode 100644 framework/programs/summary.py

diff --git a/framework/programs/__init__.py b/framework/programs/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/framework/programs/run.py b/framework/programs/run.py
new file mode 100644
index 0000000..9c5b033
--- /dev/null
+++ b/framework/programs/run.py
@@ -0,0 +1,242 @@
+# 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:
+#
+# 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 AUTHOR(S) 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.
+
+
+from __future__ import print_function
+import argparse
+import sys
+import os
+import os.path as path
+import time
+
+import framework.core as core
+import framework.profile
+
+__all__ = ['run',
+           'resume']
+
+
+def run(input_):
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-n", "--name",
+                        metavar="<test name>",
+                        default=None,
+                        help="Name of this test run")
+    parser.add_argument("-d", "--dry-run",
+                        action="store_false",
+                        dest="execute",
+                        help="Do not execute the tests")
+    parser.add_argument("-t", "--include-tests",
+                        default=[],
+                        action="append",
+                        metavar="<regex>",
+                        help="Run only matching tests "
+                             "(can be used more than once)")
+    parser.add_argument("-x", "--exclude-tests",
+                        default=[],
+                        action="append",
+                        metavar="<regex>",
+                        help="Exclude matching tests "
+                             "(can be used more than once)")
+    conc_parser = parser.add_mutually_exclusive_group()
+    conc_parser.add_argument('-c', '--all-concurrent',
+                             action="store_const",
+                             default="some",
+                             const="all",
+                             dest="concurrency",
+                             help="Run all tests concurrently")
+    conc_parser.add_argument("-1", "--no-concurrency",
+                             action="store_const",
+                             default="some",
+                             const="none",
+                             dest="concurrency",
+                             help="Disable concurrent test runs")
+    parser.add_argument("-p", "--platform",
+                        choices=["glx", "x11_egl", "wayland", "gbm"],
+                        help="Name of windows system passed to waffle")
+    parser.add_argument("-f", "--config",
+                        dest="config_file",
+                        type=argparse.FileType("r"),
+                        help="Optionally specify a piglit config file to use. "
+                             "Default is piglit.conf")
+    parser.add_argument("--valgrind",
+                        action="store_true",
+                        help="Run tests in valgrind's memcheck")
+    parser.add_argument("--dmesg",
+                        action="store_true",
+                        help="Capture a difference in dmesg before and "
+                             "after each test. Implies -1/--no-concurrency")
+    parser.add_argument("-v", "--verbose",
+                        action="store_true",
+                        help="Produce a line of output for each test before "
+                             "and after it runs")
+    parser.add_argument("test_profile",
+                        metavar="<Path to one or more test profile(s)>",
+                        nargs='+',
+                        help="Path to testfile to run")
+    parser.add_argument("results_path",
+                        type=path.realpath,
+                        metavar="<Results Path>",
+                        help="Path to results folder")
+    args = parser.parse_args(input_)
+
+    # Set the platform to pass to waffle
+    if args.platform:
+        os.environ['PIGLIT_PLATFORM'] = args.platform
+
+    # If dmesg is requested we must have serial run, this is becasue dmesg
+    # isn't reliable with threaded run
+    if args.dmesg:
+        args.concurrency = "none"
+
+    # Read the config file
+    if args.config_file:
+        core.PIGLIT_CONFIG.readfp(args.config_file)
+        args.config_file.close()
+    else:
+        core.PIGLIT_CONFIG.read(os.path.join(os.path.dirname(__file__),
+                                'piglit.conf'))
+
+    # Pass arguments into Environment
+    env = core.Environment(concurrent=args.concurrency,
+                           exclude_filter=args.exclude_tests,
+                           include_filter=args.include_tests,
+                           execute=args.execute,
+                           valgrind=args.valgrind,
+                           dmesg=args.dmesg,
+                           verbose=args.verbose)
+
+    # Change working directory to the root of the piglit directory
+    piglit_dir = path.dirname(path.realpath(sys.argv[0]))
+    os.chdir(piglit_dir)
+    core.checkDir(args.results_path, False)
+
+    results = core.TestrunResult()
+
+    # Set results.name
+    if args.name is not None:
+        results.name = args.name
+    else:
+        results.name = path.basename(args.results_path)
+
+    # Begin json.
+    result_filepath = path.join(args.results_path, 'main')
+    result_file = open(result_filepath, 'w')
+    json_writer = core.JSONWriter(result_file)
+    json_writer.open_dict()
+
+    # Write out command line options for use in resuming.
+    json_writer.write_dict_key('options')
+    json_writer.open_dict()
+    json_writer.write_dict_item('profile', args.test_profile)
+    for key, value in env:
+        json_writer.write_dict_item(key, value)
+    if args.platform:
+        json_writer.write_dict_item('platform', args.platform)
+    json_writer.close_dict()
+
+    json_writer.write_dict_item('name', results.name)
+
+    for (key, value) in env.collectData().items():
+        json_writer.write_dict_item(key, value)
+
+    profile = framework.profile.merge_test_profiles(args.test_profile)
+    profile.results_dir = args.results_path
+
+    json_writer.write_dict_key('tests')
+    json_writer.open_dict()
+    time_start = time.time()
+    # Set the dmesg type
+    if args.dmesg:
+        profile.dmesg = args.dmesg
+    profile.run(env, json_writer)
+    time_end = time.time()
+
+    json_writer.close_dict()
+
+    results.time_elapsed = time_end - time_start
+    json_writer.write_dict_item('time_elapsed', results.time_elapsed)
+
+    # End json.
+    json_writer.close_dict()
+    json_writer.file.close()
+
+    print('Thank you for running Piglit!\n'
+          'Results have been written to ' + result_filepath)
+
+
+def resume(input_):
+    parser = argparse.ArgumentParser()
+    parser.add_argument("results_path",
+                        type=path.realpath,
+                        metavar="<Results Path>",
+                        help="Path to results folder")
+    args = parser.parse_args(input_)
+
+    results = core.load_results(args.results_path)
+    env = core.Environment(concurrent=results.options['concurrent'],
+                           exclude_filter=results.options['exclude_filter'],
+                           include_filter=results.options['filter'],
+                           execute=results.options['execute'],
+                           valgrind=results.options['valgrind'],
+                           dmesg=results.options['dmesg'],
+                           verbose=results.options['verbose'])
+
+    # attempt to restore a saved platform, if there is no saved platform just
+    # go on
+    try:
+        os.environ['PIGLIT_PLATFORM'] = results.options['platform']
+    except KeyError:
+        pass
+
+    results_path = path.join(args.results_path, "main")
+    json_writer = core.JSONWriter(open(results_path, 'w+'))
+    json_writer.open_dict()
+    json_writer.write_dict_key("options")
+    json_writer.open_dict()
+    for key, value in results.options.iteritems():
+        json_writer.write_dict_item(key, value)
+    json_writer.close_dict()
+
+    json_writer.write_dict_item('name', results.name)
+    for (key, value) in env.collectData().items():
+        json_writer.write_dict_item(key, value)
+
+    json_writer.write_dict_key('tests')
+    json_writer.open_dict()
+    for key, value in results.tests.iteritems():
+        json_writer.write_dict_item(key, value)
+        env.exclude_tests.add(key)
+
+    profile = framework.profile.merge_test_profiles(results.options['profile'])
+    profile.results_dir = args.results_path
+    if env.dmesg:
+        profile.dmesg = env.dmesg
+
+    # This is resumed, don't bother with time since it wont be accurate anyway
+    profile.run(env, json_writer)
+
+    json_writer.close_dict()
+    json_writer.close_dict()
+    json_writer.file.close()
+
+    print("Thank you for running Piglit!\n"
+          "Results have ben wrriten to {0}".format(results_path))
diff --git a/framework/programs/summary.py b/framework/programs/summary.py
new file mode 100644
index 0000000..db3a83e
--- /dev/null
+++ b/framework/programs/summary.py
@@ -0,0 +1,243 @@
+# 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:
+#
+# 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 AUTHOR(S) 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.
+
+import argparse
+import shutil
+import os.path as path
+
+import framework.summary as summary
+import framework.status as status
+import framework.core as core
+import framework.junit 
+
+__all__ = ['html',
+           'junit',
+           'console']
+
+
+def html(input_):
+    # Make a copy of the status text list and add all. This is used as the
+    # argument list for -e/--exclude
+    statuses = set(str(s) for s in status.ALL)
+    statuses.add('all')
+
+    parser = argparse.ArgumentParser()
+    parser.add_argument("-o", "--overwrite",
+                        action="store_true",
+                        help="Overwrite existing directories")
+    parser.add_argument("-l", "--list",
+                        action="store",
+                        help="Load a newline seperated list of results. These "
+                             "results will be prepended to any Results "
+                             "specified on the command line")
+    parser.add_argument("-e", "--exclude-details",
+                        default=[],
+                        action="append",
+                        choices=statuses,
+                        help="Optionally exclude the generation of HTML pages "
+                             "for individual test pages with the status(es) "
+                             "given as arguments. This speeds up HTML "
+                             "generation, but reduces the info in the HTML "
+                             "pages. May be used multiple times")
+    parser.add_argument("summaryDir",
+                        metavar="<Summary Directory>",
+                        help="Directory to put HTML files in")
+    parser.add_argument("resultsFiles",
+                        metavar="<Results Files>",
+                        nargs="*",
+                        help="Results files to include in HTML")
+    args = parser.parse_args(input_)
+
+    # If args.list and args.resultsFiles are empty, then raise an error
+    if not args.list and not args.resultsFiles:
+        raise parser.error("Missing required option -l or <resultsFiles>")
+
+    # Convert the exclude_details list to status objects, without this using
+    # the -e option will except
+    if args.exclude_details:
+        # If exclude-results has all, then change it to be all
+        if 'all' in args.exclude_details:
+            args.exclude_details = status.ALL
+        else:
+            args.exclude_details = frozenset(
+                status.status_lookup(i) for i in args.exclude_details)
+
+
+    # if overwrite is requested delete the output directory
+    if path.exists(args.summaryDir) and args.overwrite:
+        shutil.rmtree(args.summaryDir)
+
+    # If the requested directory doesn't exist, create it or throw an error
+    core.checkDir(args.summaryDir, not args.overwrite)
+
+    # Merge args.list and args.resultsFiles
+    if args.list:
+        args.resultsFiles.extend(core.parse_listfile(args.list))
+
+    # Create the HTML output
+    output = summary.Summary(args.resultsFiles)
+    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 = core.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.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()
+            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()
+
+    # Set the -d and -s options as exclusive, since it's silly to call for diff
+    # and then call for only summary
+    excGroup1 = parser.add_mutually_exclusive_group()
+    excGroup1.add_argument("-d", "--diff",
+                           action="store_true",
+                           help="Only display the differences between multiple "
+                                "result files")
+    excGroup1.add_argument("-s", "--summary",
+                           action="store_true",
+                           help="Only display the summary, not the individual "
+                                "test results")
+    parser.add_argument("-l", "--list",
+                        action="store",
+                        help="Use test results from a list file")
+    parser.add_argument("results",
+                        metavar="<Results Path(s)>",
+                        nargs="+",
+                        help="Space seperated paths to at least one results "
+                             "file")
+    args = parser.parse_args(input_)
+
+    # Throw an error if -d/--diff is called, but only one results file is
+    # provided
+    if args.diff and len(args.results) < 2:
+        parser.error('-d/--diff cannot be specified unless two or more '
+                     'results files are specified')
+
+    # make list of results
+    if args.list:
+        args.results.extend(core.parse_listfile(args.list))
+
+    # Generate the output
+    output = summary.Summary(args.results)
+    output.generate_text(args.diff, args.summary)
diff --git a/piglit-resume.py b/piglit-resume.py
index 638d63a..68c546d 100755
--- a/piglit-resume.py
+++ b/piglit-resume.py
@@ -1,96 +1,32 @@
 #!/usr/bin/env python
-#
-# 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:
-#
-# 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 AUTHOR(S) 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.
 
-from __future__ import print_function
-import sys
-import os
-import os.path as path
-import argparse
-
-import framework.core as core
-import framework.profile
-
-
-def main():
-    parser = argparse.ArgumentParser()
-    parser.add_argument("results_path",
-                        type=path.realpath,
-                        metavar="<Results Path>",
-                        help="Path to results folder")
-    args = parser.parse_args()
+# Copyright (c) 2014 Intel Corporation
 
-    results = core.load_results(args.results_path)
-    env = core.Environment(concurrent=results.options['concurrent'],
-                           exclude_filter=results.options['exclude_filter'],
-                           include_filter=results.options['filter'],
-                           execute=results.options['execute'],
-                           valgrind=results.options['valgrind'],
-                           dmesg=results.options['dmesg'],
-                           verbose=results.options['verbose'])
+# 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:
 
-    # Change working directory to the piglit directory
-    os.chdir(path.dirname(path.realpath(sys.argv[0])))
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
 
-    # attempt to restore a saved platform, if there is no saved platform just
-    # go on
-    try:
-        os.environ['PIGLIT_PLATFORM'] = results.options['platform']
-    except KeyError:
-        pass
+# 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.
 
-    results_path = path.join(args.results_path, "main")
-    json_writer = core.JSONWriter(open(results_path, 'w+'))
-    json_writer.open_dict()
-    json_writer.write_dict_key("options")
-    json_writer.open_dict()
-    for key, value in results.options.iteritems():
-        json_writer.write_dict_item(key, value)
-    json_writer.close_dict()
+""" Resume an interupted piglit run
 
-    json_writer.write_dict_item('name', results.name)
-    for (key, value) in env.collectData().items():
-        json_writer.write_dict_item(key, value)
+Deprecated compatability wrapper
 
-    json_writer.write_dict_key('tests')
-    json_writer.open_dict()
-    for key, value in results.tests.iteritems():
-        json_writer.write_dict_item(key, value)
-        env.exclude_tests.add(key)
-    
-    profile = framework.profile.merge_test_profiles(results.options['profile'])
-    profile.results_dir = args.results_path
-    if env.dmesg:
-        profile.dmesg = env.dmesg
+"""
 
-    # This is resumed, don't bother with time since it wont be accurate anyway
-    profile.run(env, json_writer)
-
-    json_writer.close_dict()
-    json_writer.close_dict()
-    json_writer.file.close()
-
-    print("Thank you for running Piglit!\n"
-          "Results have ben wrriten to {0}".format(results_path))
+import sys
+from framework.programs.run import resume
 
-if __name__ == "__main__":
-    main()
+resume(sys.argv)
diff --git a/piglit-run.py b/piglit-run.py
index e5b1b43..fd7cd72 100755
--- a/piglit-run.py
+++ b/piglit-run.py
@@ -1,187 +1,32 @@
 #!/usr/bin/env python
-#
-# 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:
-#
-# 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 AUTHOR(S) 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.
 
+# Copyright (c) 2014 Intel Corporation
 
-from __future__ import print_function
-import argparse
-import sys
-import os
-import os.path as path
-import time
-
-sys.path.append(path.dirname(path.realpath(sys.argv[0])))
-import framework.core as core
-import framework.profile
-
-
-def main():
-    parser = argparse.ArgumentParser(sys.argv)
-    parser.add_argument("-n", "--name",
-                        metavar="<test name>",
-                        default=None,
-                        help="Name of this test run")
-    parser.add_argument("-d", "--dry-run",
-                        action="store_false",
-                        dest="execute",
-                        help="Do not execute the tests")
-    parser.add_argument("-t", "--include-tests",
-                        default=[],
-                        action="append",
-                        metavar="<regex>",
-                        help="Run only matching tests "
-                             "(can be used more than once)")
-    parser.add_argument("-x", "--exclude-tests",
-                        default=[],
-                        action="append",
-                        metavar="<regex>",
-                        help="Exclude matching tests "
-                             "(can be used more than once)")
-    conc_parser = parser.add_mutually_exclusive_group()
-    conc_parser.add_argument('-c', '--all-concurrent',
-                             action="store_const",
-                             default="some",
-                             const="all",
-                             dest="concurrency",
-                             help="Run all tests concurrently")
-    conc_parser.add_argument("-1", "--no-concurrency",
-                             action="store_const",
-                             default="some",
-                             const="none",
-                             dest="concurrency",
-                             help="Disable concurrent test runs")
-    parser.add_argument("-p", "--platform",
-                        choices=["glx", "x11_egl", "wayland", "gbm"],
-                        help="Name of windows system passed to waffle")
-    parser.add_argument("-f", "--config",
-                        dest="config_file",
-                        type=argparse.FileType("r"),
-                        help="Optionally specify a piglit config file to use. "
-                             "Default is piglit.conf")
-    parser.add_argument("--valgrind",
-                        action="store_true",
-                        help="Run tests in valgrind's memcheck")
-    parser.add_argument("--dmesg",
-                        action="store_true",
-                        help="Capture a difference in dmesg before and "
-                             "after each test. Implies -1/--no-concurrency")
-    parser.add_argument("-v", "--verbose",
-                        action="store_true",
-                        help="Produce a line of output for each test before "
-                             "and after it runs")
-    parser.add_argument("test_profile",
-                        metavar="<Path to one or more test profile(s)>",
-                        nargs='+',
-                        help="Path to testfile to run")
-    parser.add_argument("results_path",
-                        type=path.realpath,
-                        metavar="<Results Path>",
-                        help="Path to results folder")
-    args = parser.parse_args()
-
-    # Set the platform to pass to waffle
-    if args.platform:
-        os.environ['PIGLIT_PLATFORM'] = args.platform
-
-    # If dmesg is requested we must have serial run, this is becasue dmesg
-    # isn't reliable with threaded run
-    if args.dmesg:
-        args.concurrency = "none"
-
-    # Read the config file
-    if args.config_file:
-        core.PIGLIT_CONFIG.readfp(args.config_file)
-        args.config_file.close()
-    else:
-        core.PIGLIT_CONFIG.read(os.path.join(os.path.dirname(__file__),
-                                'piglit.conf'))
-
-    # Pass arguments into Environment
-    env = core.Environment(concurrent=args.concurrency,
-                           exclude_filter=args.exclude_tests,
-                           include_filter=args.include_tests,
-                           execute=args.execute,
-                           valgrind=args.valgrind,
-                           dmesg=args.dmesg,
-                           verbose=args.verbose)
-
-    # Change working directory to the root of the piglit directory
-    piglit_dir = path.dirname(path.realpath(sys.argv[0]))
-    os.chdir(piglit_dir)
-    core.checkDir(args.results_path, False)
+# 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:
 
-    results = core.TestrunResult()
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
 
-    # Set results.name
-    if args.name is not None:
-        results.name = args.name
-    else:
-        results.name = path.basename(args.results_path)
+# 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.
 
-    # Begin json.
-    result_filepath = path.join(args.results_path, 'main')
-    result_file = open(result_filepath, 'w')
-    json_writer = core.JSONWriter(result_file)
-    json_writer.open_dict()
+""" Run a piglit test profile
 
-    # Write out command line options for use in resuming.
-    json_writer.write_dict_key('options')
-    json_writer.open_dict()
-    json_writer.write_dict_item('profile', args.test_profile)
-    for key, value in env:
-        json_writer.write_dict_item(key, value)
-    if args.platform:
-        json_writer.write_dict_item('platform', args.platform)
-    json_writer.close_dict()
+Deprecated compatability wrapper
 
-    json_writer.write_dict_item('name', results.name)
-
-    for (key, value) in env.collectData().items():
-        json_writer.write_dict_item(key, value)
-
-    profile = framework.profile.merge_test_profiles(args.test_profile)
-    profile.results_dir = args.results_path
-
-    json_writer.write_dict_key('tests')
-    json_writer.open_dict()
-    time_start = time.time()
-    # Set the dmesg type
-    if args.dmesg:
-        profile.dmesg = args.dmesg
-    profile.run(env, json_writer)
-    time_end = time.time()
-
-    json_writer.close_dict()
-
-    results.time_elapsed = time_end - time_start
-    json_writer.write_dict_item('time_elapsed', results.time_elapsed)
-
-    # End json.
-    json_writer.close_dict()
-    json_writer.file.close()
-
-    print('Thank you for running Piglit!\n'
-          'Results have been written to ' + result_filepath)
+"""
 
+import sys
+from framework.programs.run import run
 
-if __name__ == "__main__":
-    main()
+run(sys.argv)
diff --git a/piglit-summary-html.py b/piglit-summary-html.py
index 58b6823..92a350d 100755
--- a/piglit-summary-html.py
+++ b/piglit-summary-html.py
@@ -1,101 +1,28 @@
 #!/usr/bin/env python
-#
-# 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:
-#
-# 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 AUTHOR(S) 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.
 
-import argparse
-import sys
-import shutil
-import os.path as path
-
-import framework.summary as summary
-import framework.status as status
-from framework.core import checkDir, parse_listfile
-
-sys.path.append(path.dirname(path.realpath(sys.argv[0])))
-
-
-def main():
-    # Make a copy of the status text list and add all. This is used as the
-    # argument list for -e/--exclude
-    statuses = set(str(s) for s in status.ALL)
-    statuses.add('all')
+# Copyright (c) 2014 Intel Corporation
 
-    parser = argparse.ArgumentParser()
-    parser.add_argument("-o", "--overwrite",
-                        action="store_true",
-                        help="Overwrite existing directories")
-    parser.add_argument("-l", "--list",
-                        action="store",
-                        help="Load a newline seperated list of results. These "
-                             "results will be prepended to any Results "
-                             "specified on the command line")
-    parser.add_argument("-e", "--exclude-details",
-                        default=[],
-                        action="append",
-                        choices=statuses,
-                        help="Optionally exclude the generation of HTML pages "
-                             "for individual test pages with the status(es) "
-                             "given as arguments. This speeds up HTML "
-                             "generation, but reduces the info in the HTML "
-                             "pages. May be used multiple times")
-    parser.add_argument("summaryDir",
-                        metavar="<Summary Directory>",
-                        help="Directory to put HTML files in")
-    parser.add_argument("resultsFiles",
-                        metavar="<Results Files>",
-                        nargs="*",
-                        help="Results files to include in HTML")
-    args = parser.parse_args()
+# 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:
 
-    # If args.list and args.resultsFiles are empty, then raise an error
-    if not args.list and not args.resultsFiles:
-        raise parser.error("Missing required option -l or <resultsFiles>")
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
 
-    # Convert the exclude_details list to status objects, without this using
-    # the -e option will except
-    if args.exclude_details:
-        # If exclude-results has all, then change it to be all
-        if 'all' in args.exclude_details:
-            args.exclude_details = status.ALL
-        else:
-            args.exclude_details = frozenset(
-                status.status_lookup(i) for i in args.exclude_details)
+# 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 html summary """
 
-    # if overwrite is requested delete the output directory
-    if path.exists(args.summaryDir) and args.overwrite:
-        shutil.rmtree(args.summaryDir)
-
-    # If the requested directory doesn't exist, create it or throw an error
-    checkDir(args.summaryDir, not args.overwrite)
-
-    # Merge args.list and args.resultsFiles
-    if args.list:
-        args.resultsFiles.extend(parse_listfile(args.list))
-
-    # Create the HTML output
-    output = summary.Summary(args.resultsFiles)
-    output.generate_html(args.summaryDir, args.exclude_details)
-
+import sys
+from framework.programs.summary import html
 
-if __name__ == "__main__":
-    main()
+html(sys.argv)
diff --git a/piglit-summary-junit.py b/piglit-summary-junit.py
index 6dba152..31c66d3 100755
--- a/piglit-summary-junit.py
+++ b/piglit-summary-junit.py
@@ -1,149 +1,28 @@
 #!/usr/bin/env python
-#
-# 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.
 
+# Copyright (c) 2014 Intel Corporation
 
-import argparse
-import os
-import sys
-
-sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0])))
-import framework.core as core
-import framework.status as status
-from framework import junit
-
-
-class Writer:
-
-    def __init__(self, filename):
-        self.report = junit.Report(filename)
-        self.path = []
-
-    def write(self, arg):
-        testrun = core.load_results(arg)
-
-        self.report.start()
-        self.report.startSuite('piglit')
-        try:
-            for (path, result) in testrun.tests.items():
-                self.write_test(testrun, path, result)
-        finally:
-            self.enter_path([])
-            self.report.stopSuite()
-            self.report.stop()
-
-    def write_test(self, testrun, test_path, result):
-        test_path = test_path.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')
+# 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:
 
-            try:
-                returncode = result['returncode']
-            except KeyError:
-                pass
-            else:
-                if returncode:
-                    self.report.addStderr('returncode = %s\n' % returncode)
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
 
-            success = result.get('result')
-            if success in (status.PASS, status.WARN):
-                pass
-            elif success == status.SKIP:
-                self.report.addSkipped()
-            else:
-                self.report.addFailure(success.name)
+# 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.
 
-            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 main():
-    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()
-
-
-    writer = Writer(args.output)
-    writer.write(args.testResults)
-
-
-if __name__ == "__main__":
-    main()
+""" Deprecated compatability wrapper for junit summary """
 
+import sys
+from framework.programs.summary import junit
 
-# vim:set sw=4 ts=4 noet:
+junit(sys.argv)
diff --git a/piglit-summary.py b/piglit-summary.py
index fe58e40..b497996 100755
--- a/piglit-summary.py
+++ b/piglit-summary.py
@@ -1,81 +1,28 @@
 #!/usr/bin/env python
-#
-# 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:
-#
-# 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 AUTHOR(S) 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.
 
-# Print a very simple summary of piglit results file(s).
-# When multiple result files are specified, compare the results
-# of each test run to look for differences/regressions.
-#
-# Brian Paul
-# April 2013
+# 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:
 
-import argparse
-import os.path
-import sys
-
-sys.path.append(os.path.dirname(os.path.realpath(sys.argv[0])))
-import framework.summary as summary
-from framework.core import parse_listfile
-
-
-def main():
-    parser = argparse.ArgumentParser()
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
 
-    # Set the -d and -s options as exclusive, since it's silly to call for diff
-    # and then call for only summary
-    excGroup1 = parser.add_mutually_exclusive_group()
-    excGroup1.add_argument("-d", "--diff",
-                           action="store_true",
-                           help="Only display the differences between multiple "
-                                "result files")
-    excGroup1.add_argument("-s", "--summary",
-                           action="store_true",
-                           help="Only display the summary, not the individual "
-                                "test results")
-    parser.add_argument("-l", "--list",
-                        action="store",
-                        help="Use test results from a list file")
-    parser.add_argument("results",
-                        metavar="<Results Path(s)>",
-                        nargs="+",
-                        help="Space seperated paths to at least one results "
-                             "file")
-    args = parser.parse_args()
+# 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.
 
-    # Throw an error if -d/--diff is called, but only one results file is
-    # provided
-    if args.diff and len(args.results) < 2:
-        parser.error('-d/--diff cannot be specified unless two or more '
-                     'results files are specified')
-
-    # make list of results
-    if args.list:
-        args.results.extend(parse_listfile(args.list))
-
-    # Generate the output
-    output = summary.Summary(args.results)
-    output.generate_text(args.diff, args.summary)
+""" Deprecated compatability wrapper for console summary """
 
+import sys
+from framework.programs.summary import console
 
-if __name__ == "__main__":
-    main()
+console(sys.argv)
-- 
2.0.0.rc0



More information about the Piglit mailing list