1*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 2*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 3*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 4*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 5*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 6*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 7*6236dae4SAndroid Build Coastguard Worker# 8*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 9*6236dae4SAndroid Build Coastguard Worker# 10*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 11*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 12*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 13*6236dae4SAndroid Build Coastguard Worker# 14*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 15*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 16*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 17*6236dae4SAndroid Build Coastguard Worker# 18*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 20*6236dae4SAndroid Build Coastguard Worker# 21*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 22*6236dae4SAndroid Build Coastguard Worker# 23*6236dae4SAndroid Build Coastguard Worker########################################################################### 24*6236dae4SAndroid Build Coastguard Worker# 25*6236dae4SAndroid Build Coastguard Workerimport logging 26*6236dae4SAndroid Build Coastguard Workerimport os 27*6236dae4SAndroid Build Coastguard Workerimport sys 28*6236dae4SAndroid Build Coastguard Workerimport platform 29*6236dae4SAndroid Build Coastguard Workerfrom typing import Generator 30*6236dae4SAndroid Build Coastguard Worker 31*6236dae4SAndroid Build Coastguard Workerimport pytest 32*6236dae4SAndroid Build Coastguard Worker 33*6236dae4SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__), '.')) 34*6236dae4SAndroid Build Coastguard Worker 35*6236dae4SAndroid Build Coastguard Workerfrom testenv import Env, Nghttpx, Httpd, NghttpxQuic, NghttpxFwd 36*6236dae4SAndroid Build Coastguard Worker 37*6236dae4SAndroid Build Coastguard Workerdef pytest_report_header(config): 38*6236dae4SAndroid Build Coastguard Worker # Env inits its base properties only once, we can report them here 39*6236dae4SAndroid Build Coastguard Worker env = Env() 40*6236dae4SAndroid Build Coastguard Worker report = [ 41*6236dae4SAndroid Build Coastguard Worker f'Testing curl {env.curl_version()}', 42*6236dae4SAndroid Build Coastguard Worker f' platform: {platform.platform()}', 43*6236dae4SAndroid Build Coastguard Worker f' curl: Version: {env.curl_version_string()}', 44*6236dae4SAndroid Build Coastguard Worker f' curl: Features: {env.curl_features_string()}', 45*6236dae4SAndroid Build Coastguard Worker f' curl: Protocols: {env.curl_protocols_string()}', 46*6236dae4SAndroid Build Coastguard Worker f' httpd: {env.httpd_version()}, http:{env.http_port} https:{env.https_port}', 47*6236dae4SAndroid Build Coastguard Worker f' httpd-proxy: {env.httpd_version()}, http:{env.proxy_port} https:{env.proxys_port}' 48*6236dae4SAndroid Build Coastguard Worker ] 49*6236dae4SAndroid Build Coastguard Worker if env.have_h3(): 50*6236dae4SAndroid Build Coastguard Worker report.extend([ 51*6236dae4SAndroid Build Coastguard Worker f' nghttpx: {env.nghttpx_version()}, h3:{env.https_port}' 52*6236dae4SAndroid Build Coastguard Worker ]) 53*6236dae4SAndroid Build Coastguard Worker if env.has_caddy(): 54*6236dae4SAndroid Build Coastguard Worker report.extend([ 55*6236dae4SAndroid Build Coastguard Worker f' Caddy: {env.caddy_version()}, http:{env.caddy_http_port} https:{env.caddy_https_port}' 56*6236dae4SAndroid Build Coastguard Worker ]) 57*6236dae4SAndroid Build Coastguard Worker if env.has_vsftpd(): 58*6236dae4SAndroid Build Coastguard Worker report.extend([ 59*6236dae4SAndroid Build Coastguard Worker f' VsFTPD: {env.vsftpd_version()}, ftp:{env.ftp_port}, ftps:{env.ftps_port}' 60*6236dae4SAndroid Build Coastguard Worker ]) 61*6236dae4SAndroid Build Coastguard Worker buildinfo_fn = os.path.join(env.build_dir, 'buildinfo.txt') 62*6236dae4SAndroid Build Coastguard Worker if os.path.exists(buildinfo_fn): 63*6236dae4SAndroid Build Coastguard Worker with open(buildinfo_fn, 'r') as file_in: 64*6236dae4SAndroid Build Coastguard Worker for line in file_in: 65*6236dae4SAndroid Build Coastguard Worker line = line.strip() 66*6236dae4SAndroid Build Coastguard Worker if line and not line.startswith('#'): 67*6236dae4SAndroid Build Coastguard Worker report.extend([line]) 68*6236dae4SAndroid Build Coastguard Worker return '\n'.join(report) 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard Worker# TODO: remove this and repeat argument everywhere, pytest-repeat can be used to repeat tests 71*6236dae4SAndroid Build Coastguard Workerdef pytest_generate_tests(metafunc): 72*6236dae4SAndroid Build Coastguard Worker if "repeat" in metafunc.fixturenames: 73*6236dae4SAndroid Build Coastguard Worker metafunc.parametrize('repeat', [0]) 74*6236dae4SAndroid Build Coastguard Worker 75*6236dae4SAndroid Build Coastguard Worker@pytest.fixture(scope="package") 76*6236dae4SAndroid Build Coastguard Workerdef env(pytestconfig) -> Env: 77*6236dae4SAndroid Build Coastguard Worker env = Env(pytestconfig=pytestconfig) 78*6236dae4SAndroid Build Coastguard Worker level = logging.DEBUG if env.verbose > 0 else logging.INFO 79*6236dae4SAndroid Build Coastguard Worker logging.getLogger('').setLevel(level=level) 80*6236dae4SAndroid Build Coastguard Worker if not env.curl_has_protocol('http'): 81*6236dae4SAndroid Build Coastguard Worker pytest.skip("curl built without HTTP support") 82*6236dae4SAndroid Build Coastguard Worker if not env.curl_has_protocol('https'): 83*6236dae4SAndroid Build Coastguard Worker pytest.skip("curl built without HTTPS support") 84*6236dae4SAndroid Build Coastguard Worker if env.setup_incomplete(): 85*6236dae4SAndroid Build Coastguard Worker pytest.skip(env.incomplete_reason()) 86*6236dae4SAndroid Build Coastguard Worker 87*6236dae4SAndroid Build Coastguard Worker env.setup() 88*6236dae4SAndroid Build Coastguard Worker return env 89*6236dae4SAndroid Build Coastguard Worker 90*6236dae4SAndroid Build Coastguard Worker@pytest.fixture(scope="package", autouse=True) 91*6236dae4SAndroid Build Coastguard Workerdef log_global_env_facts(record_testsuite_property, env): 92*6236dae4SAndroid Build Coastguard Worker record_testsuite_property("http-port", env.http_port) 93*6236dae4SAndroid Build Coastguard Worker 94*6236dae4SAndroid Build Coastguard Worker 95*6236dae4SAndroid Build Coastguard Worker@pytest.fixture(scope='package') 96*6236dae4SAndroid Build Coastguard Workerdef httpd(env) -> Generator[Httpd, None, None]: 97*6236dae4SAndroid Build Coastguard Worker httpd = Httpd(env=env) 98*6236dae4SAndroid Build Coastguard Worker if not httpd.exists(): 99*6236dae4SAndroid Build Coastguard Worker pytest.skip(f'httpd not found: {env.httpd}') 100*6236dae4SAndroid Build Coastguard Worker httpd.clear_logs() 101*6236dae4SAndroid Build Coastguard Worker if not httpd.start(): 102*6236dae4SAndroid Build Coastguard Worker pytest.fail(f'failed to start httpd: {env.httpd}') 103*6236dae4SAndroid Build Coastguard Worker yield httpd 104*6236dae4SAndroid Build Coastguard Worker httpd.stop() 105*6236dae4SAndroid Build Coastguard Worker 106*6236dae4SAndroid Build Coastguard Worker 107*6236dae4SAndroid Build Coastguard Worker@pytest.fixture(scope='package') 108*6236dae4SAndroid Build Coastguard Workerdef nghttpx(env, httpd) -> Generator[Nghttpx, None, None]: 109*6236dae4SAndroid Build Coastguard Worker nghttpx = NghttpxQuic(env=env) 110*6236dae4SAndroid Build Coastguard Worker if nghttpx.exists() and (env.have_h3() or nghttpx.https_port > 0): 111*6236dae4SAndroid Build Coastguard Worker nghttpx.clear_logs() 112*6236dae4SAndroid Build Coastguard Worker assert nghttpx.start() 113*6236dae4SAndroid Build Coastguard Worker yield nghttpx 114*6236dae4SAndroid Build Coastguard Worker nghttpx.stop() 115*6236dae4SAndroid Build Coastguard Worker 116*6236dae4SAndroid Build Coastguard Worker@pytest.fixture(scope='package') 117*6236dae4SAndroid Build Coastguard Workerdef nghttpx_fwd(env, httpd) -> Generator[Nghttpx, None, None]: 118*6236dae4SAndroid Build Coastguard Worker nghttpx = NghttpxFwd(env=env) 119*6236dae4SAndroid Build Coastguard Worker if nghttpx.exists() and (env.have_h3() or nghttpx.https_port > 0): 120*6236dae4SAndroid Build Coastguard Worker nghttpx.clear_logs() 121*6236dae4SAndroid Build Coastguard Worker assert nghttpx.start() 122*6236dae4SAndroid Build Coastguard Worker yield nghttpx 123*6236dae4SAndroid Build Coastguard Worker nghttpx.stop() 124