e93507a09c
Lockfile supply-chain audit / lockfile supply-chain audit (push) Has been cancelled
Windows Studio GGUF CI / GPU prebuilt resolves without Visual Studio (push) Has been cancelled
Windows Studio GGUF CI / setup.ps1 unit tests (VS 2026 / CMake guard) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2022) (push) Has been cancelled
Windows Studio GGUF CI / real-VS detection (VS 2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-2025-vs2026) (push) Has been cancelled
Windows Studio GGUF CI / VC++ runtime detect + install round-trip (windows-latest) (push) Has been cancelled
Windows Studio Update CI / Studio Updating Tests (push) Has been cancelled
Wheel CI / Wheel build + content sanity + import smoke (push) Has been cancelled
Lint CI / Source lint (Python + shell + YAML + JSON + safety nets) (push) Has been cancelled
MLX CI on Mac M1 / dispatch (push) Has been cancelled
Security audit / advisory audit (pip + npm + cargo) (push) Has been cancelled
Security audit / pip scan-packages :: extras (push) Has been cancelled
Security audit / pip scan-packages :: studio (push) Has been cancelled
Security audit / pip scan-packages :: hf-stack (push) Has been cancelled
Security audit / npm scan-packages (Studio frontend tarballs) (push) Has been cancelled
Security audit / workflow-trigger lint (pull_request_target / cache-poisoning) (push) Has been cancelled
Security audit / pytest tests/security (push) Has been cancelled
Security audit / npm provenance + new install-script diff (push) Has been cancelled
Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Backend CI / (Python 3.10) (push) Has been cancelled
Backend CI / (Python 3.11) (push) Has been cancelled
Backend CI / (Python 3.12) (push) Has been cancelled
Backend CI / (Python 3.13) (push) Has been cancelled
Backend CI / Repo tests (CPU) (push) Has been cancelled
Frontend CI / Frontend build + bundle sanity (push) Has been cancelled
Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Mac Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Mac Studio GGUF CI / JSON, images (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-14) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26) (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-15-intel) (push) Has been cancelled
Mac Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Mac Studio Install Matrix CI / Install + load (macos-26-intel) (push) Has been cancelled
Mac Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Tauri CI / Tauri Linux debug build (no codesign) (push) Has been cancelled
Mac Studio Update CI / Studio Updating Tests (push) Has been cancelled
Studio UI CI / Chat UI Tests (push) Has been cancelled
Windows Studio API CI / Studio API & Auth Tests (push) Has been cancelled
Windows Studio UI CI / Chat UI Tests (push) Has been cancelled
Studio Update CI / Studio Updating Tests (push) Has been cancelled
Core / Core (HF=default + TRL=default) (push) Has been cancelled
Core / Core (HF=4.57.6 + TRL<1) (push) Has been cancelled
Core / Core (HF=latest + TRL=latest) (push) Has been cancelled
Core / llama.cpp build + smoke (push) Has been cancelled
Windows Studio GGUF CI / OpenAI, Anthropic API tests (push) Has been cancelled
Windows Studio GGUF CI / Tool calling Tests (push) Has been cancelled
Windows Studio GGUF CI / JSON, images (push) Has been cancelled
Windows Studio GGUF CI / Studio install + inference without Visual Studio (push) Has been cancelled
Studio export capability / capability (macos-latest) (push) Has been cancelled
Studio export capability / capability (ubuntu-latest) (push) Has been cancelled
Studio export capability / capability (windows-latest) (push) Has been cancelled
Cross-platform parity / parity (macos-latest) (push) Has been cancelled
Cross-platform parity / parity (windows-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Studio load-orchestrator CI / test (push) Has been cancelled
75 lines
2.3 KiB
Python
75 lines
2.3 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0
|
|
|
|
"""Tests for Apple Silicon GPU sensors (SMC temperature + IOReport power)."""
|
|
|
|
import ctypes
|
|
import platform
|
|
import time
|
|
|
|
import pytest
|
|
|
|
from utils.hardware import apple
|
|
|
|
_IS_APPLE_SILICON = platform.system() == "Darwin" and platform.machine() == "arm64"
|
|
|
|
|
|
class TestFourcc:
|
|
def test_roundtrip(self):
|
|
for key in ("#KEY", "Tg0D", "flt "):
|
|
assert apple._fourcc_str(apple._fourcc(key)) == key
|
|
|
|
def test_known_value(self):
|
|
# "flt " FourCC, same constant macmon uses.
|
|
assert apple._fourcc("flt ") == 1718383648
|
|
|
|
|
|
class TestWatts:
|
|
def test_millijoules(self):
|
|
assert apple._watts(2000, "mJ", 2.0) == pytest.approx(1.0)
|
|
|
|
def test_microjoules(self):
|
|
assert apple._watts(5_000_000, "uJ", 1.0) == pytest.approx(5.0)
|
|
|
|
def test_nanojoules(self):
|
|
assert apple._watts(1_500_000_000, "nJ", 1.0) == pytest.approx(1.5)
|
|
|
|
def test_unknown_unit_returns_none(self):
|
|
assert apple._watts(1000, "J", 1.0) is None
|
|
|
|
def test_zero_elapsed_returns_none(self):
|
|
assert apple._watts(1000, "mJ", 0.0) is None
|
|
|
|
|
|
class TestAverageValidTemps:
|
|
def test_averages_and_rounds(self):
|
|
assert apple._average_valid_temps([40.0, 50.0, 60.05]) == 50.0
|
|
|
|
def test_filters_invalid(self):
|
|
assert apple._average_valid_temps([-1.0, 0.0, 151.0, 42.0]) == 42.0
|
|
|
|
def test_empty_returns_none(self):
|
|
assert apple._average_valid_temps([]) is None
|
|
assert apple._average_valid_temps([0.0, 200.0]) is None
|
|
|
|
|
|
class TestSmcStructLayout:
|
|
def test_key_data_matches_smc_protocol_size(self):
|
|
# The AppleSMC user client rejects calls whose struct size differs.
|
|
assert ctypes.sizeof(apple._SMCKeyData) == 80
|
|
|
|
|
|
@pytest.mark.skipif(not _IS_APPLE_SILICON, reason = "requires Apple Silicon")
|
|
class TestLiveSensors:
|
|
def test_gpu_temperature_in_plausible_range(self):
|
|
temp = apple.read_gpu_temperature_c()
|
|
assert temp is not None
|
|
assert 0.0 < temp <= 150.0
|
|
|
|
def test_gpu_power_after_baseline(self):
|
|
apple.read_gpu_power_w() # first call only sets the baseline
|
|
time.sleep(0.3)
|
|
power = apple.read_gpu_power_w()
|
|
assert power is not None
|
|
assert power >= 0.0
|