Files
agentci/tests/test_install_scripts.py
2026-07-22 23:10:23 +02:00

155 lines
4.3 KiB
Python

import os
import subprocess
from pathlib import Path
ROOT = Path(__file__).parents[1]
def executable(path: Path, content: str) -> None:
path.write_text(content)
path.chmod(0o755)
def test_python_installer_configures_uv_and_stable_python_links(tmp_path: Path) -> None:
fake_bin = tmp_path / "fake-bin"
fake_bin.mkdir()
tools = tmp_path / "tools"
uv_log = tmp_path / "uv.log"
executable(
fake_bin / "uv",
"""#!/bin/sh
set -eu
{
printf 'UV_NO_CONFIG=%s\n' "$UV_NO_CONFIG"
printf 'UV_PYTHON_INSTALL_DIR=%s\n' "$UV_PYTHON_INSTALL_DIR"
printf 'UV_PYTHON_BIN_DIR=%s\n' "$UV_PYTHON_BIN_DIR"
printf 'UV_PYTHON_INSTALL_BIN=%s\n' "$UV_PYTHON_INSTALL_BIN"
printf 'args=%s %s %s\n' "$1" "$2" "$3"
} > "$FAKE_UV_LOG"
minor=$(printf '%s' "$3" | cut -d. -f1,2)
mkdir -p "$UV_PYTHON_INSTALL_DIR" "$UV_PYTHON_BIN_DIR"
cat > "$UV_PYTHON_BIN_DIR/python$minor" <<'PYTHON'
#!/bin/sh
printf '%s\n' 'Python fake'
PYTHON
chmod 0755 "$UV_PYTHON_BIN_DIR/python$minor"
""",
)
environment = {
**os.environ,
"PATH": f"{fake_bin}:{os.environ['PATH']}",
"DEV_TOOLS_DIR": str(tools),
"PYTHON_VERSION": "3.13.7",
"FAKE_UV_LOG": str(uv_log),
}
result = subprocess.run(
["/bin/sh", str(ROOT / "install-scripts" / "python")],
env=environment,
capture_output=True,
text=True,
timeout=10,
check=False,
)
assert result.returncode == 0, result.stderr
assert result.stdout == "Python fake\n"
assert uv_log.read_text().splitlines() == [
"UV_NO_CONFIG=1",
f"UV_PYTHON_INSTALL_DIR={tools / 'python'}",
f"UV_PYTHON_BIN_DIR={tools / 'bin'}",
"UV_PYTHON_INSTALL_BIN=1",
"args=python install 3.13.7",
]
assert (tools / "bin" / "python").readlink() == Path("python3.13")
assert (tools / "bin" / "python3").readlink() == Path("python3.13")
def test_dotnet_installer_builds_persistent_runtime_wrapper_without_network(
tmp_path: Path,
) -> None:
fake_bin = tmp_path / "fake-bin"
fake_bin.mkdir()
tools = tmp_path / "tools"
installer_log = tmp_path / "installer.log"
dotnet_log = tmp_path / "dotnet.log"
executable(
fake_bin / "python3",
"""#!/bin/sh
set -eu
[ "$1" = - ]
cat > "$2" <<'INSTALLER'
#!/bin/sh
set -eu
printf '%s\n' "$@" > "$FAKE_INSTALLER_LOG"
install_dir=
while [ "$#" -gt 0 ]; do
case "$1" in
--install-dir) install_dir=$2; shift 2 ;;
*) shift ;;
esac
done
mkdir -p "$install_dir"
cat > "$install_dir/dotnet" <<'DOTNET'
#!/bin/sh
set -eu
printf '%s|%s|%s|%s|%s|%s\n' \
"$*" "$DOTNET_ROOT" "$DOTNET_CLI_HOME" "$NUGET_PACKAGES" \
"$NUGET_HTTP_CACHE_PATH" "$HOME" >> "$FAKE_DOTNET_LOG"
DOTNET
chmod 0755 "$install_dir/dotnet"
INSTALLER
""",
)
environment = {
**os.environ,
"PATH": f"{fake_bin}:{os.environ['PATH']}",
"DEV_TOOLS_DIR": str(tools),
"DOTNET_CHANNEL": "10.0",
"FAKE_INSTALLER_LOG": str(installer_log),
"FAKE_DOTNET_LOG": str(dotnet_log),
}
result = subprocess.run(
["/bin/sh", str(ROOT / "install-scripts" / "dotnet")],
env=environment,
capture_output=True,
text=True,
timeout=10,
check=False,
)
assert result.returncode == 0, result.stderr
assert installer_log.read_text().splitlines() == [
"--channel",
"10.0",
"--install-dir",
str(tools / "dotnet"),
"--no-path",
]
wrapper = tools / "bin" / "dotnet"
assert os.access(wrapper, os.X_OK)
wrapped = subprocess.run(
[wrapper, "--version"],
env=environment,
capture_output=True,
text=True,
timeout=10,
check=False,
)
assert wrapped.returncode == 0, wrapped.stderr
calls = dotnet_log.read_text().splitlines()
assert calls[0].split("|")[0] == "--info"
assert calls[1].split("|") == [
"--version",
str(tools / "dotnet"),
str(tools / "runtime" / "dotnet" / "home"),
str(tools / "runtime" / "dotnet" / "nuget" / "packages"),
str(tools / "runtime" / "dotnet" / "nuget" / "http-cache"),
str(tools / "runtime" / "dotnet" / "home"),
]
assert (tools / "runtime" / "dotnet" / "home").is_dir()
assert (tools / "runtime" / "dotnet" / "nuget" / "packages").is_dir()