Skip to content

Commit 78c8c9a

Browse files
committed
Use fixed list of bios data files and update unit tests
1 parent d2dba97 commit 78c8c9a

2 files changed

Lines changed: 58 additions & 50 deletions

File tree

checkbox-ng/checkbox_ng/support/device_info.py

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#!/usr/bin/env python3
22
import argparse
3-
import glob
43
import json
5-
import os
4+
from pathlib import Path
65
import platform
76
import subprocess
7+
import sys
88

99
from checkbox_ng.support.release_info import get_release_info
1010
from checkbox_ng.support.parsers.meminfo import MeminfoParser
@@ -44,20 +44,27 @@ def get_bios_info() -> dict:
4444
- bios_version
4545
4646
This function extracts the content from these files and returns a dict,
47-
using the filename as a key.
47+
using the filename as a key, defaulting to `None` if it cannot find data.
4848
"""
49-
bios_data = {}
50-
base_path = "/sys/class/dmi/id/bios_*"
51-
52-
for filepath in glob.glob(base_path):
53-
key = os.path.basename(filepath)
49+
bios_data = {
50+
"date": None,
51+
"release": None,
52+
"vendor": None,
53+
"version": None,
54+
}
55+
bios_root = Path("/sys/class/dmi/id/")
56+
bios_data_name = "bios_{}"
57+
for key in bios_data:
5458
try:
55-
with open(filepath, "r") as f:
56-
bios_data[key] = f.read().strip()
57-
except (PermissionError, OSError):
58-
# If a specific file is restricted or unreadable, skip it
59-
continue
60-
59+
value = (
60+
(bios_root / bios_data_name.format(key)).read_text().strip()
61+
)
62+
bios_data[key] = value
63+
except (PermissionError, FileNotFoundError) as e:
64+
print(
65+
"Failed to read bios {}. Error: {}".format(key, e),
66+
file=sys.stderr,
67+
)
6168
return bios_data
6269

6370

checkbox-ng/checkbox_ng/support/tests/test_device_info.py

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -30,64 +30,64 @@ def test_get_debian_packages(self, mock_co):
3030
self.assertEqual(pkg[0]["version"], "23.01+dfsg-11")
3131
self.assertEqual(pkg[0]["architecture"], "amd64")
3232

33-
@patch("glob.glob")
34-
def test_get_bios_info_success(self, mock_glob):
33+
def test_get_bios_info_success(self):
3534
"""Test successful retrieval of multiple BIOS files."""
36-
# Setup mocks
37-
mock_glob.return_items = [
38-
"/sys/class/dmi/id/bios_vendor",
39-
"/sys/class/dmi/id/bios_version",
40-
]
41-
mock_glob.return_value = mock_glob.return_items
42-
43-
# Use a mapping for mock_open to return different data for different files
44-
file_contents = {
45-
"/sys/class/dmi/id/bios_vendor": "Dell Inc.",
46-
"/sys/class/dmi/id/bios_version": "1.5.0",
47-
}
4835

49-
def side_effect_open(filename, mode):
50-
content = file_contents.get(filename, "")
51-
return mock_open(read_data=content).return_value
36+
file_contents = [
37+
"2026/03/20",
38+
"v1.0",
39+
"Dell Inc.",
40+
"1.5.0",
41+
]
5242

53-
with patch("builtins.open", side_effect=side_effect_open):
43+
with patch(
44+
"checkbox_ng.support.device_info.Path.read_text",
45+
side_effect=file_contents,
46+
):
5447
result = device_info.get_bios_info()
5548

56-
self.assertEqual(result["bios_vendor"], "Dell Inc.")
57-
self.assertEqual(result["bios_version"], "1.5.0")
58-
self.assertEqual(len(result), 2)
49+
self.assertEqual(result["vendor"], "Dell Inc.")
50+
self.assertEqual(result["version"], "1.5.0")
51+
self.assertEqual(len(result), 4)
5952

60-
@patch("glob.glob")
61-
def test_get_bios_info_empty(self, mock_glob):
53+
def test_get_bios_info_empty(self):
6254
"""Test behavior when no bios_* files are found."""
63-
mock_glob.return_value = []
64-
65-
result = device_info.get_bios_info()
55+
with patch(
56+
"checkbox_ng.support.device_info.Path.read_text",
57+
side_effect=FileNotFoundError,
58+
):
59+
result = device_info.get_bios_info()
6660

67-
self.assertEqual(result, {})
61+
self.assertEqual(
62+
result,
63+
{"date": None, "release": None, "vendor": None, "version": None},
64+
)
6865

69-
@patch("glob.glob")
70-
@patch("os.path.basename")
71-
def test_get_bios_info_permission_denied(self, mock_basename, mock_glob):
66+
def test_get_bios_info_permission_denied(self):
7267
"""Test behavior when a file exists but cannot be read."""
73-
mock_glob.return_value = ["/sys/class/dmi/id/bios_version"]
74-
mock_basename.return_value = "bios_version"
75-
76-
# Force a PermissionError when trying to open the file
77-
with patch("builtins.open", side_effect=PermissionError):
68+
with patch(
69+
"checkbox_ng.support.device_info.Path.read_text",
70+
side_effect=PermissionError,
71+
):
7872
result = device_info.get_bios_info()
79-
self.assertEqual(result, {})
73+
74+
self.assertEqual(
75+
result,
76+
{"date": None, "release": None, "vendor": None, "version": None},
77+
)
8078

8179
@patch("checkbox_ng.support.device_info.get_debian_packages")
8280
@patch("checkbox_ng.support.device_info.get_devices")
8381
@patch("checkbox_ng.support.device_info.get_release_info")
8482
@patch("checkbox_ng.support.device_info.get_meminfo")
8583
@patch("checkbox_ng.support.device_info.get_snap_packages")
8684
@patch("checkbox_ng.support.device_info.get_uname")
85+
@patch("checkbox_ng.support.device_info.get_bios_info")
8786
@patch("checkbox_ng.support.device_info.get_kernel_cmdline")
8887
def test_kernel_cmdline_subcommand_uses_only_kernel_getter(
8988
self,
9089
mock_kernel_cmdline,
90+
mock_bios_info,
9191
mock_uname,
9292
mock_snap_packages,
9393
mock_meminfo,
@@ -105,6 +105,7 @@ def test_kernel_cmdline_subcommand_uses_only_kernel_getter(
105105
)
106106
mock_kernel_cmdline.assert_called_once_with()
107107
mock_uname.assert_not_called()
108+
mock_bios_info.assert_not_called()
108109
mock_meminfo.assert_not_called()
109110
mock_release_info.assert_not_called()
110111
mock_devices.assert_not_called()

0 commit comments

Comments
 (0)