1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2021 The gRPC Authors 2*cc02d7e2SAndroid Build Coastguard Worker# 3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*cc02d7e2SAndroid Build Coastguard Worker# 7*cc02d7e2SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*cc02d7e2SAndroid Build Coastguard Worker# 9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License. 14*cc02d7e2SAndroid Build Coastguard Worker""" 15*cc02d7e2SAndroid Build Coastguard WorkerHouses py_grpc_gevent_test. 16*cc02d7e2SAndroid Build Coastguard Worker""" 17*cc02d7e2SAndroid Build Coastguard Worker 18*cc02d7e2SAndroid Build Coastguard Workerload("@grpc_python_dependencies//:requirements.bzl", "requirement") 19*cc02d7e2SAndroid Build Coastguard Worker 20*cc02d7e2SAndroid Build Coastguard Worker_GRPC_LIB = "//src/python/grpcio/grpc:grpcio" 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker_COPIED_MAIN_SUFFIX = ".gevent.main" 23*cc02d7e2SAndroid Build Coastguard Worker 24*cc02d7e2SAndroid Build Coastguard Workerdef py_grpc_gevent_test( 25*cc02d7e2SAndroid Build Coastguard Worker name, 26*cc02d7e2SAndroid Build Coastguard Worker srcs, 27*cc02d7e2SAndroid Build Coastguard Worker main = None, 28*cc02d7e2SAndroid Build Coastguard Worker deps = None, 29*cc02d7e2SAndroid Build Coastguard Worker data = None, 30*cc02d7e2SAndroid Build Coastguard Worker **kwargs): 31*cc02d7e2SAndroid Build Coastguard Worker """Runs a Python test with gevent monkeypatched in. 32*cc02d7e2SAndroid Build Coastguard Worker 33*cc02d7e2SAndroid Build Coastguard Worker Args: 34*cc02d7e2SAndroid Build Coastguard Worker name: The name of the test. 35*cc02d7e2SAndroid Build Coastguard Worker srcs: The source files. 36*cc02d7e2SAndroid Build Coastguard Worker main: The main file of the test. 37*cc02d7e2SAndroid Build Coastguard Worker deps: The dependencies of the test. 38*cc02d7e2SAndroid Build Coastguard Worker data: The data dependencies of the test. 39*cc02d7e2SAndroid Build Coastguard Worker **kwargs: Any other test arguments. 40*cc02d7e2SAndroid Build Coastguard Worker """ 41*cc02d7e2SAndroid Build Coastguard Worker if main == None: 42*cc02d7e2SAndroid Build Coastguard Worker if len(srcs) != 1: 43*cc02d7e2SAndroid Build Coastguard Worker fail("When main is not provided, srcs must be of size 1.") 44*cc02d7e2SAndroid Build Coastguard Worker main = srcs[0] 45*cc02d7e2SAndroid Build Coastguard Worker deps = [] if deps == None else deps 46*cc02d7e2SAndroid Build Coastguard Worker data = [] if data == None else data 47*cc02d7e2SAndroid Build Coastguard Worker lib_name = name + ".gevent.lib" 48*cc02d7e2SAndroid Build Coastguard Worker supplied_python_version = kwargs.pop("python_version", "") 49*cc02d7e2SAndroid Build Coastguard Worker if supplied_python_version and supplied_python_version != "PY3": 50*cc02d7e2SAndroid Build Coastguard Worker fail("py_grpc_gevent_test only supports python_version=PY3") 51*cc02d7e2SAndroid Build Coastguard Worker native.py_library( 52*cc02d7e2SAndroid Build Coastguard Worker name = lib_name, 53*cc02d7e2SAndroid Build Coastguard Worker srcs = srcs, 54*cc02d7e2SAndroid Build Coastguard Worker ) 55*cc02d7e2SAndroid Build Coastguard Worker augmented_deps = deps + [ 56*cc02d7e2SAndroid Build Coastguard Worker ":{}".format(lib_name), 57*cc02d7e2SAndroid Build Coastguard Worker requirement("gevent"), 58*cc02d7e2SAndroid Build Coastguard Worker ] 59*cc02d7e2SAndroid Build Coastguard Worker if _GRPC_LIB not in augmented_deps: 60*cc02d7e2SAndroid Build Coastguard Worker augmented_deps.append(_GRPC_LIB) 61*cc02d7e2SAndroid Build Coastguard Worker 62*cc02d7e2SAndroid Build Coastguard Worker # The main file needs to be in the same package as the test file. 63*cc02d7e2SAndroid Build Coastguard Worker copied_main_name = name + _COPIED_MAIN_SUFFIX 64*cc02d7e2SAndroid Build Coastguard Worker copied_main_filename = copied_main_name + ".py" 65*cc02d7e2SAndroid Build Coastguard Worker native.genrule( 66*cc02d7e2SAndroid Build Coastguard Worker name = copied_main_name, 67*cc02d7e2SAndroid Build Coastguard Worker srcs = ["//bazel:_gevent_test_main.py"], 68*cc02d7e2SAndroid Build Coastguard Worker outs = [copied_main_filename], 69*cc02d7e2SAndroid Build Coastguard Worker cmd = "cp $< $@", 70*cc02d7e2SAndroid Build Coastguard Worker ) 71*cc02d7e2SAndroid Build Coastguard Worker 72*cc02d7e2SAndroid Build Coastguard Worker # TODO(https://github.com/grpc/grpc/issues/27542): Remove once gevent is deemed non-flaky. 73*cc02d7e2SAndroid Build Coastguard Worker if "flaky" in kwargs: 74*cc02d7e2SAndroid Build Coastguard Worker kwargs.pop("flaky") 75*cc02d7e2SAndroid Build Coastguard Worker 76*cc02d7e2SAndroid Build Coastguard Worker native.py_test( 77*cc02d7e2SAndroid Build Coastguard Worker name = name + ".gevent", 78*cc02d7e2SAndroid Build Coastguard Worker args = [name], 79*cc02d7e2SAndroid Build Coastguard Worker data = data, 80*cc02d7e2SAndroid Build Coastguard Worker deps = augmented_deps, 81*cc02d7e2SAndroid Build Coastguard Worker srcs = [copied_main_filename], 82*cc02d7e2SAndroid Build Coastguard Worker main = copied_main_filename, 83*cc02d7e2SAndroid Build Coastguard Worker python_version = "PY3", 84*cc02d7e2SAndroid Build Coastguard Worker flaky = False, 85*cc02d7e2SAndroid Build Coastguard Worker **kwargs 86*cc02d7e2SAndroid Build Coastguard Worker ) 87