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