예제 #1
0
def start_client(host, port):
    #replace exit (see comments on method)
    #note that this does not work in jython!!! (sys method can't be replaced).
    sys.exit = do_exit

    from pydev_console.pydev_protocol import PythonConsoleBackendService, PythonConsoleFrontendService

    enable_thrift_logging()

    client_service = PythonConsoleFrontendService

    client, server_transport = make_rpc_client(client_service, host, port)

    interpreter = InterpreterInterface(threading.currentThread(),
                                       rpc_client=client)

    # we do not need to start the server in a new thread because it does not need to accept a client connection, it already has it

    # Tell UMD the proper default namespace
    _set_globals_function(interpreter.get_namespace)

    server_service = PythonConsoleBackendService

    # `InterpreterInterface` implements all methods required for the handler
    server_handler = interpreter

    start_rpc_server(server_transport, server_service, server_handler)

    process_exec_queue(interpreter)
예제 #2
0
    def test_server(self):
        self.original_stdout = sys.stdout
        sys.stdout = pydevd_io.IOBuf()
        try:
            from _pydev_bundle.pydev_localhost import get_socket_name
            host, port = get_socket_name(close=True)

            class ServerThread(threading.Thread):
                def __init__(self, backend_port):
                    threading.Thread.__init__(self)
                    self.backend_port = backend_port

                def run(self):
                    from _pydev_bundle import pydev_localhost
                    pydevconsole.start_server(self.backend_port)

            server_thread = ServerThread(port)
            server_thread.daemon = True
            server_thread.start()

            import time
            time.sleep(1)  #let's give it some time to start the threads

            rpc_client, server_transport = make_rpc_client(
                PythonConsoleBackendService, host, port)

            server_service = PythonConsoleFrontendService

            server_handler = self.create_frontend_handler()

            start_rpc_server(server_transport, server_service, server_handler)

            rpc_client.execLine('class Foo:')
            rpc_client.execLine('    pass')
            rpc_client.execLine('')
            rpc_client.execLine('foo = Foo()')
            rpc_client.execLine('a = %s()' % (raw_input_name, ))
            rpc_client.execLine('print (a)')
            initial = time.time()
            while not server_handler.requested_input:
                if time.time() - initial > 2:
                    raise AssertionError(
                        'Did not get the return asked before the timeout.')
                time.sleep(.1)

            found = sys.stdout.getvalue()
            while ['input_request'] != found.split():
                found += sys.stdout.getvalue()
                if time.time() - initial > 2:
                    break
                time.sleep(.1)
            self.assertIn('input_request', found.split())
        finally:
            sys.stdout = self.original_stdout
    def start_client_thread(self):
        from _pydev_bundle import pydev_localhost

        enable_thrift_logging()

        # here we start the test server
        server_socket = start_rpc_server_and_make_client(pydev_localhost.get_localhost(), 0,
                                                         PythonConsoleFrontendService,
                                                         PythonConsoleBackendService,
                                                         create_server_handler_factory(self.create_frontend_handler()))

        host, port = server_socket.getsockname()

        import time
        time.sleep(1)

        rpc_client, _ = make_rpc_client(PythonConsoleFrontendService, host, port)

        return rpc_client
    def test_edit(self):
        ''' Make sure we can issue an edit command'''
        if os.environ.get('TRAVIS') == 'true':
            # This test is too flaky on travis.
            return

        from _pydev_bundle.pydev_ipython_console_011 import get_pydev_ipython_frontend
        from _pydev_comm.pydev_rpc import start_rpc_server_and_make_client

        called_RequestInput = [False]
        called_IPythonEditor = [False]

        class RequestInputHandler:
            def __init__(self):
                self.rpc_client = None

            def requestInput(self, path):
                called_RequestInput[0] = True
                return '\n'

            def IPythonEditor(self, name, line):
                called_IPythonEditor[0] = (name, line)
                return True

        enable_thrift_logging()

        # here we start the test server
        server_socket = start_rpc_server_and_make_client(
            get_localhost(), 0, PythonConsoleFrontendService,
            PythonConsoleBackendService,
            create_server_handler_factory(RequestInputHandler()))

        host, port = server_socket.getsockname()

        rpc_client, _ = make_rpc_client(PythonConsoleFrontendService, host,
                                        port)

        # PyDevFrontEnd depends on singleton in IPython, so you
        # can't make multiple versions. So we reuse self.front_end for
        # all the tests
        self.front_end = get_pydev_ipython_frontend(rpc_client)

        orig_stdin = sys.stdin
        sys.stdin = StdIn(self, rpc_client)
        try:
            filename = 'made_up_file.py'
            self.add_exec('%edit ' + filename)

            for i in xrange(10):
                if called_IPythonEditor[0] == (os.path.abspath(filename), '0'):
                    break
                time.sleep(.1)

            if not called_IPythonEditor[0]:
                #   File "/home/travis/miniconda/lib/python3.3/site-packages/IPython/core/interactiveshell.py", line 2883, in run_code
                #     exec(code_obj, self.user_global_ns, self.user_ns)
                #   File "<ipython-input-15-09583ca3bce1>", line 1, in <module>
                #     get_ipython().magic('edit made_up_file.py')
                #   File "/home/travis/miniconda/lib/python3.3/site-packages/IPython/core/interactiveshell.py", line 2205, in magic
                #     return self.run_line_magic(magic_name, magic_arg_s)
                #   File "/home/travis/miniconda/lib/python3.3/site-packages/IPython/core/interactiveshell.py", line 2126, in run_line_magic
                #     result = fn(*args,**kwargs)
                #   File "<string>", line 2, in edit
                #   File "/home/travis/miniconda/lib/python3.3/site-packages/IPython/core/magic.py", line 193, in <lambda>
                #     call = lambda f, *a, **k: f(*a, **k)
                #   File "/home/travis/miniconda/lib/python3.3/site-packages/IPython/core/magics/code.py", line 662, in edit
                #     self.shell.hooks.editor(filename,lineno)
                #   File "/home/travis/build/fabioz/PyDev.Debugger/pydev_ipython_console_011.py", line 70, in call_editor
                #     server.IPythonEditor(filename, str(line))
                #   File "/home/travis/miniconda/lib/python3.3/xmlrpc/client.py", line 1090, in __call__
                #     return self.__send(self.__name, args)
                #   File "/home/travis/miniconda/lib/python3.3/xmlrpc/client.py", line 1419, in __request
                #     verbose=self.__verbose
                #   File "/home/travis/miniconda/lib/python3.3/xmlrpc/client.py", line 1132, in request
                #     return self.single_request(host, handler, request_body, verbose)
                #   File "/home/travis/miniconda/lib/python3.3/xmlrpc/client.py", line 1143, in single_request
                #     http_conn = self.send_request(host, handler, request_body, verbose)
                #   File "/home/travis/miniconda/lib/python3.3/xmlrpc/client.py", line 1255, in send_request
                #     self.send_content(connection, request_body)
                #   File "/home/travis/miniconda/lib/python3.3/xmlrpc/client.py", line 1285, in send_content
                #     connection.endheaders(request_body)
                #   File "/home/travis/miniconda/lib/python3.3/http/client.py", line 1061, in endheaders
                #     self._send_output(message_body)
                #   File "/home/travis/miniconda/lib/python3.3/http/client.py", line 906, in _send_output
                #     self.send(msg)
                #   File "/home/travis/miniconda/lib/python3.3/http/client.py", line 844, in send
                #     self.connect()
                #   File "/home/travis/miniconda/lib/python3.3/http/client.py", line 822, in connect
                #     self.timeout, self.source_address)
                #   File "/home/travis/miniconda/lib/python3.3/socket.py", line 435, in create_connection
                #     raise err
                #   File "/home/travis/miniconda/lib/python3.3/socket.py", line 426, in create_connection
                #     sock.connect(sa)
                # ConnectionRefusedError: [Errno 111] Connection refused

                # I.e.: just warn that the test failing, don't actually fail.
                sys.stderr.write(
                    'Test failed: this test is brittle in travis because sometimes the connection is refused (as above) and we do not have a callback.\n'
                )
                return

            eq_(called_IPythonEditor[0], (os.path.abspath(filename), '0'))
            assert called_RequestInput[
                0], "Make sure the 'wait' parameter has been respected"
        finally:
            sys.stdin = orig_stdin