def server_url(request): if sys.platform.startswith('win'): pytest.skip('WSGI server tests are currently unsupported on Windows') server_args = request.param for attempt in range(3): server_port = testing.get_unused_port() base_url = 'http://{}:{}'.format(_SERVER_HOST, server_port) args = server_args(_SERVER_HOST, server_port) print('Starting {}...'.format(server_args.__doc__)) print(' '.join(args)) try: server = subprocess.Popen(args, cwd=_HERE) except FileNotFoundError: pytest.skip('{} executable is not installed'.format(args[0])) # NOTE(vytas): give the app server some time to start. start_time = time.time() while time.time() - start_time < _STARTUP_TIMEOUT: try: requests.get(base_url + '/hello', timeout=0.2) except (requests.exceptions.Timeout, requests.exceptions.ConnectionError): time.sleep(0.2) else: break else: if server.poll() is None: pytest.fail('Server is not responding to requests') else: # NOTE(kgriffs): The server did not start up; probably due to # the port being in use. We could check the output but # capsys fixture may not have buffered the error output # yet, so we just retry. continue yield base_url break else: pytest.fail('Could not start server') print('\n[Sending SIGTERM to server process...]') server.terminate() try: server.communicate(timeout=_SHUTDOWN_TIMEOUT) except subprocess.TimeoutExpired: print('\n[Killing stubborn server process...]') server.kill() server.communicate() pytest.fail( 'Server process did not exit in a timely manner and had to be killed.' )
def server_base_url(request): process_factory = request.param _can_run(process_factory) for i in range(3): server_port = testing.get_unused_port() base_url = 'http://{}:{}/'.format(_SERVER_HOST, server_port) with _run_server_isolated(process_factory, _SERVER_HOST, server_port) as server: # NOTE(kgriffs): Let the server start up. Give up after 5 seconds. start_ts = time.time() while (time.time() - start_ts) < 5: try: requests.get(base_url, timeout=0.2) except ( requests.exceptions.Timeout, requests.exceptions.ConnectionError, ): time.sleep(0.2) else: break else: if server.poll() is None: pytest.fail('Server is not responding to requests') else: # NOTE(kgriffs): The server did not start up; probably due to # the port being in use. We could check the output but # capsys fixture may not have buffered the error output # yet, so we just retry. continue yield base_url assert server.returncode == 0 break else: pytest.fail('Could not start server')