Index: tools/testrunner/local/old_statusfile.py |
diff --git a/tools/testrunner/local/old_statusfile.py b/tools/testrunner/local/old_statusfile.py |
deleted file mode 100644 |
index d634e3ec955b9f278fb6a09df2b0e03df2c8df6c..0000000000000000000000000000000000000000 |
--- a/tools/testrunner/local/old_statusfile.py |
+++ /dev/null |
@@ -1,462 +0,0 @@ |
-# 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. |
- |
- |
-import cStringIO |
-import re |
- |
-# These outcomes can occur in a TestCase's outcomes list: |
-SKIP = 'SKIP' |
-FAIL = 'FAIL' |
-PASS = 'PASS' |
-OKAY = 'OKAY' |
-TIMEOUT = 'TIMEOUT' |
-CRASH = 'CRASH' |
-SLOW = 'SLOW' |
-FLAKY = 'FLAKY' |
-# These are just for the status files and are mapped below in DEFS: |
-FAIL_OK = 'FAIL_OK' |
-PASS_OR_FAIL = 'PASS_OR_FAIL' |
- |
-KEYWORDS = {SKIP: SKIP, |
- FAIL: FAIL, |
- PASS: PASS, |
- OKAY: OKAY, |
- TIMEOUT: TIMEOUT, |
- CRASH: CRASH, |
- SLOW: SLOW, |
- FLAKY: FLAKY, |
- FAIL_OK: FAIL_OK, |
- PASS_OR_FAIL: PASS_OR_FAIL} |
- |
-class Expression(object): |
- pass |
- |
- |
-class Constant(Expression): |
- |
- def __init__(self, value): |
- self.value = value |
- |
- def Evaluate(self, env, defs): |
- return self.value |
- |
- |
-class Variable(Expression): |
- |
- def __init__(self, name): |
- self.name = name |
- |
- def GetOutcomes(self, env, defs): |
- if self.name in env: return set([env[self.name]]) |
- else: return set([]) |
- |
- def Evaluate(self, env, defs): |
- return env[self.name] |
- |
- def __str__(self): |
- return self.name |
- |
- def string(self, logical): |
- return self.__str__() |
- |
- |
-class Outcome(Expression): |
- |
- def __init__(self, name): |
- self.name = name |
- |
- def GetOutcomes(self, env, defs): |
- if self.name in defs: |
- return defs[self.name].GetOutcomes(env, defs) |
- else: |
- return set([self.name]) |
- |
- def __str__(self): |
- if self.name in KEYWORDS: |
- return "%s" % KEYWORDS[self.name] |
- return "'%s'" % self.name |
- |
- def string(self, logical): |
- if logical: |
- return "%s" % self.name |
- return self.__str__() |
- |
- |
-class Operation(Expression): |
- |
- def __init__(self, left, op, right): |
- self.left = left |
- self.op = op |
- self.right = right |
- |
- def Evaluate(self, env, defs): |
- if self.op == '||' or self.op == ',': |
- return self.left.Evaluate(env, defs) or self.right.Evaluate(env, defs) |
- elif self.op == 'if': |
- return False |
- elif self.op == '==': |
- return not self.left.GetOutcomes(env, defs).isdisjoint(self.right.GetOutcomes(env, defs)) |
- elif self.op == '!=': |
- return self.left.GetOutcomes(env, defs).isdisjoint(self.right.GetOutcomes(env, defs)) |
- else: |
- assert self.op == '&&' |
- return self.left.Evaluate(env, defs) and self.right.Evaluate(env, defs) |
- |
- def GetOutcomes(self, env, defs): |
- if self.op == '||' or self.op == ',': |
- return self.left.GetOutcomes(env, defs) | self.right.GetOutcomes(env, defs) |
- elif self.op == 'if': |
- if self.right.Evaluate(env, defs): return self.left.GetOutcomes(env, defs) |
- else: return set([]) |
- else: |
- assert self.op == '&&' |
- return self.left.GetOutcomes(env, defs) & self.right.GetOutcomes(env, defs) |
- |
- def __str__(self): |
- return self.string(False) |
- |
- def string(self, logical=False): |
- if self.op == 'if': |
- return "['%s', %s]" % (self.right.string(True), self.left.string(logical)) |
- elif self.op == "||" or self.op == ",": |
- if logical: |
- return "%s or %s" % (self.left.string(True), self.right.string(True)) |
- else: |
- return "%s, %s" % (self.left, self.right) |
- elif self.op == "&&": |
- return "%s and %s" % (self.left.string(True), self.right.string(True)) |
- return "%s %s %s" % (self.left.string(logical), self.op, |
- self.right.string(logical)) |
- |
- |
-def IsAlpha(string): |
- for char in string: |
- if not (char.isalpha() or char.isdigit() or char == '_'): |
- return False |
- return True |
- |
- |
-class Tokenizer(object): |
- """A simple string tokenizer that chops expressions into variables, |
- parens and operators""" |
- |
- def __init__(self, expr): |
- self.index = 0 |
- self.expr = expr |
- self.length = len(expr) |
- self.tokens = None |
- |
- def Current(self, length=1): |
- if not self.HasMore(length): return "" |
- return self.expr[self.index:self.index + length] |
- |
- def HasMore(self, length=1): |
- return self.index < self.length + (length - 1) |
- |
- def Advance(self, count=1): |
- self.index = self.index + count |
- |
- def AddToken(self, token): |
- self.tokens.append(token) |
- |
- def SkipSpaces(self): |
- while self.HasMore() and self.Current().isspace(): |
- self.Advance() |
- |
- def Tokenize(self): |
- self.tokens = [ ] |
- while self.HasMore(): |
- self.SkipSpaces() |
- if not self.HasMore(): |
- return None |
- if self.Current() == '(': |
- self.AddToken('(') |
- self.Advance() |
- elif self.Current() == ')': |
- self.AddToken(')') |
- self.Advance() |
- elif self.Current() == '$': |
- self.AddToken('$') |
- self.Advance() |
- elif self.Current() == ',': |
- self.AddToken(',') |
- self.Advance() |
- elif IsAlpha(self.Current()): |
- buf = "" |
- while self.HasMore() and IsAlpha(self.Current()): |
- buf += self.Current() |
- self.Advance() |
- self.AddToken(buf) |
- elif self.Current(2) == '&&': |
- self.AddToken('&&') |
- self.Advance(2) |
- elif self.Current(2) == '||': |
- self.AddToken('||') |
- self.Advance(2) |
- elif self.Current(2) == '==': |
- self.AddToken('==') |
- self.Advance(2) |
- elif self.Current(2) == '!=': |
- self.AddToken('!=') |
- self.Advance(2) |
- else: |
- return None |
- return self.tokens |
- |
- |
-class Scanner(object): |
- """A simple scanner that can serve out tokens from a given list""" |
- |
- def __init__(self, tokens): |
- self.tokens = tokens |
- self.length = len(tokens) |
- self.index = 0 |
- |
- def HasMore(self): |
- return self.index < self.length |
- |
- def Current(self): |
- return self.tokens[self.index] |
- |
- def Advance(self): |
- self.index = self.index + 1 |
- |
- |
-def ParseAtomicExpression(scan): |
- if scan.Current() == "true": |
- scan.Advance() |
- return Constant(True) |
- elif scan.Current() == "false": |
- scan.Advance() |
- return Constant(False) |
- elif IsAlpha(scan.Current()): |
- name = scan.Current() |
- scan.Advance() |
- return Outcome(name) |
- elif scan.Current() == '$': |
- scan.Advance() |
- if not IsAlpha(scan.Current()): |
- return None |
- name = scan.Current() |
- scan.Advance() |
- return Variable(name.lower()) |
- elif scan.Current() == '(': |
- scan.Advance() |
- result = ParseLogicalExpression(scan) |
- if (not result) or (scan.Current() != ')'): |
- return None |
- scan.Advance() |
- return result |
- else: |
- return None |
- |
- |
-BINARIES = ['==', '!='] |
-def ParseOperatorExpression(scan): |
- left = ParseAtomicExpression(scan) |
- if not left: return None |
- while scan.HasMore() and (scan.Current() in BINARIES): |
- op = scan.Current() |
- scan.Advance() |
- right = ParseOperatorExpression(scan) |
- if not right: |
- return None |
- left = Operation(left, op, right) |
- return left |
- |
- |
-def ParseConditionalExpression(scan): |
- left = ParseOperatorExpression(scan) |
- if not left: return None |
- while scan.HasMore() and (scan.Current() == 'if'): |
- scan.Advance() |
- right = ParseOperatorExpression(scan) |
- if not right: |
- return None |
- left = Operation(left, 'if', right) |
- return left |
- |
- |
-LOGICALS = ["&&", "||", ","] |
-def ParseLogicalExpression(scan): |
- left = ParseConditionalExpression(scan) |
- if not left: return None |
- while scan.HasMore() and (scan.Current() in LOGICALS): |
- op = scan.Current() |
- scan.Advance() |
- right = ParseConditionalExpression(scan) |
- if not right: |
- return None |
- left = Operation(left, op, right) |
- return left |
- |
- |
-def ParseCondition(expr): |
- """Parses a logical expression into an Expression object""" |
- tokens = Tokenizer(expr).Tokenize() |
- if not tokens: |
- print "Malformed expression: '%s'" % expr |
- return None |
- scan = Scanner(tokens) |
- ast = ParseLogicalExpression(scan) |
- if not ast: |
- print "Malformed expression: '%s'" % expr |
- return None |
- if scan.HasMore(): |
- print "Malformed expression: '%s'" % expr |
- return None |
- return ast |
- |
- |
-class Section(object): |
- """A section of the configuration file. Sections are enabled or |
- disabled prior to running the tests, based on their conditions""" |
- |
- def __init__(self, condition): |
- self.condition = condition |
- self.rules = [ ] |
- |
- def AddRule(self, rule): |
- self.rules.append(rule) |
- |
- |
-class Rule(object): |
- """A single rule that specifies the expected outcome for a single |
- test.""" |
- |
- def __init__(self, raw_path, path, value): |
- self.raw_path = raw_path |
- self.path = path |
- self.value = value |
- |
- def GetOutcomes(self, env, defs): |
- return self.value.GetOutcomes(env, defs) |
- |
- def Contains(self, path): |
- if len(self.path) > len(path): |
- return False |
- for i in xrange(len(self.path)): |
- if not self.path[i].match(path[i]): |
- return False |
- return True |
- |
- |
-HEADER_PATTERN = re.compile(r'\[([^]]+)\]') |
-RULE_PATTERN = re.compile(r'\s*([^: ]*)\s*:(.*)') |
-DEF_PATTERN = re.compile(r'^def\s*(\w+)\s*=(.*)$') |
-PREFIX_PATTERN = re.compile(r'^\s*prefix\s+([\w\_\.\-\/]+)$') |
- |
- |
-class ConvertNotation(object): |
- def __init__(self, path): |
- self.path = path |
- self.indent = "" |
- self.comment = [] |
- self.init = False |
- self.section = False |
- self.out = cStringIO.StringIO() |
- |
- def OpenGlobal(self): |
- if self.init: return |
- self.WriteComment() |
- print >> self.out, "[" |
- self.init = True |
- |
- def CloseGlobal(self): |
- if not self.init: self.OpenGlobal() |
- print >> self.out, "]" |
- self.init = False |
- |
- def OpenSection(self, condition="ALWAYS"): |
- if self.section: return |
- self.OpenGlobal() |
- if type(condition) != str: |
- condition = "'%s'" % condition.string(True) |
- print >> self.out, "%s[%s, {" % (self.indent, condition) |
- self.indent += " " * 2 |
- self.section = condition |
- |
- def CloseSection(self): |
- if not self.section: return |
- self.indent = self.indent[:-2] |
- print >> self.out, "%s}], # %s" % (self.indent, self.section) |
- self.section = False |
- |
- def WriteComment(self): |
- if not self.comment: return |
- for c in self.comment: |
- if len(c.strip()) == 0: |
- print >> self.out, "" |
- else: |
- print >> self.out, "%s%s" % (self.indent, c), |
- self.comment = [] |
- |
- def GetOutput(self): |
- with open(self.path) as f: |
- for line in f: |
- if line[0] == '#': |
- self.comment += [line] |
- continue |
- if len(line.strip()) == 0: |
- self.comment += [line] |
- continue |
- header_match = HEADER_PATTERN.match(line) |
- if header_match: |
- condition = ParseCondition(header_match.group(1).strip()) |
- self.CloseSection() |
- self.WriteComment() |
- self.OpenSection(condition) |
- continue |
- rule_match = RULE_PATTERN.match(line) |
- if rule_match: |
- self.OpenSection() |
- self.WriteComment() |
- path = rule_match.group(1).strip() |
- value_str = rule_match.group(2).strip() |
- comment = "" |
- if '#' in value_str: |
- pos = value_str.find('#') |
- comment = " %s" % value_str[pos:].strip() |
- value_str = value_str[:pos].strip() |
- value = ParseCondition(value_str) |
- print >> self.out, ("%s'%s': [%s],%s" % |
- (self.indent, path, value, comment)) |
- continue |
- def_match = DEF_PATTERN.match(line) |
- if def_match: |
- # Custom definitions are deprecated. |
- continue |
- prefix_match = PREFIX_PATTERN.match(line) |
- if prefix_match: |
- continue |
- print "Malformed line: '%s'." % line |
- self.CloseSection() |
- self.CloseGlobal() |
- result = self.out.getvalue() |
- self.out.close() |
- return result |