15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2010 Google Inc. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2010 Gabor Rapcsanyi (rgabor@inf.u-szeged.hu), University of Szeged
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (C) 2011 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Redistribution and use in source and binary forms, with or without
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# modification, are permitted provided that the following conditions are
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# met:
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     * Redistributions of source code must retain the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# notice, this list of conditions and the following disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     * Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# copyright notice, this list of conditions and the following disclaimer
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# in the documentation and/or other materials provided with the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#     * Neither the name of Google Inc. nor the names of its
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# contributors may be used to endorse or promote products derived from
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# this software without specific prior written permission.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import logging
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import optparse
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import os
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import signal
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import sys
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import traceback
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)from webkitpy.common.host import Host
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)from webkitpy.layout_tests.controllers.manager import Manager
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)from webkitpy.layout_tests.port import configuration_options, platform_options
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)from webkitpy.layout_tests.views import buildbot_results
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)from webkitpy.layout_tests.views import printing
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)_log = logging.getLogger(__name__)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# This mirrors what the shell normally does.
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)INTERRUPTED_EXIT_STATUS = signal.SIGINT + 128
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# This is a randomly chosen exit code that can be tested against to
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# indicate that an unexpected exception occurred.
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)EXCEPTIONAL_EXIT_STATUS = 254
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)def main(argv, stdout, stderr):
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    options, args = parse_args(argv)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if options.platform and 'test' in options.platform:
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        # It's a bit lame to import mocks into real code, but this allows the user
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        # to run tests against the test platform interactively, which is useful for
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        # debugging test failures.
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        from webkitpy.common.host_mock import MockHost
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        host = MockHost()
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else:
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        host = Host()
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if options.lint_test_files:
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        from webkitpy.layout_tests.lint_test_expectations import lint
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return lint(host, options, stderr)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    try:
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        port = host.port_factory.get(options.platform, options)
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    except NotImplementedError, e:
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        # FIXME: is this the best way to handle unsupported port names?
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        print >> stderr, str(e)
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return EXCEPTIONAL_EXIT_STATUS
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    try:
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        run_details = run(port, options, args, stderr)
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if run_details.exit_code != -1:
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            bot_printer = buildbot_results.BuildBotPrinter(stdout, options.debug_rwt_logging)
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            bot_printer.print_results(run_details)
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return run_details.exit_code
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    except KeyboardInterrupt:
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return INTERRUPTED_EXIT_STATUS
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    except BaseException as e:
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if isinstance(e, Exception):
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            print >> stderr, '\n%s raised: %s' % (e.__class__.__name__, str(e))
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            traceback.print_exc(file=stderr)
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return EXCEPTIONAL_EXIT_STATUS
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)def parse_args(args):
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions = []
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Platform options", platform_options()))
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Configuration options", configuration_options()))
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Printing Options", printing.print_options()))
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # FIXME: These options should move onto the ChromiumPort.
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Chromium-specific Options", [
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--nocheck-sys-deps", action="store_true",
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=False,
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Don't check the system dependencies (themes)"),
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--adb-device",
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            action="append", default=[],
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Run Android layout tests on these devices."),
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ]))
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Results Options", [
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        optparse.make_option("-p", "--pixel", "--pixel-tests", action="store_true",
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dest="pixel_tests", help="Enable pixel-to-pixel PNG comparisons"),
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        optparse.make_option("--no-pixel", "--no-pixel-tests", action="store_false",
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dest="pixel_tests", help="Disable pixel-to-pixel PNG comparisons"),
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--results-directory", help="Location of test results"),
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--build-directory",
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Path to the directory under which build files are kept (should not include configuration)"),
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--add-platform-exceptions", action="store_true", default=False,
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Save generated results into the *most-specific-platform* directory rather than the *generic-platform* directory"),
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--new-baseline", action="store_true",
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=False, help="Save generated results as new baselines "
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "into the *most-specific-platform* directory, overwriting whatever's "
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "already there. Equivalent to --reset-results --add-platform-exceptions"),
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--reset-results", action="store_true",
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=False, help="Reset expectations to the "
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "generated results in their existing location."),
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--no-new-test-results", action="store_false",
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dest="new_test_results", default=True,
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Don't create new baselines when no expected results exist"),
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        #FIXME: we should support a comma separated list with --pixel-test-directory as well.
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--pixel-test-directory", action="append", default=[], dest="pixel_test_directories",
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="A directory where it is allowed to execute tests as pixel tests. "
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "Specify multiple times to add multiple directories. "
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "This option implies --pixel-tests. If specified, only those tests "
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "will be executed as pixel tests that are located in one of the "
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "directories enumerated with the option. Some ports may ignore this "
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "option while others can have a default value that can be overridden here."),
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--skip-failing-tests", action="store_true",
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=False, help="Skip tests that are expected to fail. "
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "Note: When using this option, you might miss new crashes "
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "in these tests."),
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--additional-drt-flag", action="append",
147591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            default=[], help="Additional command line flag to pass to the driver "
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "Specify multiple times to add multiple flags."),
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--driver-name", type="string",
150591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            help="Alternative driver binary to use"),
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--additional-platform-directory", action="append",
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=[], help="Additional directory where to look for test "
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "baselines (will take precendence over platform baselines). "
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "Specify multiple times to add multiple search path entries."),
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--additional-expectations", action="append", default=[],
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Path to a test_expectations file that will override previous expectations. "
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "Specify multiple times for multiple sets of overrides."),
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--compare-port", action="store", default=None,
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Use the specified port's baselines first"),
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--no-show-results", action="store_false",
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=True, dest="show_results",
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Don't launch a browser with results after the tests "
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "are done"),
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--full-results-html", action="store_true",
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=False,
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Show all failures in results.html, rather than only regressions"),
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--clobber-old-results", action="store_true",
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=False, help="Clobbers test results from previous runs."),
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ]))
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Testing Options", [
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--build", dest="build",
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            action="store_true", default=True,
174591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            help="Check to ensure the build is up-to-date (default)."),
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--no-build", dest="build",
176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            action="store_false", help="Don't check to see if the build is up-to-date."),
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("-n", "--dry-run", action="store_true",
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=False,
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Do everything but actually run the tests or upload results."),
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--wrapper",
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="wrapper command to insert before invocations of "
182591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                 "the driver; option is split on whitespace before "
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "running. (Example: --wrapper='valgrind --smc-check=all')"),
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("-i", "--ignore-tests", action="append", default=[],
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="directories or test to ignore (may specify multiple times)"),
18693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        optparse.make_option("--ignore-flaky-tests", action="store",
18753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            help=("Control whether tests that are flaky on the bots get ignored."
18853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                "'very-flaky' == Ignore any tests that flaked more than once on the bot."
189591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                "'maybe-flaky' == Ignore any tests that flaked once on the bot."
190591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                "'unexpected' == Ignore any tests that had unexpected results on the bot.")),
191591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        optparse.make_option("--ignore-builder-category", action="store",
192591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            help=("The category of builders to use with the --ignore-flaky-tests "
193591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                "option ('layout' or 'deps').")),
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--test-list", action="append",
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="read list of tests to run from file", metavar="FILE"),
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--skipped", action="store", default="default",
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help=("control how tests marked SKIP are run. "
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "'default' == Skip tests unless explicitly listed on the command line, "
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "'ignore' == Run them anyway, "
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "'only' == only run the SKIP tests, "
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "'always' == always skip, even if listed on the command line.")),
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--time-out-ms",
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Set the timeout for each test"),
204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        optparse.make_option("--order", action="store", default="natural",
205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            help=("determine the order in which the test cases will be run. "
206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                  "'none' == use the order in which the tests were listed either in arguments or test list, "
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                  "'natural' == use the natural order (default), "
208e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                  "'random-seeded' == randomize the test order using a fixed seed, "
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                  "'random' == randomize the test order.")),
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--run-chunk",
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help=("Run a specified chunk (n:l), the nth of len l, "
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 "of the layout tests")),
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--run-part", help=("Run a specified part (n:m), "
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "the nth of m parts, of the layout tests")),
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--batch-size",
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help=("Run a the tests in batches (n), after every n tests, "
217591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                  "the driver is relaunched."), type="int", default=None),
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--run-singly", action="store_true",
219591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            default=False, help="run a separate driver for each test (implies --verbose)"),
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--child-processes",
221591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            help="Number of drivers to run in parallel."),
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        # FIXME: Display default number of child processes that will run.
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("-f", "--fully-parallel", action="store_true",
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="run all tests in parallel"),
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--exit-after-n-failures", type="int", default=None,
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Exit after the first N failures instead of running all "
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "tests"),
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--exit-after-n-crashes-or-timeouts", type="int",
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default=None, help="Exit after the first N crashes instead of "
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            "running all tests"),
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--iterations", type="int", default=1, help="Number of times to run the set of tests (e.g. ABCABCABC)"),
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--repeat-each", type="int", default=1, help="Number of times to run each test (e.g. AAABBBCCC)"),
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--retry-failures", action="store_true",
234e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)            help="Re-try any tests that produce unexpected results. Default is to not retry if an explicit list of tests is passed to run-webkit-tests."),
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--no-retry-failures", action="store_false",
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dest="retry_failures",
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Don't re-try any tests that produce unexpected results."),
238e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
239e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        # FIXME: Remove this after we remove the flag from the v8 bot.
2405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        optparse.make_option("--retry-crashes", action="store_true",
2415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            default=False,
242e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            help="ignored (we now always retry crashes when we retry failures)."),
243e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--max-locked-shards", type="int", default=0,
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Set the maximum number of locked shards"),
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--additional-env-var", type="string", action="append", default=[],
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help="Passes that environment variable to the tests (--additional-env-var=NAME=VALUE)"),
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        optparse.make_option("--profile", action="store_true",
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            help="Output per-test profile information."),
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        optparse.make_option("--profiler", action="store",
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            help="Output per-test profile information, using the specified profiler."),
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ]))
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Miscellaneous Options", [
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--lint-test-files", action="store_true",
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        default=False, help=("Makes sure the test files parse for all "
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            "configurations. Does not run any tests.")),
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ]))
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # FIXME: Move these into json_results_generator.py
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_group_definitions.append(("Result JSON Options", [
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--master-name", help="The name of the buildbot master."),
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--builder-name", default="",
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help=("The name of the builder shown on the waterfall running "
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "this script e.g. WebKit.")),
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--build-name", default="DUMMY_BUILD_NAME",
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help=("The name of the builder used in its path, e.g. "
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "webkit-rel.")),
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--build-number", default="DUMMY_BUILD_NUMBER",
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help=("The build number of the builder running this script.")),
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        optparse.make_option("--test-results-server", default="",
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            help=("If specified, upload results json files to this appengine "
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "server.")),
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ]))
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    option_parser = optparse.OptionParser()
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for group_name, group_options in option_group_definitions:
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        option_group = optparse.OptionGroup(option_parser, group_name)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        option_group.add_options(group_options)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        option_parser.add_option_group(option_group)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return option_parser.parse_args(args)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)def _set_up_derived_options(port, options):
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    """Sets the options values that depend on other options values."""
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if not options.child_processes:
289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.child_processes = os.environ.get("WEBKIT_TEST_CHILD_PROCESSES",
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                                                 str(port.default_child_processes()))
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if not options.max_locked_shards:
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.max_locked_shards = int(os.environ.get("WEBKIT_TEST_MAX_LOCKED_SHARDS",
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                                                       str(port.default_max_locked_shards())))
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if not options.configuration:
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.configuration = port.default_configuration()
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if options.pixel_tests is None:
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.pixel_tests = port.default_pixel_tests()
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if not options.time_out_ms:
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.time_out_ms = str(port.default_timeout_ms())
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    options.slow_time_out_ms = str(5 * int(options.time_out_ms))
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if options.additional_platform_directory:
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        additional_platform_directories = []
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for path in options.additional_platform_directory:
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            additional_platform_directories.append(port.host.filesystem.abspath(path))
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.additional_platform_directory = additional_platform_directories
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if options.new_baseline:
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.reset_results = True
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.add_platform_exceptions = True
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if options.pixel_test_directories:
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.pixel_tests = True
318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        varified_dirs = set()
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        pixel_test_directories = options.pixel_test_directories
320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for directory in pixel_test_directories:
321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            # FIXME: we should support specifying the directories all the ways we support it for additional
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            # arguments specifying which tests and directories to run. We should also move the logic for that
323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            # to Port.
324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            filesystem = port.host.filesystem
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if not filesystem.isdir(filesystem.join(port.layout_tests_dir(), directory)):
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                _log.warning("'%s' was passed to --pixel-test-directories, which doesn't seem to be a directory" % str(directory))
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            else:
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                varified_dirs.add(directory)
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.pixel_test_directories = list(varified_dirs)
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if options.run_singly:
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        options.verbose = True
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)def run(port, options, args, logging_stream):
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    logger = logging.getLogger()
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    logger.setLevel(logging.DEBUG if options.debug_rwt_logging else logging.INFO)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    try:
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        printer = printing.Printer(port, options, logging_stream, logger=logger)
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        _set_up_derived_options(port, options)
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        manager = Manager(port, options, printer)
345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        printer.print_config(port.results_directory())
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        run_details = manager.run(args)
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        _log.debug("Testing completed, Exit status: %d" % run_details.exit_code)
349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return run_details
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    finally:
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        printer.cleanup()
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)if __name__ == '__main__':
354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    sys.exit(main(sys.argv[1:], sys.stdout, sys.stderr))
355