blob: 92b554d0d8781b04560431e5c54512d165338d6e [file] [log] [blame]
#!/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 getopt import getopt, GetoptError
import os.path as path
import re
import sys, os
import time
import traceback
sys.path.append(path.dirname(path.realpath(sys.argv[0])))
import framework.core as core
from framework.threads import synchronized_self
#############################################################################
##### Main program
#############################################################################
def usage():
USAGE = """\
Usage: %(progName)s [options] [profile.tests] [results]
Options:
-h, --help Show this message
-d, --dry-run Do not execute the tests
-t regexp, --tests=regexp Run only matching tests (can be used more
than once)
-x regexp, --exclude-tests=regexp Excludey matching tests (can be used
more than once)
-n name, --name=name Name of the testrun
-c bool, --concurrent=bool Enable/disable concurrent test runs. Valid
option values are: 0, 1, on, off. (default: on)
Example:
%(progName)s tests/all.tests results/all
Run all tests, store the results in the directory results/all
%(progName)s -t basic tests/all.tests results/all
Run all tests whose path contains the word 'basic'
%(progName)s -t ^glean/ -t tex tests/all.tests results/all
Run all tests that are in the 'glean' group or whose path contains
the substring 'tex'
"""
print USAGE % {'progName': sys.argv[0]}
sys.exit(1)
def main():
env = core.Environment()
try:
option_list = [
"help",
"dry-run",
"tests=",
"name=",
"exclude-tests=",
"concurrent=",
]
options, args = getopt(sys.argv[1:], "hdt:n:x:c:", option_list)
except GetoptError:
usage()
OptionName = ''
for name, value in options:
if name in ('-h', '--help'):
usage()
elif name in ('-d', '--dry-run'):
env.execute = False
elif name in ('-t', '--tests'):
env.filter[:0] = [re.compile(value)]
elif name in ('-x', '--exclude-tests'):
env.exclude_filter[:0] = [re.compile(value)]
elif name in ('-n', '--name'):
OptionName = value
elif name in ('-c, --concurrent'):
if value in ('1', 'on'):
env.concurrent = True
elif value in ('0', 'off'):
env.concurrent = False
else:
usage()
if len(args) != 2:
usage()
profileFilename = args[0]
resultsDir = args[1]
# Change to the piglit's path
piglit_dir = path.dirname(path.realpath(sys.argv[0]))
os.chdir(piglit_dir)
core.checkDir(resultsDir, False)
results = core.TestrunResult()
# Set results.name
if OptionName is '':
results.name = path.basename(resultsDir)
else:
results.name = OptionName
# Begin json.
result_filepath = os.path.join(resultsDir, 'main')
result_file = open(result_filepath, 'w')
json_writer = core.JSONWriter(result_file)
json_writer.open_dict()
json_writer.write_dict_item('name', results.name)
for (key, value) in env.collectData().items():
json_writer.write_dict_item(key, value)
profile = core.loadTestProfile(profileFilename, resultsDir)
time_start = time.time()
profile.run(env, json_writer)
time_end = time.time()
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
print 'Thank you for running Piglit!'
print 'Results have been written to ' + result_filepath
if __name__ == "__main__":
main()