Exemplo n.º 1
0
    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()
Exemplo n.º 2
0
  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)
Exemplo n.º 3
0
  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)
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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()
Exemplo n.º 6
0
    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()
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
    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
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
 def __init__(self):
   self._internal = _low.CompletionQueue()