|  | @@ -1,101 +0,0 @@
 | 
	
		
			
				|  |  | -# 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.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import os
 | 
	
		
			
				|  |  | -import sys
 | 
	
		
			
				|  |  | -import subprocess
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import asyncio
 | 
	
		
			
				|  |  | -import unittest
 | 
	
		
			
				|  |  | -import socket
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -from grpc.experimental import aio
 | 
	
		
			
				|  |  | -from tests_aio.unit import sync_server
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -def _get_free_loopback_tcp_port():
 | 
	
		
			
				|  |  | -    if socket.has_ipv6:
 | 
	
		
			
				|  |  | -        tcp_socket = socket.socket(socket.AF_INET6)
 | 
	
		
			
				|  |  | -        host = "::1"
 | 
	
		
			
				|  |  | -        host_target = "[::1]"
 | 
	
		
			
				|  |  | -    else:
 | 
	
		
			
				|  |  | -        tcp_socket = socket.socket(socket.AF_INET)
 | 
	
		
			
				|  |  | -        host = "127.0.0.1"
 | 
	
		
			
				|  |  | -        host_target = host
 | 
	
		
			
				|  |  | -    tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
 | 
	
		
			
				|  |  | -    tcp_socket.bind((host, 0))
 | 
	
		
			
				|  |  | -    address_tuple = tcp_socket.getsockname()
 | 
	
		
			
				|  |  | -    return tcp_socket, "%s:%s" % (host_target, address_tuple[1])
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class _Server:
 | 
	
		
			
				|  |  | -    """_Server is an wrapper for a sync-server subprocess.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    The synchronous server is executed in another process which initializes
 | 
	
		
			
				|  |  | -    implicitly the grpc using the synchronous configuration. Both worlds
 | 
	
		
			
				|  |  | -    can not coexist within the same process.
 | 
	
		
			
				|  |  | -    """
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def __init__(self, host_and_port):  # pylint: disable=W0621
 | 
	
		
			
				|  |  | -        self._host_and_port = host_and_port
 | 
	
		
			
				|  |  | -        self._handle = None
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def start(self):
 | 
	
		
			
				|  |  | -        assert self._handle is None
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        try:
 | 
	
		
			
				|  |  | -            from google3.pyglib import resources
 | 
	
		
			
				|  |  | -            executable = resources.GetResourceFilename(
 | 
	
		
			
				|  |  | -                "google3/third_party/py/grpc/sync_server")
 | 
	
		
			
				|  |  | -            args = [executable, '--host_and_port', self._host_and_port]
 | 
	
		
			
				|  |  | -        except ImportError:
 | 
	
		
			
				|  |  | -            executable = sys.executable
 | 
	
		
			
				|  |  | -            directory, _ = os.path.split(os.path.abspath(__file__))
 | 
	
		
			
				|  |  | -            filename = directory + '/sync_server.py'
 | 
	
		
			
				|  |  | -            args = [
 | 
	
		
			
				|  |  | -                executable, filename, '--host_and_port', self._host_and_port
 | 
	
		
			
				|  |  | -            ]
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        self._handle = subprocess.Popen(args)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def terminate(self):
 | 
	
		
			
				|  |  | -        if not self._handle:
 | 
	
		
			
				|  |  | -            return
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        self._handle.terminate()
 | 
	
		
			
				|  |  | -        self._handle.wait()
 | 
	
		
			
				|  |  | -        self._handle = None
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -class AioTestBase(unittest.TestCase):
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def setUp(self):
 | 
	
		
			
				|  |  | -        self._socket, self._target = _get_free_loopback_tcp_port()
 | 
	
		
			
				|  |  | -        self._server = _Server(self._target)
 | 
	
		
			
				|  |  | -        self._server.start()
 | 
	
		
			
				|  |  | -        self._loop = asyncio.new_event_loop()
 | 
	
		
			
				|  |  | -        asyncio.set_event_loop(self._loop)
 | 
	
		
			
				|  |  | -        aio.init_grpc_aio()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    def tearDown(self):
 | 
	
		
			
				|  |  | -        self._server.terminate()
 | 
	
		
			
				|  |  | -        self._socket.close()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @property
 | 
	
		
			
				|  |  | -    def loop(self):
 | 
	
		
			
				|  |  | -        return self._loop
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    @property
 | 
	
		
			
				|  |  | -    def server_target(self):
 | 
	
		
			
				|  |  | -        return self._target
 |