CNA-VGAP-020: The hand-written CnaPlatformTests filter misses TerminalPresenterThroughPlatformTest and nine other platform suites, so the platform CI cells never select them
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.cmakecontains the tokenTerminalPresenter.*. AGoogleTestpattern matches the fullSuite.Casename, andTerminalPresenter.* requires a literal dot afterTerminalPresenter; the suite is namedTerminalPresenterThroughPlatformTestinTerminalPresenterTests.cpp(a T, not a dot, follows), so it is not selected. It runs only as its own case throughgtest_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/teststhat noCnaPlatformTestsorCnaPlatformWindowTestsfilter matches and no workflow names:KeyCodeTests,KeyCodeTableEquivalenceTests,ScancodeTests,StandardFileSystemTests,SensorSessionContractTests,Sdl3DeviceServicesTest,Sdl3InputDevicesTest,Sdl3SystemBackTestandSdl3PlatformExitUnderLockTest. The input filter (CnaInputTests, ctest -L input) reaches only four of their cases through its case-name tokens:ScancodeTests.TheValuesAreHidKeyboardUsageIdsand threeSdl3DeviceServicesTesthaptic 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
cmake/UnitTests.cmake— CnaPlatformTests filter token TerminalPresenter.*modules/platform/tests/CNA/Platform/TerminalPresenterTests.cpp— TerminalPresenterThroughPlatformTest.PresentationIsRefusedWhenStandardOutputIsNotATerminal
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.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Tests and validation
- Test architecture: discovery
- Known issues
- Verification gap index