Ejemplo n.º 1
0
 def test_from_message(self):
     message = Message()
     failure_message = FailureMessage.from_message(message)
     assert isinstance(failure_message, FailureMessage)
     assert failure_message.exception is None
     assert failure_message == {
         'channel': None,
         'id': None,
         'request': message,
         'successful': False,
         'exception': None,
         'advice': {
             'reconnect': 'none',
             'interval': 0
         }
     }
     message = Message(channel='/test', id='1')
     exception = Exception()
     failure_message = FailureMessage.from_message(message,
                                                   exception=exception,
                                                   successful=True)
     assert isinstance(failure_message, FailureMessage)
     assert failure_message == {
         'channel': '/test',
         'id': '1',
         'request': message,
         'successful': True,
         'exception': exception,
         'advice': {
             'reconnect': 'none',
             'interval': 0
         }
     }
Ejemplo n.º 2
0
 def test_to_json(self):
     assert Message.to_json([]) == dumps([])
     message = Message(channel='/test', id='1')
     assert Message.to_json(message) == dumps([message])
     messages = [
         Message(channel='/test1', id='1'),
         Message(channel='/test2', id='2')
     ]
     assert Message.to_json(messages) == dumps(messages)
Ejemplo n.º 3
0
 def test_init(self):
     message = Message()
     assert message == {}
     message = Message({'channel': '/bad', 'id': '1'}, {'channel': '/test'})
     assert message == {'channel': '/test', 'id': '1'}
     message = Message(channel='/test', id='1')
     assert message == {'channel': '/test', 'id': '1'}
     message = Message({'channel': '/bad', 'id': '1'}, channel='/test')
     assert message == {'channel': '/test', 'id': '1'}
Ejemplo n.º 4
0
 def test_copy(self):
     message = Message()
     message_copy = message.copy()
     assert message == message_copy
     assert isinstance(message_copy, Message)
     message = Message(channel='/test', id='1', ext={'ack': True})
     message_copy = message.copy()
     assert message == message_copy
     assert isinstance(message_copy, Message)
Ejemplo n.º 5
0
 def test_failure(self):
     message = Message()
     assert message.failure
     message = Message(successful=True)
     assert not message.failure
     message = Message(successful=False)
     assert message.failure
     message['successful'] = True
     assert not message.failure
Ejemplo n.º 6
0
 def test_setdefault(self):
     message = Message()
     self.assertRaises(KeyError, message.__getitem__, 'ext')
     assert message.setdefault('ext') is None
     assert message['ext'] is None
     message = Message()
     assert message.setdefault('ext', {}) == {}
     assert message['ext'] == {}
     message = Message(ext={'ack': 1})
     assert message.setdefault('ext', {}) == {'ack': 1}
     assert message['ext'] == {'ack': 1}
Ejemplo n.º 7
0
 def test_channel(self):
     message = Message({'channel': '/test'})
     assert isinstance(message.channel, ChannelId)
     message = Message(channel='/test')
     assert isinstance(message.channel, ChannelId)
     message = Message()
     message['channel'] = '/test'
     assert isinstance(message.channel, ChannelId)
     message = Message()
     message.channel = '/test'
     assert isinstance(message.channel, ChannelId)
Ejemplo n.º 8
0
 def connect_client(self, client_id='client-1'):
     self.client.handshake()
     self.transport.receive([
         Message(channel=ChannelId.META_HANDSHAKE,
                 successful=True,
                 client_id=client_id,
                 supported_connection_types=[self.transport.name],
                 version=Client.BAYEUX_VERSION)
     ])
     self.transport.receive(
         [Message(channel=ChannelId.META_CONNECT, successful=True)])
     self.transport.clear_sent_messages()
Ejemplo n.º 9
0
 def create_sent_message(self, *args, **kwargs):
     message = Message(*args, **kwargs)
     if not message.client_id and self.client.client_id:
         message.client_id = self.client.client_id
     if not message.id:
         message.id = str(self.client.message_id)
     return message
Ejemplo n.º 10
0
 def test_send(self):
     message = Message(channel='/test')
     with patch.object(timestamp, 'formatdate') as mock_formatdate:
         mock_formatdate.return_value = formatdate(usegmt=True)
         assert self.extension.send(message) is message
     mock_formatdate.assert_called_with(usegmt=True)
     assert message.timestamp == mock_formatdate.return_value
Ejemplo n.º 11
0
    def test_disconnect(self):

        # Connect the client so we can disconnect
        self.connect_client()

        # Issue the disconnect request
        self.client.disconnect()
        assert self.client.status == ClientStatus.DISCONNECTING
        assert len(self.transport.sent_messages) == 1
        message = self.transport.sent_messages[0]
        assert message == self.create_sent_message(
            channel=ChannelId.META_DISCONNECT)

        # Make sure we can't attempt to disconnect again during a disconnect
        self.client.disconnect()
        assert self.client.status == ClientStatus.DISCONNECTING
        assert len(self.transport.sent_messages) == 1

        # Complete the disconnect
        self.transport.receive(
            [Message(channel=ChannelId.META_DISCONNECT, successful=True)])
        assert self.client.status == ClientStatus.DISCONNECTED
        assert len(self.transport.sent_messages) == 1
        assert self.client.backoff_period == 0
        assert self.client.client_id is None
Ejemplo n.º 12
0
 def test_receive_handshake(self):
     message = Message(channel=ChannelId.META_HANDSHAKE)
     assert self.extension.receive(message) == message
     assert not self.extension.server_supports_acks
     message.ext = {AckExtension.FIELD_ACK: True}
     assert self.extension.receive(message) == message
     assert self.extension.server_supports_acks
Ejemplo n.º 13
0
 def test_send_connect(self):
     message = Message(channel=ChannelId.META_CONNECT)
     assert self.extension.send(message) == message
     assert not message.ext
     self.extension.receive(Message(
         channel=ChannelId.META_HANDSHAKE,
         ext={AckExtension.FIELD_ACK: True}
     ))
     assert self.extension.send(message) == message
     assert message.ext[AckExtension.FIELD_ACK] is None
     self.extension.receive(Message(
         channel=ChannelId.META_CONNECT,
         successful=True,
         ext={AckExtension.FIELD_ACK: 1}
     ))
     assert self.extension.send(message) == message
     assert message.ext[AckExtension.FIELD_ACK] == 1
Ejemplo n.º 14
0
 def test_update(self):
     message = Message(channel='/bad1')
     assert message['channel'] == '/bad1'
     message.update({'channel': '/bad2', 'id': '1'}, channel='/test')
     assert message == {'channel': '/test', 'id': '1'}
     self.assertRaises(TypeError, message.update, {'channel': '/bad3'},
                       {'id': '2'})
     assert message == {'channel': '/test', 'id': '1'}
Ejemplo n.º 15
0
 def test_send_handshake(self):
     message = Message(channel=ChannelId.META_HANDSHAKE)
     assert self.extension.send(message) == message
     assert message.ext[AckExtension.FIELD_ACK]
     assert self.extension.ack_id is None
     self.client.configure(ack_enabled=False)
     assert self.extension.send(message) == message
     assert not message.ext[AckExtension.FIELD_ACK]
     assert self.extension.ack_id is None
Ejemplo n.º 16
0
    def test_receive_connect(self):

        # Check that nothing happens when no ACK ID is included
        message = Message(channel=ChannelId.META_CONNECT, successful=True)
        assert self.extension.receive(message) is message
        assert self.extension.ack_id is None
        assert not self.extension.server_supports_acks

        # Check that nothing happens when server support is unknown
        message.ext = {AckExtension.FIELD_ACK: 1}
        assert self.extension.receive(message) == message
        assert self.extension.ack_id is None
        assert not self.extension.server_supports_acks

        # Notify the extension that server supports ACKs
        self.extension.receive(Message(
            channel=ChannelId.META_HANDSHAKE,
            ext={AckExtension.FIELD_ACK: True}
        ))

        # Check that the ACK ID is captured
        assert self.extension.server_supports_acks
        assert self.extension.receive(message) == message
        assert self.extension.ack_id == 1

        # Check that the ACK ID is ignored for failed messages
        message.ext[AckExtension.FIELD_ACK] = 2
        message.successful = False
        assert self.extension.receive(message) == message
        assert self.extension.ack_id == 1

        # Check that the ACK ID is ignored if not an integer
        message.ext[AckExtension.FIELD_ACK] = '2'
        message.successful = True
        assert self.extension.receive(message) == message
        assert self.extension.ack_id == 1

        # Check that updates to the ACK ID are captured
        message.ext[AckExtension.FIELD_ACK] = 2
        assert self.extension.receive(message) == message
        assert self.extension.ack_id == 2
Ejemplo n.º 17
0
 def subscribe(self, function, *extra_args, **extra_kwargs):
     properties = None
     if 'properties' in extra_kwargs:
         properties = extra_kwargs.pop('properties')
     if not self.has_subscriptions:
         self.log.debug('Subscribe to channel "%s"' % self._channel_id)
         message = Message(properties,
                           channel=ChannelId.META_SUBSCRIBE,
                           subscription=self._channel_id)
         self._client.send(message)
     return self._add_listener(self._subscriptions, function, extra_args,
                               extra_kwargs)
Ejemplo n.º 18
0
 def unsubscribe(self, id=None, function=None, properties=None):
     success = self._remove_listener(self._subscriptions,
                                     id=id,
                                     function=function)
     if not self.has_subscriptions:
         self.log.debug(
             'Channel has no remaining subscriptions, sending unsubscribe')
         message = Message(properties,
                           channel=ChannelId.META_UNSUBSCRIBE,
                           subscription=self._channel_id)
         self._client.send(message)
     return success
Ejemplo n.º 19
0
    def test_fail_messages_connect(self):
        self.connect_client()
        mock_message_1 = Message(channel=ChannelId.META_CONNECT,
                                 client_id=self.client.client_id,
                                 connection_type=self.transport.name,
                                 advice={Message.FIELD_TIMEOUT: 0})
        mock_message_2 = mock_message_1.copy()
        exception = Exception()
        with nested(self.capture_messages(),
                    self.capture_timeouts()) as (messages, timeouts):
            self.client.fail_messages([mock_message_1])
            self.client.fail_messages([mock_message_2], exception=exception)

        self.check_failure_messages(
            messages, {
                ChannelId.META_CONNECT: [
                    FailureMessage.from_message(
                        mock_message_1,
                        advice={
                            FailureMessage.FIELD_RECONNECT:
                            FailureMessage.RECONNECT_RETRY,
                            FailureMessage.FIELD_INTERVAL: 0
                        }),
                    FailureMessage.from_message(
                        mock_message_2,
                        exception=exception,
                        advice={
                            FailureMessage.FIELD_RECONNECT:
                            FailureMessage.RECONNECT_RETRY,
                            FailureMessage.FIELD_INTERVAL:
                            self.DEFAULT_OPTIONS['backoff_period_increment']
                        })
                ]
            })

        # Make sure a single delayed connect was scheduled
        self.transport.clear_sent_messages()
        assert len(timeouts) == 1
        assert timeouts[0].deadline == timedelta(
            milliseconds=self.DEFAULT_OPTIONS['backoff_period_increment'] * 2)
        timeouts[0].callback()
        assert self.transport.sent_messages == [
            self.create_sent_message(channel=ChannelId.META_CONNECT,
                                     connection_type=self.transport.name,
                                     advice={Message.FIELD_TIMEOUT: 0})
        ]
Ejemplo n.º 20
0
 def test_fields(self):
     timestamp = formatdate(usegmt=True)
     message = Message(
         advice={'reconnect': 'none'},
         channel='/test',
         client_id='client-1',
         connection_type='long-polling',
         data='dummy',
         error='402 Client Unauthorized',
         ext={},
         id='1',
         interval=0,
         minimum_version='0.9',
         reconnect='none',
         subscription='/topic',
         supported_connection_types=['long-polling', 'callback-polling'],
         timeout=1000,
         timestamp=timestamp,
         version='1.0')
     assert message == {
         'advice': {
             'reconnect': 'none'
         },
         'channel': '/test',
         'clientId': 'client-1',
         'connectionType': 'long-polling',
         'data': 'dummy',
         'error': '402 Client Unauthorized',
         'ext': {},
         'id': '1',
         'interval': 0,
         'minimumVersion': '0.9',
         'reconnect': 'none',
         'subscription': '/topic',
         'supportedConnectionTypes': ['long-polling', 'callback-polling'],
         'timeout': 1000,
         'timestamp': timestamp,
         'version': '1.0'
     }
Ejemplo n.º 21
0
 def test_receive(self):
     message = Message(channel='/test')
     assert self.extension.receive(message) is message
     assert message == {'channel': '/test'}
Ejemplo n.º 22
0
 def test_receive_other(self):
     message = Message(channel='/test', ext={AckExtension.FIELD_ACK: 1})
     assert self.extension.receive(message) is message
     assert not self.extension.server_supports_acks
     assert self.extension.ack_id is None
Ejemplo n.º 23
0
 def test_key(self):
     message = Message()
     self.assertRaises(KeyError, message.__getitem__, 'channel')
     message['channel'] = '/test'
     assert message['channel'] == '/test'
Ejemplo n.º 24
0
 def test_bad_attribute(self):
     message = Message()
     self.assertRaises(AttributeError, getattr, message, 'bad_attribute')
     message.bad_attribute = 'dummy'
     assert message.bad_attribute == 'dummy'
     assert message == {}
Ejemplo n.º 25
0
 def test_attribute(self):
     message = Message()
     assert message.channel is None
     message.channel = '/test'
     assert message.channel == '/test'
     assert message == {'channel': '/test'}
Ejemplo n.º 26
0
 def test_disconnect_second_response(self):
     self.connect_client()
     self.client.disconnect()
     self.transport.receive(
         [Message(channel=ChannelId.META_DISCONNECT, successful=True)])
Ejemplo n.º 27
0
 def test_to_json_with_encoding(self):
     message = Message(channel='/caf\xe9', id='1')
     value = dumps([message], ensure_ascii=False).encode('utf8')
     assert Message.to_json(message, encoding='utf8') == value
Ejemplo n.º 28
0
 def setUp(self):
     self.client = Mock(spec_set=Client)
     self.channel_id = ChannelId('/test')
     self.channel = Channel(self.client, self.channel_id)
     self.mock_message = Message(data='dummy')
Ejemplo n.º 29
0
 def test_send_other(self):
     message = Message(channel='/test')
     assert self.extension.send(message) == message
     assert message == {'channel': '/test'}
Ejemplo n.º 30
0
 def publish(self, data, properties=None):
     self.log.debug('Publishing data to channel: %s' % data)
     message = Message(properties, channel=self._channel_id, data=data)
     self._client.send(message)