Commit b63e6608 authored by Ben Pastene's avatar Ben Pastene Committed by Commit Bot

Add a presubmit check to ensure sytnax of test filters files is valid.

This prints an error if:
- A line begins with '//' or '/*'
- A non-comment contains a whitespace
And prints a warning if:
- A filter file contains both inclusions and exclusions

Bug: 868000
Change-Id: I2a04504d3a17f4f7536b529a0e2e626eb6e61f66
Reviewed-on: https://chromium-review.googlesource.com/1153427
Commit-Queue: Ben Pastene <bpastene@chromium.org>
Reviewed-by: default avatarJohn Budorick <jbudorick@chromium.org>
Reviewed-by: default avatarDirk Pranke <dpranke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578784}
parent d370a559
...@@ -7,6 +7,84 @@ See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts ...@@ -7,6 +7,84 @@ See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details about the presubmit API built into depot_tools. for more details about the presubmit API built into depot_tools.
""" """
import os
import re
def _CheckFilterFileFormat(input_api, output_api):
"""This ensures all modified filter files are free of common syntax errors.
See the following for the correct syntax of these files:
https://chromium.googlesource.com/chromium/src/+/master/testing/buildbot/filters/README.md#file-syntax
As well as:
https://bit.ly/chromium-test-list-format
"""
errors = []
warnings = []
for f in input_api.AffectedFiles():
filename = os.path.basename(f.LocalPath())
if not filename.endswith('.filter'):
# Non-filter files. Ignore these.
continue
inclusions = 0
exclusions = 0
for line_num, line in enumerate(f.NewContents()):
# Implicitly allow for trailing (but not leading) whitespace.
line = line.rstrip()
if not line:
# Empty line. Ignore these.
continue
if line.startswith('#'):
# A comment. Ignore these.
continue
if line.startswith('//') or line.startswith('/*'):
errors.append(
'%s:%d Not a valid comment syntax. Use "#" instead: "%s"' % (
filename, line_num, line))
continue
if not re.match(r'^\S+$', line):
errors.append(
'%s:%d Line must not contain whitespace: "%s"' % (
filename, line_num, line))
continue
if line[0] == '-':
exclusions += 1
else:
inclusions += 1
# If we have a mix of exclusions and inclusions, print a warning with a
# Y/N prompt to the author. Though this is a valid syntax, it's possible
# that such a combination will lead to a situation where zero tests are run.
if exclusions and inclusions:
warnings.append(
'%s: Contains both inclusions (%d) and exclusions (%d). This may '
'result in no tests running. Are you sure this is correct?' % (
filename, inclusions, exclusions))
res = []
if errors:
res.append(output_api.PresubmitError(
'Filter files do not follow the correct format:',
long_text='\n'.join(errors)))
if warnings:
res.append(output_api.PresubmitPromptWarning(
'Filter files may be incorrect:\n%s' % '\n'.join(warnings)))
return res
def CommonChecks(input_api, output_api):
return _CheckFilterFileFormat(input_api, output_api)
def CheckChangeOnUpload(input_api, output_api):
return CommonChecks(input_api, output_api)
def CheckChangeOnCommit(input_api, output_api):
return CommonChecks(input_api, output_api)
def PostUploadHook(cl, change, output_api): def PostUploadHook(cl, change, output_api):
"""git cl upload will call this hook after the issue is created/modified. """git cl upload will call this hook after the issue is created/modified.
...@@ -23,4 +101,3 @@ def PostUploadHook(cl, change, output_api): ...@@ -23,4 +101,3 @@ def PostUploadHook(cl, change, output_api):
'luci.chromium.try:linux_mojo' 'luci.chromium.try:linux_mojo'
], ],
'Automatically added network service trybots to run tests on CQ.') 'Automatically added network service trybots to run tests on CQ.')
...@@ -82,4 +82,4 @@ Please use the following conventions when naming the new file: ...@@ -82,4 +82,4 @@ Please use the following conventions when naming the new file:
When adding a new file, please update `//testing/buildbot/filters/BUILD.gn`. When adding a new file, please update `//testing/buildbot/filters/BUILD.gn`.
[gtest_filter]: https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#running-a-subset-of-the-tests [gtest_filter]: https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#running-a-subset-of-the-tests
TODO(crbug.com/865693): Fix this. # TODO(crbug.com/865693): Fix this.
-NetworkConnectionHandlerImplTest.ConnectWithCertificateSuccess -NetworkConnectionHandlerImplTest.ConnectWithCertificateSuccess
...@@ -15,6 +15,9 @@ change to a minimum. ...@@ -15,6 +15,9 @@ change to a minimum.
This module only depends on default Python modules. No third party code is This module only depends on default Python modules. No third party code is
required to use this module. required to use this module.
""" """
# pylint: disable=no-value-for-parameter
import json import json
import urllib import urllib
import xmlrpclib as _base import xmlrpclib as _base
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment