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 == []
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")
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")
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))
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