From 7deb015ae8d4f7535256ef9986b1f2b9b828cb6c Mon Sep 17 00:00:00 2001 From: tomsht01 Date: Thu, 8 May 2025 12:57:42 +0300 Subject: [PATCH 1/2] feat: add http server fixture --- e2e/binary/BUILD.bazel | 1 + e2e/binary/__init__.py | 3 ++- e2e/binary/conftest.py | 8 +++++++ e2e/binary/server.py | 53 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 e2e/binary/server.py diff --git a/e2e/binary/BUILD.bazel b/e2e/binary/BUILD.bazel index 24cf276d..b0929f36 100644 --- a/e2e/binary/BUILD.bazel +++ b/e2e/binary/BUILD.bazel @@ -18,6 +18,7 @@ py_library( "port.py", "relative.py", "runfile.py", + "server.py", "sniff.py", "tool.py", ], diff --git a/e2e/binary/__init__.py b/e2e/binary/__init__.py index 0c485f0b..f9a883e7 100644 --- a/e2e/binary/__init__.py +++ b/e2e/binary/__init__.py @@ -5,5 +5,6 @@ from binary.relative import Relative from binary.runfile import Env from binary.sniff import sniff from binary.tool import Tool +from binary.server import HTTPInterface -__all__ = ("sniff", "Diff", "Tool", "Relative", "Env") +__all__ = ("sniff", "Diff", "Tool", "Relative", "Env", "HTTPInterface") diff --git a/e2e/binary/conftest.py b/e2e/binary/conftest.py index b645b614..01548349 100644 --- a/e2e/binary/conftest.py +++ b/e2e/binary/conftest.py @@ -16,6 +16,7 @@ from .runfile import ( create, ) from .tool import Tool +from .server import HTTPServer, HTTPInterface __all__ = ("Relative", "Tool", "Runfile", "Env") @@ -50,6 +51,13 @@ def relative(runfile: Runfile) -> Relative: return Relative(runfile) +@fixture +def http_server() -> HTTPInterface: + server = HTTPServer() + yield server + server.shutdown() + + def pytest_assertrepr_compare(op, left, right) -> list[str] | None: if value := diff(op, left, right): return value diff --git a/e2e/binary/server.py b/e2e/binary/server.py new file mode 100644 index 00000000..b0962be5 --- /dev/null +++ b/e2e/binary/server.py @@ -0,0 +1,53 @@ +import threading + +from typing import Protocol +from urllib.parse import urlunparse +from http.server import HTTPServer as HttpServer, SimpleHTTPRequestHandler + + +class HTTPInterface(Protocol): + @property + def hostname(self) -> str: ... + + @property + def port(self) -> int: ... + + @property + def netloc(self) -> str: ... + + @property + def scheme(self) -> str: ... + + @property + def base_url(self) -> str: ... + + +class HTTPServer: + def __init__(self): + self.__server = HttpServer(("", 0), SimpleHTTPRequestHandler) + self.__thread = threading.Thread(target=self.__server.serve_forever) + self.__thread.start() + + def shutdown(self): + self.__server.shutdown() + self.__thread.join() + + @property + def hostname(self) -> str: + return self.__server.server_address[0] + + @property + def port(self) -> int: + return self.__server.server_address[1] + + @property + def netloc(self) -> str: + return f"{self.hostname}:{self.port}" + + @property + def scheme(self) -> str: + return "http" + + @property + def base_url(self) -> str: + return urlunparse((self.scheme, self.netloc, "", "", "", "")) -- GitLab From a138020a556f9a46766c6012dca9c1ebc7dd9546 Mon Sep 17 00:00:00 2001 From: tomsht01 Date: Thu, 8 May 2025 12:58:23 +0300 Subject: [PATCH 2/2] test(wget): add native and pytest tests --- e2e/binary/wget/BUILD.bazel | 31 +++++++++++++++++++++++++------ e2e/binary/wget/wget.py | 14 ++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 e2e/binary/wget/wget.py diff --git a/e2e/binary/wget/BUILD.bazel b/e2e/binary/wget/BUILD.bazel index 2664737e..9505b982 100644 --- a/e2e/binary/wget/BUILD.bazel +++ b/e2e/binary/wget/BUILD.bazel @@ -1,11 +1,30 @@ -load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@bazel_skylib//rules:native_binary.bzl", "native_test") +load("@rules_python_pytest//python_pytest:defs.bzl", "py_pytest_test") -# TODO: write an _actual_ test for `wget` +py_pytest_test( + name = "pytest", + size = "small", + srcs = ["wget.py"], + data = [ + "@ape//ape:wget", + ], + deps = [ + "//binary:pytest", + ], +) -build_test( - name = "wget", +native_test( + name = "version", size = "small", - tags = ["stub"], - targets = ["@ape//ape:wget"], + src = "@ape//ape:wget", + args = ["--version"], +) + +test_suite( + name = "wget", + tests = [ + "pytest", + "version", + ], visibility = ["//:__subpackages__"], ) diff --git a/e2e/binary/wget/wget.py b/e2e/binary/wget/wget.py new file mode 100644 index 00000000..1944beef --- /dev/null +++ b/e2e/binary/wget/wget.py @@ -0,0 +1,14 @@ +from __future__ import annotations + +from subprocess import run + +from binary import Tool, HTTPInterface + + +def test_wget(tool: Tool, http_server: HTTPInterface) -> None: + binary = tool("wget") + + process = run( + [binary, "-q", "--spider", http_server.base_url], check=True, timeout=30 + ) + assert 0 == process.returncode -- GitLab