from pathlib import Path import subprocess import sys import tempfile import unittest sys.path.insert(0, str(Path(__file__).resolve().parents[1])) import check_skips TOOL = Path(__file__).resolve().parents[1] / "check_skips.py" LIMITATIONS = [ "skipped, the device lacks fragmentShaderPixelInterlock", "skipped, the device lacks geometryShader", "skipped, the device lacks shaderSubgroupClock", "skipped, the device lacks VK_EXT_shader_stencil_export", "skipped, the device does not import guest memory", "skipped, the device imports no host memory", "skipped, the device flushes f64 subnormals without DenormPreserve", "skipped, the device binds fewer than 8 storage buffers per stage or set", "skipped, no usable Vulkan device: ErrorInitializationFailed", "skipped, unit shadows or host imports are unavailable", "skipped, the device has no compute queue", "skipped, the device reports 4 lanes", "skipped, subgroup size 8", "skipped, no display", ] OTHER = [ "skipped, flaky", "skipped, APS5_RAYTRACING replaces the node", "skipped, interpolation modes require", ] class CheckSkipsTests(unittest.TestCase): def test_device_limitations_match(self): for message in LIMITATIONS: with self.subTest(message=message): self.assertTrue(check_skips.DEVICE_LIMITATION.search(message)) def test_other_reasons_do_not_match(self): for message in OTHER: with self.subTest(message=message): self.assertFalse(check_skips.DEVICE_LIMITATION.search(message)) def test_only_unexpected_skip_is_reported(self): xml = ( '' 'skipped, the device lacks geometryShader' 'skipped, flaky' '' ) with tempfile.TemporaryDirectory() as directory: junit = Path(directory) / "junit.xml" junit.write_text(xml, encoding="utf-8") result = subprocess.run([sys.executable, "-I", str(TOOL), str(junit), "--job", "linux"], capture_output=True, text=True) self.assertEqual(result.returncode, 1) self.assertIn("error: odd skipped", result.stdout) self.assertNotIn("error: geometry skipped", result.stdout) class SkipReportTests(unittest.TestCase): def skipped(self, content): with tempfile.TemporaryDirectory() as directory: path = Path(directory) / "ctest.xml" path.write_text(content, encoding="utf-8") return list(check_skips.skips(path)) def test_skip_message_preserves_the_device_reason(self): found = self.skipped('') self.assertEqual(len(found), 1) self.assertRegex(found[0][1], check_skips.DEVICE_LIMITATION) def test_stderr_preserves_the_device_reason(self): found = self.skipped('skipped, no display') self.assertEqual(len(found), 1) self.assertRegex(found[0][1], check_skips.DEVICE_LIMITATION) def test_unnamed_skipped_test_is_an_error(self): with self.assertRaises(ValueError): self.skipped('') def test_unexpected_reason_stays_unexpected(self): found = self.skipped('') self.assertIsNone(check_skips.DEVICE_LIMITATION.search(found[0][1])) def test_ctest_stdout_is_retained(self): found = self.skipped('skipped, the device reports too few descriptors') self.assertRegex(found[0][1], check_skips.DEVICE_LIMITATION) def test_message_and_element_text_are_both_retained(self): found = self.skipped('the device has no required extension') self.assertRegex(found[0][1], check_skips.DEVICE_LIMITATION) if __name__ == "__main__": unittest.main()