Esempio n. 1
0
def test_receivingOverlappingFragmentedData(messageTransport):
    t = messageTransport
    t._parseMessage(t._now(), Message(3, 0, [], None, 5, '2111').pack())
    assert t._protocol.data == ''
    t._parseMessage(t._now(), Message(2, 0, [], None, 2, '32221').pack())
    assert t._protocol.data == ''
    t._parseMessage(t._now(), Message(1, 0, [], None, 0, '3332').pack())
    assert t._protocol.data == '333222111'
Esempio n. 2
0
def test_emptyingTheMessageQueueWaitsForAWhile(messageTransport):
    t = messageTransport
    t.write('hi')
    t._clock.pump([1, 10])
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 2)], None, 0, '').pack())
    t._clock.advance(10)
    assert len(t._sendMessage.captured) == 2
    assert nextCallIn(t._clock) == 60
Esempio n. 3
0
def test_closeDeferredFiresAfterSendingData(messageTransport):
    t = messageTransport
    t.write('hello')
    t.write('world')
    d = t.loseConnection()
    fired = []
    d.addCallback(fired.append)
    assert not fired
    t._clock.pump([1, 1, 1])
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 1)], None, 0, '').pack())
    assert not fired
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 6)], None, 0, '').pack())
    assert not fired
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 11)], None, 0, '').pack())
    assert fired[0] == t._now()
Esempio n. 4
0
def test_closeDeferredFires(messageTransport):
    t = messageTransport
    d = t.loseConnection()
    fired = []
    d.addCallback(fired.append)
    assert not fired
    t._clock.advance(1)
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 1)], None, 0, '').pack())
    assert fired[0] == t._now()
Esempio n. 5
0
def test_writeDeferredFires(messageTransport):
    t = messageTransport
    d = t.write('hi')
    fired = []
    d.addCallback(fired.append)
    assert not fired
    runUntilNext(t._clock)
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 2)], None, 0, '').pack())
    assert fired[0] == t._now()
Esempio n. 6
0
def test_writeDeferredFiresSendingLotsOfData(messageTransport):
    t = messageTransport
    d = t.write('hi' * 1023)
    fired = []
    d.addCallback(fired.append)
    assert not fired
    t._clock.pump([1, 1])
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 2)], None, 0, '').pack())
    assert not fired
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 1024)], None, 0, '').pack())
    assert not fired
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 2045)], None, 0, '').pack())
    assert not fired
    t._parseMessage(t._now(),
                    Message(0, 1, [halfOpen(0, 2046)], None, 0, '').pack())
    assert fired[0] == t._now()
Esempio n. 7
0
    def _sendAMessage(self, ack=None):
        now = self._now()
        nextActionIn = None
        message = Message(
            id=self._counter,
            previousID=0,
            ranges=list(self._received)[:6],
            resolution=None,
            dataPos=0,
            data='',
        )

        if ack is not None:
            message = message._replace(id=0, previousID=ack)
        elif self._messageQueue:
            _, _, qd = heapq.heappop(self._messageQueue)
            self._enqueuedMessages.remove(qd)
            message = qd.fillInMessage(message)
            self._counter += 1
            if qd.sentAt:
                self._congestion.timedOut(now)
                self._sentMessageAt.pop(qd.messageIDs[-1], None)
            elif self._congestion.window is not None and self._outstandingMessages > self._congestion.window:
                self._enqueue(1, qd)
                return
            else:
                self._outstandingMessages += 1
            qd.sentAt.append(now)
            qd.messageIDs.append(message.id)
            self._sentMessages.add(qd)
            self._reschedule(qd)
        else:
            return 60

        self._sendMessage(message)
        return nextActionIn
Esempio n. 8
0
    def _sendAMessage(self, ack=None):
        now = self._now()
        nextActionIn = None
        message = Message(
            id=self._counter,
            previousID=0,
            ranges=list(self._received)[:6],
            resolution=None,
            dataPos=0,
            data='',
        )

        if ack is not None:
            message = message._replace(id=0, previousID=ack)
        elif self._messageQueue:
            _, _, qd = heapq.heappop(self._messageQueue)
            self._enqueuedMessages.remove(qd)
            message = qd.fillInMessage(message)
            self._counter += 1
            if qd.sentAt:
                self._congestion.timedOut(now)
                self._sentMessageAt.pop(qd.messageIDs[-1], None)
            elif self._congestion.window is not None and self._outstandingMessages > self._congestion.window:
                self._enqueue(1, qd)
                return
            else:
                self._outstandingMessages += 1
            qd.sentAt.append(now)
            qd.messageIDs.append(message.id)
            self._sentMessages.add(qd)
            self._reschedule(qd)
        else:
            return 60

        self._sendMessage(message)
        return nextActionIn
Esempio n. 9
0
def test_messagePackRanges(input, expected):
    assert Message(0, 0, input, None, 0,
                   '').pack_ranges().encode('hex') == expected.encode('hex')
Esempio n. 10
0
def test_messagePackFailure():
    m = Message(0, 0, [], None, 0, '\0' * 1025)
    with pytest.raises(ValueError):
        m.pack_data()
Esempio n. 11
0
import pytest

from spiral.curvecp._pynacl.message import Message
from spiral.curvecp._pynacl.interval import halfOpen

messagePackPairs = [
    (Message(0, 0, [], None, 0, ''), '\0' * 202),
    (Message(0, 0, [], 'success', 0, ''), '\0\10' + '\0' * 200),
    (Message(0, 0, [], 'failure', 0, ''), '\0\20' + '\0' * 200),
    (Message(0, 0, [], None, 0, '\1'), '\1\0' + '\0' * 199 + '\1'),
    (Message(0, 0, [], None, 0, '\0' * 193), '\xc1\0' + '\0' * 328),
    (Message(0, 0, [], None, 0,
             '\1' * 193), '\xc1\0' + '\0' * 135 + '\1' * 193),
    (Message(0, 0, [], None, 0, '\0' * 321), '\x41\1' + '\0' * 584),
    (Message(0, 0, [], None, 0,
             '\1' * 321), '\x41\1' + '\0' * 263 + '\1' * 321),
    (Message(0, 0, [], None, 0, '\0' * 577), '\x41\2' + '\0' * 1032),
    (Message(0, 0, [], None, 0,
             '\1' * 577), '\x41\2' + '\0' * 455 + '\1' * 577),
    (Message(0, 0, [], None, 0, '\1' * 1024), '\0\4' + '\0' * 8 + '\1' * 1024),
    (Message(0, 0, [], 'success', 0,
             '\1' * 1024), '\0\14' + '\0' * 8 + '\1' * 1024),
    (Message(0, 0, [], 'failure', 0,
             '\1' * 1024), '\0\24' + '\0' * 8 + '\1' * 1024),
]


@pytest.mark.parametrize(('input', 'expected'), messagePackPairs)
def test_messagePack(input, expected):
    assert input.pack_data().encode('hex') == expected.encode('hex')
Esempio n. 12
0
def test_receivingData(messageTransport):
    t = messageTransport
    t._parseMessage(t._now(), Message(1, 0, [], None, 0, 'hi').pack())
    assert t._protocol.data == 'hi'
Esempio n. 13
0
def test_readConnectionClosesAfterAllDataIsRead(messageTransport):
    t = messageTransport
    t._parseMessage(t._now(), Message(1, 0, [], 'success', 4, '').pack())
    assert not t._protocol.readsClosed
    t._parseMessage(t._now(), Message(2, 0, [], None, 0, 'spam').pack())
    assert t._protocol.readsClosed
Esempio n. 14
0
def test_sendingData(messageTransport):
    t = messageTransport
    t.write('hi')
    runUntilNext(t._clock)
    assert t._sendMessage.captured[0] == Message(1, 0, [], None, 0, 'hi')
Esempio n. 15
0
def test_ack(messageTransport):
    t = messageTransport
    t._parseMessage(t._now(), Message(1, 0, [], None, 0, 'hi').pack())
    runUntilNext(t._clock)
    assert t._sendMessage.captured[0] == Message(0, 1, [halfOpen(0, 2)], None,
                                                 0, '')
Esempio n. 16
0
def test_messagePackFailure():
    m = Message(0, 0, [], None, 0, '\0' * 1025)
    with pytest.raises(ValueError):
        m.pack_data()