| # Copyright 2018 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 |
| |
| from . import base |
| |
| |
| class OutProc(base.OutProc): |
| def __init__(self, expected_outcomes, basepath, expected_fail): |
| super(OutProc, self).__init__(expected_outcomes) |
| self._basepath = basepath |
| self._expected_fail = expected_fail |
| |
| def _is_failure_output(self, output): |
| fail = output.exit_code != 0 |
| if fail != self._expected_fail: |
| return True |
| |
| expected_lines = [] |
| # Can't use utils.ReadLinesFrom() here because it strips whitespace. |
| with open(self._basepath + '.out') as f: |
| for line in f: |
| if line.startswith("#") or not line.strip(): |
| continue |
| expected_lines.append(line) |
| raw_lines = output.stdout.splitlines() |
| actual_lines = [ s for s in raw_lines if not self._ignore_line(s) ] |
| if len(expected_lines) != len(actual_lines): |
| return True |
| |
| env = { |
| 'basename': os.path.basename(self._basepath + '.js'), |
| } |
| for (expected, actual) in itertools.izip_longest( |
| expected_lines, actual_lines, fillvalue=''): |
| pattern = re.escape(expected.rstrip() % env) |
| pattern = pattern.replace('\\*', '.*') |
| pattern = pattern.replace('\\{NUMBER\\}', '\d+(?:\.\d*)?') |
| pattern = '^%s$' % pattern |
| if not re.match(pattern, actual): |
| return True |
| return False |
| |
| def _ignore_line(self, string): |
| """Ignore empty lines, valgrind output, Android output.""" |
| return ( |
| not string or |
| not string.strip() or |
| string.startswith("==") or |
| string.startswith("**") or |
| string.startswith("ANDROID") |
| ) |