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'
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
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()
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()
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()
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()
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
def test_messagePackRanges(input, expected): assert Message(0, 0, input, None, 0, '').pack_ranges().encode('hex') == expected.encode('hex')
def test_messagePackFailure(): m = Message(0, 0, [], None, 0, '\0' * 1025) with pytest.raises(ValueError): m.pack_data()
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')
def test_receivingData(messageTransport): t = messageTransport t._parseMessage(t._now(), Message(1, 0, [], None, 0, 'hi').pack()) assert t._protocol.data == 'hi'
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
def test_sendingData(messageTransport): t = messageTransport t.write('hi') runUntilNext(t._clock) assert t._sendMessage.captured[0] == Message(1, 0, [], None, 0, 'hi')
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, '')