From: Stefan Eissing Date: Mon, 26 Aug 2024 09:58:18 +0000 (+0200) Subject: pytest: tweak counts X-Git-Tag: curl-8_10_0~102 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ae3fadb7c39a686d1487eff2fe3ebaf36156e7e;p=thirdparty%2Fcurl.git pytest: tweak counts Lower some iteration counts for tests where they do not seem to add value. Raise speed limits somewhat to shave off a second or two. Closes #14689 --- diff --git a/tests/http/test_02_download.py b/tests/http/test_02_download.py index 55d0b0ce0a..4fed6aeb9a 100644 --- a/tests/http/test_02_download.py +++ b/tests/http/test_02_download.py @@ -27,6 +27,7 @@ import difflib import filecmp import logging +import math import os from datetime import timedelta import pytest @@ -77,23 +78,24 @@ class TestDownload: # download 100 files sequentially @pytest.mark.parametrize("proto", ['http/1.1', 'h2', 'h3']) - def test_02_03_download_100_sequential(self, env: Env, - httpd, nghttpx, repeat, proto): + def test_02_03_download_sequential(self, env: Env, + httpd, nghttpx, repeat, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") + count = 10 curl = CurlClient(env=env) - urln = f'https://{env.authority_for(env.domain1, proto)}/data.json?[0-99]' + urln = f'https://{env.authority_for(env.domain1, proto)}/data.json?[0-{count-1}]' r = curl.http_download(urls=[urln], alpn_proto=proto) - r.check_response(http_status=200, count=100, connect_count=1) + r.check_response(http_status=200, count=count, connect_count=1) # download 100 files parallel @pytest.mark.parametrize("proto", ['http/1.1', 'h2', 'h3']) - def test_02_04_download_20_parallel(self, env: Env, - httpd, nghttpx, repeat, proto): + def test_02_04_download_parallel(self, env: Env, + httpd, nghttpx, repeat, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 20 - max_parallel = 10 + count = 10 + max_parallel = 5 curl = CurlClient(env=env) urln = f'https://{env.authority_for(env.domain1, proto)}/data.json?[0-{count-1}]' r = curl.http_download(urls=[urln], alpn_proto=proto, extra_args=[ @@ -183,7 +185,7 @@ class TestDownload: httpd, nghttpx, repeat, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 20 + count = 5 urln = f'https://{env.authority_for(env.domain1, proto)}/data-1m?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto) @@ -194,7 +196,7 @@ class TestDownload: httpd, nghttpx, repeat, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 20 + count = 5 urln = f'https://{env.authority_for(env.domain1, proto)}/data-1m?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto, extra_args=[ @@ -209,7 +211,7 @@ class TestDownload: httpd, nghttpx, repeat, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 10 + count = 3 urln = f'https://{env.authority_for(env.domain1, proto)}/data-10m?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto) @@ -224,7 +226,7 @@ class TestDownload: pytest.skip("h3 not supported") if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") - count = 10 + count = 3 urln = f'https://{env.authority_for(env.domain1, proto)}/data-10m?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto, extra_args=[ @@ -237,7 +239,7 @@ class TestDownload: httpd, nghttpx, repeat, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 50 + count = 5 urln = f'https://{env.authority_for(env.domain1, proto)}/data-10m?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto, extra_args=[ @@ -250,7 +252,7 @@ class TestDownload: httpd, nghttpx, repeat, proto): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 50 + count = 5 urln = f'http://{env.domain1}:{env.http_port}/data-10m?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto, extra_args=[ @@ -264,7 +266,7 @@ class TestDownload: pytest.skip("h3 not supported") if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") - count = 10 + count = 5 urln = f'https://{env.authority_for(env.domain1, proto)}/not-found?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto, extra_args=[ @@ -278,7 +280,7 @@ class TestDownload: pytest.skip("h3 not supported") if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") - count = 10 + count = 5 urln = f'https://{env.authority_for(env.domain1, proto)}/not-found?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto=proto, extra_args=[ @@ -306,7 +308,7 @@ class TestDownload: # ok, make 100 downloads with 2 parallel running and they # are expected to stumble into the issue when using `lib/http2.c` # from curl 7.88.0 - count = 100 + count = 5 urln = f'https://{env.authority_for(env.domain1, "h2")}/data-1m?[0-{count-1}]' curl = CurlClient(env=env) r = curl.http_download(urls=[urln], alpn_proto="h2", extra_args=[ @@ -326,7 +328,7 @@ class TestDownload: def test_02_21_lib_serial(self, env: Env, httpd, nghttpx, proto, pause_offset, repeat): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 2 if proto == 'http/1.1' else 10 + count = 2 docname = 'data-10m' url = f'https://localhost:{env.https_port}/{docname}' client = LocalClient(name='h2-download', env=env) @@ -345,7 +347,7 @@ class TestDownload: def test_02_22_lib_parallel_resume(self, env: Env, httpd, nghttpx, proto, pause_offset, repeat): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") - count = 2 if proto == 'http/1.1' else 10 + count = 2 max_parallel = 5 docname = 'data-10m' url = f'https://localhost:{env.https_port}/{docname}' @@ -369,13 +371,11 @@ class TestDownload: pytest.skip('OpenSSL QUIC fails here') if proto == 'h3' and env.ci_run and env.curl_uses_lib('quiche'): pytest.skip("fails in CI, but works locally for unknown reasons") + count = 10 + max_parallel = 5 if proto in ['h2', 'h3']: - count = 200 - max_parallel = 100 pause_offset = 64 * 1024 else: - count = 10 - max_parallel = 5 pause_offset = 12 * 1024 docname = 'data-1m' url = f'https://localhost:{env.https_port}/{docname}' @@ -400,13 +400,11 @@ class TestDownload: pytest.skip('OpenSSL QUIC fails here') if proto == 'h3' and env.ci_run and env.curl_uses_lib('quiche'): pytest.skip("fails in CI, but works locally for unknown reasons") + count = 10 + max_parallel = 5 if proto in ['h2', 'h3']: - count = 200 - max_parallel = 100 abort_offset = 64 * 1024 else: - count = 10 - max_parallel = 5 abort_offset = 12 * 1024 docname = 'data-1m' url = f'https://localhost:{env.https_port}/{docname}' @@ -431,13 +429,11 @@ class TestDownload: pytest.skip('OpenSSL QUIC fails here') if proto == 'h3' and env.ci_run and env.curl_uses_lib('quiche'): pytest.skip("fails in CI, but works locally for unknown reasons") + count = 10 + max_parallel = 5 if proto in ['h2', 'h3']: - count = 200 - max_parallel = 100 fail_offset = 64 * 1024 else: - count = 10 - max_parallel = 5 fail_offset = 12 * 1024 docname = 'data-1m' url = f'https://localhost:{env.https_port}/{docname}' @@ -454,19 +450,22 @@ class TestDownload: self.check_downloads(client, srcfile, count, complete=False) # speed limited download - @pytest.mark.parametrize("proto", ['h2', 'h3']) + @pytest.mark.parametrize("proto", ['http/1.1', 'h2', 'h3']) def test_02_24_speed_limit(self, env: Env, httpd, nghttpx, proto, repeat): if proto == 'h3' and not env.have_h3(): pytest.skip("h3 not supported") count = 1 url = f'https://{env.authority_for(env.domain1, proto)}/data-1m' curl = CurlClient(env=env) + speed_limit = 384 * 1024 + min_duration = math.floor((1024 * 1024)/speed_limit) r = curl.http_download(urls=[url], alpn_proto=proto, extra_args=[ - '--limit-rate', f'{196 * 1024}' + '--limit-rate', f'{speed_limit}' ]) r.check_response(count=count, http_status=200) - assert r.duration > timedelta(seconds=4), \ - f'rate limited transfer should take more than 4s, not {r.duration}' + assert r.duration > timedelta(seconds=min_duration), \ + f'rate limited transfer should take more than {min_duration}s, '\ + f'not {r.duration}' # make extreme parallel h2 upgrades, check invalid conn reuse # before protocol switch has happened @@ -552,7 +551,7 @@ class TestDownload: @pytest.mark.parametrize("pause_offset", [0, 10*1024, 100*1023, 640000]) @pytest.mark.parametrize("proto", ['http/1.1', 'h2', 'h3']) def test_02_29_h2_lib_serial(self, env: Env, httpd, nghttpx, proto, pause_offset, repeat): - count = 2 if proto == 'http/1.1' else 10 + count = 2 docname = 'data-10m' url = f'https://localhost:{env.https_port}/{docname}' client = LocalClient(name='h2-download', env=env) diff --git a/tests/http/test_07_upload.py b/tests/http/test_07_upload.py index c9c65f0999..8dc06d45da 100644 --- a/tests/http/test_07_upload.py +++ b/tests/http/test_07_upload.py @@ -89,7 +89,7 @@ class TestUpload: pytest.skip("h3 not supported") if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") - count = 50 + count = 20 data = '0123456789' curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-{count-1}]' @@ -107,7 +107,7 @@ class TestUpload: if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") # limit since we use a separate connection in h1 - count = 50 + count = 20 data = '0123456789' curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-{count-1}]' @@ -126,7 +126,7 @@ class TestUpload: if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") fdata = os.path.join(env.gen_dir, 'data-100k') - count = 20 + count = 10 curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-{count-1}]' r = curl.http_upload(urls=[url], data=f'@{fdata}', alpn_proto=proto) @@ -163,7 +163,7 @@ class TestUpload: if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") # limit since we use a separate connection in h1 - count = 20 + count = 10 data = '0123456789' curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-{count-1}]' @@ -183,7 +183,7 @@ class TestUpload: pytest.skip("msh3 stalls here") fdata = os.path.join(env.gen_dir, 'data-100k') # limit since we use a separate connection in h1 - count = 20 + count = 10 curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-{count-1}]' r = curl.http_upload(urls=[url], data=f'@{fdata}', alpn_proto=proto, @@ -199,7 +199,7 @@ class TestUpload: if proto == 'h3' and env.curl_uses_lib('msh3'): pytest.skip("msh3 stalls here") fdata = os.path.join(env.gen_dir, 'data-10m') - count = 100 + count = 20 curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}'\ f'/curltest/tweak?status=400&delay=5ms&chunks=1&body_error=reset&id=[0-{count-1}]' @@ -526,7 +526,7 @@ class TestUpload: count = 1 fdata = os.path.join(env.gen_dir, 'data-100k') up_len = 100 * 1024 - speed_limit = 20 * 1024 + speed_limit = 50 * 1024 curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}/curltest/put?id=[0-0]' r = curl.http_put(urls=[url], fdata=fdata, alpn_proto=proto, @@ -545,7 +545,7 @@ class TestUpload: pytest.skip("h3 not supported") count = 1 fdata = os.path.join(env.gen_dir, 'data-100k') - speed_limit = 20 * 1024 + speed_limit = 50 * 1024 curl = CurlClient(env=env) url = f'https://{env.authority_for(env.domain1, proto)}/curltest/echo?id=[0-0]' r = curl.http_upload(urls=[url], data=f'@{fdata}', alpn_proto=proto,