From 080d8db090914fbe027acbf43b7e7e7772ef59a74316bb28f2b7cd4be6ebacfd Mon Sep 17 00:00:00 2001 From: Matej Cepl Date: Thu, 28 Apr 2022 21:40:28 +0000 Subject: [PATCH] - Replace no-network-testing.patch with the upstream solution 2402-dev_server.patch from gh#pallets/werkzeug#2402. - Add moved_root.patch to make test test_exclude_patterns with different PYTHONPATH. OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-Werkzeug?expand=0&rev=64 --- 2402-dev_server.patch | 165 +++++++++++++++++++++++++++++++++++++++ moved_root.patch | 34 ++++++++ no-network-testing.patch | 53 ------------- python-Werkzeug.changes | 8 ++ python-Werkzeug.spec | 12 ++- 5 files changed, 215 insertions(+), 57 deletions(-) create mode 100644 2402-dev_server.patch create mode 100644 moved_root.patch delete mode 100644 no-network-testing.patch diff --git a/2402-dev_server.patch b/2402-dev_server.patch new file mode 100644 index 0000000..a20b28a --- /dev/null +++ b/2402-dev_server.patch @@ -0,0 +1,165 @@ +From 9d83ed43027b6538efde5b708395fed36700d970 Mon Sep 17 00:00:00 2001 +From: David Lord +Date: Mon, 25 Apr 2022 11:08:09 -0700 +Subject: [PATCH] mark test that use the dev_server + +--- + setup.cfg | 2 ++ + tests/middleware/test_http_proxy.py | 1 + + tests/test_debug.py | 1 + + tests/test_serving.py | 15 +++++++++++++++ + 4 files changed, 19 insertions(+) + +--- a/setup.cfg ++++ b/setup.cfg +@@ -44,6 +44,8 @@ where = src + testpaths = tests + filterwarnings = + error ++markers = ++ dev_server: tests that start the dev server + + [coverage:run] + branch = True +--- a/tests/middleware/test_http_proxy.py ++++ b/tests/middleware/test_http_proxy.py +@@ -6,6 +6,7 @@ from werkzeug.wrappers import Response + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_http_proxy(standard_app): + app = ProxyMiddleware( + Response("ROOT"), +--- a/tests/test_debug.py ++++ b/tests/test_debug.py +@@ -247,6 +247,7 @@ def test_get_machine_id(): + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") + @pytest.mark.parametrize("crash", (True, False)) ++@pytest.mark.dev_server + def test_basic(dev_server, crash): + c = dev_server(use_debugger=True) + r = c.request("/crash" if crash else "") +--- a/tests/test_serving.py ++++ b/tests/test_serving.py +@@ -35,6 +35,7 @@ from werkzeug.test import stream_encode_ + ), + ], + ) ++@pytest.mark.dev_server + def test_server(tmp_path, dev_server, kwargs: dict): + if kwargs.get("hostname") == "unix": + kwargs["hostname"] = f"unix://{tmp_path / 'test.sock'}" +@@ -46,6 +47,7 @@ def test_server(tmp_path, dev_server, kw + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_untrusted_host(standard_app): + r = standard_app.request( + "http://missing.test:1337/index.html#ignore", +@@ -59,6 +61,7 @@ def test_untrusted_host(standard_app): + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_double_slash_path(standard_app): + r = standard_app.request("//double-slash") + assert "double-slash" not in r.json["HTTP_HOST"] +@@ -66,6 +69,7 @@ def test_double_slash_path(standard_app) + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_500_error(standard_app): + r = standard_app.request("/crash") + assert r.status == 500 +@@ -73,6 +77,7 @@ def test_500_error(standard_app): + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_ssl_dev_cert(tmp_path, dev_server): + client = dev_server(ssl_context=make_ssl_devcert(tmp_path)) + r = client.request() +@@ -80,6 +85,7 @@ def test_ssl_dev_cert(tmp_path, dev_serv + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_ssl_object(dev_server): + client = dev_server(ssl_context="custom") + r = client.request() +@@ -91,6 +97,7 @@ def test_ssl_object(dev_server): + @pytest.mark.skipif( + os.name == "nt" and "CI" in os.environ, reason="unreliable on Windows during CI" + ) ++@pytest.mark.dev_server + def test_reloader_sys_path(tmp_path, dev_server, reloader_type): + """This tests the general behavior of the reloader. It also tests + that fixing an import error triggers a reload, not just Python +@@ -129,6 +136,7 @@ def test_exclude_patterns(find): + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_wrong_protocol(standard_app): + """An HTTPS request to an HTTP server doesn't show a traceback. + https://github.com/pallets/werkzeug/pull/838 +@@ -142,6 +150,7 @@ def test_wrong_protocol(standard_app): + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_content_type_and_length(standard_app): + r = standard_app.request() + assert "CONTENT_TYPE" not in r.json +@@ -159,6 +168,7 @@ def test_port_is_int(): + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") + @pytest.mark.parametrize("send_length", [False, True]) ++@pytest.mark.dev_server + def test_chunked_request(monkeypatch, dev_server, send_length): + stream, length, boundary = stream_encode_multipart( + { +@@ -200,6 +210,7 @@ def test_chunked_request(monkeypatch, de + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_multiple_headers_concatenated(standard_app): + """A header key can be sent multiple times. The server will join all + the values with commas. +@@ -224,6 +235,7 @@ def test_multiple_headers_concatenated(s + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_multiline_header_folding(standard_app): + """A header value can be split over multiple lines with a leading + tab. The server will remove the newlines and preserve the tabs. +@@ -242,6 +254,7 @@ def test_multiline_header_folding(standa + + + @pytest.mark.parametrize("endpoint", ["", "crash"]) ++@pytest.mark.dev_server + def test_streaming_close_response(dev_server, endpoint): + """When using HTTP/1.0, chunked encoding is not supported. Fall + back to Connection: close, but this allows no reliable way to +@@ -252,6 +265,7 @@ def test_streaming_close_response(dev_se + assert r.data == "".join(str(x) + "\n" for x in range(5)).encode() + + ++@pytest.mark.dev_server + def test_streaming_chunked_response(dev_server): + """When using HTTP/1.1, use Transfer-Encoding: chunked for streamed + responses, since it can distinguish the end of the response without +@@ -265,6 +279,7 @@ def test_streaming_chunked_response(dev_ + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") ++@pytest.mark.dev_server + def test_streaming_chunked_truncation(dev_server): + """When using HTTP/1.1, chunked encoding allows the client to detect + content truncated by a prematurely closed connection. diff --git a/moved_root.patch b/moved_root.patch new file mode 100644 index 0000000..602820b --- /dev/null +++ b/moved_root.patch @@ -0,0 +1,34 @@ +--- + tests/test_serving.py | 12 ++++++++---- + 1 file changed, 8 insertions(+), 4 deletions(-) + +--- a/tests/test_serving.py ++++ b/tests/test_serving.py +@@ -10,6 +10,7 @@ from pathlib import Path + + import pytest + ++import werkzeug + from werkzeug import run_simple + from werkzeug._reloader import _find_stat_paths + from werkzeug._reloader import _find_watchdog_paths +@@ -127,12 +128,15 @@ def test_windows_get_args_for_reloading( + + @pytest.mark.parametrize("find", [_find_stat_paths, _find_watchdog_paths]) + def test_exclude_patterns(find): +- # Imported paths under sys.prefix will be included by default. ++ # Don’t use sys.prefix, we may have redefined PYTHONPATH and ++ # libraries elsewhere. ++ cur_prefix = str(Path(werkzeug.__file__).parents[1]) ++ # Imported paths under cur_prefix will be included by default. + paths = find(set(), set()) +- assert any(p.startswith(sys.prefix) for p in paths) ++ assert any(p.startswith(cur_prefix) for p in paths) + # Those paths should be excluded due to the pattern. +- paths = find(set(), {f"{sys.prefix}*"}) +- assert not any(p.startswith(sys.prefix) for p in paths) ++ paths = find(set(), {f"{str(cur_prefix)}*"}) ++ assert not any(p.startswith(cur_prefix) for p in paths) + + + @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") diff --git a/no-network-testing.patch b/no-network-testing.patch deleted file mode 100644 index b6b7813..0000000 --- a/no-network-testing.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- - pytest.ini | 3 +++ - tests/test_serving.py | 5 +++++ - 2 files changed, 8 insertions(+) - ---- /dev/null -+++ b/pytest.ini -@@ -0,0 +1,3 @@ -+[pytest] -+markers = -+ network: tests requiring network connection ---- a/tests/test_serving.py -+++ b/tests/test_serving.py -@@ -118,6 +118,7 @@ def test_windows_get_args_for_reloading( - assert rv == argv - - -+@pytest.mark.network - @pytest.mark.parametrize("find", [_find_stat_paths, _find_watchdog_paths]) - def test_exclude_patterns(find): - # Imported paths under sys.prefix will be included by default. -@@ -157,6 +158,7 @@ def test_port_is_int(): - run_simple("127.0.0.1", "5000", None) - - -+@pytest.mark.network - @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") - @pytest.mark.parametrize("send_length", [False, True]) - def test_chunked_request(monkeypatch, dev_server, send_length): -@@ -241,6 +243,7 @@ def test_multiline_header_folding(standa - assert data["HTTP_XYZ"] == "first\tsecond\tthird" - - -+@pytest.mark.network - @pytest.mark.parametrize("endpoint", ["", "crash"]) - def test_streaming_close_response(dev_server, endpoint): - """When using HTTP/1.0, chunked encoding is not supported. Fall -@@ -252,6 +255,7 @@ def test_streaming_close_response(dev_se - assert r.data == "".join(str(x) + "\n" for x in range(5)).encode() - - -+@pytest.mark.network - def test_streaming_chunked_response(dev_server): - """When using HTTP/1.1, use Transfer-Encoding: chunked for streamed - responses, since it can distinguish the end of the response without -@@ -264,6 +268,7 @@ def test_streaming_chunked_response(dev_ - assert r.data == "".join(str(x) + "\n" for x in range(5)).encode() - - -+@pytest.mark.network - @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") - def test_streaming_chunked_truncation(dev_server): - """When using HTTP/1.1, chunked encoding allows the client to detect diff --git a/python-Werkzeug.changes b/python-Werkzeug.changes index 5e3a8bd..80cc600 100644 --- a/python-Werkzeug.changes +++ b/python-Werkzeug.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Thu Apr 28 16:25:37 UTC 2022 - Matej Cepl + +- Replace no-network-testing.patch with the upstream solution + 2402-dev_server.patch from gh#pallets/werkzeug#2402. +- Add moved_root.patch to make test test_exclude_patterns with + different PYTHONPATH. + ------------------------------------------------------------------- Tue Apr 19 18:54:06 UTC 2022 - Matej Cepl diff --git a/python-Werkzeug.spec b/python-Werkzeug.spec index 7816203..4e2998d 100644 --- a/python-Werkzeug.spec +++ b/python-Werkzeug.spec @@ -27,9 +27,13 @@ License: BSD-3-Clause Group: Development/Languages/Python URL: https://werkzeug.palletsprojects.com Source: https://files.pythonhosted.org/packages/source/W/Werkzeug/Werkzeug-%{version}.tar.gz -# PATCH-FIX-UPSTREAM no-network-testing.patch gh#pallets/werkzeug#2393 mcepl@suse.com -# mark tests which require network access -Patch0: no-network-testing.patch +# PATCH-FIX-UPSTREAM 2402-dev_server.patch gh#pallets/werkzeug#2393 mcepl@suse.com +# upstream solution to mark tests which require development server +# from https://github.com/pallets/werkzeug/pull/2402 +Patch0: 2402-dev_server.patch +# PATCH-FIX-UPSTREAM moved_root.patch bsc#[0-9]+ mcepl@suse.com +# this patch makes things totally awesome +Patch1: moved_root.patch BuildRequires: %{python_module cryptography} BuildRequires: %{python_module ephemeral-port-reserve} BuildRequires: %{python_module hypothesis} @@ -83,7 +87,7 @@ sed -i "1d" examples/manage-{i18nurls,simplewiki,shorty,couchy,cupoftee,webpylik export LANG=en_US.UTF-8 export PYTHONDONTWRITEBYTECODE=1 # workaround pytest 6.2 (like https://github.com/pallets/werkzeug/commit/16718f461d016b88b6457d3ef63816b7df1f0d1f, but shorter) -%pytest -k 'not (network or test_reloader_sys_path or test_chunked_encoding or test_basic or test_server or test_ssl or test_http_proxy or test_500_error or test_untrusted_host or test_double_slash_path or test_wrong_protocol or test_content_type_and_length or test_multiple_headers_concatenated or test_multiline_header_folding)' +%pytest -k 'not (dev_server or test_reloader_sys_path or test_chunked_encoding or test_basic or test_server or test_ssl or test_http_proxy or test_500_error or test_untrusted_host or test_double_slash_path or test_wrong_protocol or test_content_type_and_length or test_multiple_headers_concatenated or test_multiline_header_folding)' %files %{python_files} %license LICENSE.rst