mirror of https://github.com/grpc/grpc.git
parent
2817afd4e9
commit
d10eabf18b
3 changed files with 56 additions and 0 deletions
@ -0,0 +1,54 @@ |
||||
# Copyright 2019 The 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. |
||||
"""Tests the gRPC Core shutdown path.""" |
||||
|
||||
import time |
||||
import threading |
||||
import unittest |
||||
import datetime |
||||
|
||||
import grpc |
||||
|
||||
_TIMEOUT_FOR_SEGFAULT = datetime.timedelta(seconds=10) |
||||
|
||||
|
||||
class GrpcShutdownTest(unittest.TestCase): |
||||
|
||||
def test_channel_close_with_connectivity_watcher(self): |
||||
"""Originated by https://github.com/grpc/grpc/issues/20299. |
||||
|
||||
The grpc_shutdown happens synchronously, but there might be Core object |
||||
references left in Cython which might lead to ABORT or SIGSEGV. |
||||
""" |
||||
connection_failed = threading.Event() |
||||
|
||||
def on_state_change(state): |
||||
if state in (grpc.ChannelConnectivity.TRANSIENT_FAILURE, |
||||
grpc.ChannelConnectivity.SHUTDOWN): |
||||
connection_failed.set() |
||||
|
||||
# Connects to an void address, and subscribes state changes |
||||
channel = grpc.insecure_channel("0.1.1.1:12345") |
||||
channel.subscribe(on_state_change, True) |
||||
|
||||
deadline = datetime.datetime.now() + _TIMEOUT_FOR_SEGFAULT |
||||
|
||||
while datetime.datetime.now() < deadline: |
||||
time.sleep(0.1) |
||||
if connection_failed.is_set(): |
||||
channel.close() |
||||
|
||||
|
||||
if __name__ == '__main__': |
||||
unittest.main(verbosity=2) |
Loading…
Reference in new issue