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()