def test_close(self): sock = ListenSocket() sock.bind(('localhost', 80)) sock.listen(5) sock.close() with self.assertRaises(OSError): sock.accept()
def test_ctx_manager(self): c1 = MockSocket([b'foo', b'quit']) c2 = MockSocket([b'foo', b'bar', b'baz', b'fee']) s = ListenSocket((c1, c2)) sel = MockSelector([s, c1, s, c2, c2, (c1, c2), c1, c2, c2]) with sel: sel.register(s, EVENT_READ) s.bind(('localhost', 8888)) s.listen(5) while len(sel.get_map()) > 0: for k, ev in sel.select(): sock = k.fileobj if sock == s: c, _ = sock.accept() sel.register(c, EVENT_READ) else: data = sock.recv(1024) if len(data) == 0: sock.close() sel.unregister(sock) else: sock.send(data) s.close() sel.close() self.assertEqual([((b'foo', ), ), ((b'quit', ), )], c1.send.call_args_list) self.assertEqual([((b'foo', ), ), ((b'bar', ), ), ((b'baz', ), ), ((b'fee', ), )], c2.send.call_args_list)
def test_callable(self): c1 = MockSocket() c2 = MockSocket() sock = ListenSocket([c1, lambda: c2]) sock.bind(('localhost', 80)) sock.listen(5) c, _ = sock.accept() self.assertTrue(c is c1) c, _ = sock.accept() self.assertTrue(c is c2)
def test_child_list(self): c1 = MockSocket() c2 = MockSocket() self.assertFalse(c1 is c2) sock = ListenSocket([c1, c2]) sock.bind(('localhost', 80)) sock.listen(5) c, _ = sock.accept() self.assertTrue(c is c1) c, _ = sock.accept() self.assertTrue(c is c2)
def test_registry(self): c = MockSocket([b'foo']) s = ListenSocket([c]) sel = MockSelector([]) sel.register(s, EVENT_READ) sel.register(c, EVENT_READ | EVENT_WRITE, ['foo']) m = sel.get_map() self.assertEqual(2, len(m)) k = m[s] self.assertEqual(k.data, None) k = m[c] self.assertEqual(k.data, ['foo'])
def test_run(self): """ Demonstrates how to exit from a never ending loop by throwing an EndException that is caught by the MockSelector as a context manager. """ serv = miniserv.MiniServer(8888) c1 = MockSocket([b'foo', b'quit']) c2 = MockSocket([b'foo', b'bar', b'baz', b'fee']) s = ListenSocket((c1, c2)) sel = MockSelector([s, c1, s, c2, c2, (c1, c2), c1, c2, c2]) with patch('socket.socket') as socket, \ patch('miniserv.DefaultSelector') as selector: socket.return_value = s selector.return_value = sel with sel: serv.run() self.assertEqual([((b'foo',),), ((b'quit',),)], c1.send.call_args_list) self.assertEqual([((b'foo',),), ((b'bar',),), ((b'baz',),), ((b'fee',),)], c2.send.call_args_list)
def test_run_stop(self): """ Demonstrates how to use a side effect function to set a flag in a server to have it to end its loop """ def do_stop(srv): srv.stop = True return b'' serv = miniserv.MiniServer(8888) c1 = MockSocket([b'foo', b'quit']) c2 = MockSocket([b'foo', b'bar', b'baz', lambda: do_stop(serv), b'fee']) s = ListenSocket((c1, c2)) sel = MockSelector([s, c1, s, c2, c2, (c1, c2), c1, c2, c2]) with patch('socket.socket') as socket, \ patch('miniserv.DefaultSelector') as selector: socket.return_value = s selector.return_value = sel serv.run() self.assertEqual([((b'foo',),), ((b'quit',),)], c1.send.call_args_list) self.assertEqual([((b'foo',),), ((b'bar',),), ((b'baz',),)], c2.send.call_args_list)
def test_with_patch(self): import socket import selectors from unittest.mock import patch c1 = MockSocket([b'foo', b'quit']) c2 = MockSocket([b'foo', b'bar', b'baz', b'fee']) x = ListenSocket((c1, c2)) # noinspection SpellCheckingInspection xsel = MockSelector([x, c1, x, c2, c2, (c1, c2), c1, c2, c2]) with patch('socket.socket') as sock, \ patch('selectors.DefaultSelector') as selector: sock.return_value = x selector.return_value = xsel with xsel: s = socket.socket() sel = selectors.DefaultSelector() self.assertEqual(xsel, sel) sel.register(s, EVENT_READ) s.bind(('localhost', 8888)) s.listen(5) while len(sel.get_map()) > 0: for k, ev in sel.select(): sock = k.fileobj if sock == s: c, _ = sock.accept() sel.register(c, EVENT_READ) else: data = sock.recv(1024) if len(data) == 0: sock.close() sel.unregister(sock) else: sock.send(data) s.close() sel.close() self.assertEqual([((b'foo', ), ), ((b'quit', ), )], c1.send.call_args_list) self.assertEqual([((b'foo', ), ), ((b'bar', ), ), ((b'baz', ), ), ((b'fee', ), )], c2.send.call_args_list)
def test_listen_ok(self): sock = ListenSocket() sock.bind(('localhost', 80)) sock.listen(5) c, _ = sock.accept() self.assertIsInstance(c, MockSocket)
def test_no_listen(self): s = ListenSocket() s.bind(('localhost', 80)) with self.assertRaises(OSError): s.accept()
def test_no_bind(self): s = ListenSocket() with self.assertRaises(OSError): s.listen(2)