diff options
Diffstat (limited to 'src/3rdparty/v8/tools/testrunner/local/statusfile.py')
-rw-r--r-- | src/3rdparty/v8/tools/testrunner/local/statusfile.py | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/3rdparty/v8/tools/testrunner/local/statusfile.py b/src/3rdparty/v8/tools/testrunner/local/statusfile.py new file mode 100644 index 0000000..bf1de45 --- /dev/null +++ b/src/3rdparty/v8/tools/testrunner/local/statusfile.py @@ -0,0 +1,145 @@ +# Copyright 2012 the V8 project authors. All rights reserved. +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +# These imports are required for the on-demand conversion from +# old to new status file format. +from os.path import exists +from os.path import getmtime + +from . import old_statusfile + + +# These outcomes can occur in a TestCase's outcomes list: +SKIP = "SKIP" +FAIL = "FAIL" +PASS = "PASS" +OKAY = "OKAY" +TIMEOUT = "TIMEOUT" +CRASH = "CRASH" +SLOW = "SLOW" +# These are just for the status files and are mapped below in DEFS: +FAIL_OK = "FAIL_OK" +PASS_OR_FAIL = "PASS_OR_FAIL" + +ALWAYS = "ALWAYS" + +KEYWORDS = {} +for key in [SKIP, FAIL, PASS, OKAY, TIMEOUT, CRASH, SLOW, FAIL_OK, + PASS_OR_FAIL, ALWAYS]: + KEYWORDS[key] = key + +DEFS = {FAIL_OK: [FAIL, OKAY], + PASS_OR_FAIL: [PASS, FAIL]} + +# Support arches, modes to be written as keywords instead of strings. +VARIABLES = {ALWAYS: True} +for var in ["debug", "release", "android_arm", "android_ia32", "arm", "ia32", + "mipsel", "x64"]: + VARIABLES[var] = var + + +def DoSkip(outcomes): + return SKIP in outcomes or SLOW in outcomes + + +def IsFlaky(outcomes): + return ((PASS in outcomes) and (FAIL in outcomes) and + (not CRASH in outcomes) and (not OKAY in outcomes)) + + +def IsFailOk(outcomes): + return (FAIL in outcomes) and (OKAY in outcomes) + + +def _AddOutcome(result, new): + global DEFS + if new in DEFS: + mapped = DEFS[new] + if type(mapped) == list: + for m in mapped: + _AddOutcome(result, m) + elif type(mapped) == str: + _AddOutcome(result, mapped) + else: + result.add(new) + + +def _ParseOutcomeList(rule, outcomes, target_dict, variables): + result = set([]) + if type(outcomes) == str: + outcomes = [outcomes] + for item in outcomes: + if type(item) == str: + _AddOutcome(result, item) + elif type(item) == list: + if not eval(item[0], variables): continue + for outcome in item[1:]: + assert type(outcome) == str + _AddOutcome(result, outcome) + else: + assert False + if len(result) == 0: return + if rule in target_dict: + target_dict[rule] |= result + else: + target_dict[rule] = result + + +def ReadStatusFile(path, variables): + # As long as the old-format .status files are authoritative, just + # create the converted version on demand and cache it to speed up + # subsequent runs. + if path.endswith(".status"): + newpath = path + "2" + if not exists(newpath) or getmtime(newpath) < getmtime(path): + print "Converting status file." + converted = old_statusfile.ConvertNotation(path).GetOutput() + with open(newpath, 'w') as f: + f.write(converted) + path = newpath + + with open(path) as f: + global KEYWORDS + contents = eval(f.read(), KEYWORDS) + + rules = {} + wildcards = {} + variables.update(VARIABLES) + for section in contents: + assert type(section) == list + assert len(section) == 2 + if not eval(section[0], variables): continue + section = section[1] + assert type(section) == dict + for rule in section: + assert type(rule) == str + if rule[-1] == '*': + _ParseOutcomeList(rule, section[rule], wildcards, variables) + else: + _ParseOutcomeList(rule, section[rule], rules, variables) + return rules, wildcards |