Пример #1
0
    def testMsgWaitallProblems2(self):
        class ReceiveThread(threading.Thread):
            def __init__(self, sock, sizes):
                super(ReceiveThread, self).__init__()
                self.sock = sock
                self.sizes = sizes

            def run(self):
                cs, _ = self.sock.accept()
                for size in self.sizes:
                    data = socketutil.receive_data(cs, size)
                    socketutil.send_data(cs, data)
                cs.close()

        ss = socketutil.create_socket(bind=("localhost", 0))
        SIZES = [
            1000, 10000, 32000, 32768, 32780, 41950, 41952, 42000, 65000,
            65535, 65600, 80000, 999999
        ]
        serverthread = ReceiveThread(ss, SIZES)
        serverthread.setDaemon(True)
        serverthread.start()
        port = ss.getsockname()[1]
        cs = socketutil.create_socket(connect=("localhost", port), timeout=2)
        # test some sizes that might be problematic with MSG_WAITALL and check that they work fine
        for size in SIZES:
            socketutil.send_data(cs, b"x" * size)
            data = socketutil.receive_data(cs, size)
            assert size == len(data)
        serverthread.join()
        ss.close()
        cs.close()
Пример #2
0
 def testCreateBoundSockets(self):
     s = socketutil.create_socket(bind=('127.0.0.1', 0))
     assert socket.AF_INET == s.family
     bs = socketutil.create_bc_socket(bind=('127.0.0.1', 0))
     assert '127.0.0.1' == s.getsockname()[0]
     assert '127.0.0.1' == bs.getsockname()[0]
     s.close()
     bs.close()
     with pytest.raises(ValueError):
         socketutil.create_socket(bind=('localhost', 12345),
                                  connect=('localhost', 1234))
Пример #3
0
 def testCreateBoundSockets6(self):
     if not has_ipv6:
         pytest.skip("no ipv6 capability")
     s = socketutil.create_socket(bind=('::1', 0))
     assert socket.AF_INET6 == s.family
     bs = socketutil.create_bc_socket(bind=('::1', 0))
     assert ':' in s.getsockname()[0]
     assert ':' in bs.getsockname()[0]
     s.close()
     bs.close()
     with pytest.raises(ValueError):
         socketutil.create_socket(bind=('::1', 12345),
                                  connect=('::1', 1234))
Пример #4
0
 def testSend(self):
     ss = socketutil.create_socket(bind=("localhost", 0))
     port = ss.getsockname()[1]
     cs = socketutil.create_socket(connect=("localhost", port))
     socketutil.send_data(cs, b"foobar!" * 10)
     cs.shutdown(socket.SHUT_WR)
     a = ss.accept()
     data = socketutil.receive_data(a[0], 5)
     assert b"fooba" == data
     data = socketutil.receive_data(a[0], 5)
     assert b"r!foo" == data
     a[0].close()
     ss.close()
     cs.close()
Пример #5
0
 def testCreateBoundUnixSockets(self):
     if not hasattr(socket, "AF_UNIX"):
         pytest.skip("no unix domain sockets capability")
     SOCKNAME = "test_unixsocket"
     if os.path.exists(SOCKNAME):
         os.remove(SOCKNAME)
     s = socketutil.create_socket(bind=SOCKNAME)
     assert socket.AF_UNIX == s.family
     assert SOCKNAME == s.getsockname()
     s.close()
     if os.path.exists(SOCKNAME):
         os.remove(SOCKNAME)
     with pytest.raises(ValueError):
         socketutil.create_socket(bind=SOCKNAME, connect=SOCKNAME)
Пример #6
0
 def testContextAndSock(self):
     cert_dir = "../../certs"
     if not os.path.isdir(cert_dir):
         cert_dir = "../certs"
         if not os.path.isdir(cert_dir):
             cert_dir = "./certs"
             if not os.path.isdir(cert_dir):
                 raise IOError("cannot locate test certs directory")
     try:
         config.SSL = True
         config.SSL_REQUIRECLIENTCERT = True
         server_ctx = socketutil.get_ssl_context(
             cert_dir + "/server_cert.pem", cert_dir + "/server_key.pem")
         client_ctx = socketutil.get_ssl_context(
             clientcert=cert_dir + "/client_cert.pem",
             clientkey=cert_dir + "/client_key.pem")
         assert server_ctx.verify_mode == ssl.CERT_REQUIRED
         assert client_ctx.verify_mode == ssl.CERT_REQUIRED
         assert client_ctx.check_hostname
         sock = socketutil.create_socket(sslContext=server_ctx)
         try:
             assert hasattr(sock, "getpeercert")
         finally:
             sock.close()
     finally:
         config.SSL = False
Пример #7
0
 def testAbstractNamespace(self):
     if not hasattr(socket,
                    "AF_UNIX") and not sys.platform.startswith("linux"):
         pytest.skip("no unix domain sockets capability, and not Linux")
     SOCKNAME = "\0test_unixsocket_abstract_ns"  # mind the \0 at the start
     s = socketutil.create_socket(bind=SOCKNAME)
     assert bytes(SOCKNAME, "ascii") == s.getsockname()
     s.close()
Пример #8
0
 def testMsgWaitallProblems(self):
     ss = socketutil.create_socket(bind=("localhost", 0), timeout=2)
     port = ss.getsockname()[1]
     cs = socketutil.create_socket(connect=("localhost", port), timeout=2)
     a = ss.accept()
     # test some sizes that might be problematic with MSG_WAITALL and check that they work fine
     for size in [
             1000, 10000, 32000, 32768, 32780, 41950, 41952, 42000, 65000,
             65535, 65600, 80000
     ]:
         socketutil.send_data(cs, b"x" * size)
         data = socketutil.receive_data(a[0], size)
         socketutil.send_data(a[0], data)
         data = socketutil.receive_data(cs, size)
         assert size == len(data)
     a[0].close()
     ss.close()
     cs.close()
Пример #9
0
 def testSendUnix(self):
     if not hasattr(socket, "AF_UNIX"):
         pytest.skip("no unix domain sockets capability")
     SOCKNAME = "test_unixsocket"
     if os.path.exists(SOCKNAME):
         os.remove(SOCKNAME)
     ss = socketutil.create_socket(bind=SOCKNAME)
     cs = socketutil.create_socket(connect=SOCKNAME)
     socketutil.send_data(cs, b"foobar!" * 10)
     cs.shutdown(socket.SHUT_WR)
     a = ss.accept()
     data = socketutil.receive_data(a[0], 5)
     assert b"fooba" == data
     data = socketutil.receive_data(a[0], 5)
     assert b"r!foo" == data
     a[0].close()
     ss.close()
     cs.close()
     if os.path.exists(SOCKNAME):
         os.remove(SOCKNAME)
Пример #10
0
 def testServerPoolFull(self):
     port = socketutil.find_probably_unused_port()
     serv = SocketServer_Threadpool()
     daemon = ServerCallback()
     serv.init(daemon, "localhost", port)
     serversock = serv.sock.getsockname()
     csock1 = socketutil.create_socket(connect=serversock)
     csock2 = socketutil.create_socket(connect=serversock)
     try:
         serv.events([serv.sock])
         time.sleep(0.2)
         assert daemon.received_denied_reasons == [None]
         serv.events([serv.sock])
         time.sleep(0.2)
         assert len(daemon.received_denied_reasons) == 2
         assert "no free workers, increase server threadpool size" in daemon.received_denied_reasons
     finally:
         csock1.close()
         csock2.close()
         serv.shutdown()
Пример #11
0
 def testConnectCrash(self):
     serv_thread = TestServerDOS_multiplex.ServerThread(
         self.socket_server, ServerCallback_BrokenHandshake)
     serv_thread.start()
     time.sleep(0.2)
     assert serv_thread.is_alive(), "server thread failed to start"
     threadpool = getattr(serv_thread.serv, "pool", None)
     if threadpool:
         assert len(threadpool.idle) == 1
         assert len(threadpool.busy) == 0
     try:
         host, port = serv_thread.locationStr.split(':')
         port = int(port)
         try:
             # first connection attempt (will fail because server daemon _handshake crashes)
             csock = socketutil.create_socket(connect=(host, port))
             conn = socketutil.SocketConnection(csock, "uri")
             protocol.recv_stub(conn, [protocol.MSG_CONNECTOK])
         except errors.ConnectionClosedError:
             pass
         conn.close()
         time.sleep(0.1)
         if threadpool:
             assert len(threadpool.idle) == 1
             assert len(threadpool.busy) == 0
         try:
             # second connection attempt, should still work (i.e. server should still be running)
             csock = socketutil.create_socket(connect=(host, port))
             conn = socketutil.SocketConnection(csock, "uri")
             protocol.recv_stub(conn, [protocol.MSG_CONNECTOK])
         except errors.ConnectionClosedError:
             pass
     finally:
         if conn:
             conn.close()
         serv_thread.stop_loop.set()
         serv_thread.join()
Пример #12
0
 def testCreateUnboundSockets(self):
     s = socketutil.create_socket()
     assert socket.AF_INET == s.family
     bs = socketutil.create_bc_socket()
     assert socket.AF_INET == bs.family
     with contextlib.suppress(socket.error):
         host, port = s.getsockname()
         # can either fail with socket.error or return (host,0)
         assert 0 == port
     with contextlib.suppress(socket.error):
         host, port = bs.getsockname()
         # can either fail with socket.error or return (host,0)
         assert 0 == port
     s.close()
     bs.close()
Пример #13
0
 def testCreateUnboundSockets6(self):
     if not has_ipv6:
         pytest.skip("no ipv6 capability")
     s = socketutil.create_socket(ipv6=True)
     assert socket.AF_INET6 == s.family
     bs = socketutil.create_bc_socket(ipv6=True)
     assert socket.AF_INET6 == bs.family
     with contextlib.suppress(socket.error):
         host, port, _, _ = s.getsockname()
         # can either fail with socket.error or return (host,0)
         assert 0 == port
     with contextlib.suppress(socket.error):
         host, port, _, _ = bs.getsockname()
         # can either fail with socket.error or return (host,0)
         assert 0 == port
     s.close()
     bs.close()
Пример #14
0
 def connect(host, port):
     # connect to the server
     csock = socketutil.create_socket(connect=(host, port))
     conn = socketutil.SocketConnection(csock, "uri")
     # send the handshake/connect data
     ser = serializers.serializers_by_id[
         serializers.MarshalSerializer.serializer_id]
     data = ser.dumps({
         "handshake": "hello",
         "object": core.DAEMON_NAME
     })
     msg = protocol.SendingMessage(
         protocol.MSG_CONNECT, 0, 0,
         serializers.MarshalSerializer.serializer_id, data)
     conn.send(msg.data)
     # get the handshake/connect response
     protocol.recv_stub(conn, [protocol.MSG_CONNECTOK])
     return conn
Пример #15
0
 def testCreateUnboundSockets(self):
     s = socketutil.create_socket()
     assert socket.AF_INET == s.family
     bs = socketutil.create_bc_socket()
     assert socket.AF_INET == bs.family
     try:
         host, port = s.getsockname()
         # can either fail with socket.error or return (host,0)
         assert 0 == port
     except socket.error:
         pass
     try:
         host, port = bs.getsockname()
         # can either fail with socket.error or return (host,0)
         assert 0 == port
     except socket.error:
         pass
     s.close()
     bs.close()