main.py revision 4ac723b53f2eb69e604891853ca87d1e2b3ee788
1d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar#!/usr/bin/env python
2d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
3d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar"""
4d24f1f342a4637756297117ead63e2e966999126Daniel Dunbarlit - LLVM Integrated Tester.
5d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
6d24f1f342a4637756297117ead63e2e966999126Daniel DunbarSee lit.pod for more information.
7d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar"""
8d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
9b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarfrom __future__ import absolute_import
1007f0f16bfd58c3e44babae65ccd88b9621d15f48Daniel Dunbarimport math, os, platform, random, re, sys, time
11d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
12b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarimport lit.ProgressBar
13b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarimport lit.LitConfig
14b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbarimport lit.Test
155b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbarimport lit.run
16128ce319ec47c46dc7da16aa3a75185899878745Daniel Dunbarimport lit.util
173d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbarimport lit.discovery
18d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
1907f0f16bfd58c3e44babae65ccd88b9621d15f48Daniel Dunbarclass TestingProgressDisplay(object):
20d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    def __init__(self, opts, numTests, progressBar=None):
21d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        self.opts = opts
22d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        self.numTests = numTests
23d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        self.current = None
24d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        self.progressBar = progressBar
25d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        self.completed = 0
26d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
27d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    def finish(self):
28d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if self.progressBar:
29d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            self.progressBar.clear()
30d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        elif self.opts.quiet:
31d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            pass
32d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        elif self.opts.succinct:
33d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            sys.stdout.write('\n')
34d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
35b11b690d3f36d552091423293489f845090efb4fDaniel Dunbar    def update(self, test):
36d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        self.completed += 1
37d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if self.progressBar:
38d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            self.progressBar.update(float(self.completed)/self.numTests,
39d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                                    test.getFullName())
40d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
41b11b690d3f36d552091423293489f845090efb4fDaniel Dunbar        if not test.result.code.isFailure and \
42b11b690d3f36d552091423293489f845090efb4fDaniel Dunbar                (self.opts.quiet or self.opts.succinct):
43d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            return
44d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
45d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if self.progressBar:
46d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            self.progressBar.clear()
47d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
48ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar        print('%s: %s (%d of %d)' % (test.result.code.name, test.getFullName(),
494f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar                                     self.completed, self.numTests))
50d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
51ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar        if test.result.code.isFailure and self.opts.showOutput:
524f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar            print("%s TEST '%s' FAILED %s" % ('*'*20, test.getFullName(),
534f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar                                              '*'*20))
54ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar            print(test.result.output)
554f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar            print("*" * 20)
56d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
57d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        sys.stdout.flush()
58d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
593d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbardef main(builtinParameters = {}):
603d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar    # Bump the GIL check interval, its more important to get any one thread to a
61d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # blocking operation (hopefully exec) than to try and unblock other threads.
62d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    #
63d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # FIXME: This is a hack.
64d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    sys.setcheckinterval(1000)
65d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
66d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    global options
67d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    from optparse import OptionParser, OptionGroup
68d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser = OptionParser("usage: %prog [options] {file-or-path}")
69d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
70d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser.add_option("-j", "--threads", dest="numThreads", metavar="N",
71d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      help="Number of testing threads",
72d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      type=int, action="store", default=None)
73d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser.add_option("", "--config-prefix", dest="configPrefix",
74d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      metavar="NAME", help="Prefix for 'lit' config files",
75d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      action="store", default=None)
76d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser.add_option("", "--param", dest="userParameters",
77d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      metavar="NAME=VAL",
78d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      help="Add 'NAME' = 'VAL' to the user defined parameters",
79d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      type=str, action="append", default=[])
80d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
81d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group = OptionGroup(parser, "Output Format")
82d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # FIXME: I find these names very confusing, although I like the
83d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # functionality.
84d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("-q", "--quiet", dest="quiet",
85d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Suppress no error output",
86d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store_true", default=False)
87d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("-s", "--succinct", dest="succinct",
88d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Reduce amount of output",
89d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store_true", default=False)
90d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("-v", "--verbose", dest="showOutput",
91d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Show all test output",
92d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store_true", default=False)
93d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--no-progress-bar", dest="useProgressBar",
94d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Do not use curses based progress bar",
95d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store_false", default=True)
96d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser.add_option_group(group)
97d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
98d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group = OptionGroup(parser, "Test Execution")
99d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--path", dest="path",
100d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Additional paths to add to testing environment",
101d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="append", type=str, default=[])
102d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--vg", dest="useValgrind",
103d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Run tests under valgrind",
104d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store_true", default=False)
10532989deb9641cf3878686b5634311a7a125f8f02Jeffrey Yasskin    group.add_option("", "--vg-leak", dest="valgrindLeakCheck",
10632989deb9641cf3878686b5634311a7a125f8f02Jeffrey Yasskin                     help="Check for memory leaks under valgrind",
10732989deb9641cf3878686b5634311a7a125f8f02Jeffrey Yasskin                     action="store_true", default=False)
108d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--vg-arg", dest="valgrindArgs", metavar="ARG",
109d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Specify an extra argument for valgrind",
110d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     type=str, action="append", default=[])
111d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--time-tests", dest="timeTests",
112d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Track elapsed wall time for each test",
113d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store_true", default=False)
1148f4aab8c2fe095ce1286fc1bd0bdd9157ed00398NAKAMURA Takumi    group.add_option("", "--no-execute", dest="noExecute",
1158f4aab8c2fe095ce1286fc1bd0bdd9157ed00398NAKAMURA Takumi                     help="Don't execute any tests (assume PASS)",
1168f4aab8c2fe095ce1286fc1bd0bdd9157ed00398NAKAMURA Takumi                     action="store_true", default=False)
117d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser.add_option_group(group)
118d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
119d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group = OptionGroup(parser, "Test Selection")
120d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--max-tests", dest="maxTests", metavar="N",
121d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Maximum number of tests to run",
122d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store", type=int, default=None)
123d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--max-time", dest="maxTime", metavar="N",
124d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Maximum time to spend testing (in seconds)",
125d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store", type=float, default=None)
126d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--shuffle", dest="shuffle",
127d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     help="Run tests in random order",
128d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                     action="store_true", default=False)
129e94bd36dc715bc05aff35e04528dbc409a87d97cDaniel Dunbar    group.add_option("", "--filter", dest="filter", metavar="REGEX",
1307434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar                     help=("Only run tests with paths matching the given "
1317434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar                           "regular expression"),
1327434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar                     action="store", default=None)
133d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser.add_option_group(group)
134d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
135d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group = OptionGroup(parser, "Debug and Experimental Options")
136d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--debug", dest="debug",
137d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      help="Enable debugging (for 'lit' development)",
138d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      action="store_true", default=False)
139d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    group.add_option("", "--show-suites", dest="showSuites",
140d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      help="Show discovered test suites",
141d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                      action="store_true", default=False)
1423915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar    group.add_option("", "--show-tests", dest="showTests",
1433915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar                      help="Show all discovered tests",
1443915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar                      action="store_true", default=False)
1454ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar    group.add_option("", "--use-processes", dest="useProcesses",
1464ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar                      help="Run tests in parallel with processes (not threads)",
1474ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar                      action="store_true", default=False)
1484ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar    group.add_option("", "--use-threads", dest="useProcesses",
1494ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar                      help="Run tests in parallel with threads (not processes)",
1504ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar                      action="store_false", default=False)
151d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    parser.add_option_group(group)
152d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
153d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    (opts, args) = parser.parse_args()
154d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
155d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if not args:
156d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        parser.error('No inputs specified')
157d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
158d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if opts.numThreads is None:
1592f36fe438062801ca69785ffc8e476aa1bfa49e6Torok Edwin# Python <2.5 has a race condition causing lit to always fail with numThreads>1
1602f36fe438062801ca69785ffc8e476aa1bfa49e6Torok Edwin# http://bugs.python.org/issue1731717
1612f36fe438062801ca69785ffc8e476aa1bfa49e6Torok Edwin# I haven't seen this bug occur with 2.5.2 and later, so only enable multiple
1622f36fe438062801ca69785ffc8e476aa1bfa49e6Torok Edwin# threads by default there.
1632f36fe438062801ca69785ffc8e476aa1bfa49e6Torok Edwin       if sys.hexversion >= 0x2050200:
164128ce319ec47c46dc7da16aa3a75185899878745Daniel Dunbar               opts.numThreads = lit.util.detectCPUs()
1652f36fe438062801ca69785ffc8e476aa1bfa49e6Torok Edwin       else:
1662f36fe438062801ca69785ffc8e476aa1bfa49e6Torok Edwin               opts.numThreads = 1
167d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
168d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    inputs = args
169d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
170d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # Create the user defined parameters.
1716647033565456120ba24d83450bada5bb3096187Daniel Dunbar    userParams = dict(builtinParameters)
172d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    for entry in opts.userParameters:
173d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if '=' not in entry:
174d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            name,val = entry,''
175d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        else:
176d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            name,val = entry.split('=', 1)
177d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        userParams[name] = val
178d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
179d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # Create the global config object.
180b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar    litConfig = lit.LitConfig.LitConfig(
181b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        progname = os.path.basename(sys.argv[0]),
182b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        path = opts.path,
183b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        quiet = opts.quiet,
184b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        useValgrind = opts.useValgrind,
185b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        valgrindLeakCheck = opts.valgrindLeakCheck,
186b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        valgrindArgs = opts.valgrindArgs,
1878f4aab8c2fe095ce1286fc1bd0bdd9157ed00398NAKAMURA Takumi        noExecute = opts.noExecute,
188b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        debug = opts.debug,
189b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        isWindows = (platform.system()=='Windows'),
190b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        params = userParams,
191b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar        config_prefix = opts.configPrefix)
192d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
1935b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    # Perform test discovery.
1945b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    run = lit.run.Run(litConfig,
1955b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar                      lit.discovery.find_tests_for_inputs(litConfig, inputs))
196d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
1973915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar    if opts.showSuites or opts.showTests:
1983915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar        # Aggregate the tests by suite.
1993d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar        suitesAndTests = {}
2005b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar        for t in run.tests:
2013d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar            if t.suite not in suitesAndTests:
2023d4a973ee4a2a134dd3df34a64a0a16256a5306cDaniel Dunbar                suitesAndTests[t.suite] = []
203d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            suitesAndTests[t.suite].append(t)
20432b7d4dfc1eefd1081c5bf9533c25616aee129bdDaniel Dunbar        suitesAndTests = list(suitesAndTests.items())
2050b714f768605c9f5d3c8caf2b5708e617b82f86fDaniel Dunbar        suitesAndTests.sort(key = lambda item: item[0].name)
206d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
2073915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar        # Show the suites, if requested.
2083915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar        if opts.showSuites:
2094f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar            print('-- Test Suites --')
2103915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar            for ts,ts_tests in suitesAndTests:
2114f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar                print('  %s - %d tests' %(ts.name, len(ts_tests)))
2124f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar                print('    Source Root: %s' % ts.source_root)
2134f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar                print('    Exec Root  : %s' % ts.exec_root)
2143915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar
2153915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar        # Show the tests, if requested.
2163915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar        if opts.showTests:
2174f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar            print('-- Available Tests --')
2183915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar            for ts,ts_tests in suitesAndTests:
2193915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar                ts_tests.sort(key = lambda test: test.path_in_suite)
2203915c080ccdd872893412c0a8eaa29f2cec05761Daniel Dunbar                for test in ts_tests:
2214f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar                    print('  %s' % (test.getFullName(),))
222abb9de5257375dbf10c87bdbf40ecafa777a0881Daniel Dunbar
223abb9de5257375dbf10c87bdbf40ecafa777a0881Daniel Dunbar        # Exit.
224abb9de5257375dbf10c87bdbf40ecafa777a0881Daniel Dunbar        sys.exit(0)
225abb9de5257375dbf10c87bdbf40ecafa777a0881Daniel Dunbar
226d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # Select and order the tests.
2275b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    numTotalTests = len(run.tests)
2287434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar
2297434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar    # First, select based on the filter expression if given.
2307434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar    if opts.filter:
2317434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar        try:
2327434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar            rex = re.compile(opts.filter)
2337434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar        except:
2347434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar            parser.error("invalid regular expression for --filter: %r" % (
2357434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar                    opts.filter))
2365b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar        run.tests = [t for t in run.tests
2375b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar                     if rex.search(t.getFullName())]
2387434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar
2397434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar    # Then select the order.
240d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if opts.shuffle:
2415b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar        random.shuffle(run.tests)
242d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    else:
2435b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar        run.tests.sort(key = lambda t: t.getFullName())
2447434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar
2457434c9a053789c04d73bb58df41ad6fdf6a84e6aDaniel Dunbar    # Finally limit the number of tests, if desired.
246d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if opts.maxTests is not None:
2475b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar        run.tests = run.tests[:opts.maxTests]
248d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
249c797f2e9c7121c7a8c859ad2a8ede8f8639e4ff5NAKAMURA Takumi    # Don't create more threads than tests.
2505b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    opts.numThreads = min(len(run.tests), opts.numThreads)
251c797f2e9c7121c7a8c859ad2a8ede8f8639e4ff5NAKAMURA Takumi
252d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    extra = ''
2535b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    if len(run.tests) != numTotalTests:
254d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        extra = ' of %d' % numTotalTests
2555b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    header = '-- Testing: %d%s tests, %d threads --'%(len(run.tests), extra,
256d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar                                                      opts.numThreads)
257d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
258d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    progressBar = None
259d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if not opts.quiet:
260d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if opts.succinct and opts.useProgressBar:
261d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            try:
262b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                tc = lit.ProgressBar.TerminalController()
263b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                progressBar = lit.ProgressBar.ProgressBar(tc, header)
264d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            except ValueError:
2654f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar                print(header)
266b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                progressBar = lit.ProgressBar.SimpleProgressBar('Testing: ')
267d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        else:
2684f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar            print(header)
269d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
270d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    startTime = time.time()
2715b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    display = TestingProgressDisplay(opts, len(run.tests), progressBar)
272ba460864440b4dd192bd2809f913babe0cf07031Nico Rieck    try:
2734ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar        run.execute_tests(display, opts.numThreads, opts.maxTime,
2744ac723b53f2eb69e604891853ca87d1e2b3ee788Daniel Dunbar                          opts.useProcesses)
275ec8e0592544de7b99b87535352a26b0420c51820Daniel Dunbar    except KeyboardInterrupt:
276ec8e0592544de7b99b87535352a26b0420c51820Daniel Dunbar        sys.exit(2)
277d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    display.finish()
278d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
279d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if not opts.quiet:
2804f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar        print('Testing Time: %.2fs'%(time.time() - startTime))
281d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
282d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # List test results organized by kind.
283d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    hasFailures = False
284d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    byCode = {}
2855b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    for test in run.tests:
286ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar        if test.result.code not in byCode:
287ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar            byCode[test.result.code] = []
288ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar        byCode[test.result.code].append(test)
289ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar        if test.result.code.isFailure:
290d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            hasFailures = True
291d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
29291a62c34d8e40f3f5b51b07b2edb156f7bcbbffcDaniel Dunbar    # Print each test in any of the failing groups.
293b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar    for title,code in (('Unexpected Passing Tests', lit.Test.XPASS),
29491a62c34d8e40f3f5b51b07b2edb156f7bcbbffcDaniel Dunbar                       ('Failing Tests', lit.Test.FAIL),
29591a62c34d8e40f3f5b51b07b2edb156f7bcbbffcDaniel Dunbar                       ('Unresolved Tests', lit.Test.UNRESOLVED)):
296d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        elts = byCode.get(code)
297d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if not elts:
298d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            continue
2994f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar        print('*'*20)
3004f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar        print('%s (%d):' % (title, len(elts)))
301ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar        for test in elts:
302ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar            print('    %s' % test.getFullName())
3030d038e3e8852bf4fde949136ca9c2815f64febd0Daniel Dunbar        sys.stdout.write('\n')
304d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
3055b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar    if opts.timeTests and run.tests:
3060dd41a99e31d098165571911fbb7d9d9a453595fDaniel Dunbar        # Order by time.
307ccd21b26dd16c6dff207b3ded3df2bb90f1b9e6eDaniel Dunbar        test_times = [(test.getFullName(), test.result.elapsed)
3085b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar                      for test in run.tests]
3090dd41a99e31d098165571911fbb7d9d9a453595fDaniel Dunbar        lit.util.printHistogram(test_times, title='Tests')
3105b2efc28fd193701d2d05780c7b8d8ee5bf75c31Daniel Dunbar
311b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar    for name,code in (('Expected Passes    ', lit.Test.PASS),
312b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                      ('Expected Failures  ', lit.Test.XFAIL),
313b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                      ('Unsupported Tests  ', lit.Test.UNSUPPORTED),
314b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                      ('Unresolved Tests   ', lit.Test.UNRESOLVED),
315b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                      ('Unexpected Passes  ', lit.Test.XPASS),
316b35a1733607b07f36c3617932b67debb375a15c5Daniel Dunbar                      ('Unexpected Failures', lit.Test.FAIL),):
317d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if opts.quiet and not code.isFailure:
318d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar            continue
319d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        N = len(byCode.get(code,[]))
320d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        if N:
3214f2469c40c9020af2cf39ec0af518b6caba0a588Daniel Dunbar            print('  %s: %d' % (name,N))
322d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
323d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # If we encountered any additional errors, exit abnormally.
324d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if litConfig.numErrors:
3250d038e3e8852bf4fde949136ca9c2815f64febd0Daniel Dunbar        sys.stderr.write('\n%d error(s), exiting.\n' % litConfig.numErrors)
326d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        sys.exit(2)
327d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
328d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    # Warn about warnings.
329d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if litConfig.numWarnings:
3300d038e3e8852bf4fde949136ca9c2815f64febd0Daniel Dunbar        sys.stderr.write('\n%d warning(s) in tests.\n' % litConfig.numWarnings)
331d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
332d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    if hasFailures:
333d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar        sys.exit(1)
334d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    sys.exit(0)
335d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar
336d24f1f342a4637756297117ead63e2e966999126Daniel Dunbarif __name__=='__main__':
337d24f1f342a4637756297117ead63e2e966999126Daniel Dunbar    main()
338