CI: add pytest github workflow to CI test/tests-httpd on a HTTP/3 setup

Closes #10317
This commit is contained in:
Stefan Eissing 2023-01-18 11:11:41 +01:00 committed by Daniel Stenberg
parent d55de24dce
commit 91eb197a9e
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
5 changed files with 120 additions and 4 deletions

103
.github/workflows/pytest.yml vendored Normal file
View file

@ -0,0 +1,103 @@
# Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
#
# SPDX-License-Identifier: curl
name: pytest
on:
push:
branches:
- master
- '*/ci'
paths-ignore:
- '**/*.md'
pull_request:
branches:
- master
paths-ignore:
- '**/*.md'
concurrency:
# Hardcoded workflow filename as workflow name above is just Linux again
group: pytest-openssl-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true
jobs:
autotools:
name: ${{ matrix.build.name }}
runs-on: 'ubuntu-latest'
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
build:
- name: quictls
install: >-
libpsl-dev libbrotli-dev libzstd-dev zlib1g-dev libev-dev libc-ares-dev
configure: >-
PKG_CONFIG_PATH="$HOME/all/lib/pkgconfig" LDFLAGS="-Wl,-rpath,$HOME/all/lib"
--with-ngtcp2=$HOME/all --enable-warnings --enable-werror --enable-debug
--with-test-nghttpx="$HOME/all/bin/nghttpx"
ngtcp2-configure: >-
--prefix=$HOME/all PKG_CONFIG_PATH="$HOME/all/lib/pkgconfig" --enable-lib-only
steps:
- run: |
sudo apt-get update
sudo apt-get install libtool autoconf automake pkg-config stunnel4 ${{ matrix.build.install }}
sudo apt-get install apache2 apache2-dev
sudo python3 -m pip install impacket pytest cryptography
name: 'install prereqs and impacket, pytest, crypto'
- run: |
git clone --depth=1 -b openssl-3.0.7+quic https://github.com/quictls/openssl
cd openssl
./config --prefix=$HOME/all --libdir=$HOME/all/lib
make install_sw
name: 'install quictls'
- run: |
git clone --depth=1 -b v0.8.0 https://github.com/ngtcp2/nghttp3
cd nghttp3
autoreconf -fi
./configure --prefix=$HOME/all PKG_CONFIG_PATH="$HOME/all/lib/pkgconfig" --enable-lib-only
make install
name: 'install nghttp3'
- run: |
git clone --depth=1 -b v0.12.1 https://github.com/ngtcp2/ngtcp2
cd ngtcp2
autoreconf -fi
./configure ${{ matrix.build.ngtcp2-configure }} --with-openssl
make install
name: 'install ngtcp2'
- run: |
git clone --depth=1 -b v1.51.0 https://github.com/nghttp2/nghttp2
cd nghttp2
autoreconf -fi
./configure --prefix=$HOME/all PKG_CONFIG_PATH="$HOME/all/lib/pkgconfig" --enable-http3
make install
name: 'install nghttp2'
- uses: actions/checkout@v3
- run: autoreconf -fi
name: 'autoreconf'
- run: ./configure --with-openssl=$HOME/all ${{ matrix.build.configure }}
name: 'configure'
- run: make V=1
name: 'make'
- run: make V=1 examples
name: 'make examples'
- run: make V=1 -C tests
name: 'make tests'
- run: pytest -v
name: 'run pytest'
env:
TFLAGS: "${{ matrix.build.tflags }}"

View file

@ -1472,6 +1472,8 @@ static CURLcode h3_stream_open(struct Curl_cfilter *cf,
infof(data, "Using HTTP/3 Stream ID: %" PRIx64 " (easy handle %p)",
stream3_id, (void *)data);
DEBUGF(LOG_CF(data, cf, "[h3sid=%" PRIx64 "] opened for %s",
stream3_id, data->state.url));
Curl_pseudo_free(hreq);
return CURLE_OK;

View file

@ -97,7 +97,7 @@ class TestStuttered:
r.check_responses(count=warmups+count, exp_status=200)
assert r.total_connects == 1
t_avg, i_min, t_min, i_max, t_max = self.stats_spread(r.stats[warmups:], 'time_total')
assert t_max < (3 * t_min) and t_min < 2.5, \
assert t_max < (2 * t_min), \
f'avg time of transfer: {t_avg} [{i_min}={t_min}, {i_max}={t_max}]'
# download 50 files in 10000 chunks a 1 byte with 10us delay between
@ -122,7 +122,7 @@ class TestStuttered:
r.check_responses(count=warmups+count, exp_status=200)
assert r.total_connects == 1
t_avg, i_min, t_min, i_max, t_max = self.stats_spread(r.stats[warmups:], 'time_total')
assert t_max < (3 * t_min) and t_min < 3, \
assert t_max < (2 * t_min), \
f'avg time of transfer: {t_avg} [{i_min}={t_min}, {i_max}={t_max}]'
def stats_spread(self, stats: List[Dict], key: str) -> Tuple[float, int, float, int, float]:

View file

@ -273,7 +273,7 @@ class CurlClient:
self._curl, "-s", "--path-as-is", "-D", self._headerfile,
]
if self.env.verbose > 2:
args.extend(['--trace', self._tracefile])
args.extend(['--trace', self._tracefile, '--trace-time'])
for url in urls:
u = urlparse(urls[0])

View file

@ -60,6 +60,8 @@ class Httpd:
self.env = env
self._cmd = env.apachectl
self._apache_dir = os.path.join(env.gen_dir, 'apache')
self._run_dir = os.path.join(self._apache_dir, 'run')
self._lock_dir = os.path.join(self._apache_dir, 'locks')
self._docs_dir = os.path.join(self._apache_dir, 'docs')
self._conf_dir = os.path.join(self._apache_dir, 'conf')
self._conf_file = os.path.join(self._conf_dir, 'test.conf')
@ -90,9 +92,17 @@ class Httpd:
return os.path.exists(self._cmd)
def _run(self, args, intext=''):
env = {}
for key, val in os.environ.items():
env[key] = val
env['APACHE_RUN_DIR'] = self._run_dir
env['APACHE_RUN_USER'] = os.environ['USER']
env['APACHE_LOCK_DIR'] = self._lock_dir
env['APACHE_CONFDIR'] = self._apache_dir
p = subprocess.run(args, stderr=subprocess.PIPE, stdout=subprocess.PIPE,
cwd=self.env.gen_dir,
input=intext.encode() if intext else None)
input=intext.encode() if intext else None,
env=env)
start = datetime.now()
return ExecResult(args=args, exit_code=p.returncode,
stdout=p.stdout.decode().splitlines(),
@ -117,6 +127,7 @@ class Httpd:
r = self._apachectl('start')
if r.exit_code != 0:
log.error(f'failed to start httpd: {r}')
return False
return self.wait_live(timeout=timedelta(seconds=5))
def stop(self):