CNA-VGAP-020: The hand-written CnaPlatformTests filter misses TerminalPresenterThroughPlatformTest and nine other platform suites, so the platform CI cells never select them

CNA snapshot c1c316b9  ·  Known Issues › Verification gaps  ·  source links pinned to c1c316b9

✓

Evidence basis: source-verified at the pinned commit; tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit c1c316b9; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.

CnaPlatformTests selects suites by hand-written name tokens: TerminalPresenter.* misses TerminalPresenterThroughPlatformTest, and nine more platform suites (key codes, scancodes, filesystem, sensor session, SDL3 device services, input devices, system back, exit under lock) match no platform filter. Only four of their cases are selected, by the input filter's case-name tokens.

Identifier
CNA-VGAP-020
Category
Verification gap
Subsystem
Testing & evidence
Status
Open
Verified against
CNA c1c316b9 (c1c316b9c7a846ce8002809c151fcd1af14942c9)
Evidence basis
Source-verified: read at TARGET, not executed
Tests touching this area
Yes: see Current tests
Affected contract
cmake/UnitTests.cmake CnaPlatformTests filter coverage of the platform suites (the terminal presenter through-the-platform case and nine others)

Expected behaviour

The CnaPlatformTests aggregate is what the terminal platform CI cell runs (ctest -R '^CnaPlatformTests$'); its filter names the terminal suites explicitly, and every terminal suite should be reachable through it.

Actual behaviour at TARGET

  • The filter in UnitTests.cmake contains the token TerminalPresenter.*. A GoogleTest pattern matches the full Suite.Case name, and TerminalPresenter.* requires a literal dot after TerminalPresenter; the suite is named TerminalPresenterThroughPlatformTest in TerminalPresenterTests.cpp (a T, not a dot, follows), so it is not selected. It runs only as its own case through gtest_discover_tests(CnaTests) in an unfiltered ctest (the general-tests workflow), never in the terminal cell that filters to ^CnaPlatformTests$.
  • The same hand-written selection misses nine further suites of modules/platform/tests that no CnaPlatformTests or CnaPlatformWindowTests filter matches and no workflow names: KeyCodeTests, KeyCodeTableEquivalenceTests, ScancodeTests, StandardFileSystemTests, SensorSessionContractTests, Sdl3DeviceServicesTest, Sdl3InputDevicesTest, Sdl3SystemBackTest and Sdl3PlatformExitUnderLockTest. The input filter (CnaInputTests, ctest -L input) reaches only four of their cases through its case-name tokens: ScancodeTests.TheValuesAreHidKeyboardUsageIds and three Sdl3DeviceServicesTest haptic cases. Sdl3PlatformLinuxHintsTest, counted in an earlier version of this entry, is selected by the input filter's *Joystick* token and is not missed. Like the terminal case, the rest run only as discovered cases of an unfiltered ctest.

Source locations

Evidence

Checked by reading the CnaPlatformTests filter string, the suite name, and the terminal platform-ci cell's ctest -R '^CnaPlatformTests$' step at c1c316b9. Not executed. The Development terminal page states the same: the suite “is reached only through the per-case discovery.” The case does run in the unfiltered general-tests workflow, so this is a coverage gap in the platform cell, not a total absence.

Independent re-verification: Checked by reading the CnaPlatformTests filter string, the suite names, and the terminal platform-ci cell's ctest -R '^CnaPlatformTests$' step at c1c316b9. Not executed. The wider count was recomputed at case level: every Suite.Case name in modules/platform/tests was matched against the CnaPlatformTests, CnaPlatformWindowTests and CnaInputTests filters with GoogleTest glob semantics. An earlier count matched suite names only, which missed the input filter's *Keyboard*, *Haptic* and *Joystick* tokens matching case names. The Development terminal page states the same for the presenter suite: it is reached only through the per-case discovery. The case does run in the unfiltered general-tests workflow, so this is a coverage gap in the platform cell, not a total absence. The public_contract line should read: the terminal presenter through-the-platform case and nine others.

Re-verified at c1c316b9: every Suite.Case of modules/platform/tests was matched again against the platform, platform-window and SDL3 window-system filters and the input filter. Sdl3SystemBackTest (two cases in Sdl3InputServicesTests.cpp) matches none of them either and was missing from the earlier count; Sdl3XErrorHandlerTest has a CTest registration of its own. Not executed.

Focused reproduction

No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.

Current tests

The presenter's other suites (TerminalPresenter.*, TerminalFrameGridTest.*, TerminalAnsiWriterTest.*) match the filter; only TerminalPresenterThroughPlatformTest falls outside it.

Regression test

Add TerminalPresenterThroughPlatformTest.* (or broaden the token to TerminalPresenter*) to the CnaPlatformTests filter, so the terminal CI cell exercises the refuse-into-a-pipe case.

Blast radius

The terminal platform CI cell's coverage of surface-presenter refusal on a non-TTY; the case is still exercised by the unfiltered general-tests run.

Workaround

No workaround is known.

The same subject is explained at several altitudes. These are the neighbouring pages at each one.

Tests and validation
Test architecture: discovery