# Copyright 2024 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import re import subprocess import sys import tempfile _OK_TEST_REGEX = r"^-+.*Ran ([\d]+) tests* in ([\d.]+)s.*OK(?: \(skipped=(\d+)\))?\n$" # Tests with known exception logs. # TODO(sourabhsinghs): Investigate and enable _rpc_part_1_test and _rpc_part_2_test tests. _SKIP_TESTS = [ "_rpc_part_1_test", "_server_shutdown_test", "_xds_credentials_test", "_server_test", "_invalid_metadata_test", "_reconnect_test", "_channel_close_test", "_rpc_part_2_test", "_invocation_defects_test", "_dynamic_stubs_test", "_channel_connectivity_test", ] if __name__ == "__main__": if len(sys.argv) != 3: print(f"USAGE: {sys.argv[0]} TARGET_MODULE", file=sys.stderr) sys.exit(1) test_script = sys.argv[1] target_module = sys.argv[2] if target_module in _SKIP_TESTS: print(f"Skipping {target_module}") sys.exit(0) command = [ sys.executable, os.path.realpath(test_script), target_module, os.path.dirname(os.path.relpath(__file__)), ] with tempfile.TemporaryFile(mode="w+") as stdout_file: with tempfile.TemporaryFile(mode="w+") as stderr_file: result = subprocess.run( command, stdout=stdout_file, stderr=stderr_file, text=True, check=True, ) stdout_file.seek(0) stderr_file.seek(0) stdout_count = len(stdout_file.readlines()) stderr_count = len(stderr_file.readlines()) if result.returncode != 0: sys.exit("Test failure") stderr_file.seek(0) if not re.fullmatch(_OK_TEST_REGEX, stderr_file.read(), re.DOTALL): print( f"Warning: Excessive error output detected ({stderr_count} lines):" ) stderr_file.seek(0) for line in stderr_file: print(line) if stdout_count > 0: print( f"Warning: Unexpected output detected ({stdout_count} lines):" ) stdout_file.seek(0) for line in stdout_file: print(line)