示例#1
0
 def test_close(self):
     sock = ListenSocket()
     sock.bind(('localhost', 80))
     sock.listen(5)
     sock.close()
     with self.assertRaises(OSError):
         sock.accept()
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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'])
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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)
示例#9
0
 def test_listen_ok(self):
     sock = ListenSocket()
     sock.bind(('localhost', 80))
     sock.listen(5)
     c, _ = sock.accept()
     self.assertIsInstance(c, MockSocket)
示例#10
0
 def test_no_listen(self):
     s = ListenSocket()
     s.bind(('localhost', 80))
     with self.assertRaises(OSError):
         s.accept()
示例#11
0
 def test_no_bind(self):
     s = ListenSocket()
     with self.assertRaises(OSError):
         s.listen(2)