155 lines
4.3 KiB
Python
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()
|