Files
tilelang/testing/python/test_version_provider.py
T
2026-06-11 20:40:16 +08:00

91 lines
3.0 KiB
Python

from __future__ import annotations
import importlib.util
import shutil
import subprocess
import uuid
from pathlib import Path
import pytest
REPO_ROOT = Path(__file__).resolve().parents[2]
def _clear_version_env(monkeypatch: pytest.MonkeyPatch) -> None:
for name in (
"CUDA_VERSION",
"NO_GIT_VERSION",
"NO_TOOLCHAIN_VERSION",
"NO_VERSION_LABEL",
"TILELANG_BUILD_WHEEL_WITH_DATE",
"USE_CUDA",
"USE_ROCM",
):
monkeypatch.delenv(name, raising=False)
def _load_provider(root: Path):
spec = importlib.util.spec_from_file_location(
f"_tilelang_test_version_provider_{uuid.uuid4().hex}",
root / "version_provider.py",
)
assert spec is not None
assert spec.loader is not None
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
def _make_provider_tree(root: Path) -> None:
shutil.copy(REPO_ROOT / "version_provider.py", root / "version_provider.py")
(root / "VERSION").write_text("1.2.3\n", encoding="utf-8")
def test_extracted_sdist_uses_plain_version_by_default(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
_clear_version_env(monkeypatch)
_make_provider_tree(tmp_path)
(tmp_path / ".git_commit.txt").write_text("abcdef1234567890\n", encoding="utf-8")
provider = _load_provider(tmp_path)
assert provider.dynamic_metadata("version") == "1.2.3"
def test_extracted_sdist_can_opt_into_version_label(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
_clear_version_env(monkeypatch)
monkeypatch.setenv("NO_VERSION_LABEL", "OFF")
monkeypatch.setenv("NO_TOOLCHAIN_VERSION", "ON")
_make_provider_tree(tmp_path)
(tmp_path / ".git_commit.txt").write_text("abcdef1234567890\n", encoding="utf-8")
provider = _load_provider(tmp_path)
assert provider.dynamic_metadata("version") == "1.2.3+gitabcdef12"
@pytest.mark.skipif(shutil.which("git") is None, reason="git is required for checkout version test")
def test_git_checkout_uses_version_label_by_default(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
_clear_version_env(monkeypatch)
monkeypatch.setenv("NO_TOOLCHAIN_VERSION", "ON")
_make_provider_tree(tmp_path)
subprocess.run(["git", "init"], cwd=tmp_path, check=True, capture_output=True)
subprocess.run(["git", "config", "user.name", "TileLang Test"], cwd=tmp_path, check=True)
subprocess.run(["git", "config", "user.email", "tilelang-test@example.com"], cwd=tmp_path, check=True)
subprocess.run(["git", "add", "VERSION", "version_provider.py"], cwd=tmp_path, check=True)
subprocess.run(["git", "commit", "-m", "init"], cwd=tmp_path, check=True, capture_output=True)
commit = subprocess.run(
["git", "rev-parse", "HEAD"],
cwd=tmp_path,
check=True,
capture_output=True,
encoding="utf-8",
).stdout.strip()
provider = _load_provider(tmp_path)
assert provider.dynamic_metadata("version") == f"1.2.3+git{commit[:8]}"
assert (tmp_path / ".git_commit.txt").read_text(encoding="utf-8") == commit