"""Evidence gates used by the real private-display integration probe.""" import tempfile import unittest from pathlib import Path from dev import smoke class SmokeEvidenceTests(unittest.TestCase): def setUp(self): self.tmp = tempfile.TemporaryDirectory(prefix='hydra-smoke-test-') self.addCleanup(self.tmp.cleanup) root = Path(self.tmp.name) self.hidden = root / 'hidden.log' self.visible = root / 'visible.log' self.hidden.write_text('wl_keyboard#21.enter(1)\nwl_keyboard#21.leave(2)\n') self.visible.write_text('wl_keyboard#21.enter(3)\n') def test_focus_parser_ignores_pointer_events(self): self.hidden.write_text(self.hidden.read_text() + 'wl_pointer#22.enter(4)\n') self.assertEqual(smoke.focus_events(self.hidden), ['enter', 'leave']) def test_old_focus_events_cannot_prove_a_new_switch(self): self.assertFalse(smoke.fresh_focus_transition(['enter', 'leave'], ['enter'], ['enter', 'leave'], ['enter'])) self.assertTrue(smoke.fresh_focus_transition(['enter'], ['leave'], ['enter', 'leave'], ['leave', 'enter'])) def test_hidden_guest_must_advance_during_hidden_interval(self): with self.assertRaisesRegex(AssertionError, 'hidden guest stopped'): smoke.measure_hidden_interval(lambda: 10, self.hidden, self.visible, duration=.01) readings = iter((10, 20)) result = smoke.measure_hidden_interval(lambda: next(readings), self.hidden, self.visible, duration=.01) self.assertEqual((result['before'], result['after']), (10, 20)) self.assertGreaterEqual(result['elapsed_seconds'], .01) def test_focus_change_during_sampling_invalidates_hidden_evidence(self): def reading(): self.hidden.write_text(self.hidden.read_text() + 'wl_keyboard#21.enter(4)\n') return 10 with self.assertRaisesRegex(AssertionError, 'focus changed'): smoke.measure_hidden_interval(reading, self.hidden, self.visible, duration=.01) def test_compositor_classifier_does_not_hide_other_errors(self): occupied = '[ERROR] [xwayland/sockets.c:47] Failed to bind socket @/tmp/.X11-unix/X2: Address already in use' self.assertEqual(smoke.classify_compositor_errors(occupied), [occupied]) with self.assertRaisesRegex(AssertionError, 'Unexpected compositor'): smoke.classify_compositor_errors(occupied + '\n[ERROR] [config.c:1] invalid configuration')