glx-oml-sync-control-timing: Perform initial swap / wait before loop
[piglit.git] / piglit
blob0bc7534020794669d93d771448bb9e4c31e9fd36
1 #!/usr/bin/env python3
3 # Copyright (c) 2014 Intel Corporation
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to deal
7 # in the Software without restriction, including without limitation the rights
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 # copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice shall be included in
13 # all copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 # SOFTWARE.
23 """ Wrapper for piglit executables
25 This imports functions from the framework and calls them with the argument
26 parts that the parser defined here doesn't know how to parse.
28 It is very important that the final parser not generate a help message
29 (add_help=False in the constructor arguments), otherwise this parser will
30 capture -h/--help and the results will not be useful.
32 """
34 from __future__ import (
35     absolute_import, division, print_function, unicode_literals
37 import argparse
38 import os
39 import os.path as path
40 import sys
42 import six
45 def setup_module_search_path():
46     """Add Piglit's data directory to Python's module search path.
48     This enables Python to import Piglit's framework module.
50     CAUTION: This script must import the framework that *belongs to this
51     script*. Mayhem occurs if this script accidentally imports a framework
52     module that belongs to a different Piglit source tree or belongs to
53     a different Piglit installation.
55     CAUTION: This script file must be located in the Piglit source tree or in
56     an installed location.  Otherwise this function may fail to find the
57     framework module or, worse, it may succeed in finding a different Piglit's
58     framework module.
59     """
61     # To avoid accidentally importing a framework module that belongs to
62     # a different Piglit, base the search for Piglit's data directory on the
63     # absolute path of the this script and *not* on the process's working
64     # directory.
65     abs_script_dir = os.path.abspath(os.path.dirname(__file__))
67     tested_piglit_data_dirs = []
69     def is_piglit_data_dir(dirpath):
70         tested_piglit_data_dirs.append(dirpath)
71         return path.exists(path.join(dirpath, 'framework'))
73     # This script may be in two valid locations:
74     #
75     #   - At the top of a Piglit source tree, as below.  In this case, Piglit's
76     #     data directory is the source directory itself.
77     #
78     #       ${piglit_source_dir}/${script_name}     -> This script.
79     #       ${piglit_source_dir}/                   -> Piglit's data directory.
80     #       ${piglit_source_dir}/framework          -> Piglit's framework module
81     #
82     if is_piglit_data_dir(abs_script_dir):
83         sys.path.append(abs_script_dir)
84         return
86     # Or...
87     #
88     #   - In an installed location.  Piglit's installation layout looks like
89     #     this, where ${ext} may be empty or ".py":
90     #
91     #       ${prefix}/${bindir}/${script_name}${ext}     -> This script.
92     #       ${prefix}/${libdir}/${script_name}/          -> Piglit's data directory.
93     #       ${prefix}/${libdir}/${script_name}/framework -> Piglit framework module.
94     #
95     abs_bindir = abs_script_dir
96     script_basename_noext = os.path.splitext(os.path.basename(__file__))[0]
97     for libdir in ('lib64', 'lib32', 'lib'):
98         abs_libdir = path.normpath(path.join(abs_bindir, '..', libdir))
99         abs_data_dir = path.join(abs_libdir, script_basename_noext)
100         if is_piglit_data_dir(abs_data_dir):
101             sys.path.insert(0, abs_data_dir)
102             return
104     print('error: failed to find piglit data directory. exiting...', file=sys.stderr)
105     for test_dir in tested_piglit_data_dirs:
106         print('error: tested directory {0!r}'.format(test_dir), file=sys.stderr)
107     sys.exit(1)
110 setup_module_search_path()
111 import framework.programs.run as run
112 import framework.programs.summary as summary
113 import framework.programs.print_commands as pc
116 def main():
117     """ Parse argument and call other executables """
118     if six.PY2:
119         input_ = [i.decode('utf-8') for i in sys.argv[1:]]
120     elif six.PY3:
121         input_ = sys.argv[1:]
123     parser = argparse.ArgumentParser()
124     subparsers = parser.add_subparsers()
125     print_cmd = subparsers.add_parser('print-cmd',
126                                       add_help=False,
127                                       help="Print piglit commands, one per line.")
128     print_cmd.set_defaults(func=pc.main)
130     parse_run = subparsers.add_parser('run',
131                                       add_help=False,
132                                       help="Run a piglit test")
133     parse_run.set_defaults(func=run.run)
134     resume = subparsers.add_parser('resume',
135                                    add_help=False,
136                                    help="resume an interrupted piglit run")
137     resume.set_defaults(func=run.resume)
138     parse_summary = subparsers.add_parser('summary', help='summary generators')
139     summary_parser = parse_summary.add_subparsers()
140     html = summary_parser.add_parser('html',
141                                      add_help=False,
142                                      help='generate html reports from results')
143     html.set_defaults(func=summary.html)
144     console = summary_parser.add_parser('console',
145                                         add_help=False,
146                                         help='print results to terminal')
147     console.set_defaults(func=summary.console)
148     csv = summary_parser.add_parser('csv',
149                                     add_help=False,
150                                     help='generate csv from results')
151     csv.set_defaults(func=summary.csv)
152     formatted = summary_parser.add_parser('formatted',
153                                     add_help=False,
154                                     help='generate formatted output from results')
155     formatted.set_defaults(func=summary.formatted)
156     aggregate = summary_parser.add_parser('aggregate',
157                                           add_help=False,
158                                           help="Aggregate incomplete piglit run.")
159     aggregate.set_defaults(func=summary.aggregate)
160     feature = summary_parser.add_parser('feature',
161                                         add_help=False,
162                                         help="generate feature readiness html report.")
163     feature.set_defaults(func=summary.feature)
165     # Parse the known arguments (piglit run or piglit summary html for
166     # example), and then pass the arguments that this parser doesn't know about
167     # to that executable
168     parsed, args = parser.parse_known_args(input_)
169     try:
170         runner = parsed.func
171     except AttributeError:
172         parser.print_help()
173         sys.exit(1)
174     sys.exit(runner(args))
177 if __name__ == '__main__':
178     main()