Пример #1
0
    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()
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
    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, '')
Пример #5
0
    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, '')
Пример #6
0
    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))
Пример #7
0
    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)
Пример #8
0
    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)
Пример #9
0
    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')
Пример #10
0
    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))
Пример #11
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
Пример #12
0
    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))
Пример #13
0
    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))
Пример #14
0
    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))
Пример #15
0
    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)
Пример #16
0
    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)
Пример #17
0
    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)
Пример #18
0
    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
Пример #19
0
    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)
Пример #20
0
    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)
Пример #21
0
    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)
Пример #22
0
    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)