Files
Strata/tools/test_setup_cuda_repo.py
Niko1221 20b501743d setup: Ubuntu keeps its checked cuda-toolkit-13-0 install; Debian stops with a message when no 13.x installs (#2172 follow-up)
The Debian fallback loop ran with check=False on Ubuntu too, so a failed 13.0 install (a
network or apt lock error) went on to 13-1..13-4 and then past the loop without a word. Ubuntu
is back to the single checked install of 0.1.43; Debian tries 13-0..13-9 and fails with
guidance when none installs. Checked against NVIDIA's repos today: debian12 and ubuntu2404
carry 13-0..13-3, debian13 starts at 13-1 (up to 13-4). Two tests added.
2026-10-13 00:49:11 +02:00

116 lines
6.0 KiB
Python

"""The CUDA Toolkit apt install: which distros it covers and which 13.x package it picks
(Debian 13's repo has no cuda-toolkit-13-0). No GPU, downloads or installs are used.
python -m unittest tools.test_setup_cuda_repo
"""
from __future__ import annotations
import contextlib
import io
import sys
import types
import unittest
from pathlib import Path
from unittest import mock
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
import setup # noqa: E402
class AptRepo(unittest.TestCase):
def test_known_and_unknown_distros(self):
for osr, want in ({"ID": "ubuntu", "VERSION_ID": '"22.04"'}, "ubuntu2204"), \
({"ID": "ubuntu", "VERSION_ID": '"24.04"'}, "ubuntu2404"), \
({"ID": "debian", "VERSION_ID": '"12"'}, "debian12"), \
({"ID": "debian", "VERSION_ID": '"13"'}, "debian13"), \
({"ID": "debian", "VERSION_ID": '"11"'}, None), \
({"ID": "fedora", "VERSION_ID": '"42"'}, None), \
({}, None):
with self.subTest(osr=osr):
self.assertEqual(setup.cuda_apt_repo(osr), want)
def test_debian_13_falls_back_to_the_oldest_13_x_it_has(self):
# the repo has no 13-0: apt fails on it, setup must try 13-1 and stop there (not install 13-2+)
installed = []
def fake_run(cmd, **kw):
installed.append(cmd[-1])
return types.SimpleNamespace(returncode=100 if cmd[-1] == "cuda-toolkit-13-0" else 0)
with mock.patch.object(setup, "WIN", False), \
mock.patch.object(setup, "find_nvcc", side_effect=[(None, (0, 0)), ("/usr/local/cuda-13.1/bin/nvcc", (13, 1))]), \
mock.patch.object(setup.shutil, "which", lambda n: "/usr/bin/" + n), \
mock.patch("builtins.open", mock.mock_open(read_data='ID=debian\nVERSION_ID="13"\n')), \
mock.patch.object(setup, "download") as download, \
mock.patch.object(setup, "run", side_effect=fake_run), \
contextlib.redirect_stdout(io.StringIO()):
nvcc, _ = setup.install_build_tools({"arch": "86", "archs": [86]}, True)
self.assertEqual(nvcc, "/usr/local/cuda-13.1/bin/nvcc")
self.assertIn("repos/debian13/x86_64/cuda-keyring_1.1-1_all.deb", download.call_args[0][0])
self.assertEqual(installed[-2:], ["cuda-toolkit-13-0", "cuda-toolkit-13-1"])
def test_ubuntu_still_installs_exactly_13_0(self):
installed = []
def fake_run(cmd, **kw):
if cmd[0:2] == ["sudo", "apt-get"] and cmd[2] == "install":
installed.append(cmd[-1])
return types.SimpleNamespace(returncode=0)
with mock.patch.object(setup, "WIN", False), \
mock.patch.object(setup, "find_nvcc", side_effect=[(None, (0, 0)), ("/usr/local/cuda-13.0/bin/nvcc", (13, 0))]), \
mock.patch.object(setup.shutil, "which", lambda n: "/usr/bin/" + n), \
mock.patch("builtins.open", mock.mock_open(read_data='ID=ubuntu\nVERSION_ID="24.04"\n')), \
mock.patch.object(setup, "download"), \
mock.patch.object(setup, "run", side_effect=fake_run), \
contextlib.redirect_stdout(io.StringIO()):
setup.install_build_tools({"arch": "86", "archs": [86]}, True)
self.assertEqual(installed, ["cuda-toolkit-13-0"])
def test_debian_without_any_13_x_stops_with_guidance(self):
out = io.StringIO()
with mock.patch.object(setup, "WIN", False), \
mock.patch.object(setup, "find_nvcc", return_value=(None, (0, 0))), \
mock.patch.object(setup.shutil, "which", lambda n: "/usr/bin/" + n), \
mock.patch("builtins.open", mock.mock_open(read_data='ID=debian\nVERSION_ID="12"\n')), \
mock.patch.object(setup, "download"), \
mock.patch.object(setup, "run", return_value=types.SimpleNamespace(returncode=100)), \
contextlib.redirect_stdout(out):
with self.assertRaises(SystemExit):
setup.install_build_tools({"arch": "86", "archs": [86]}, True)
self.assertIn("no cuda-toolkit-13-x package", out.getvalue())
def test_ubuntu_install_failure_still_stops_setup(self):
def fake_run(cmd, check=True, **kw):
failed = cmd[-1] == "cuda-toolkit-13-0"
if failed and check:
raise SystemExit(1) # setup.run's own fail() on a checked command
return types.SimpleNamespace(returncode=100 if failed else 0)
with mock.patch.object(setup, "WIN", False), \
mock.patch.object(setup, "find_nvcc", return_value=(None, (0, 0))), \
mock.patch.object(setup.shutil, "which", lambda n: "/usr/bin/" + n), \
mock.patch("builtins.open", mock.mock_open(read_data='ID=ubuntu\nVERSION_ID="22.04"\n')), \
mock.patch.object(setup, "download"), \
mock.patch.object(setup, "run", side_effect=fake_run), \
contextlib.redirect_stdout(io.StringIO()):
with self.assertRaises(SystemExit):
setup.install_build_tools({"arch": "86", "archs": [86]}, True)
def test_unknown_distro_stops_with_guidance(self):
out = io.StringIO()
with mock.patch.object(setup, "WIN", False), \
mock.patch.object(setup, "find_nvcc", return_value=(None, (0, 0))), \
mock.patch.object(setup.shutil, "which", lambda n: "/usr/bin/" + n), \
mock.patch("builtins.open", mock.mock_open(read_data='ID=fedora\nVERSION_ID="42"\n')), \
mock.patch.object(setup, "download", side_effect=AssertionError("download started")), \
contextlib.redirect_stdout(out):
with self.assertRaises(SystemExit):
setup.install_build_tools({"arch": "86", "archs": [86]}, True)
self.assertIn("Debian 12 / 13", out.getvalue())
if __name__ == "__main__":
unittest.main()