def test_frame_to_json():
    uuid = uuid4().hex
    frame_as_dict = {'name': 'test-frame', 'uuid': uuid, 'kind': Kind.EVENT}
    f = Frame('test-frame', uuid=uuid)
    fjson = f.to_json()
    fdict = json.loads(fjson)
    assert fdict == frame_as_dict
async def test_queue_transport():
    qt = QueueTransport()
    frame = Frame('test-frame')
    await qt.connect('test-endpoint', 'test-token')
    assert qt.connected is True
    await qt.send(frame)
    frame_sent = await qt.queue_send.get()
    assert frame == frame_sent
    frame_ = Frame('test-recv')
    await qt.queue_recv.put(frame_)
    frame_recv = await qt.recv()
    assert frame_ == frame_recv
    await qt.close()
    assert qt.connected is False
def test_frame_creation_with_name():
    f = Frame('test-frame')
    assert f.name == 'test-frame'
    assert len(f.uuid) == 32
    assert f.kind == Kind.EVENT
    assert f.data == {}
    assert f.meta == {}
def test_frame_from_dict():
    uuid = uuid4().hex
    frame_as_dict = {'name': 'test-frame', 'uuid': uuid, 'kind': Kind.EVENT}
    f = Frame.from_dict(frame_as_dict)
    assert f.name == 'test-frame'
    assert f.uuid == uuid
    assert f.kind == Kind.EVENT
def test_frame_from_json():
    uuid = uuid4().hex
    frame_as_dict = {'name': 'test-frame', 'uuid': uuid, 'kind': Kind.EVENT}
    frame_as_json = json.dumps(frame_as_dict)
    f = Frame.from_json(frame_as_json)
    assert f.name == 'test-frame'
    assert f.uuid == uuid
    assert f.kind == Kind.EVENT
async def echo(websocket, path):
    async for message in websocket:
        frame = Frame.from_json(message)
        if frame.kind == Kind.COMMAND and frame.name == 'login':
            print(f'login-ok', frame.to_dict())
            await websocket.send(frame.reply('login-ok').to_json())
        else:
            print(frame.to_dict())
            await websocket.send(message)
 async def send(self, data):
     if not self._send_ok:
         raise ConnectionAbortedError()
     frame = Frame.from_json(data)
     if frame.name == 'login':
         if self._login_ok:
             self.frame = frame.reply('login-ok').to_json()
         else:
             self.frame = frame.reply('login-failed').to_json()
         return
     self.frame = data
async def test_websocket_transport(monkeypatch):
    monkeypatch.setattr(websocket, 'websockets', MockWebsockets())
    wt = WebsocketTransport()
    frame = Frame('test-frame')
    await wt.connect('ws://localhost:6789/', 'test-token')
    assert wt.connected is True
    await wt.send(frame)
    assert wt.connection.frame
    frame_recv = await wt.recv()
    assert frame_recv.name == 'test-frame'
    await wt.close()
    assert wt.connected is False
Exemple #9
0
async def test_datagram_transport(monkeypatch):
    monkeypatch.setattr(datagram, 'asyncio_dgram', MockDatagram())
    dt = datagram.DatagramTransport()
    frame = Frame('test-frame')
    await dt.connect('dgram://127.0.0.1:6789/', 'test-token')
    assert dt.connected is True
    await dt.send(frame)
    assert dt.connection.frame
    frame_recv = await dt.recv()
    assert frame_recv.name == 'test-frame'
    await dt.close()
    assert dt.connected is False
async def echo(websocket, path):  # pragma: no cover
    async for message in websocket:
        frame = Frame.from_json(message)
        if frame.kind == Kind.COMMAND and frame.name == 'login' and frame.data.get(
                'token') == 'fail-token':
            print(frame.to_dict())
            print(f'login-fail')
            await websocket.send(frame.reply('login-fail').to_json())
        elif frame.kind == Kind.COMMAND and frame.name == 'login':
            print(frame.to_dict())
            print(f'login-ok')
            await websocket.send(frame.reply('login-ok').to_json())
        else:
            print(frame.to_dict())
            await websocket.send(message)
Exemple #11
0
    async def connect(self, endpoint, token):
        from zentropi import Kind
        from zentropi import Frame

        self.token = token
        self.endpoint = endpoint
        self._host, self._port = endpoint.replace('dgram://', '').split(':')
        self.connection = await asyncio_dgram.connect((self._host, self._port))
        await self.send(
            Frame('login', kind=Kind.COMMAND, data=dict(token=token)))
        auth_ack = await self.recv()
        if auth_ack.name == 'login-ok':
            self.connected = True
        else:
            raise PermissionError(
                f'Unable to connect to {endpoint}, got {auth_ack.to_dict()}')
def test_frame_to_dict():
    uuid = uuid4().hex
    frame_as_dict = {'name': 'test-frame', 'uuid': uuid, 'kind': Kind.EVENT}
    f = Frame('test-frame', uuid=uuid)
    fdict = f.to_dict()
    assert fdict == frame_as_dict
Exemple #13
0
 async def recv(self):
     data, remote_addr = await self.connection.recv()
     frame = Frame.from_json(data.decode('utf-8'))
     return frame
def test_frame_creation_with_data():
    data = {'test': 'item'}
    f = Frame('test-frame', data=data)
    assert f.name == 'test-frame'
    assert f.data == data
def test_frame_creation_with_meta():
    meta = {'test': 'item'}
    f = Frame('test-frame', meta=meta)
    assert f.name == 'test-frame'
    assert f.meta == meta
def test_frame_reply_with_name():
    f = Frame('test-frame')
    freply = f.reply('test-reply')
    assert freply.name == 'test-reply'
    assert freply.meta.get('reply_to') == f.uuid
def test_frame_validate_name_must_be_string():
    Frame(42)
def test_frame_validate_uuid_must_not_be_empty():
    Frame('test-frame', uuid='     ')
def test_frame_validate_meta_must_be_dict():
    Frame('test-frame', meta='expect failure')
def test_frame_creation_requires_name():
    Frame()
def test_frame_reply_with_meta():
    meta = {'test': 'item'}
    f = Frame('test-frame')
    freply = f.reply(meta=meta)
    assert freply.meta.get('reply_to') == f.uuid
    assert freply.meta.get('test') == 'item'
def test_frame_validate_kind_must_be_within_range():
    Frame('test-frame', -1)
def test_frame_validate_kind_must_be_integer():
    Frame('test-frame', kind='event')
def test_frame_validate_name_must_not_be_empty():
    Frame('     ')
async def test_websocket_transport_recv_fail(monkeypatch):
    monkeypatch.setattr(websocket, 'websockets', MockWebsockets(recv_ok=False))
    wt = WebsocketTransport()
    frame = Frame('test-frame')
    await wt.connect('ws://localhost:6789/', 'test-token')
def test_frame_creation_with_kind():
    f = Frame('test-frame', kind=1)
    assert f.name == 'test-frame'
    assert f.kind == 1
def test_frame_reply():
    f = Frame('test-frame')
    freply = f.reply()
    assert freply.meta.get('reply_to') == f.uuid
def test_frame_creation_with_uuid():
    uuid = uuid4().hex
    f = Frame('test-frame', uuid=uuid)
    assert f.name == 'test-frame'
    assert f.uuid == uuid
def test_frame_validate_uuid_must_be_string():
    Frame('test-frame', uuid=42)
def test_frame_reply_for_request():
    f = Frame('test-frame', kind=Kind.REQUEST)
    freply = f.reply()
    assert freply.meta.get('reply_to') == f.uuid
    assert freply.kind == Kind.RESPONSE