def setUp(self): self.server_completion_queue = _low.CompletionQueue() self.server = _low.Server(self.server_completion_queue, []) self.port = self.server.add_http2_port('[::]:0') self.client_completion_queue = _low.CompletionQueue() self.client_channel = _low.Channel('localhost:%d' % self.port, []) self.server.start()
def setUp(self): self.host = 'localhost' self.server_completion_queue = _low.CompletionQueue() self.server = _low.Server(self.server_completion_queue) port = self.server.add_http2_addr('[::]:0') self.server.start() self.client_completion_queue = _low.CompletionQueue() self.channel = _low.Channel('%s:%d' % (self.host, port), None)
def testLonelyClient(self): host = 'nosuchhostexists' port = 54321 method = 'test method' deadline = time.time() + _TIMEOUT after_deadline = deadline + _AFTER_DELAY metadata_tag = object() finish_tag = object() completion_queue = _low.CompletionQueue() channel = _low.Channel('%s:%d' % (host, port), None) client_call = _low.Call(channel, method, host, deadline) client_call.invoke(completion_queue, metadata_tag, finish_tag) first_event = completion_queue.get(after_deadline) self.assertIsNotNone(first_event) second_event = completion_queue.get(after_deadline) self.assertIsNotNone(second_event) kinds = [event.kind for event in (first_event, second_event)] self.assertItemsEqual( (_low.Event.Kind.METADATA_ACCEPTED, _low.Event.Kind.FINISH), kinds) self.assertIsNone(completion_queue.get(after_deadline)) completion_queue.stop() stop_event = completion_queue.get(_FUTURE) self.assertEqual(_low.Event.Kind.STOP, stop_event.kind)
def _start(self): """Starts this ForeLink. This method must be called before attempting to exchange tickets with this object. """ with self._condition: address = '[::]:%d' % (0 if self._requested_port is None else self._requested_port) self._completion_queue = _low.CompletionQueue() if self._root_certificates is None and not self._key_chain_pairs: self._server = _low.Server(self._completion_queue, None) self._port = self._server.add_http2_addr(address) else: server_credentials = _low.ServerCredentials( self._root_certificates, self._key_chain_pairs) self._server = _low.Server(self._completion_queue, server_credentials) self._port = self._server.add_secure_http2_addr(address) self._server.start() self._server.service(None) self._pool.submit(self._spin, self._completion_queue, self._server) self._spinning = True return self
def test_immediately_connectable_channel_connectivity(self): server_completion_queue = _low.CompletionQueue() server = _low.Server(server_completion_queue, []) port = server.add_http2_port('[::]:0') server.start() server_completion_queue_thread = threading.Thread( target=_drive_completion_queue, args=(server_completion_queue, )) server_completion_queue_thread.start() channel = implementations.insecure_channel('localhost', port) callback = _Callback() try: ready_future = utilities.channel_ready_future(channel) ready_future.add_done_callback(callback.accept_value) self.assertIsNone(ready_future.result( test_constants.SHORT_TIMEOUT)) value_passed_to_callback = callback.block_until_called() self.assertIs(ready_future, value_passed_to_callback) self.assertFalse(ready_future.cancelled()) self.assertTrue(ready_future.done()) self.assertFalse(ready_future.running()) # Cancellation after maturity has no effect. ready_future.cancel() self.assertFalse(ready_future.cancelled()) self.assertTrue(ready_future.done()) self.assertFalse(ready_future.running()) finally: ready_future.cancel() server.shutdown() server_completion_queue.shutdown() server_completion_queue_thread.join()
def test_reachable_then_unreachable_channel_connectivity(self): server_completion_queue = _low.CompletionQueue() server = _low.Server(server_completion_queue, []) port = server.add_http2_port('[::]:0') server.start() server_completion_queue_thread = threading.Thread( target=_drive_completion_queue, args=(server_completion_queue, )) server_completion_queue_thread.start() low_channel = _low.Channel('localhost:%d' % port, ()) callback = _Callback() connectivity_channel = _connectivity_channel.ConnectivityChannel( low_channel) connectivity_channel.subscribe(callback.update, try_to_connect=True) callback.block_until_connectivities_satisfy( lambda connectivities: interfaces.ChannelConnectivity.READY in connectivities) # Now take down the server and confirm that channel readiness is repudiated. server.shutdown() callback.block_until_connectivities_satisfy( lambda connectivities: connectivities[ -1] is not interfaces.ChannelConnectivity.READY) connectivity_channel.unsubscribe(callback.update) server.shutdown() server_completion_queue.shutdown() server_completion_queue_thread.join()
def _poll_connectivity(self, low_channel, initial_try_to_connect): try_to_connect = initial_try_to_connect low_connectivity = low_channel.check_connectivity_state(try_to_connect) with self._lock: self._connectivity = self._mapping[low_connectivity] callbacks = tuple( callback for callback, unused_but_known_to_be_none_connectivity in self._callbacks_and_connectivities) for callback_and_connectivity in self._callbacks_and_connectivities: callback_and_connectivity[1] = self._connectivity if callbacks: self._spawn_delivery(self._connectivity, callbacks) completion_queue = _low.CompletionQueue() while True: low_channel.watch_connectivity_state( low_connectivity, time.time() + 0.2, completion_queue, None) event = completion_queue.next() with self._lock: if not self._callbacks_and_connectivities and not self._try_to_connect: self._polling = False self._connectivity = None completion_queue.shutdown() break try_to_connect = self._try_to_connect self._try_to_connect = False if event.success or try_to_connect: low_connectivity = low_channel.check_connectivity_state(try_to_connect) with self._lock: self._connectivity = self._mapping[low_connectivity] if not self._delivering: callbacks = self._deliveries(self._connectivity) if callbacks: self._spawn_delivery(self._connectivity, callbacks)
def _start(self): """Starts this RearLink. This method must be called before attempting to exchange tickets with this object. """ with self._condition: self._completion_queue = _low.CompletionQueue() self._channel = _low.Channel('%s:%d' % (self._host, self._port)) return self
def test_immediately_connectable_channel_connectivity(self): server_completion_queue = _low.CompletionQueue() server = _low.Server(server_completion_queue, []) port = server.add_http2_port('[::]:0') server.start() server_completion_queue_thread = threading.Thread( target=_drive_completion_queue, args=(server_completion_queue, )) server_completion_queue_thread.start() low_channel = _low.Channel('localhost:%d' % port, ()) first_callback = _Callback() second_callback = _Callback() connectivity_channel = _connectivity_channel.ConnectivityChannel( low_channel) connectivity_channel.subscribe(first_callback.update, try_to_connect=False) first_connectivities = first_callback.block_until_connectivities_satisfy( bool) # Wait for a connection that will never happen because try_to_connect=True # has not yet been passed. time.sleep(test_constants.SHORT_TIMEOUT) second_connectivities = first_callback.connectivities() connectivity_channel.subscribe(second_callback.update, try_to_connect=True) third_connectivities = first_callback.block_until_connectivities_satisfy( lambda connectivities: 2 <= len(connectivities)) fourth_connectivities = second_callback.block_until_connectivities_satisfy( bool) # Wait for a connection that will happen (or may already have happened). first_callback.block_until_connectivities_satisfy( lambda connectivities: interfaces.ChannelConnectivity.READY in connectivities) second_callback.block_until_connectivities_satisfy( lambda connectivities: interfaces.ChannelConnectivity.READY in connectivities) connectivity_channel.unsubscribe(first_callback.update) connectivity_channel.unsubscribe(second_callback.update) server.shutdown() server_completion_queue.shutdown() server_completion_queue_thread.join() self.assertSequenceEqual((interfaces.ChannelConnectivity.IDLE, ), first_connectivities) self.assertSequenceEqual((interfaces.ChannelConnectivity.IDLE, ), second_connectivities) self.assertNotIn(interfaces.ChannelConnectivity.TRANSIENT_FAILURE, third_connectivities) self.assertNotIn(interfaces.ChannelConnectivity.FATAL_FAILURE, third_connectivities) self.assertNotIn(interfaces.ChannelConnectivity.TRANSIENT_FAILURE, fourth_connectivities) self.assertNotIn(interfaces.ChannelConnectivity.FATAL_FAILURE, fourth_connectivities)
def __init__(self): self._internal = _low.CompletionQueue()