class TestConstBuffer(unittest.TestCase): def setUp(self): self.b = ConstBuffer(b'12345') def tearDown(self): del self.b def testPop(self): d1 = self.b.pop(2) d2 = self.b.pop(1) self.assertTrue(d1.called) self.assertEqual(d1.result, b'12') self.assertTrue(d2.called) self.assertEqual(d2.result, b'3') self.assertRaises(BufferUnderflowException, lambda: self.b.pop(3)) self.assertEqual(len(self.b), 2)
class StatefulDatagramProtocol(WriterMixin, ReaderMixin, StateMixin, object, DatagramProtocol): __metaclass__ = ABCMeta def __init__(self): super(StatefulDatagramProtocol, self).__init__() self.datagramDeferred = Deferred() self.writeBuffer = bytearray() @abstractmethod def stateMachine(self): return defer.Deferred() def protocolError(self, failure): txlog.err(failure) def datagramReceived(self, data, addr): self.buffer = ConstBuffer(data) if self.deferred is None: self._startSM() old_deferred = self.datagramDeferred self.datagramDeferred = Deferred() old_deferred.callback(addr) def receiveDatagram(self): return self.datagramDeferred def readBytes(self, count): return self.buffer.pop(count) def writeBytes(self, data): self.writeBuffer.extend(data) def writePacked(self, format_, *args): offset = len(self.writeBuffer) self.writeBuffer.extend(itertools.repeat(0, struct.calcsize(format_))) struct.pack_into(format_, self.writeBuffer, offset, *args) def send(self, addr=None): #if _log.isEnabledFor(logging.DEBUG): # s = str(self.writeBuffer).encode('string_escape') # _log.debug('Sending %s', s) if addr is None: self.transport.write(self.writeBuffer) else: self.transport.write(self.writeBuffer, addr=addr) self.writeBuffer = bytearray()