def main(config_file): notify2.init("pa-client") with open(config_file) as cfg: config = yaml.load(cfg) poller = Poller() addr = (config['server']['host'], config['server']['port']) pipe = config['client']['pipe'] cleanup(pipe) os.mkfifo(pipe) open_pipe(pipe, poller) atexit.register(cleanup, pipe) atexit.register(poller.close_all) up = connect(addr, poller) try: while True: for data, channel in poller.poll(): if channel == up: handle_pa_message(data) else: if data: t, msg = data.split(b':') if t == b'message': if not msg.endswith(b'\n'): msg += b'\n' up.write(msg) elif t == b'event': msg = msg.strip() if msg == b"presence" and up is None: up = connect(addr, poller) elif msg == b'gone' and up is not None: poller.unregister(up) up.close() up = None else: open_pipe(pipe, poller) except KeyboardInterrupt: exit(0)
class PollerTest(unittest.TestCase): def setUp(self): self._poller = Poller() def tearDown(self): self._poller.close_all() def test_blocking_poll(self): with self.assertRaisesRegex(Exception, "timeout"), timeout(0.02): self._poller.poll() def test_timed_poll(self): with timeout(0.02): result = self._poller.poll(0.01) self.assertEqual(list(result), []) def test_timed_out_poll(self): with self.assertRaisesRegex(Exception, "timeout"), timeout(0.02): self._poller.poll(0.03) def test_poll_data(self): chan = TestChannel() self._poller.register(chan) chan.put(b'hello\n') with timeout(0.02): result = self._poller.poll() self.assertEqual(list(result), [(b'hello\n', chan)]) def test_poll_no_data(self): chan = TestChannel() self._poller.register(chan) with timeout(0.02): result = self._poller.poll(0.01) self.assertEqual(list(result), []) def test_poll_accept(self): client, cl_chan = _connect_and_get_client_channel(self, self._poller) client.send(b'hello\n') result = self._poller.poll(0.01) self.assertEqual(list(result), [(b'hello\n', cl_chan)]) def test_close_all_channels(self): chan = TestChannel() self._poller.register(chan) self._poller.close_all() with self.assertRaises(EndpointClosedException): chan.read() def test_close_all_servers(self): serv = socket.socket() serv.bind(('127.0.0.1', 0)) serv.listen(0) self.addCleanup(serv.close) self._poller.add_server(serv) self._poller.close_all() with timeout(0.01), self.assertRaises(OSError): serv.accept() def test_unregister(self): chan = TestChannel() self._poller.register(chan) chan.put(b'hello\n') self._poller.unregister(chan) with self.assertRaisesRegex(Exception, "timeout"), timeout(0.02): self._poller.poll() def test_unregister_twice(self): chan = TestChannel() self._poller.register(chan) chan.put(b'hello\n') self._poller.unregister(chan) self._poller.unregister(chan) def test_closed(self): chan = TestChannel() self._poller.register(chan) chan.close() with timeout(0.01): result = self._poller.poll() self.assertEquals(result, [(b'', chan)]) def test_disconnect(self): client, cl_chan = _connect_and_get_client_channel(self, self._poller) client.close() result = list(self._poller.poll(0.01)) self.assertEqual(result, [(b'', cl_chan)]) def test_unregister_on_disconnect(self): client, cl_chan = _connect_and_get_client_channel(self, self._poller) client.close() self._poller.poll(0.01) result = list(self._poller.poll(0.01)) self.assertEqual(result, [])