env:
TFLAGS: "${{ matrix.build.tflags }}"
- - run: pytest -v tests
+ - run: pytest -v tests/http
name: 'run pytest'
env:
TFLAGS: "${{ matrix.build.tflags }}"
make V=1 VERBOSE=1 test-ci
- if: contains(matrix.build.install_steps, 'pytest')
- # run for `tests` directory, so pytest does not pick up any other
+ # run for `tests/http` directory, so pytest does not pick up any other
# packages we might have built here
run:
- pytest -v tests
+ pytest -v tests/http
name: 'run pytest'
env:
TFLAGS: "${{ matrix.build.tflags }}"
README.md \
appveyor.pm \
azure.pm \
- conftest.py \
devtest.pl \
dictserver.py \
directories.pm \
+++ /dev/null
-#***************************************************************************
-# _ _ ____ _
-# Project ___| | | | _ \| |
-# / __| | | | |_) | |
-# | (__| |_| | _ <| |___
-# \___|\___/|_| \_\_____|
-#
-# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, 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 sys, os
-
-sys.path.append(os.path.join(os.path.dirname(__file__), 'http'))
-
-from testenv import Env
-
-
-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' 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}'
- ])
- return '\n'.join(report)
-
-
-def pytest_addoption(parser):
- parser.addoption("--repeat", action="store", type=int, default=1,
- help='Number of times to repeat each test')
-
-
-def pytest_generate_tests(metafunc):
- if "repeat" in metafunc.fixturenames:
- count = int(metafunc.config.getoption("repeat"))
- metafunc.fixturenames.append('tmp_ct')
- metafunc.parametrize('repeat', range(count))
The test cases and necessary files are in `tests/http`. You can invoke `pytest` from there or from the top level curl checkout and it will find all tests.
```
-curl> pytest
+curl> pytest test/http
platform darwin -- Python 3.9.15, pytest-6.2.0, py-1.10.0, pluggy-0.13.1
rootdir: /Users/sei/projects/curl
collected 5 items
Pytest takes arguments. `-v` increases its verbosity and can be used several times. `-k <expr>` can be used to run only matching test cases. The `expr` can be something resembling a python test or just a string that needs to match test cases in their names.
```
-curl> pytest -vv -k test_01_02
+curl/tests/http> pytest -vv -k test_01_02
```
runs all test cases that have `test_01_02` in their name. This does not have to be the start of the name.
Several test cases are parameterized, for example with the HTTP version to use. If you want to run a test with a particular protocol only, use a command line like:
```
-curl> pytest -k "test_02_06 and h2"
+curl/tests/http> pytest -k "test_02_06 and h2"
```
-Several test cases can be repeated, they all have the `repeat` parameter (install `pytest-repeat` module). To make this work, you have to start `pytest` in the test directory itself (for some unknown reason). Like in:
+Test cases can be repeated, with the `pytest-repeat` module (`pip install pytest-repeat`). Like in:
```
curl/tests/http> pytest -k "test_02_06 and h2" --count=100
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' 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}'
+ ])
+ 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)