Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

219 lines
7.0 KiB
Python

#!/usr/bin/env python
"""Unit tests for upload_jax_manifest.py.
Tests verify that the manifest upload places files at the correct paths
and that helper functions normalize inputs correctly. Uses LocalStorageBackend
with a temp directory so no mocking of subprocess or boto3 is needed.
"""
import os
import sys
import tempfile
import unittest
from pathlib import Path
from unittest import mock
# Add build_tools to path so _therock_utils is importable.
sys.path.insert(0, os.fspath(Path(__file__).parent.parent.parent))
# Add github_actions to path so upload_jax_manifest is importable.
sys.path.insert(0, os.fspath(Path(__file__).parent.parent))
import upload_jax_manifest
from manifest_utils import (
normalize_python_version_for_filename,
normalize_ref_for_filename,
)
class TestNormalizePythonVersion(unittest.TestCase):
"""Tests for normalize_python_version_for_filename()."""
def test_strips_py_prefix(self):
self.assertEqual(
normalize_python_version_for_filename("py3.12"),
"3.12",
)
def test_plain_version(self):
self.assertEqual(
normalize_python_version_for_filename("3.12"),
"3.12",
)
def test_strips_whitespace(self):
self.assertEqual(
normalize_python_version_for_filename(" py3.13 "),
"3.13",
)
class TestSanitizeRefForFilename(unittest.TestCase):
"""Tests for normalize_ref_for_filename()."""
def test_simple_ref(self):
self.assertEqual(
normalize_ref_for_filename("nightly"),
"nightly",
)
def test_slashes_replaced(self):
self.assertEqual(
normalize_ref_for_filename("release/0.4.28"),
"release-0.4.28",
)
def test_multiple_slashes(self):
self.assertEqual(
normalize_ref_for_filename("users/alice/experiment"),
"users-alice-experiment",
)
# Override GITHUB_EVENT_NAME so _is_current_run_pr_from_fork() in
# workflow_outputs.py returns False. Without this, tests that call main()
# fail when run in a pull_request CI job because the real event payload
# has fork=true, which changes the S3 prefix used for output paths.
# TODO: These tests are brittle because they depend on the bucket selection
# logic deep in workflow_outputs.py. Consider mocking at the
# WorkflowOutputRoot level instead.
@mock.patch.dict(os.environ, {"GITHUB_EVENT_NAME": "push"})
class TestMain(unittest.TestCase):
"""Tests for main() end-to-end with LocalStorageBackend."""
def test_uploads_manifest_to_correct_path(self):
with tempfile.TemporaryDirectory() as tmp, tempfile.TemporaryDirectory() as staging:
dist_dir = Path(tmp)
staging_dir = Path(staging)
manifest_dir = dist_dir / "manifests"
manifest_dir.mkdir()
manifest_name = "therock-manifest_jax_py3.12_nightly.json"
(manifest_dir / manifest_name).write_text("{}", encoding="utf-8")
upload_jax_manifest.main(
[
"--dist-dir",
str(dist_dir),
"--run-id",
"12345",
"--amdgpu-family",
"gfx94X-dcgpu",
"--python-version",
"py3.12",
"--jax-git-ref",
"nightly",
"--output-dir",
str(staging_dir),
"--bucket",
"test",
]
)
self.assertTrue(
(
staging_dir
/ f"12345-{upload_jax_manifest.PLATFORM}"
/ "manifests"
/ "gfx94X-dcgpu"
/ manifest_name
).is_file()
)
def test_release_ref_sanitized_in_filename(self):
with tempfile.TemporaryDirectory() as tmp, tempfile.TemporaryDirectory() as staging:
dist_dir = Path(tmp)
staging_dir = Path(staging)
manifest_dir = dist_dir / "manifests"
manifest_dir.mkdir()
manifest_name = "therock-manifest_jax_py3.12_release-0.4.28.json"
(manifest_dir / manifest_name).write_text("{}", encoding="utf-8")
upload_jax_manifest.main(
[
"--dist-dir",
str(dist_dir),
"--run-id",
"99999",
"--amdgpu-family",
"gfx110X-all",
"--python-version",
"3.12",
"--jax-git-ref",
"release/0.4.28",
"--output-dir",
str(staging_dir),
"--bucket",
"test",
]
)
self.assertTrue(
(
staging_dir
/ f"99999-{upload_jax_manifest.PLATFORM}"
/ "manifests"
/ "gfx110X-all"
/ manifest_name
).is_file()
)
def test_missing_manifest_raises(self):
with tempfile.TemporaryDirectory() as tmp, tempfile.TemporaryDirectory() as staging:
dist_dir = Path(tmp)
(dist_dir / "manifests").mkdir()
with self.assertRaises(FileNotFoundError):
upload_jax_manifest.main(
[
"--dist-dir",
str(dist_dir),
"--run-id",
"12345",
"--amdgpu-family",
"gfx94X-dcgpu",
"--python-version",
"3.12",
"--jax-git-ref",
"nightly",
"--output-dir",
str(staging),
"--bucket",
"test",
]
)
def test_dry_run_does_not_write(self):
with tempfile.TemporaryDirectory() as tmp, tempfile.TemporaryDirectory() as staging:
dist_dir = Path(tmp)
staging_dir = Path(staging)
manifest_dir = dist_dir / "manifests"
manifest_dir.mkdir()
manifest_name = "therock-manifest_jax_py3.12_nightly.json"
(manifest_dir / manifest_name).write_text("{}", encoding="utf-8")
upload_jax_manifest.main(
[
"--dist-dir",
str(dist_dir),
"--run-id",
"12345",
"--amdgpu-family",
"gfx94X-dcgpu",
"--python-version",
"py3.12",
"--jax-git-ref",
"nightly",
"--output-dir",
str(staging_dir),
"--dry-run",
]
)
self.assertEqual(list(staging_dir.iterdir()), [])
if __name__ == "__main__":
unittest.main()