testcfg.py 3.88 KB
Newer Older
1 2 3 4 5 6 7
# Copyright 2016 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import itertools
import os
import re
8
import shlex
9 10 11 12 13 14 15 16

from testrunner.local import testsuite
from testrunner.local import utils
from testrunner.objects import testcase

FLAGS_PATTERN = re.compile(r"//\s+Flags:(.*)")
PROTOCOL_TEST_JS = "protocol-test.js"
EXPECTED_SUFFIX = "-expected.txt"
17
RESOURCES_FOLDER = "resources"
18 19 20 21 22 23 24 25 26 27 28

class InspectorProtocolTestSuite(testsuite.TestSuite):

  def __init__(self, name, root):
    super(InspectorProtocolTestSuite, self).__init__(name, root)

  def ListTests(self, context):
    tests = []
    for dirname, dirs, files in os.walk(os.path.join(self.root), followlinks=True):
      for dotted in [x for x in dirs if x.startswith('.')]:
        dirs.remove(dotted)
29 30
      if dirname.endswith(os.path.sep + RESOURCES_FOLDER):
        continue
31 32 33 34 35 36 37 38 39 40 41
      dirs.sort()
      files.sort()
      for filename in files:
        if filename.endswith(".js") and filename != PROTOCOL_TEST_JS:
          fullpath = os.path.join(dirname, filename)
          relpath = fullpath[len(self.root) + 1 : -3]
          testname = relpath.replace(os.path.sep, "/")
          test = testcase.TestCase(self, testname)
          tests.append(test)
    return tests

42
  def GetParametersForTestCase(self, testcase, context):
43
    source = self.GetSourceForTest(testcase)
44
    flags = testcase.flags + context.mode_flags
45 46
    flags_match = re.findall(FLAGS_PATTERN, source)
    for match in flags_match:
47
      flags += shlex.split(match.strip())
48 49 50 51 52
    files = [
      os.path.join(self.root, PROTOCOL_TEST_JS),
      os.path.join(self.root, testcase.path + self.suffix()),
    ]
    return files, flags
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

  def GetSourceForTest(self, testcase):
    filename = os.path.join(self.root, testcase.path + self.suffix())
    with open(filename) as f:
      return f.read()

  def shell(self):
    return "inspector-test"

  def _IgnoreLine(self, string):
    """Ignore empty lines, valgrind output and Android output."""
    if not string: return True
    return (string.startswith("==") or string.startswith("**") or
            string.startswith("ANDROID") or
            # FIXME(machenbach): The test driver shouldn't try to use slow
            # asserts if they weren't compiled. This fails in optdebug=2.
            string == "Warning: unknown flag --enable-slow-asserts." or
            string == "Try --help for options")

  def IsFailureOutput(self, testcase):
    file_name = os.path.join(self.root, testcase.path) + EXPECTED_SUFFIX
    with file(file_name, "r") as expected:
      expected_lines = expected.readlines()

    def ExpIterator():
      for line in expected_lines:
79
        if not line.strip(): continue
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
        yield line.strip()

    def ActIterator(lines):
      for line in lines:
        if self._IgnoreLine(line.strip()): continue
        yield line.strip()

    def ActBlockIterator():
      """Iterates over blocks of actual output lines."""
      lines = testcase.output.stdout.splitlines()
      start_index = 0
      found_eqeq = False
      for index, line in enumerate(lines):
        # If a stress test separator is found:
        if line.startswith("=="):
          # Iterate over all lines before a separator except the first.
          if not found_eqeq:
            found_eqeq = True
          else:
            yield ActIterator(lines[start_index:index])
          # The next block of output lines starts after the separator.
          start_index = index + 1
      # Iterate over complete output if no separator was found.
      if not found_eqeq:
        yield ActIterator(lines)

    for act_iterator in ActBlockIterator():
      for (expected, actual) in itertools.izip_longest(
          ExpIterator(), act_iterator, fillvalue=''):
        if expected != actual:
          return True
      return False

def GetSuite(name, root):
  return InspectorProtocolTestSuite(name, root)