ci: Improve pipeline unit test test_derive_docker_image_matrix

This commit is contained in:
Marian Koop 2026-07-28 01:25:13 +02:00 committed by mkoop-ni
parent 943692b9c7
commit a3d8778a84
3 changed files with 40 additions and 7 deletions

View File

@ -44,6 +44,8 @@ SECTION_DATA_MAP = {
def _parse_matrix_string(raw_value: str) -> dict[str, dict[str, Any]]: def _parse_matrix_string(raw_value: str) -> dict[str, dict[str, Any]]:
if not raw_value:
return {}
parsed = ast.literal_eval(raw_value) parsed = ast.literal_eval(raw_value)
if not isinstance(parsed, dict): if not isinstance(parsed, dict):
raise ValueError("Expected matrix content to parse as a dict") raise ValueError("Expected matrix content to parse as a dict")

View File

@ -1,6 +1,6 @@
4.10.0_20260711.1 4.10.0_20260727.3
rnd-docker-ci/ni/rfsdr/ rnd-docker-pre/ni/rfsdr/
{'Fedora-42-builder':{'buildOSName':'fedora42','dockerImageName':'uhd-builder-fedora42','releaseName':'42'}, 'Fedora-43-builder':{'buildOSName':'fedora43','dockerImageName':'uhd-builder-fedora43','releaseName':'43'}, 'Fedora-44-builder':{'buildOSName':'fedora44','dockerImageName':'uhd-builder-fedora44','releaseName':'44'}, 'Ubuntu-2004-builder':{'buildOSName':'ubuntu2004','dockerImageName':'uhd-builder-ubuntu2004','releaseName':'focal'}, 'Ubuntu-2204-builder':{'buildOSName':'ubuntu2204','dockerImageName':'uhd-builder-ubuntu2204','releaseName':'jammy'}, 'Ubuntu-2404-builder':{'buildOSName':'ubuntu2404','dockerImageName':'uhd-builder-ubuntu2404','releaseName':'noble'}, 'Ubuntu-2510-builder':{'buildOSName':'ubuntu2510','dockerImageName':'uhd-builder-ubuntu2510','releaseName':'questing'}}
{'VS2022-x64-py310-builder':{'buildOSName':'win-vs22-v143-x64-py310','dockerImageName':'uhd-builder-vs2022-v143-x64-py310','cmakeCompiler':'Visual Studio 17 2022','cmakeArch':'x64','vsArch':'x64','vsYear':'2022','pythonVersion':'python310'}, 'VS2022-x64-py312-builder':{'buildOSName':'win-vs22-v143-x64-py312','dockerImageName':'uhd-builder-vs2022-v143-x64-py312','cmakeCompiler':'Visual Studio 17 2022','cmakeArch':'x64','vsArch':'x64','vsYear':'2022','pythonVersion':'python312'}, 'VS2026-x64-py310-builder':{'buildOSName':'win-vs26-v145-x64-py310','dockerImageName':'uhd-builder-vs2026-v145-x64-py310','cmakeCompiler':'Visual Studio 18 2026','cmakeArch':'x64','vsArch':'x64','vsYear':'2026','pythonVersion':'python310'}, 'VS2026-x64-py312-builder':{'buildOSName':'win-vs26-v145-x64-py312','dockerImageName':'uhd-builder-vs2026-v145-x64-py312','cmakeCompiler':'Visual Studio 18 2026','cmakeArch':'x64','vsArch':'x64','vsYear':'2026','pythonVersion':'python312'}} {'VS2022-x64-py310-builder':{'buildOSName':'win-vs22-v143-x64-py310','dockerImageName':'uhd-builder-vs2022-v143-x64-py310','cmakeCompiler':'Visual Studio 17 2022','cmakeArch':'x64','vsArch':'x64','vsYear':'2022','pythonVersion':'python310'}, 'VS2022-x64-py312-builder':{'buildOSName':'win-vs22-v143-x64-py312','dockerImageName':'uhd-builder-vs2022-v143-x64-py312','cmakeCompiler':'Visual Studio 17 2022','cmakeArch':'x64','vsArch':'x64','vsYear':'2022','pythonVersion':'python312'}, 'VS2026-x64-py310-builder':{'buildOSName':'win-vs26-v145-x64-py310','dockerImageName':'uhd-builder-vs2026-v145-x64-py310','cmakeCompiler':'Visual Studio 18 2026','cmakeArch':'x64','vsArch':'x64','vsYear':'2026','pythonVersion':'python310'}, 'VS2026-x64-py312-builder':{'buildOSName':'win-vs26-v145-x64-py312','dockerImageName':'uhd-builder-vs2026-v145-x64-py312','cmakeCompiler':'Visual Studio 18 2026','cmakeArch':'x64','vsArch':'x64','vsYear':'2026','pythonVersion':'python312'}}
{'macOS-15-x64':{'buildOSName':'macOS-15-x64', 'macOSVersionDemand':'15', 'macOSArchDemand': 'X64'}} {'macOS-15-x64':{'buildOSName':'macOS-15-x64', 'macOSVersionDemand':'15', 'macOSArchDemand': 'X64'}}
{} {}

View File

@ -19,6 +19,7 @@ import ast
import subprocess import subprocess
import sys import sys
import unittest import unittest
import warnings
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional
@ -59,17 +60,43 @@ class DeriveDockerImageMatrixTests(unittest.TestCase):
self.fixture = self.__class__.fixture self.fixture = self.__class__.fixture
self.using_artifact_override = ARTIFACT_FILE_OVERRIDE is not None self.using_artifact_override = ARTIFACT_FILE_OVERRIDE is not None
self.artifact_data = self.parse_docker_image_names_file(self.fixture) self.artifact_data = self.parse_docker_image_names_file(self.fixture)
self._warn_for_empty_optional_matrices()
def _warn_for_empty_optional_matrices(self) -> None:
"""Warn if expected matrix sections are present but empty."""
line_map = {
"linux_matrix": 3,
"win_matrix": 4,
"macos_builders": 5,
}
for key, line_no in line_map.items():
value = self.artifact_data.get(key)
if isinstance(value, dict) and not value:
warnings.warn(
f"DockerImageNames line {line_no} ({key}) is an empty dict; "
"tests requiring populated matrix entries may be skipped.",
UserWarning,
)
def _skip_if_matrix_empty(self, key: str, line_no: int) -> None:
"""Skip tests that need populated matrix content when section is empty."""
value = self.artifact_data.get(key)
if isinstance(value, dict) and not value:
warnings.warn(
f"Skipping test because DockerImageNames line {line_no} ({key}) is empty.",
UserWarning,
)
self.skipTest(f"Empty matrix at line {line_no}: {key}")
def test_parses_fixture_file(self): def test_parses_fixture_file(self):
"""Parse the fixture and expose expected top-level fields.""" """Parse the fixture and expose expected top-level fields."""
if self.using_artifact_override: self.assertTrue(self.artifact_data["docker_build_number"])
self.assertTrue(self.artifact_data["docker_build_number"]) self._skip_if_matrix_empty("linux_matrix", 3)
else:
self.assertEqual(self.artifact_data["docker_build_number"], "4.10.0_20260711.1")
self.assertIn("Ubuntu-2404-builder", self.artifact_data["linux_matrix"]) self.assertIn("Ubuntu-2404-builder", self.artifact_data["linux_matrix"])
def test_derives_deb_matrix_from_linux_matrix(self): def test_derives_deb_matrix_from_linux_matrix(self):
"""Derive Ubuntu deb matrix using releaseName from linux matrix entries.""" """Derive Ubuntu deb matrix using releaseName from linux matrix entries."""
self._skip_if_matrix_empty("linux_matrix", 3)
matrix = self.derive_package_matrix(self.artifact_data, os_name="linux", package="deb") matrix = self.derive_package_matrix(self.artifact_data, os_name="linux", package="deb")
self.assertIn("Ubuntu-2204-builder", matrix) self.assertIn("Ubuntu-2204-builder", matrix)
self.assertIn("Ubuntu-2404-builder", matrix) self.assertIn("Ubuntu-2404-builder", matrix)
@ -79,6 +106,7 @@ class DeriveDockerImageMatrixTests(unittest.TestCase):
def test_derives_rpm_matrix_from_linux_matrix(self): def test_derives_rpm_matrix_from_linux_matrix(self):
"""Derive Fedora rpm matrix using releaseName from linux matrix entries.""" """Derive Fedora rpm matrix using releaseName from linux matrix entries."""
self._skip_if_matrix_empty("linux_matrix", 3)
matrix = self.derive_package_matrix(self.artifact_data, os_name="linux", package="rpm") matrix = self.derive_package_matrix(self.artifact_data, os_name="linux", package="rpm")
self.assertIn("Fedora-42-builder", matrix) self.assertIn("Fedora-42-builder", matrix)
self.assertEqual(matrix["Fedora-42-builder"]["fedoraReleaseName"], "42") self.assertEqual(matrix["Fedora-42-builder"]["fedoraReleaseName"], "42")
@ -86,6 +114,7 @@ class DeriveDockerImageMatrixTests(unittest.TestCase):
def test_filter_out_matches_release_name(self): def test_filter_out_matches_release_name(self):
"""Exclude entries when filter-out matches a derived release field.""" """Exclude entries when filter-out matches a derived release field."""
self._skip_if_matrix_empty("linux_matrix", 3)
matrix = self.derive_package_matrix( matrix = self.derive_package_matrix(
self.artifact_data, self.artifact_data,
os_name="linux", os_name="linux",
@ -103,6 +132,7 @@ class DeriveDockerImageMatrixTests(unittest.TestCase):
def test_build_type_derivation_with_filter_out(self): def test_build_type_derivation_with_filter_out(self):
"""Build type returns linux matrix and honors filter_out by releaseName.""" """Build type returns linux matrix and honors filter_out by releaseName."""
self._skip_if_matrix_empty("linux_matrix", 3)
matrix = self.derive_typed_matrix( matrix = self.derive_typed_matrix(
self.artifact_data, self.artifact_data,
target_type="build", target_type="build",
@ -123,6 +153,7 @@ class DeriveDockerImageMatrixTests(unittest.TestCase):
def test_source_type_select_returns_single_entry(self): def test_source_type_select_returns_single_entry(self):
"""Source type should return a single selected Ubuntu entry.""" """Source type should return a single selected Ubuntu entry."""
self._skip_if_matrix_empty("linux_matrix", 3)
matrix = self.derive_typed_matrix( matrix = self.derive_typed_matrix(
self.artifact_data, self.artifact_data,
target_type="source", target_type="source",