133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Copyright 2012 the V8 project authors. All rights reserved. 233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Redistribution and use in source and binary forms, with or without 333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# modification, are permitted provided that the following conditions are 433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# met: 533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions of source code must retain the above copyright 733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# notice, this list of conditions and the following disclaimer. 833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Redistributions in binary form must reproduce the above 933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# copyright notice, this list of conditions and the following 1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# disclaimer in the documentation and/or other materials provided 1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# with the distribution. 1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# * Neither the name of Google Inc. nor the names of its 1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# contributors may be used to endorse or promote products derived 1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# from this software without specific prior written permission. 1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# 1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# These imports are required for the on-demand conversion from 3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# old to new status file format. 3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom os.path import exists 3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom os.path import getmtime 3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom . import old_statusfile 3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# These outcomes can occur in a TestCase's outcomes list: 3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgSKIP = "SKIP" 3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgFAIL = "FAIL" 4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgPASS = "PASS" 4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgOKAY = "OKAY" 4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgTIMEOUT = "TIMEOUT" 4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgCRASH = "CRASH" 4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgSLOW = "SLOW" 45594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgFLAKY = "FLAKY" 4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# These are just for the status files and are mapped below in DEFS: 4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgFAIL_OK = "FAIL_OK" 4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgPASS_OR_FAIL = "PASS_OR_FAIL" 4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgALWAYS = "ALWAYS" 5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgKEYWORDS = {} 53594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgfor key in [SKIP, FAIL, PASS, OKAY, TIMEOUT, CRASH, SLOW, FLAKY, FAIL_OK, 5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org PASS_OR_FAIL, ALWAYS]: 5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org KEYWORDS[key] = key 5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 5733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgDEFS = {FAIL_OK: [FAIL, OKAY], 5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org PASS_OR_FAIL: [PASS, FAIL]} 5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Support arches, modes to be written as keywords instead of strings. 6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgVARIABLES = {ALWAYS: True} 6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfor var in ["debug", "release", "android_arm", "android_ia32", "arm", "ia32", 63e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org "mipsel", "x64", "nacl_ia32", "nacl_x64"]: 6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org VARIABLES[var] = var 6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef DoSkip(outcomes): 6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return SKIP in outcomes or SLOW in outcomes 6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef IsFlaky(outcomes): 72594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return FLAKY in outcomes 73594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 74594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 75594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgdef IsPassOrFail(outcomes): 7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return ((PASS in outcomes) and (FAIL in outcomes) and 7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org (not CRASH in outcomes) and (not OKAY in outcomes)) 7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef IsFailOk(outcomes): 8133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return (FAIL in outcomes) and (OKAY in outcomes) 8233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 8433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef _AddOutcome(result, new): 8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org global DEFS 8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if new in DEFS: 8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org mapped = DEFS[new] 8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if type(mapped) == list: 8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for m in mapped: 9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _AddOutcome(result, m) 9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif type(mapped) == str: 9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _AddOutcome(result, mapped) 9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org else: 9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org result.add(new) 9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef _ParseOutcomeList(rule, outcomes, target_dict, variables): 9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org result = set([]) 9933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if type(outcomes) == str: 10033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org outcomes = [outcomes] 10133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for item in outcomes: 10233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if type(item) == str: 10333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _AddOutcome(result, item) 10433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org elif type(item) == list: 10533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if not eval(item[0], variables): continue 10633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for outcome in item[1:]: 10733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert type(outcome) == str 10833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _AddOutcome(result, outcome) 10933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org else: 11033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert False 11133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if len(result) == 0: return 11233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if rule in target_dict: 11333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org target_dict[rule] |= result 11433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org else: 11533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org target_dict[rule] = result 11633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 11733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 11833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef ReadStatusFile(path, variables): 11933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org # As long as the old-format .status files are authoritative, just 12033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org # create the converted version on demand and cache it to speed up 12133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org # subsequent runs. 12233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if path.endswith(".status"): 12333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org newpath = path + "2" 12433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if not exists(newpath) or getmtime(newpath) < getmtime(path): 12533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org print "Converting status file." 12633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org converted = old_statusfile.ConvertNotation(path).GetOutput() 12733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org with open(newpath, 'w') as f: 12833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org f.write(converted) 12933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org path = newpath 13033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 13133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org with open(path) as f: 13233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org global KEYWORDS 13333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org contents = eval(f.read(), KEYWORDS) 13433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org 13533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org rules = {} 13633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org wildcards = {} 13733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org variables.update(VARIABLES) 13833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for section in contents: 13933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert type(section) == list 14033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert len(section) == 2 14133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if not eval(section[0], variables): continue 14233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org section = section[1] 14333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert type(section) == dict 14433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org for rule in section: 14533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org assert type(rule) == str 14633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if rule[-1] == '*': 14733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _ParseOutcomeList(rule, section[rule], wildcards, variables) 14833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org else: 14933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org _ParseOutcomeList(rule, section[rule], rules, variables) 15033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org return rules, wildcards 151