def __init__(self, manager, local_addr, remote_addr): """ Initialize a Tendril. :param manager: The TendrilManager responsible for the Tendril. :param local_addr: The address of the local end of the connection represented by the Tendril. :param remote_addr: The address of the remote end of the connection represented by the Tendril. """ self.manager = manager self.local_addr = local_addr self.remote_addr = remote_addr self._application = None # Set the initial framer f = self.default_framer() self._send_framer = f self._recv_framer = f # Set up state for the framer self._send_framer_state = framers.FrameState() self._recv_framer_state = framers.FrameState()
def test_reset(self): state = framers.FrameState() state.recv_buf = 'foobar' state.send_buf = [1, 2, 3] state._other.update(a=1, b=2, c=3) mock_framer = mock.Mock() state._reset(mock_framer) self.assertEqual(state.recv_buf, 'foobar') self.assertEqual(state.send_buf, [1, 2, 3]) self.assertEqual(state._other, {}) self.assertEqual(state._framer_id, id(mock_framer)) mock_framer.init_state.assert_called_once_with(state) state.recv_buf += 'baz' state.send_buf.append(4) state.a = 3 state.b = 2 state.c = 1 mock_framer.reset_mock() state._reset(mock_framer) self.assertEqual(state.recv_buf, 'foobarbaz') self.assertEqual(state.send_buf, [1, 2, 3, 4]) self.assertEqual(state._other, dict(a=3, b=2, c=1)) self.assertEqual(state._framer_id, id(mock_framer)) self.assertFalse(mock_framer.init_state.called)
def test_init(self): state = framers.FrameState() self.assertEqual(state.recv_buf, '') self.assertEqual(state.send_buf, []) self.assertEqual(state._other, {}) self.assertEqual(state._framer_id, None)
def test_frameify_nocr(self): f = self.framer_class(False) s = framers.FrameState() s._reset(f) result = f.frameify(s, 'frame1\nframe2\r\n') self.assertEqual(list(result), ['frame1', 'frame2\r']) self.assertEqual(s.recv_buf, '')
def test_frameify(self): f = self.framer_class() s = framers.FrameState() s._reset(f) result = f.frameify(s, 'this is a test') self.assertEqual(list(result), ['this is a test']) self.assertEqual(s.recv_buf, '')
def test_frameify_buffered_noend(self): f = self.framer_class(prefix='zzz', begin='z', end='w', nop='a') s = framers.FrameState() s._reset(f) result = f.frameify(s, 'zzzzthis is a testzzzwzzzzdid it work?zzz') self.assertEqual(list(result), ['this is a test']) self.assertEqual(s.recv_buf, 'did it work?zzz') self.assertEqual(s._other, dict(frame_start=True))
def test_frameify_nop(self): f = self.framer_class(prefix='zzz', begin='z', end='w', nop='a') s = framers.FrameState() s._reset(f) result = f.frameify(s, 'zzzzthis is a zzzazzzzw') self.assertEqual(list(result), ['this is a zzzz']) self.assertEqual(s.recv_buf, '') self.assertEqual(s._other, self.clear_state)
def test_frameify_buffered_len(self): f = self.framer_class('<i') s = framers.FrameState() s._reset(f) result = f.frameify(s, self.make_frame('\0', 4)) self.assertEqual(list(result), []) self.assertEqual(s.recv_buf, self.make_frame('\0', 4)) self.assertEqual(s._other, self.clear_state)
def test_frameify_buffered(self): f = self.framer_class() s = framers.FrameState() s._reset(f) s.recv_buf = 'this is ' result = f.frameify(s, 'frame1\nframe2') self.assertEqual(list(result), ['this is frame1']) self.assertEqual(s.recv_buf, 'frame2')
def test_frameify_complete(self): f = self.framer_class(5) s = framers.FrameState() s._reset(f) result = f.frameify(s, '1234567890') self.assertEqual(list(result), ['12345']) self.assertEqual(s.recv_buf, '67890') self.assertEqual(s._other, dict(chunk_remaining=0))
def test_getattr(self): state = framers.FrameState() state._other.update(a=1, _b=2) self.assertEqual(state.recv_buf, '') self.assertEqual(state.send_buf, []) self.assertEqual(state.a, 1) with self.assertRaises(AttributeError): dummy = state.b with self.assertRaises(AttributeError): dummy = state._b
def test_frameify_buffered(self): f = self.framer_class(20) s = framers.FrameState() s._reset(f) s.recv_buf = '12345' result = f.frameify(s, '67890') self.assertEqual(list(result), ['1234567890']) self.assertEqual(s.recv_buf, '') self.assertEqual(s._other, dict(chunk_remaining=10))
def test_frameify_buffered(self): f = self.framer_class('!B') s = framers.FrameState() s._reset(f) s.recv_buf = self.make_frame('sp', 5) result = f.frameify(s, ''.join(['am1', self.make_frame('sp', 5)])) self.assertEqual(list(result), ['spam1']) self.assertEqual(s.recv_buf, 'sp') self.assertEqual(s._other, dict(frame_len=5))
def test_setattr(self): state = framers.FrameState() state.recv_buf = 'foobar' state.send_buf = [1, 2, 3] state._framer_id = 'foo' state.a = 1 self.assertEqual(state.recv_buf, 'foobar') self.assertEqual(state.send_buf, [1, 2, 3]) self.assertEqual(state._framer_id, 'foo') self.assertEqual(state._other, dict(a=1))
def test_frameify_fractured(self): f = self.framer_class('!B') s = framers.FrameState() s._reset(f) frame = self.make_frame('spam', 4) s.frame_len = 4 result = f.frameify(s, frame[1:]) self.assertEqual(list(result), ['spam']) self.assertEqual(s.recv_buf, '') self.assertEqual(s._other, self.clear_state)
def check_init_state(self, *args, **kwargs): # Instantiate the framer... f = self.framer_class(*args, **kwargs) # Get a frame state state = framers.FrameState() state._reset(f) # Confirm the state is correct self.assertEqual(state.recv_buf, '') self.assertEqual(state.send_buf, []) self.assertEqual(state._other, self.clear_state)
def test_frameify_buffered(self): f = self.framer_class() s = framers.FrameState() s._reset(f) s.recv_buf = '\xff' + ''.join(chr(i) for i in range(1, 255)) result = f.frameify(s, '\x02\xff\x00\x01\x01') self.assertEqual(list(result), [ ''.join(chr(i) for i in range(1, 256)), ]) self.assertEqual(s.recv_buf, '\x01\x01') self.assertEqual(s._other, self.clear_state)
def test_delattr(self): state = framers.FrameState() state._other.update(a=1, _b=2) with self.assertRaises(AttributeError): del state.recv_buf with self.assertRaises(AttributeError): del state.send_buf with self.assertRaises(AttributeError): del state._b del state.a self.assertEqual(state._other, dict(_b=2)) with self.assertRaises(AttributeError): del state.a
def test_frameify(self): f = self.framer_class('!B') s = framers.FrameState() s._reset(f) result = f.frameify( s, ''.join([ self.make_frame('frame1'), self.make_frame('frame2'), ])) self.assertEqual(list(result), ['frame1', 'frame2']) self.assertEqual(s.recv_buf, '') self.assertEqual(s._other, self.clear_state)
def test_frameify_zpe_buffered(self): f = self.framer_class(True) s = framers.FrameState() s._reset(f) s.recv_buf = '\xe0' + ''.join(chr(i) for i in range(1, 224)) result = f.frameify( s, '\x21' + ''.join(chr(i) for i in range(224, 256)) + '\x00\xe1') self.assertEqual(list(result), [ ''.join(chr(i) for i in range(1, 256)), ]) self.assertEqual(s.recv_buf, '\xe1') self.assertEqual(s._other, self.clear_state)
def check_interrupt(self, stream, frame, rest, *args, **kwargs): # Instantiate the framer... f = self.framer_class(*args, **kwargs) # Also need a frame state state = framers.FrameState() state._reset(f) # Set up the generator gen = f.frameify(state, stream) # Get one frame fr1 = gen.next() self.assertEqual(fr1, frame) # Interrupt the framer with self.assertRaises(StopIteration): gen.throw(framers.FrameSwitch()) self.assertEqual(state.recv_buf, rest)
def check_composition(self, frames, *args, **kwargs): # Instantiate the framer... f = self.framer_class(*args, **kwargs) # Also need a frame state state = framers.FrameState() state._reset(f) # Convert the incoming frames into a stream stream = '' for frame in frames: stream += f.streamify(state, frame) # Now go the other way gen = f.frameify(state, stream) self.assertTrue(inspect.isgenerator(gen)) results = list(gen) # Confirm that the state has been reset self.assertEqual(state.recv_buf, '') self.assertEqual(state.send_buf, []) self.assertEqual(state._other, self.clear_state) self.assertEqual(frames, results)