Skip to content

Commit d3c5aee

Browse files
author
benoit-cty
committed
unit tests
1 parent c7aca80 commit d3c5aee

1 file changed

Lines changed: 82 additions & 0 deletions

File tree

tests/test_rapl_permissions.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import logging
2+
import os
3+
import stat
4+
import sys
5+
6+
import pytest
7+
8+
from codecarbon.core.cpu import IntelRAPL
9+
10+
11+
@pytest.mark.skipif(not sys.platform.lower().startswith("lin"), reason="requires Linux")
12+
def test_main_rapl_permission_error(tmp_path):
13+
"""If the main/package energy file is not readable we must fail loudly."""
14+
base = tmp_path
15+
# create minimal RAPL tree
16+
d0 = base / "intel-rapl:0"
17+
d0.mkdir()
18+
(d0 / "name").write_text("package-0")
19+
energy0 = d0 / "energy_uj"
20+
energy0.write_text("52649883221")
21+
(d0 / "max_energy_range_uj").write_text("262143328850")
22+
23+
# another domain (readable)
24+
d1 = base / "intel-rapl:1"
25+
d1.mkdir()
26+
(d1 / "name").write_text("psys")
27+
(d1 / "energy_uj").write_text("117870082040")
28+
(d1 / "max_energy_range_uj").write_text("262143328850")
29+
30+
# Make the main energy file unreadable to simulate permission error
31+
mode_before = energy0.stat().st_mode
32+
try:
33+
os.chmod(energy0, 0)
34+
with pytest.raises(PermissionError):
35+
IntelRAPL(rapl_dir=str(base))
36+
finally:
37+
# restore permissions so tmp_path can be cleaned up
38+
try:
39+
os.chmod(energy0, stat.S_IMODE(mode_before) or 0o644)
40+
except Exception:
41+
pass
42+
43+
44+
@pytest.mark.skipif(not sys.platform.lower().startswith("lin"), reason="requires Linux")
45+
def test_non_main_rapl_permission_warning_and_skip(tmp_path, caplog):
46+
"""If a non-main domain (e.g. psys) is unreadable, it should be skipped and warn."""
47+
base = tmp_path
48+
d0 = base / "intel-rapl:0"
49+
d0.mkdir()
50+
(d0 / "name").write_text("package-0")
51+
(d0 / "energy_uj").write_text("52649883221")
52+
(d0 / "max_energy_range_uj").write_text("262143328850")
53+
54+
d1 = base / "intel-rapl:1"
55+
d1.mkdir()
56+
(d1 / "name").write_text("psys")
57+
energy1 = d1 / "energy_uj"
58+
energy1.write_text("117870082040")
59+
(d1 / "max_energy_range_uj").write_text("262143328850")
60+
61+
# Make the non-main energy file unreadable
62+
mode_before = energy1.stat().st_mode
63+
caplog.set_level(logging.WARNING, logger="codecarbon")
64+
try:
65+
os.chmod(energy1, 0)
66+
rapl = IntelRAPL(rapl_dir=str(base))
67+
# The unreadable non-main domain should be skipped
68+
assert len(rapl._rapl_files) == 1
69+
assert rapl._rapl_files[0].path.endswith("intel-rapl:0/energy_uj")
70+
71+
# A warning about permission denied should be emitted
72+
messages = [r.getMessage() for r in caplog.records]
73+
assert any(
74+
"Permission denied reading RAPL file" in m
75+
or "Permission denied listing" in m
76+
for m in messages
77+
)
78+
finally:
79+
try:
80+
os.chmod(energy1, stat.S_IMODE(mode_before) or 0o644)
81+
except Exception:
82+
pass

0 commit comments

Comments
 (0)