Ejemplo n.º 1
0
def test_direct():
    s = Accum('direct://', name='server', context=ctx)
    c = Accum('direct://', name='client', master=s, context=ctx)

    assert s.dcaps == 0

    s.open()
    assert s.dcaps == 0

    s.post(b'xxx', seq=10)

    assert c.result == []
    assert s.result == []
    assert s.dcaps == 0

    c.open()
    assert c.dcaps == 0

    s.post(b'yyy', seq=20)
    assert [(m.data.tobytes(), m.seq) for m in c.result] == [(b'yyy', 20)]
    assert s.result == []

    c.post(b'yyy', seq=21)
    assert [(m.data.tobytes(), m.seq) for m in c.result] == [(b'yyy', 20)]
    assert [(m.data.tobytes(), m.seq) for m in s.result] == [(b'yyy', 21)]

    c.close()
    c.result = []
    s.result = []

    s.post(b'yyy', seq=20)
    assert c.result == []
    assert s.result == []
Ejemplo n.º 2
0
def test():
    ctx = C.Context()

    with pytest.raises(TLLError):
        ctx.Channel("echo://;name=echo")
    ctx.register(Echo)
    c = Accum("echo://;name=echo", context=ctx)
    cfg = c.config

    pyc = C.channel_cast(c)
    assert isinstance(pyc, Echo)

    pyc = C.channel_cast(c, Echo)
    assert isinstance(pyc, Echo)

    with pytest.raises(TypeError):
        C.channel_cast(c, TestPrefix)

    assert c.state == c.State.Closed
    assert cfg.get("state", "") == "Closed"
    assert [x.name for x in c.children] == []

    c.open()

    assert [x.name for x in c.children] == ['child', 'orphan']

    with pytest.raises(TypeError):
        C.channel_cast(c.children[0])

    assert c.state == c.State.Opening
    assert cfg.get("state", "") == "Opening"

    c.process()

    assert c.state == c.State.Active
    assert cfg.get("state", "") == "Active"

    assert c.result == []
    c.post(b'xxx', seq=100)
    assert [(m.seq, m.data.tobytes()) for m in c.result], [(100 == b'xxx')]

    c.close()
    assert [x.name for x in c.children] == ['orphan']
    assert c.state == c.State.Closing
    c.process()
    assert c.state == c.State.Closed
    del c

    assert ctx.get('orphan') == None

    ctx.unregister(Echo)
    with pytest.raises(TLLError):
        ctx.Channel("echo://;name=echo")
Ejemplo n.º 3
0
def test_prefix():
    ctx = C.Context()

    with pytest.raises(TLLError):
        ctx.Channel("prefix+null://;name=channel")
    ctx.register(Echo)
    ctx.register(TestPrefix)
    c = Accum("prefix+echo://;name=channel", context=ctx)
    cfg = c.config

    pyc = C.channel_cast(c)
    assert isinstance(pyc, TestPrefix)

    assert c.state == c.State.Closed
    assert cfg.get("state", "") == "Closed"
    assert [x.name for x in c.children] == ['channel/prefix']

    c.open()

    assert [x.name for x in c.children] == ['channel/prefix']

    assert c.state == c.State.Opening
    assert cfg.get("state", "") == "Opening"

    c.process()

    assert c.state == c.State.Opening
    assert cfg.get("state", "") == "Opening"

    c.children[0].process()

    assert c.state == c.State.Active
    assert cfg.get("state", "") == "Active"

    assert c.result == []
    c.post(b'xxx', seq=100)
    assert [(m.seq, m.data.tobytes()) for m in c.result] == [(100, b'xxx')]

    c.result = []
    c.post(b'zzz', seq=200, type=C.Type.Control, addr=0xbeef)
    assert [(m.type, m.seq, m.addr, m.data.tobytes())
            for m in c.result], [(C.Type.Control, 200, 0xbeef, b'zzz')]

    c.close()
    assert [x.name for x in c.children] == ['channel/prefix']
    del c

    ctx.unregister(TestPrefix)
    with pytest.raises(TLLError):
        ctx.Channel("prefix+null://;name=channel")
Ejemplo n.º 4
0
class TestPub:
    URL = 'pub+tcp://./pub.sock'
    CLEANUP = ['./pub.sock']

    def server(self, size='1kb', **kw):
        return Accum(self.URL, mode='server', name='server', dump='frame', size=size, context=ctx, **kw)

    def setup(self):
        self.s = self.server()
        self.c = Accum(self.URL, mode='client', name='client', dump='frame', context=ctx)

    def teardown(self):
        self.c.close()
        self.s.close()
        self.c = None
        self.s = None
        for f in self.CLEANUP:
            if os.path.exists(f):
                os.unlink(f)

    def test(self):
        s, c = self.s, self.c

        s.open()
        assert s.state == s.State.Active
        assert len(s.children) == 1
        assert s.dcaps == s.DCaps.Zero

        ss = s.children[0]
        assert ss.dcaps == ss.DCaps.Process | ss.DCaps.PollIn

        c.open()

        assert c.state == c.State.Opening
        assert len(c.children) == 0

        ss.process()
        assert len(s.children) == 2

        sc = s.children[1]
        assert sc.dcaps == sc.DCaps.Process | sc.DCaps.PollIn

        assert sc.state == c.State.Opening

        sc.process()

        assert sc.state == c.State.Active

        c.process()
        assert c.state == c.State.Active
        assert c.dcaps == c.DCaps.Process | c.DCaps.PollIn

        with pytest.raises(TLLError): s.post(b'x' * (512 - 16 + 1), seq=1) # Message larger then half of buffer

        s.post(b'xxx', seq=1, msgid=10)
        c.process()

        assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result] == [(1, 10, b'xxx')]
        c.result = []

        for i in range(2, 5):
            s.post(b'x' * i, seq=i, msgid=10)

        for i in range(2, 5):
            c.process()
            assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result[-1:]] == [(i, 10, b'x' * i)]

    def loop_open(self, s, c):
        loop = Loop()

        loop.add(s)

        s.open()
        assert s.state == s.State.Active

        c.open()

        loop.step(0) # Accept
        loop.step(0) # Handshake

        c.process()
        assert c.state == c.State.Active

        return loop

    def test_more(self):
        s, c = self.s, self.c
        loop = self.loop_open(s, c)

        s.post(b'xxx', seq=1, msgid=10, flags=s.PostFlags.More)
        c.process()

        assert c.result == []

        s.post(b'zzz', seq=2, msgid=10)

        c.process()
        assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result] == [(1, 10, b'xxx')]
        c.process()
        assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result] == [(1, 10, b'xxx'), (2, 10, b'zzz')]

    def test_eagain(self):
        self.s = None
        self.s = self.server(size='64kb', sndbuf='1kb')

        s, c = self.s, self.c
        loop = self.loop_open(s, c)

        s.post(b'xxx', seq=1, msgid=10)
        c.process()

        assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result] == [(1, 10, b'xxx')]
        c.result = []

        for i in range(2, 10):
            s.post(b'x' * 256 + b'x' * i, seq=i, msgid=10)

        for i in range(2, 5):
            c.process()
            assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result[-1:]] == [(i, 10, b'x' * 256 + b'x' * i)]

        for i in range(5, 10):
            loop.step(0)
            c.process()
            assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result[-1:]] == [(i, 10, b'x' * 256 + b'x' * i)]

    def test_overflow(self):
        self.s = None
        self.s = self.server(size='1kb', sndbuf='1kb')

        s, c = self.s, self.c
        loop = self.loop_open(s, c)

        s.post(b'xxx', seq=1, msgid=10)
        c.process()

        assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result] == [(1, 10, b'xxx')]
        c.result = []

        for i in range(2, 10):
            s.post(b'x' * 256 + b'x' * i, seq=i, msgid=10)
        loop.step(0)

        for i in range(2, 6):
            c.process()
            assert [(m.seq, m.msgid, m.data.tobytes()) for m in c.result[-1:]] == [(i, 10, b'x' * 256 + b'x' * i)]

        assert c.state == c.State.Active

        c.process()

        assert c.state == c.State.Error

    def test_many(self):
        s, c = self.s, self.c
        loop = self.loop_open(s, c)
        loop.add(c)

        for i in range(0, 1000):
            s.post(b'z' * 16 + b'x' * (i % 100), seq=i, msgid=10)
            loop.step(0)
            loop.step(0)

        assert [m.seq for m in c.result] == list(range(0, 1000))
Ejemplo n.º 5
0
class _test_udp_base:
    PROTO = 'invalid-url'
    FRAME = True
    TIMESTAMP = False
    CLEANUP = []

    def setup(self):
        self.s = Accum(self.PROTO, mode='server', name='server', dump='yes', context=ctx)
        self.c = Accum(self.PROTO, mode='client', name='client', dump='yes', context=ctx)

    def teardown(self):
        self.c.close()
        self.s.close()
        self.c = None
        self.s = None
        for f in self.CLEANUP:
            if os.path.exists(f):
                os.unlink(f)

    def test(self):
        s, c = self.s, self.c

        s.open()
        assert s.state == s.State.Active
        assert len(s.children) == 0

        spoll = select.poll()
        spoll.register(s.fd, select.POLLIN)

        assert s.state == s.State.Active
        assert s.dcaps == s.DCaps.Process | s.DCaps.PollIn

        c.open()

        cpoll = select.poll()
        cpoll.register(c.fd, select.POLLIN)

        assert c.state == c.State.Active
        assert len(c.children) == 0

        assert c.state == c.State.Active
        assert c.dcaps == c.DCaps.Process | c.DCaps.PollIn

        c.post(b'xxx', seq=0x6ead, msgid=0x6eef)
        timestamp = time.time()
        if self.TIMESTAMP:
            if c.result == []:
                assert cpoll.poll(10) != []
                c.process()
            assert [(m.seq, m.msgid) for m in c.result if m.type == m.Type.Control] == [(0, 10)]
            assert c.result[-1].time.seconds == pytest.approx(timestamp, 0.001)

        assert spoll.poll(10) != []
        s.process()

        assert [m.data.tobytes() for m in s.result] == [b'xxx']
        assert [(m.seq, m.msgid) for m in s.result] == [(0x6ead, 0x6eef) if self.FRAME else (0, 0)] # No frame

        if self.TIMESTAMP:
            assert s.result[-1].time.seconds == pytest.approx(timestamp, 0.001)

        if self.CLEANUP: return # Unix sockets don't have return address
        s.post(b'zzzz', seq=0x6eef, msgid=0x6ead, addr=s.result[0].addr)

        assert cpoll.poll(10) != []
        c.process()
        assert [m.data.tobytes() for m in c.result if m.type == m.Type.Data] == [b'zzzz']
        assert [(m.seq, m.msgid) for m in c.result if m.type == m.Type.Data] == [(0x6eef, 0x6ead) if self.FRAME else (0, 0)] # No frame