133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#!/usr/bin/env python
233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#
333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Copyright 2012 the V8 project authors. All rights reserved.
433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Redistribution and use in source and binary forms, with or without
533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# modification, are permitted provided that the following conditions are
633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# met:
733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#
833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#     * Redistributions of source code must retain the above copyright
933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       notice, this list of conditions and the following disclaimer.
1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#     * Redistributions in binary form must reproduce the above
1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       copyright notice, this list of conditions and the following
1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       disclaimer in the documentation and/or other materials provided
1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       with the distribution.
1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#     * Neither the name of Google Inc. nor the names of its
1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       contributors may be used to endorse or promote products derived
1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       from this software without specific prior written permission.
1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#
1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
319f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.orgimport itertools
3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport multiprocessing
3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport optparse
3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport os
3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom os.path import join
366bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.orgimport shlex
3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport subprocess
3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport sys
3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport time
4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.local import execution
4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.local import progress
4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.local import testsuite
4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.local import utils
4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.local import verbose
4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.network import network_execution
4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom testrunner.objects import context
4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgARCH_GUESS = utils.DefaultArch()
5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgDEFAULT_TESTS = ["mjsunit", "cctest", "message", "preparser"]
5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgTIMEOUT_DEFAULT = 60
5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgTIMEOUT_SCALEFACTOR = {"debug"   : 4,
5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                       "release" : 1 }
5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Use this to run several variants of the tests.
5737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgVARIANT_FLAGS = {
5837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    "default": [],
5937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    "stress": ["--stress-opt", "--always-opt"],
6037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    "nocrankshaft": ["--nocrankshaft"]}
6137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
6237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgVARIANTS = ["default", "stress", "nocrankshaft"]
6337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgMODE_FLAGS = {
65c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.org    "debug"   : ["--nobreak-on-abort", "--nodead-code-elimination",
662e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org                 "--nofold-constants", "--enable-slow-asserts",
672e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org                 "--debug-code", "--verify-heap"],
682e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    "release" : ["--nobreak-on-abort", "--nodead-code-elimination",
692e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org                 "--nofold-constants"]}
7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
7189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.orgSUPPORTED_ARCHS = ["android_arm",
7289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                   "android_ia32",
7389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                   "arm",
7489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                   "ia32",
7589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                   "mipsel",
76e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                   "nacl_ia32",
77e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                   "nacl_x64",
7889e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                   "x64"]
7972204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org# Double the timeout for these:
8072204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.orgSLOW_ARCHS = ["android_arm",
8172204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org              "android_ia32",
8272204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org              "arm",
83e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org              "mipsel",
84e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org              "nacl_ia32",
85e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org              "nacl_x64"]
8689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef BuildOptions():
8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result = optparse.OptionParser()
9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--arch",
9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help=("The architecture to run tests for, "
9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                          "'auto' or 'native' for auto-detect"),
9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default="ia32,x64,arm")
9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--arch-and-mode",
9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Architecture and mode in the format 'arch.mode'",
9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=None)
9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--buildbot",
9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Adapt to path structure used on buildbots",
9933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
10033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--cat", help="Print the source of the tests",
10133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
102594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  result.add_option("--flaky-tests",
103594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                    help="Regard tests marked as flaky (run|skip|dontcare)",
104594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                    default="dontcare")
10537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  result.add_option("--slow-tests",
10637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                    help="Regard slow tests (run|skip|dontcare)",
10737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                    default="dontcare")
10837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  result.add_option("--pass-fail-tests",
10937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                    help="Regard pass|fail tests (run|skip|dontcare)",
11037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                    default="dontcare")
11133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--command-prefix",
11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Prepended to each shell command used to run a test",
11333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default="")
11433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--download-data", help="Download missing test suite data",
11533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
11633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--extra-flags",
11733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Additional flags to pass to each test command",
11833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default="")
11933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--isolates", help="Whether to test isolates",
12033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
12133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("-j", help="The number of parallel tasks to run",
12233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=0, type="int")
12333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("-m", "--mode",
12433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="The test modes in which to run (comma-separated)",
12533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default="release,debug")
126528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  result.add_option("--no-i18n", "--noi18n",
127528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                    help="Skip internationalization tests",
128528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                    default=False, action="store_true")
12933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--no-network", "--nonetwork",
13033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Don't distribute tests on the network",
13133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=(utils.GuessOS() != "linux"),
13233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    dest="no_network", action="store_true")
13333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--no-presubmit", "--nopresubmit",
13433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help='Skip presubmit checks',
13533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, dest="no_presubmit", action="store_true")
13633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--no-stress", "--nostress",
13733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Don't run crankshaft --always-opt --stress-op test",
13833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, dest="no_stress", action="store_true")
139ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  result.add_option("--no-variants", "--novariants",
140ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org                    help="Don't run any testing variants",
141ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org                    default=False, dest="no_variants", action="store_true")
14237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  result.add_option("--variants",
14337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                    help="Comma-separated list of testing variants")
14433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--outdir", help="Base directory with compile output",
14533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default="out")
14633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("-p", "--progress",
14733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help=("The style of progress indicator"
14833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                          " (verbose, dots, color, mono)"),
14933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    choices=progress.PROGRESS_INDICATORS.keys(), default="mono")
150ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org  result.add_option("--quickcheck", default=False, action="store_true",
151ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org                    help=("Quick check mode (skip slow/flaky tests)"))
15233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--report", help="Print a summary of the tests to be run",
15333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
15433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--shard-count",
15533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Split testsuites into this number of shards",
15633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=1, type="int")
15733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--shard-run",
15833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Run this shard from the split up tests.",
15933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=1, type="int")
16033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--shell", help="DEPRECATED! use --shell-dir", default="")
16133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--shell-dir", help="Directory containing executables",
16233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default="")
16333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--stress-only",
16433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    help="Only run tests with --always-opt --stress-opt",
16533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
16633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--time", help="Print timing information after running",
16733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
16833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("-t", "--timeout", help="Timeout in seconds",
16933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default= -1, type="int")
17033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("-v", "--verbose", help="Verbose output",
17133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
17233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--valgrind", help="Run tests through valgrind",
17333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
17433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  result.add_option("--warn-unused", help="Report unused rules",
17533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    default=False, action="store_true")
176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  result.add_option("--junitout", help="File name of the JUnit output")
177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  result.add_option("--junittestsuite",
178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                    help="The testsuite name in the JUnit output file",
179e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                    default="v8tests")
18033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return result
18133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
18233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
18333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef ProcessOptions(options):
18433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  global VARIANT_FLAGS
18537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  global VARIANTS
18633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
18733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  # Architecture and mode related stuff.
18833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.arch_and_mode:
1899f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    options.arch_and_mode = [arch_and_mode.split(".")
1909f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org        for arch_and_mode in options.arch_and_mode.split(",")]
1919f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    options.arch = ",".join([tokens[0] for tokens in options.arch_and_mode])
1929f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    options.mode = ",".join([tokens[1] for tokens in options.arch_and_mode])
19333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  options.mode = options.mode.split(",")
19433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for mode in options.mode:
195ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org    if not mode.lower() in ["debug", "release", "optdebug"]:
19633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print "Unknown mode %s" % mode
19733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      return False
19833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.arch in ["auto", "native"]:
19933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    options.arch = ARCH_GUESS
20033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  options.arch = options.arch.split(",")
20133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for arch in options.arch:
20289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    if not arch in SUPPORTED_ARCHS:
20333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print "Unknown architecture %s" % arch
20433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      return False
20533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
2069f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  # Store the final configuration in arch_and_mode list. Don't overwrite
2079f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  # predefined arch_and_mode since it is more expressive than arch and mode.
2089f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  if not options.arch_and_mode:
2099f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    options.arch_and_mode = itertools.product(options.arch, options.mode)
2109f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org
21133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  # Special processing of other options, sorted alphabetically.
21233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
21333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.buildbot:
21433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    # Buildbots run presubmit tests as a separate step.
21533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    options.no_presubmit = True
21633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    options.no_network = True
21733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.command_prefix:
21833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    print("Specifying --command-prefix disables network distribution, "
21933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org          "running tests locally.")
22033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    options.no_network = True
2216bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org  options.command_prefix = shlex.split(options.command_prefix)
222068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  options.extra_flags = shlex.split(options.extra_flags)
22333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.j == 0:
22433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    options.j = multiprocessing.cpu_count()
225ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org
226ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  def excl(*args):
227ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org    """Returns true if zero or one of multiple arguments are true."""
228ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org    return reduce(lambda x, y: x + y, args) <= 1
229ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org
23037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if not excl(options.no_stress, options.stress_only, options.no_variants,
231ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org              bool(options.variants), options.quickcheck):
232ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org    print("Use only one of --no-stress, --stress-only, --no-variants, "
233ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org          "--variants, or --quickcheck.")
234ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org    return False
23533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.no_stress:
23637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    VARIANTS = ["default", "nocrankshaft"]
237ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  if options.no_variants:
23837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    VARIANTS = ["default"]
23937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if options.stress_only:
24037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    VARIANTS = ["stress"]
24137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if options.variants:
24237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    VARIANTS = options.variants.split(",")
24337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    if not set(VARIANTS).issubset(VARIANT_FLAGS.keys()):
24437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      print "All variants must be in %s" % str(VARIANT_FLAGS.keys())
24537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      return False
246ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org  if options.quickcheck:
247ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org    VARIANTS = ["default", "stress"]
248ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org    options.flaky_tests = "skip"
249ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org    options.slow_tests = "skip"
250ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org    options.pass_fail_tests = "skip"
251ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org
25233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if not options.shell_dir:
25333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if options.shell:
25433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print "Warning: --shell is deprecated, use --shell-dir instead."
25533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      options.shell_dir = os.path.dirname(options.shell)
25633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.valgrind:
25733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    run_valgrind = os.path.join("tools", "run-valgrind.py")
25833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    # This is OK for distributed running, so we don't need to set no_network.
2596bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org    options.command_prefix = (["python", "-u", run_valgrind] +
26033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                              options.command_prefix)
26137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  def CheckTestMode(name, option):
26237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    if not option in ["run", "skip", "dontcare"]:
26337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      print "Unknown %s mode %s" % (name, option)
26437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      return False
26537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    return True
26637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if not CheckTestMode("flaky test", options.flaky_tests):
26737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    return False
26837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if not CheckTestMode("slow test", options.slow_tests):
26937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    return False
27037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if not CheckTestMode("pass|fail test", options.pass_fail_tests):
271594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return False
272528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if not options.no_i18n:
273528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    DEFAULT_TESTS.append("intl")
27433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return True
27533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
27633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
27733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef ShardTests(tests, shard_count, shard_run):
27833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if shard_count < 2:
27933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return tests
28033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if shard_run < 1 or shard_run > shard_count:
28133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    print "shard-run not a valid number, should be in [1:shard-count]"
28233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    print "defaulting back to running all tests"
28333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return tests
28433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  count = 0
28533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  shard = []
28633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for test in tests:
28733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if count % shard_count == shard_run - 1:
28833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      shard.append(test)
28933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    count += 1
29033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return shard
29133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
29233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
29333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef Main():
29433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  parser = BuildOptions()
29533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  (options, args) = parser.parse_args()
29633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if not ProcessOptions(options):
29733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    parser.print_help()
29833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return 1
29933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
30033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  exit_code = 0
30133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  workspace = os.path.abspath(join(os.path.dirname(sys.argv[0]), ".."))
30233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if not options.no_presubmit:
30333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    print ">>> running presubmit tests"
30433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    code = subprocess.call(
30533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        [sys.executable, join(workspace, "tools", "presubmit.py")])
30633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    exit_code = code
30733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
30833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  suite_paths = utils.GetSuitePaths(join(workspace, "test"))
30933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
31033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if len(args) == 0:
311c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    suite_paths = [ s for s in DEFAULT_TESTS if s in suite_paths ]
31233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  else:
31333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    args_suites = set()
31433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    for arg in args:
31533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      suite = arg.split(os.path.sep)[0]
31633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      if not suite in args_suites:
31733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        args_suites.add(suite)
318c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    suite_paths = [ s for s in args_suites if s in suite_paths ]
31933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
32033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  suites = []
32133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for root in suite_paths:
32233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    suite = testsuite.TestSuite.LoadTestSuite(
32333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        os.path.join(workspace, "test", root))
32433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if suite:
32533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      suites.append(suite)
32633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
32733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.download_data:
32833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    for s in suites:
32933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      s.DownloadData()
33033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3319f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  for (arch, mode) in options.arch_and_mode:
3329f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    code = Execute(arch, mode, args, options, suites, workspace)
3339f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    exit_code = exit_code or code
33433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return exit_code
33533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
33633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
33733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef Execute(arch, mode, args, options, suites, workspace):
33833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  print(">>> Running tests for %s.%s" % (arch, mode))
33933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
34033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  shell_dir = options.shell_dir
34133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if not shell_dir:
34233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if options.buildbot:
34333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      shell_dir = os.path.join(workspace, options.outdir, mode)
34433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      mode = mode.lower()
34533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    else:
34633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      shell_dir = os.path.join(workspace, options.outdir,
34733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                               "%s.%s" % (arch, mode))
34833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  shell_dir = os.path.relpath(shell_dir)
34933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
350ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org  if mode == "optdebug":
351ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org    mode = "debug"  # "optdebug" is just an alias.
352ddf3811f8018dfe9e8ec7d1b8f4a8be1122fd767machenbach@chromium.org
35333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  # Populate context object.
35433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  mode_flags = MODE_FLAGS[mode]
35589e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  timeout = options.timeout
35689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org  if timeout == -1:
35789e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    # Simulators are slow, therefore allow a longer default timeout.
35872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org    if arch in SLOW_ARCHS:
359e97852de34e44a479f092bd2449134e707cd9cf1dslomov@chromium.org      timeout = 2 * TIMEOUT_DEFAULT;
36089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org    else:
36189e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org      timeout = TIMEOUT_DEFAULT;
36289e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org
36372204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  timeout *= TIMEOUT_SCALEFACTOR[mode]
36433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  ctx = context.Context(arch, mode, shell_dir,
36533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                        mode_flags, options.verbose,
36689e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org                        timeout, options.isolates,
36733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                        options.command_prefix,
368528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                        options.extra_flags,
369528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                        options.no_i18n)
37033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
37133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  # Find available test suites and read test cases from them.
37233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  variables = {
37333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "mode": mode,
37433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "arch": arch,
37533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "system": utils.GuessOS(),
376fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "isolates": options.isolates,
377fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "deopt_fuzzer": False,
378528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    "no_i18n": options.no_i18n,
37933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
38033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  all_tests = []
38133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  num_tests = 0
38233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  test_id = 0
38333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for s in suites:
38433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    s.ReadStatusFile(variables)
38533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    s.ReadTestCases(ctx)
38633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if len(args) > 0:
38733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      s.FilterTestCasesByArgs(args)
38872204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org    all_tests += s.tests
38937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    s.FilterTestCasesByStatus(options.warn_unused, options.flaky_tests,
39037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                              options.slow_tests, options.pass_fail_tests)
39133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if options.cat:
39233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      verbose.PrintTestSource(s.tests)
39333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      continue
39437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    variant_flags = [VARIANT_FLAGS[var] for var in VARIANTS]
395690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org    s.tests = [ t.CopyAddingFlags(v)
396690083842e7c67a362017dae50909d4bb0b2a9c2mstarzinger@chromium.org                for t in s.tests
39737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org                for v in s.VariantFlags(t, variant_flags) ]
39833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    s.tests = ShardTests(s.tests, options.shard_count, options.shard_run)
39933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    num_tests += len(s.tests)
40033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    for t in s.tests:
40133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      t.id = test_id
40233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      test_id += 1
40333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
40433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.cat:
40533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return 0  # We're done here.
40633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
40733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.report:
40833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    verbose.PrintReport(all_tests)
40933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
41033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if num_tests == 0:
41133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    print "No tests to run."
41233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return 0
41333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
41433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  # Run the tests, either locally or distributed on the network.
41533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  try:
41633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    start_time = time.time()
41733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    progress_indicator = progress.PROGRESS_INDICATORS[options.progress]()
418e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    if options.junitout:
419e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      progress_indicator = progress.JUnitTestProgressIndicator(
420e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org          progress_indicator, options.junitout, options.junittestsuite)
42133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
42233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    run_networked = not options.no_network
42333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if not run_networked:
42433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print("Network distribution disabled, running tests locally.")
42533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    elif utils.GuessOS() != "linux":
42633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print("Network distribution is only supported on Linux, sorry!")
42733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      run_networked = False
42833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    peers = []
42933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if run_networked:
43033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      peers = network_execution.GetPeers()
43133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      if not peers:
43233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        print("No connection to distribution server; running tests locally.")
43333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        run_networked = False
43433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      elif len(peers) == 1:
43533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        print("No other peers on the network; running tests locally.")
43633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        run_networked = False
43733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      elif num_tests <= 100:
43833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        print("Less than 100 tests, running them locally.")
43933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        run_networked = False
44033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
44133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if run_networked:
44233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      runner = network_execution.NetworkedRunner(suites, progress_indicator,
44333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                                                 ctx, peers, workspace)
44433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    else:
44533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      runner = execution.Runner(suites, progress_indicator, ctx)
44633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
44733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    exit_code = runner.Run(options.j)
44833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if runner.terminate:
44933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      return exit_code
45033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    overall_duration = time.time() - start_time
45133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  except KeyboardInterrupt:
45233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    return 1
45333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
45433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  if options.time:
45533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    verbose.PrintTestDurations(suites, overall_duration)
45633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return exit_code
45733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
45833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
45933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgif __name__ == "__main__":
46033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  sys.exit(Main())
461