Improve typing in test_runner/fixtures/httpserver.py (#10103)

Signed-off-by: Tristan Partin <tristan@neon.tech>
This commit is contained in:
Tristan Partin
2024-12-11 16:21:42 -06:00
committed by GitHub
parent 5126ebbfed
commit b391b29bdc
8 changed files with 39 additions and 19 deletions

View File

@@ -7,24 +7,25 @@ from pytest_httpserver import HTTPServer
if TYPE_CHECKING:
from collections.abc import Iterator
from ssl import SSLContext
from fixtures.port_distributor import PortDistributor
# TODO: mypy fails with:
# Module "fixtures.neon_fixtures" does not explicitly export attribute "PortDistributor" [attr-defined]
# from fixtures.neon_fixtures import PortDistributor
ListenAddress = tuple[str, int]
# compared to the fixtures from pytest_httpserver with same names, these are
# always function scoped, so you can check and stop the server in tests.
@pytest.fixture(scope="function")
def httpserver_ssl_context():
return None
def httpserver_ssl_context() -> Iterator[SSLContext | None]:
yield None
@pytest.fixture(scope="function")
def make_httpserver(httpserver_listen_address, httpserver_ssl_context) -> Iterator[HTTPServer]:
def make_httpserver(
httpserver_listen_address: ListenAddress, httpserver_ssl_context: SSLContext | None
) -> Iterator[HTTPServer]:
host, port = httpserver_listen_address
if not host:
host = HTTPServer.DEFAULT_LISTEN_HOST
@@ -47,6 +48,6 @@ def httpserver(make_httpserver: HTTPServer) -> Iterator[HTTPServer]:
@pytest.fixture(scope="function")
def httpserver_listen_address(port_distributor: PortDistributor) -> tuple[str, int]:
def httpserver_listen_address(port_distributor: PortDistributor) -> ListenAddress:
port = port_distributor.get_port()
return ("localhost", port)

View File

@@ -15,6 +15,8 @@ from werkzeug.wrappers.response import Response
if TYPE_CHECKING:
from typing import Any, Self
from fixtures.httpserver import ListenAddress
def handle_db(dbs, roles, operation):
if operation["op"] == "set":
@@ -120,7 +122,7 @@ class DdlForwardingContext:
@pytest.fixture(scope="function")
def ddl(
httpserver: HTTPServer, vanilla_pg: VanillaPostgres, httpserver_listen_address: tuple[str, int]
httpserver: HTTPServer, vanilla_pg: VanillaPostgres, httpserver_listen_address: ListenAddress
):
(host, port) = httpserver_listen_address
with DdlForwardingContext(httpserver, vanilla_pg, host, port) as ddl:

View File

@@ -20,6 +20,8 @@ from werkzeug.wrappers.response import Response
if TYPE_CHECKING:
from typing import Any
from fixtures.httpserver import ListenAddress
# use neon_env_builder_local fixture to override the default neon_env_builder fixture
# and use a test-specific pg_install instead of shared one
@@ -47,8 +49,8 @@ def neon_env_builder_local(
def test_remote_extensions(
httpserver: HTTPServer,
neon_env_builder_local: NeonEnvBuilder,
httpserver_listen_address,
pg_version,
httpserver_listen_address: ListenAddress,
pg_version: PgVersion,
):
# setup mock http server
# that expects request for anon.tar.zst

View File

@@ -27,6 +27,8 @@ from werkzeug.wrappers.response import Response
if TYPE_CHECKING:
from typing import Any
from fixtures.httpserver import ListenAddress
# TODO: collect all of the env setup *AFTER* removal of RemoteStorageKind.NOOP
@@ -34,7 +36,7 @@ if TYPE_CHECKING:
def test_metric_collection(
httpserver: HTTPServer,
neon_env_builder: NeonEnvBuilder,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
):
(host, port) = httpserver_listen_address
metric_collection_endpoint = f"http://{host}:{port}/billing/api/v1/usage_events"
@@ -195,7 +197,7 @@ def test_metric_collection(
def test_metric_collection_cleans_up_tempfile(
httpserver: HTTPServer,
neon_env_builder: NeonEnvBuilder,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
):
(host, port) = httpserver_listen_address
metric_collection_endpoint = f"http://{host}:{port}/billing/api/v1/usage_events"

View File

@@ -2,6 +2,7 @@ from __future__ import annotations
from collections.abc import Iterator
from pathlib import Path
from typing import TYPE_CHECKING
import pytest
from fixtures.log_helper import log
@@ -15,6 +16,9 @@ from pytest_httpserver import HTTPServer
from werkzeug.wrappers.request import Request
from werkzeug.wrappers.response import Response
if TYPE_CHECKING:
from fixtures.httpserver import ListenAddress
def proxy_metrics_handler(request: Request) -> Response:
if request.json is None:
@@ -38,7 +42,7 @@ def proxy_metrics_handler(request: Request) -> Response:
def proxy_with_metric_collector(
port_distributor: PortDistributor,
neon_binpath: Path,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
test_output_dir: Path,
) -> Iterator[NeonProxy]:
"""Neon proxy that routes through link auth and has metric collection enabled."""

View File

@@ -3,7 +3,7 @@ from __future__ import annotations
import os
import time
from collections import defaultdict
from typing import Any
from typing import TYPE_CHECKING, Any
import pytest
import requests
@@ -27,6 +27,9 @@ from typing_extensions import override
from werkzeug.wrappers.request import Request
from werkzeug.wrappers.response import Response
if TYPE_CHECKING:
from fixtures.httpserver import ListenAddress
def test_sharding_smoke(
neon_env_builder: NeonEnvBuilder,
@@ -759,7 +762,7 @@ def test_sharding_split_smoke(
def test_sharding_split_stripe_size(
neon_env_builder: NeonEnvBuilder,
httpserver: HTTPServer,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
initial_stripe_size: int,
):
"""

View File

@@ -58,6 +58,8 @@ from werkzeug.wrappers.response import Response
if TYPE_CHECKING:
from typing import Any
from fixtures.httpserver import ListenAddress
def get_node_shard_counts(env: NeonEnv, tenant_ids):
counts: defaultdict[int, int] = defaultdict(int)
@@ -563,7 +565,7 @@ def test_storage_controller_onboard_detached(neon_env_builder: NeonEnvBuilder):
def test_storage_controller_compute_hook(
httpserver: HTTPServer,
neon_env_builder: NeonEnvBuilder,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
):
"""
Test that the sharding service calls out to the configured HTTP endpoint on attachment changes
@@ -681,7 +683,7 @@ NOTIFY_FAILURE_LOGS = [
def test_storage_controller_stuck_compute_hook(
httpserver: HTTPServer,
neon_env_builder: NeonEnvBuilder,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
):
"""
Test the migration process's behavior when the compute hook does not enable it to proceed
@@ -818,7 +820,7 @@ def test_storage_controller_stuck_compute_hook(
def test_storage_controller_compute_hook_revert(
httpserver: HTTPServer,
neon_env_builder: NeonEnvBuilder,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
):
"""
'revert' in the sense of a migration which gets reversed shortly after, as may happen during

View File

@@ -2,6 +2,7 @@ from __future__ import annotations
import time
from dataclasses import dataclass
from typing import TYPE_CHECKING
from fixtures.log_helper import log
from fixtures.neon_fixtures import (
@@ -13,12 +14,15 @@ from fixtures.pageserver.http import LayerMapInfo
from fixtures.remote_storage import RemoteStorageKind
from pytest_httpserver import HTTPServer
if TYPE_CHECKING:
from fixtures.httpserver import ListenAddress
# NB: basic config change tests are in test_tenant_conf.py
def test_threshold_based_eviction(
httpserver: HTTPServer,
httpserver_listen_address,
httpserver_listen_address: ListenAddress,
pg_bin: PgBin,
neon_env_builder: NeonEnvBuilder,
):