1fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#!/usr/bin/env python
2fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#
3fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# Copyright 2012 the V8 project authors. All rights reserved.
4fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# Redistribution and use in source and binary forms, with or without
5fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# modification, are permitted provided that the following conditions are
6fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# met:
7fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#
8fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#     * Redistributions of source code must retain the above copyright
9fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#       notice, this list of conditions and the following disclaimer.
10fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#     * Redistributions in binary form must reproduce the above
11fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#       copyright notice, this list of conditions and the following
12fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#       disclaimer in the documentation and/or other materials provided
13fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#       with the distribution.
14fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#     * Neither the name of Google Inc. nor the names of its
15fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#       contributors may be used to endorse or promote products derived
16fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#       from this software without specific prior written permission.
17fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#
18fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
30fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
31fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport json
32fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport math
33fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport multiprocessing
34fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport optparse
35fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport os
36fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfrom os.path import join
37fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport random
38fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport shlex
39fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport subprocess
40fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport sys
41fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgimport time
42fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
43fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfrom testrunner.local import execution
44fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfrom testrunner.local import progress
45fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfrom testrunner.local import testsuite
46fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfrom testrunner.local import utils
47fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfrom testrunner.local import verbose
48fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgfrom testrunner.objects import context
49fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
50fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
51fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgARCH_GUESS = utils.DefaultArch()
52d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgDEFAULT_TESTS = ["mjsunit", "webkit"]
53fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgTIMEOUT_DEFAULT = 60
54fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgTIMEOUT_SCALEFACTOR = {"debug"   : 4,
55fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                       "release" : 1 }
56fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
57fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgMODE_FLAGS = {
58fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "debug"   : ["--nobreak-on-abort", "--nodead-code-elimination",
59fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                 "--nofold-constants", "--enable-slow-asserts",
60fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                 "--debug-code", "--verify-heap",
619259716434187c932704601f700375e53d865de8rossberg@chromium.org                 "--noconcurrent-recompilation"],
62fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "release" : ["--nobreak-on-abort", "--nodead-code-elimination",
639259716434187c932704601f700375e53d865de8rossberg@chromium.org                 "--nofold-constants", "--noconcurrent-recompilation"]}
64fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
65fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgSUPPORTED_ARCHS = ["android_arm",
66fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   "android_ia32",
67fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   "arm",
68fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   "ia32",
69fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   "mipsel",
70fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   "nacl_ia32",
71fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   "nacl_x64",
72fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                   "x64"]
73fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org# Double the timeout for these:
74fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgSLOW_ARCHS = ["android_arm",
75fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org              "android_ia32",
76fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org              "arm",
77fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org              "mipsel",
78fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org              "nacl_ia32",
79fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org              "nacl_x64"]
80fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgMAX_DEOPT = 1000000000
81fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgDISTRIBUTION_MODES = ["smooth", "random"]
82fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
83fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
84fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgclass RandomDistribution:
85fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  def __init__(self, seed=None):
86fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    seed = seed or random.randint(1, sys.maxint)
87fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print "Using random distribution with seed %d" % seed
88fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    self._random = random.Random(seed)
89fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
90fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  def Distribute(self, n, m):
91fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if n > m:
92fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      n = m
93fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return self._random.sample(xrange(1, m + 1), n)
94fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
95fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
96fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgclass SmoothDistribution:
97fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  """Distribute n numbers into the interval [1:m].
98fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  F1: Factor of the first derivation of the distribution function.
99fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  F2: Factor of the second derivation of the distribution function.
100fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  With F1 and F2 set to 0, the distribution will be equal.
101fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  """
102fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  def __init__(self, factor1=2.0, factor2=0.2):
103fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    self._factor1 = factor1
104fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    self._factor2 = factor2
105fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
106fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  def Distribute(self, n, m):
107fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if n > m:
108fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      n = m
109fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if n <= 1:
110fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return [ 1 ]
111fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
112fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result = []
113fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    x = 0.0
114fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    dx = 1.0
115fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    ddx = self._factor1
116fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    dddx = self._factor2
117fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for i in range(0, n):
118fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      result += [ x ]
119fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      x += dx
120fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      dx += ddx
121fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      ddx += dddx
122fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
123fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    # Project the distribution into the interval [0:M].
124fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result = [ x * m / result[-1] for x in result ]
125fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
126fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    # Equalize by n. The closer n is to m, the more equal will be the
127fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    # distribution.
128fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for (i, x) in enumerate(result):
129fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      # The value of x if it was equally distributed.
130fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      equal_x = i / float(n - 1) * float(m - 1) + 1
131fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
132fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      # Difference factor between actual and equal distribution.
133fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      diff = 1 - (x / equal_x)
134fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
135fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      # Equalize x dependent on the number of values to distribute.
136fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      result[i] = int(x + (i + 1) * diff)
137fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return result
138fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
139fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
140fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdef Distribution(options):
141fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.distribution_mode == "random":
142fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return RandomDistribution(options.seed)
143fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.distribution_mode == "smooth":
144fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return SmoothDistribution(options.distribution_factor1,
145fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                              options.distribution_factor2)
146fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
147fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
148fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdef BuildOptions():
149fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result = optparse.OptionParser()
150fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--arch",
151fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help=("The architecture to run tests for, "
152fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                          "'auto' or 'native' for auto-detect"),
153fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="ia32,x64,arm")
154fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--arch-and-mode",
155fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help="Architecture and mode in the format 'arch.mode'",
156fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=None)
157fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--buildbot",
158fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help="Adapt to path structure used on buildbots",
159fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=False, action="store_true")
160fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--command-prefix",
161fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help="Prepended to each shell command used to run a test",
162fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="")
163fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--coverage", help=("Exponential test coverage "
164fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    "(range 0.0, 1.0) -- 0.0: one test, 1.0 all tests (slow)"),
165fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=0.4, type="float")
166fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--coverage-lift", help=("Lifts test coverage for tests "
167fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    "with a small number of deopt points (range 0, inf)"),
168fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=20, type="int")
169fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--download-data", help="Download missing test suite data",
170fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=False, action="store_true")
171fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--distribution-factor1", help=("Factor of the first "
172fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    "derivation of the distribution function"), default=2.0,
173fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    type="float")
174fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--distribution-factor2", help=("Factor of the second "
175fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    "derivation of the distribution function"), default=0.7,
176fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    type="float")
177fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--distribution-mode", help=("How to select deopt points "
178fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    "for a given test (smooth|random)"),
179fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="smooth")
180fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--dump-results-file", help=("Dump maximum number of "
181fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    "deopt points per test to a file"))
182fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--extra-flags",
183fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help="Additional flags to pass to each test command",
184fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="")
185fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--isolates", help="Whether to test isolates",
186fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=False, action="store_true")
187fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("-j", help="The number of parallel tasks to run",
188fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=0, type="int")
189fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("-m", "--mode",
190fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help="The test modes in which to run (comma-separated)",
191fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="release,debug")
192fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--outdir", help="Base directory with compile output",
193fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="out")
194fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("-p", "--progress",
195fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help=("The style of progress indicator"
196fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                          " (verbose, dots, color, mono)"),
197fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    choices=progress.PROGRESS_INDICATORS.keys(),
198fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="mono")
199fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--shard-count",
200fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help="Split testsuites into this number of shards",
201fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=1, type="int")
202fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--shard-run",
203fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    help="Run this shard from the split up tests.",
204fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=1, type="int")
205fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--shell-dir", help="Directory containing executables",
206fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default="")
207fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("--seed", help="The seed for the random distribution",
208fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    type="int")
209fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("-t", "--timeout", help="Timeout in seconds",
210fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default= -1, type="int")
211fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result.add_option("-v", "--verbose", help="Verbose output",
212fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                    default=False, action="store_true")
213fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return result
214fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
215fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
216fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdef ProcessOptions(options):
217fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  global VARIANT_FLAGS
218fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
219fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  # Architecture and mode related stuff.
220fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.arch_and_mode:
221fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    tokens = options.arch_and_mode.split(".")
222fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.arch = tokens[0]
223fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.mode = tokens[1]
224fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  options.mode = options.mode.split(",")
225fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for mode in options.mode:
226fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if not mode.lower() in ["debug", "release"]:
227fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      print "Unknown mode %s" % mode
228fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return False
229fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.arch in ["auto", "native"]:
230fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.arch = ARCH_GUESS
231fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  options.arch = options.arch.split(",")
232fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for arch in options.arch:
233fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if not arch in SUPPORTED_ARCHS:
234fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      print "Unknown architecture %s" % arch
235fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return False
236fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
237fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  # Special processing of other options, sorted alphabetically.
238fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  options.command_prefix = shlex.split(options.command_prefix)
239fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  options.extra_flags = shlex.split(options.extra_flags)
240fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.j == 0:
241fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.j = multiprocessing.cpu_count()
242fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if not options.distribution_mode in DISTRIBUTION_MODES:
243fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print "Unknown distribution mode %s" % options.distribution_mode
244fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return False
245fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.distribution_factor1 < 0.0:
246fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print ("Distribution factor1 %s is out of range. Defaulting to 0.0"
247fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        % options.distribution_factor1)
248fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.distribution_factor1 = 0.0
249fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.distribution_factor2 < 0.0:
250fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print ("Distribution factor2 %s is out of range. Defaulting to 0.0"
251fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        % options.distribution_factor2)
252fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.distribution_factor2 = 0.0
253fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.coverage < 0.0 or options.coverage > 1.0:
254fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print ("Coverage %s is out of range. Defaulting to 0.4"
255fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        % options.coverage)
256fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.coverage = 0.4
257fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.coverage_lift < 0:
258fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print ("Coverage lift %s is out of range. Defaulting to 0"
259fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        % options.coverage_lift)
260fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    options.coverage_lift = 0
261fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return True
262fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
263fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
264fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdef ShardTests(tests, shard_count, shard_run):
265fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if shard_count < 2:
266fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return tests
267fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if shard_run < 1 or shard_run > shard_count:
268fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print "shard-run not a valid number, should be in [1:shard-count]"
269fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print "defaulting back to running all tests"
270fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return tests
271fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  count = 0
272fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  shard = []
273fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for test in tests:
274fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if count % shard_count == shard_run - 1:
275fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      shard.append(test)
276fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    count += 1
277fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return shard
278fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
279fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
280fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdef Main():
281fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  parser = BuildOptions()
282fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  (options, args) = parser.parse_args()
283fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if not ProcessOptions(options):
284fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    parser.print_help()
285fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return 1
286fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
287fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  exit_code = 0
288fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  workspace = os.path.abspath(join(os.path.dirname(sys.argv[0]), ".."))
289fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
290fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  suite_paths = utils.GetSuitePaths(join(workspace, "test"))
291fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
292fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if len(args) == 0:
293fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    suite_paths = [ s for s in suite_paths if s in DEFAULT_TESTS ]
294fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  else:
295fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    args_suites = set()
296fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for arg in args:
297fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      suite = arg.split(os.path.sep)[0]
298fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if not suite in args_suites:
299fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        args_suites.add(suite)
300fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    suite_paths = [ s for s in suite_paths if s in args_suites ]
301fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
302fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  suites = []
303fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for root in suite_paths:
304fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    suite = testsuite.TestSuite.LoadTestSuite(
305fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        os.path.join(workspace, "test", root))
306fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if suite:
307fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      suites.append(suite)
308fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
309fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if options.download_data:
310fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for s in suites:
311fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      s.DownloadData()
312fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
313fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for mode in options.mode:
314fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for arch in options.arch:
315fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      code = Execute(arch, mode, args, options, suites, workspace)
316fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      exit_code = exit_code or code
317fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return exit_code
318fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
319fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
320fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdef CalculateNTests(m, options):
321fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  """Calculates the number of tests from m deopt points with exponential
322fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  coverage.
323fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  The coverage is expected to be between 0.0 and 1.0.
324fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  The 'coverage lift' lifts the coverage for tests with smaller m values.
325fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  """
326fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  c = float(options.coverage)
327fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  l = float(options.coverage_lift)
328fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return int(math.pow(m, (m * c + l) / (m + l)))
329fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
330fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
331fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgdef Execute(arch, mode, args, options, suites, workspace):
332fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  print(">>> Running tests for %s.%s" % (arch, mode))
333fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
334fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  dist = Distribution(options)
335fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
336fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  shell_dir = options.shell_dir
337fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if not shell_dir:
338fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if options.buildbot:
339fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      shell_dir = os.path.join(workspace, options.outdir, mode)
340fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      mode = mode.lower()
341fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    else:
342fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      shell_dir = os.path.join(workspace, options.outdir,
343fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               "%s.%s" % (arch, mode))
344fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  shell_dir = os.path.relpath(shell_dir)
345fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
346fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  # Populate context object.
347fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  mode_flags = MODE_FLAGS[mode]
348fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  timeout = options.timeout
349fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if timeout == -1:
350fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    # Simulators are slow, therefore allow a longer default timeout.
351fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if arch in SLOW_ARCHS:
352fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      timeout = 2 * TIMEOUT_DEFAULT;
353fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    else:
354fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      timeout = TIMEOUT_DEFAULT;
355fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
356fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  timeout *= TIMEOUT_SCALEFACTOR[mode]
357fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ctx = context.Context(arch, mode, shell_dir,
358fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                        mode_flags, options.verbose,
359fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                        timeout, options.isolates,
360fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                        options.command_prefix,
361528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                        options.extra_flags,
362528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                        False)
363fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
364fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  # Find available test suites and read test cases from them.
365fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  variables = {
366fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "mode": mode,
367fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "arch": arch,
368fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "system": utils.GuessOS(),
369fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "isolates": options.isolates,
370fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    "deopt_fuzzer": True,
371528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    "no_i18n": False,
372fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
373fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  all_tests = []
374fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  num_tests = 0
375fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  test_id = 0
376fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
377fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  # Remember test case prototypes for the fuzzing phase.
378fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  test_backup = dict((s, []) for s in suites)
379fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
380fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for s in suites:
381fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    s.ReadStatusFile(variables)
382fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    s.ReadTestCases(ctx)
383fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if len(args) > 0:
384fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      s.FilterTestCasesByArgs(args)
385fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    all_tests += s.tests
386fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    s.FilterTestCasesByStatus(False)
387fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    test_backup[s] = s.tests
388fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    analysis_flags = ["--deopt-every-n-times", "%d" % MAX_DEOPT,
389fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                      "--print-deopt-stress"]
390fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    s.tests = [ t.CopyAddingFlags(analysis_flags) for t in s.tests ]
391fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    num_tests += len(s.tests)
392fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for t in s.tests:
393fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      t.id = test_id
394fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      test_id += 1
395fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
396fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if num_tests == 0:
397fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print "No tests to run."
398fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return 0
399fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
400fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  try:
401fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print(">>> Collection phase")
402fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    progress_indicator = progress.PROGRESS_INDICATORS[options.progress]()
403fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    runner = execution.Runner(suites, progress_indicator, ctx)
404fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
405fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    exit_code = runner.Run(options.j)
406fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if runner.terminate:
407fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return exit_code
408fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
409fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  except KeyboardInterrupt:
410fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return 1
411fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
412fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  print(">>> Analysis phase")
413fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  num_tests = 0
414fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  test_id = 0
415fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for s in suites:
416fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    test_results = {}
417fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for t in s.tests:
418fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      for line in t.output.stdout.splitlines():
419fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        if line.startswith("=== Stress deopt counter: "):
420fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          test_results[t.path] = MAX_DEOPT - int(line.split(" ")[-1])
421fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for t in s.tests:
422fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if t.path not in test_results:
423fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        print "Missing results for %s" % t.path
424fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if options.dump_results_file:
425fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      results_dict = dict((t.path, n) for (t, n) in test_results.iteritems())
426fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      with file("%s.%d.txt" % (dump_results_file, time.time()), "w") as f:
427fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        f.write(json.dumps(results_dict))
428fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
429fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    # Reset tests and redistribute the prototypes from the collection phase.
430fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    s.tests = []
431fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if options.verbose:
432fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      print "Test distributions:"
433fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for t in test_backup[s]:
434fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      max_deopt = test_results.get(t.path, 0)
435fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if max_deopt == 0:
436fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        continue
437fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      n_deopt = CalculateNTests(max_deopt, options)
438fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      distribution = dist.Distribute(n_deopt, max_deopt)
439fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if options.verbose:
440fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        print "%s %s" % (t.path, distribution)
441fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      for i in distribution:
442fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        fuzzing_flags = ["--deopt-every-n-times", "%d" % i]
443fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        s.tests.append(t.CopyAddingFlags(fuzzing_flags))
444fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    num_tests += len(s.tests)
445fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    for t in s.tests:
446fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      t.id = test_id
447fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      test_id += 1
448fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
449fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if num_tests == 0:
450fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print "No tests to run."
451fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return 0
452fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
453fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  try:
454fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    print(">>> Deopt fuzzing phase (%d test cases)" % num_tests)
455fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    progress_indicator = progress.PROGRESS_INDICATORS[options.progress]()
456fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    runner = execution.Runner(suites, progress_indicator, ctx)
457fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
458fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    exit_code = runner.Run(options.j)
459fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if runner.terminate:
460fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return exit_code
461fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
462fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  except KeyboardInterrupt:
463fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return 1
464fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
465fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return exit_code
466fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
467fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
468fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgif __name__ == "__main__":
469fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  sys.exit(Main())
470