Add test filtering to performance pull requests

pull/10884/head
Matt Kwong 8 years ago
parent e3229fe7c6
commit 72824a1416
  1. 47
      tools/jenkins/run_c_cpp_test.sh
  2. 25
      tools/run_tests/python_utils/filter_pull_request_tests.py

@ -0,0 +1,47 @@
#!/usr/bin/env bash
# Copyright 2017, Google Inc.
# 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.
#
# This script is invoked by a Jenkins pull request job and executes all
# args passed to this script if the pull request affect C/C++ code
set -ex
# Enter the gRPC repo root
cd $(dirname $0)/../..
AFFECTS_C_CPP=`python -c 'import sys; \
sys.path.insert(0, "tools/run_tests/python_utils"); \
import filter_pull_request_tests as filter; \
print(filter.affects_c_cpp("origin/$ghprbTargetBranch"))'`
if [ $AFFECTS_C_CPP == "False" ] ; then
echo "This pull request does not affect C/C++. Tests do not need to be run."
else
$@
fi

@ -127,6 +127,9 @@ _WHITELIST_DICT = {
'setup\.py$': [_PYTHON_TEST_SUITE] 'setup\.py$': [_PYTHON_TEST_SUITE]
} }
# Regex that combines all keys in _WHITELIST_DICT
_ALL_TRIGGERS = "(" + ")|(".join(_WHITELIST_DICT.keys()) + ")"
# Add all triggers to their respective test suites # Add all triggers to their respective test suites
for trigger, test_suites in six.iteritems(_WHITELIST_DICT): for trigger, test_suites in six.iteritems(_WHITELIST_DICT):
for test_suite in test_suites: for test_suite in test_suites:
@ -169,6 +172,21 @@ def _remove_irrelevant_tests(tests, skippable_labels):
test.labels[2] not in skippable_labels] test.labels[2] not in skippable_labels]
def affects_c_cpp(base_branch):
"""
Determines if a pull request's changes affect C/C++. This function exists because
there are pull request tests that only test C/C++ code
:param base_branch: branch that a pull request is requesting to merge into
:return: boolean indicating whether C/C++ changes are made in pull request
"""
changed_files = _get_changed_files(base_branch)
# Run all tests if any changed file is not in the whitelist dictionary
for changed_file in changed_files:
if not re.match(_ALL_TRIGGERS, changed_file):
return True
return not _can_skip_tests(changed_files, _CPP_TEST_SUITE.triggers + _CORE_TEST_SUITE.triggers)
def filter_tests(tests, base_branch): def filter_tests(tests, base_branch):
""" """
Filters out tests that are safe to ignore Filters out tests that are safe to ignore
@ -181,11 +199,9 @@ def filter_tests(tests, base_branch):
print(' %s' % changed_file) print(' %s' % changed_file)
print('') print('')
# Regex that combines all keys in _WHITELIST_DICT # Run all tests if any changed file is not in the whitelist dictionary
all_triggers = "(" + ")|(".join(_WHITELIST_DICT.keys()) + ")"
# Check if all tests have to be run
for changed_file in changed_files: for changed_file in changed_files:
if not re.match(all_triggers, changed_file): if not re.match(_ALL_TRIGGERS, changed_file):
return(tests) return(tests)
# Figure out which language and platform tests to run # Figure out which language and platform tests to run
skippable_labels = [] skippable_labels = []
@ -196,4 +212,3 @@ def filter_tests(tests, base_branch):
skippable_labels.append(label) skippable_labels.append(label)
tests = _remove_irrelevant_tests(tests, skippable_labels) tests = _remove_irrelevant_tests(tests, skippable_labels)
return tests return tests

Loading…
Cancel
Save