blob: c6566a7e22eb61667d7c59ae3d7ccb4c3ff4a677 [file] [log] [blame]
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""LayoutTests/ presubmit script for Blink.
See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details about the presubmit API built into gcl.
"""
import filecmp
def _CheckTestharnessResults(input_api, output_api):
"""Checks for testharness.js test baseline files that contain only PASS lines.
In general these files are unnecessary because for testharness.js tests, if there is
no baseline file then the test is considered to pass when the output is all PASS.
"""
baseline_files = _TestharnessBaselineFilesToCheck(input_api)
if not baseline_files:
return []
checker_path = input_api.os_path.join(input_api.PresubmitLocalPath(),
'..', 'Tools', 'Scripts', 'check-testharness-expected-pass')
args = [input_api.python_executable, checker_path]
args.extend(baseline_files)
_, errs = input_api.subprocess.Popen(args,
stdout=input_api.subprocess.PIPE,
stderr=input_api.subprocess.PIPE).communicate()
if errs:
return [output_api.PresubmitError(errs)]
return []
def _TestharnessBaselineFilesToCheck(input_api):
"""Returns a list of paths of -expected.txt files for testharness.js tests."""
baseline_files = []
for f in input_api.AffectedFiles():
if f.Action() == 'D':
continue
path = f.AbsoluteLocalPath()
if not path.endswith('-expected.txt'):
continue
if (input_api.os_path.join('LayoutTests', 'platform') in path or
input_api.os_path.join('LayoutTests', 'virtual') in path):
# We want to ignore files in LayoutTests/platform, because some all-PASS
# platform specific baselines may be necessary to prevent fallback to a
# more general baseline; we also ignore files in LayoutTests/virtual
# for a similar reason; some all-pass baselines are necessary to
# prevent fallback to the corresponding non-virtual test baseline.
continue
baseline_files.append(path)
return baseline_files
def _CheckIdenticalFiles(input_api, output_api):
"""Verifies that certain files are identical in various locations.
These files should always be updated together."""
dirty_files = set(input_api.LocalPaths())
groups = [[
'imported/wpt/resources/testharness.js',
'resources/testharness.js',
], [
'imported/wpt/resources/testharnessreport.js',
'resources/testharnessreport.js',
], [
'imported/wpt/resources/idlharness.js',
'resources/idlharness.js',
]]
def _absolute_path(s):
return input_api.os_path.join(input_api.PresubmitLocalPath(), *s.split('/'))
def _local_path(s):
return input_api.os_path.join('third_party', 'WebKit', 'LayoutTests', *s.split('/'))
errors = []
for group in groups:
if any(_local_path(p) in dirty_files for p in group):
a = group[0]
for b in group[1:]:
if not filecmp.cmp(_absolute_path(a), _absolute_path(b), shallow=False):
errors.append(output_api.PresubmitError(
'Files that should match differ: (see https://crbug.com/362788)\n' +
' %s <=> %s' % (_local_path(a), _local_path(b))))
return errors
def CheckChangeOnUpload(input_api, output_api):
results = []
results.extend(_CheckTestharnessResults(input_api, output_api))
results.extend(_CheckIdenticalFiles(input_api, output_api))
return results
def CheckChangeOnCommit(input_api, output_api):
results = []
results.extend(_CheckTestharnessResults(input_api, output_api))
results.extend(_CheckIdenticalFiles(input_api, output_api))
return results