| Index: tools/testrunner/local/statusfile.py
|
| diff --git a/tools/testrunner/local/statusfile.py b/tools/testrunner/local/statusfile.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bf1de45f66f5bc938caef6f95668a7c3581a3e73
|
| --- /dev/null
|
| +++ b/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
|
|
|