#*************************************************************************** # _ _ ____ _ # Project ___| | | | _ \| | # / __| | | | |_) | | # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # # Copyright (C) Daniel Stenberg, , et al. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at https://curl.se/docs/copyright.html. # # You may opt to use, copy, modify, merge, publish, distribute and/or sell # copies of the Software, and permit persons to whom the Software is # furnished to do so, under the terms of the COPYING file. # # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY # KIND, either express or implied. # # SPDX-License-Identifier: curl # ########################################################################### # import logging import os import sys import platform from typing import Generator import pytest sys.path.append(os.path.join(os.path.dirname(__file__), '.')) from testenv import Env, Nghttpx, Httpd, NghttpxQuic, NghttpxFwd def pytest_report_header(config): # Env inits its base properties only once, we can report them here env = Env() report = [ f'Testing curl {env.curl_version()}', f' platform: {platform.platform()}', f' curl: Version: {env.curl_version_string()}', f' curl: Features: {env.curl_features_string()}', f' curl: Protocols: {env.curl_protocols_string()}', f' httpd: {env.httpd_version()}, http:{env.http_port} https:{env.https_port}', f' httpd-proxy: {env.httpd_version()}, http:{env.proxy_port} https:{env.proxys_port}' ] if env.have_h3(): report.extend([ f' nghttpx: {env.nghttpx_version()}, h3:{env.https_port}' ]) if env.has_caddy(): report.extend([ f' Caddy: {env.caddy_version()}, http:{env.caddy_http_port} https:{env.caddy_https_port}' ]) if env.has_vsftpd(): report.extend([ f' VsFTPD: {env.vsftpd_version()}, ftp:{env.ftp_port}, ftps:{env.ftps_port}' ]) buildinfo_fn = os.path.join(env.build_dir, 'buildinfo.txt') if os.path.exists(buildinfo_fn): with open(buildinfo_fn, 'r') as file_in: for line in file_in: line = line.strip() if line and not line.startswith('#'): report.extend([line]) return '\n'.join(report) # TODO: remove this and repeat argument everywhere, pytest-repeat can be used to repeat tests def pytest_generate_tests(metafunc): if "repeat" in metafunc.fixturenames: metafunc.parametrize('repeat', [0]) @pytest.fixture(scope="package") def env(pytestconfig) -> Env: env = Env(pytestconfig=pytestconfig) level = logging.DEBUG if env.verbose > 0 else logging.INFO logging.getLogger('').setLevel(level=level) if not env.curl_has_protocol('http'): pytest.skip("curl built without HTTP support") if not env.curl_has_protocol('https'): pytest.skip("curl built without HTTPS support") if env.setup_incomplete(): pytest.skip(env.incomplete_reason()) env.setup() return env @pytest.fixture(scope="package", autouse=True) def log_global_env_facts(record_testsuite_property, env): record_testsuite_property("http-port", env.http_port) @pytest.fixture(scope='package') def httpd(env) -> Generator[Httpd, None, None]: httpd = Httpd(env=env) if not httpd.exists(): pytest.skip(f'httpd not found: {env.httpd}') httpd.clear_logs() if not httpd.start(): pytest.fail(f'failed to start httpd: {env.httpd}') yield httpd httpd.stop() @pytest.fixture(scope='package') def nghttpx(env, httpd) -> Generator[Nghttpx, None, None]: nghttpx = NghttpxQuic(env=env) if nghttpx.exists() and (env.have_h3() or nghttpx.https_port > 0): nghttpx.clear_logs() assert nghttpx.start() yield nghttpx nghttpx.stop() @pytest.fixture(scope='package') def nghttpx_fwd(env, httpd) -> Generator[Nghttpx, None, None]: nghttpx = NghttpxFwd(env=env) if nghttpx.exists() and (env.have_h3() or nghttpx.https_port > 0): nghttpx.clear_logs() assert nghttpx.start() yield nghttpx nghttpx.stop()