--- /dev/null
+# 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 }}"
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;
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
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]:
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])
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')
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(),
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):