diff --git a/e2e/binary/BUILD.bazel b/e2e/binary/BUILD.bazel index 24cf276de710eca3e2a6118cd09458045dd8224e..b0929f3617b7595685610e0b7e0c0fa97376f3fe 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 0c485f0bbcf04fa4b1ba05ba6758963b257249fc..f9a883e71be7d2e4f4424ea99c41996bf27f8b84 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 b645b614147b259c1dfc99e08810588070383880..01548349e998fadecd2e36e1f5b3dba9290e94ab 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 0000000000000000000000000000000000000000..b0962be5e5d288c5ac3807beaf95284e7bb02a6d --- /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, "", "", "", "")) diff --git a/e2e/binary/wget/BUILD.bazel b/e2e/binary/wget/BUILD.bazel index 2664737eaf022aad95f4f5accbd831b962984ba3..9505b982d74c5c30d78068644b65f58dc44c23c6 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 0000000000000000000000000000000000000000..1944beef711406169d3dd0a79c728569583e4422 --- /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