def test_websocket_upgrade_with_backlog(self):
        mock_server = self._get_mock_server()
        s = socket.Socket(mock_server, 'sid')
        s.connected = True
        s.queue.join = mock.MagicMock(return_value=None)
        probe = 'probe'
        foo = 'foo'
        ws = mock.MagicMock()
        ws.wait.side_effect = [
            packet.Packet(packet.PING, data=probe).encode(),
            packet.Packet(packet.UPGRADE, data='2').encode(),
        ]
        s.upgrading = True
        s.send(packet.Packet(packet.MESSAGE, data=foo))
        environ = {'REQUEST_METHOD': 'GET', 'QUERY_STRING': 'sid=sid'}
        start_response = mock.MagicMock()
        packets = s.handle_get_request(environ, start_response)
        assert len(packets) == 1
        assert packets[0].encode() == '6'
        packets = s.poll()
        assert len(packets) == 1
        assert packets[0].encode() == '4foo'

        s._websocket_handler(ws)
        self._join_bg_tasks()
        assert s.upgraded
        assert not s.upgrading
        packets = s.handle_get_request(environ, start_response)
        assert len(packets) == 1
        assert packets[0].encode() == '6'
 def test_message_async_handler(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.receive(packet.Packet(packet.MESSAGE, data='foo'))
     mock_server._trigger_event.assert_called_once_with('message', 'sid',
                                                        'foo',
                                                        run_async=True)
 def test_close_packet(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.connected = True
     s.close = mock.MagicMock()
     s.receive(packet.Packet(packet.CLOSE))
     s.close.assert_called_once_with(wait=False, abort=True)
 def test_polling_read_error(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'foo')
     environ = {'REQUEST_METHOD': 'GET', 'QUERY_STRING': 'sid=foo'}
     start_response = mock.MagicMock()
     self.assertRaises(IOError, s.handle_get_request, environ,
                       start_response)
Beispiel #5
0
 def test_upgrade_packet(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.receive(packet.Packet(packet.UPGRADE))
     r = s.poll()
     self.assertEqual(len(r), 1)
     self.assertTrue(r[0].encode(), b'6')
Beispiel #6
0
    def test_websocket_upgrade_with_backlog(self):
        mock_server = self._get_mock_server()
        s = socket.Socket(mock_server, 'sid')
        s.connected = True
        s.queue.join = mock.MagicMock(return_value=None)
        probe = six.text_type('probe')
        foo = six.text_type('foo')
        ws = mock.MagicMock()
        ws.wait.side_effect = [
            packet.Packet(packet.PING, data=probe).encode(always_bytes=False),
            packet.Packet(packet.UPGRADE, data=b'2').encode(always_bytes=False)
        ]
        s.upgrading = True
        s.send(packet.Packet(packet.MESSAGE, data=foo))
        environ = {'REQUEST_METHOD': 'GET', 'QUERY_STRING': 'sid=sid'}
        start_response = mock.MagicMock()
        packets = s.handle_get_request(environ, start_response)
        self.assertEqual(len(packets), 1)
        self.assertEqual(packets[0].encode(), b'6')
        packets = s.poll()
        self.assertEqual(len(packets), 1)
        self.assertEqual(packets[0].encode(), b'4foo')

        s._websocket_handler(ws)
        self._join_bg_tasks()
        self.assertTrue(s.upgraded)
        self.assertFalse(s.upgrading)
        packets = s.handle_get_request(environ, start_response)
        self.assertEqual(len(packets), 1)
        self.assertEqual(packets[0].encode(), b'6')
 def test_ping_pong(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.receive(packet.Packet(packet.PING, data='abc'))
     r = s.poll()
     self.assertEqual(len(r), 1)
     self.assertTrue(r[0].encode(), b'3abc')
 def test_websocket_upgrade_read_write(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.connected = True
     s.queue.join = mock.MagicMock(return_value=None)
     foo = six.text_type('foo')
     bar = six.text_type('bar')
     probe = six.text_type('probe')
     s.poll = mock.MagicMock(side_effect=[
         [packet.Packet(packet.MESSAGE, data=bar)], IOError])
     ws = mock.MagicMock()
     ws.wait.side_effect = [
         packet.Packet(packet.PING, data=probe).encode(
             always_bytes=False),
         packet.Packet(packet.UPGRADE).encode(always_bytes=False),
         packet.Packet(packet.MESSAGE, data=foo).encode(
             always_bytes=False),
         None]
     s._websocket_handler(ws)
     time.sleep(0)
     self.assertTrue(s.upgraded)
     self.assertEqual(mock_server._trigger_event.call_count, 2)
     mock_server._trigger_event.assert_has_calls([
         mock.call('message', 'sid', 'foo'),
         mock.call('disconnect', 'sid')])
     ws.send.assert_called_with('4bar')
 def test_websocket_ignore_invalid_packet(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.connected = False
     s.queue.join = mock.MagicMock(return_value=None)
     foo = six.text_type('foo')
     bar = six.text_type('bar')
     s.poll = mock.MagicMock(
         side_effect=[[packet.Packet(packet.MESSAGE, data=bar)],
                      exceptions.QueueEmpty])
     ws = mock.MagicMock()
     ws.wait.side_effect = [
         packet.Packet(packet.OPEN).encode(always_bytes=False),
         packet.Packet(packet.MESSAGE, data=foo).encode(always_bytes=False),
         None
     ]
     s._websocket_handler(ws)
     self._join_bg_tasks()
     self.assertTrue(s.connected)
     self.assertEqual(mock_server._trigger_event.call_count, 2)
     mock_server._trigger_event.assert_has_calls([
         mock.call('message', 'sid', foo, run_async=True),
         mock.call('disconnect', 'sid', run_async=False)
     ])
     ws.send.assert_called_with('4bar')
 def test_websocket_upgrade_read_write(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.connected = True
     s.queue.join = mock.MagicMock(return_value=None)
     foo = six.text_type('foo')
     bar = six.text_type('bar')
     probe = six.text_type('probe')
     s.poll = mock.MagicMock(side_effect=[
         [packet.Packet(packet.MESSAGE, data=bar)],
         exceptions.QueueEmpty,
     ])
     ws = mock.MagicMock()
     ws.wait.side_effect = [
         packet.Packet(packet.PING, data=probe).encode(always_bytes=False),
         packet.Packet(packet.UPGRADE).encode(always_bytes=False),
         packet.Packet(packet.MESSAGE, data=foo).encode(always_bytes=False),
         None,
     ]
     s._websocket_handler(ws)
     self._join_bg_tasks()
     assert s.upgraded
     assert mock_server._trigger_event.call_count == 2
     mock_server._trigger_event.assert_has_calls([
         mock.call('message', 'sid', 'foo', run_async=True),
         mock.call('disconnect', 'sid', run_async=False),
     ])
     ws.send.assert_called_with('4bar')
 def test_polling_read_error(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'foo')
     environ = {'REQUEST_METHOD': 'GET', 'QUERY_STRING': 'sid=foo'}
     start_response = mock.MagicMock()
     with pytest.raises(exceptions.QueueEmpty):
         s.handle_get_request(environ, start_response)
Beispiel #12
0
 def test_upgrade_no_probe(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     ws = mock.MagicMock()
     ws.wait.return_value = packet.Packet(
         packet.NOOP).encode(always_bytes=False)
     s._websocket_handler(ws)
     self.assertFalse(s.upgraded)
 def test_upgrade_no_probe(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.connected = True
     ws = mock.MagicMock()
     ws.wait.return_value = packet.Packet(packet.NOOP).encode()
     s._websocket_handler(ws)
     assert not s.upgraded
Beispiel #14
0
 def test_poll_none_after_packet(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     pkt = packet.Packet(packet.MESSAGE, data='hello')
     s.send(pkt)
     s.queue.put(None)
     self.assertEqual(s.poll(), [pkt])
     self.assertEqual(s.poll(), [])
 def test_poll(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     pkt1 = packet.Packet(packet.MESSAGE, data='hello')
     pkt2 = packet.Packet(packet.MESSAGE, data='bye')
     s.send(pkt1)
     s.send(pkt2)
     self.assertEqual(s.poll(), [pkt1, pkt2])
 def test_upgrade_packet(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.connected = True
     s.receive(packet.Packet(packet.UPGRADE))
     r = s.poll()
     assert len(r) == 1
     assert r[0].encode() == packet.Packet(packet.NOOP).encode()
 def test_timeout(self):
     mock_server = self._get_mock_server()
     mock_server.ping_interval = -0.1
     s = socket.Socket(mock_server, 'sid')
     s.last_ping = time.time() - 1
     s.close = mock.MagicMock()
     s.send('packet')
     s.close.assert_called_once_with(wait=False, abort=True)
Beispiel #18
0
 def test_upgrade_not_supported(self):
     mock_server = self._get_mock_server()
     mock_server._async['websocket'] = None
     s = socket.Socket(mock_server, 'sid')
     s.connected = True
     environ = "foo"
     start_response = "bar"
     s._upgrade_websocket(environ, start_response)
     mock_server._bad_request.assert_called_once_with()
 def test_schedule_ping(self):
     mock_server = self._get_mock_server()
     mock_server.ping_interval = 0.01
     s = socket.Socket(mock_server, 'sid')
     s.send = mock.MagicMock()
     s.schedule_ping()
     time.sleep(0.05)
     assert s.last_ping is not None
     assert s.send.call_args_list[0][0][0].encode() == '2'
Beispiel #20
0
 def test_upgrade_twice(self):
     mock_server = self._get_mock_server()
     mock_server. async ['websocket'] = mock.MagicMock()
     s = socket.Socket(mock_server, 'sid')
     s.upgraded = True
     environ = "foo"
     start_response = "bar"
     self.assertRaises(IOError, s._upgrade_websocket, environ,
                       start_response)
 def test_schedule_ping_closed_socket(self):
     mock_server = self._get_mock_server()
     mock_server.ping_interval = 0.01
     s = socket.Socket(mock_server, 'sid')
     s.send = mock.MagicMock()
     s.closed = True
     s.schedule_ping()
     time.sleep(0.05)
     assert s.last_ping is None
     s.send.assert_not_called()
 def test_upgrade_twice(self):
     mock_server = self._get_mock_server()
     mock_server._async['websocket'] = mock.MagicMock()
     s = socket.Socket(mock_server, 'sid')
     s.connected = True
     s.upgraded = True
     environ = "foo"
     start_response = "bar"
     with pytest.raises(IOError):
         s._upgrade_websocket(environ, start_response)
Beispiel #23
0
 def test_close_after_close(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.close(wait=False)
     self.assertTrue(s.closed)
     self.assertEqual(mock_server._trigger_event.call_count, 1)
     mock_server._trigger_event.assert_called_once_with('disconnect', 'sid',
                                                        run_async=False)
     s.close()
     self.assertEqual(mock_server._trigger_event.call_count, 1)
Beispiel #24
0
 def test_close_disconnect_error(self):
     mock_server = self._get_mock_server()
     mock_server._trigger_event.side_effect = ZeroDivisionError
     s = socket.Socket(mock_server, 'sid')
     self.assertRaises(ZeroDivisionError, s.close, wait=False)
     self.assertTrue(s.closed)
     self.assertEqual(mock_server._trigger_event.call_count, 1)
     mock_server._trigger_event.assert_called_once_with('disconnect',
                                                        'sid',
                                                        async=False)
 def test_upgrade_handshake(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'foo')
     s._upgrade_websocket = mock.MagicMock()
     environ = {'REQUEST_METHOD': 'GET', 'QUERY_STRING': 'sid=foo',
                'HTTP_CONNECTION': 'Foo,Upgrade,Bar',
                'HTTP_UPGRADE': 'websocket'}
     start_response = mock.MagicMock()
     s.handle_get_request(environ, start_response)
     s._upgrade_websocket.assert_called_once_with(environ, start_response)
 def test_polling_read(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'foo')
     pkt1 = packet.Packet(packet.MESSAGE, data='hello')
     pkt2 = packet.Packet(packet.MESSAGE, data='bye')
     s.send(pkt1)
     s.send(pkt2)
     environ = {'REQUEST_METHOD': 'GET', 'QUERY_STRING': 'sid=foo'}
     start_response = mock.MagicMock()
     packets = s.handle_get_request(environ, start_response)
     self.assertEqual(packets, [pkt1, pkt2])
 def test_create(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     assert s.server == mock_server
     assert s.sid == 'sid'
     assert not s.upgraded
     assert not s.closed
     assert hasattr(s.queue, 'get')
     assert hasattr(s.queue, 'put')
     assert hasattr(s.queue, 'task_done')
     assert hasattr(s.queue, 'join')
 def test_create(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     self.assertEqual(s.server, mock_server)
     self.assertEqual(s.sid, 'sid')
     self.assertFalse(s.upgraded)
     self.assertFalse(s.closed)
     self.assertTrue(hasattr(s.queue, 'get'))
     self.assertTrue(hasattr(s.queue, 'put'))
     self.assertTrue(hasattr(s.queue, 'task_done'))
     self.assertTrue(hasattr(s.queue, 'join'))
 def test_polling_write_too_large(self):
     mock_server = self._get_mock_server()
     pkt1 = packet.Packet(packet.MESSAGE, data='hello')
     pkt2 = packet.Packet(packet.MESSAGE, data='bye')
     p = payload.Payload(packets=[pkt1, pkt2]).encode()
     mock_server.max_http_buffer_size = len(p) - 1
     s = socket.Socket(mock_server, 'foo')
     s.receive = mock.MagicMock()
     environ = {'REQUEST_METHOD': 'POST', 'QUERY_STRING': 'sid=foo',
                'CONTENT_LENGTH': len(p), 'wsgi.input': six.BytesIO(p)}
     self.assertRaises(ValueError, s.handle_post_request, environ)
Beispiel #30
0
 def test_ping_pong(self):
     mock_server = self._get_mock_server()
     s = socket.Socket(mock_server, 'sid')
     s.receive(packet.Packet(packet.PING, data='abc'))
     r = s.poll()
     self.assertEqual(len(r), 1)
     self.assertTrue(r[0].encode(), b'3abc')
     mock_server._trigger_event.assert_called_once_with('message',
                                                        'sid',
                                                        '2["PING"]',
                                                        run_async=True)