fix(test): Windows-testleg op de spiegel-CI groen (padscheiding, spawn-milieu, mock-contracten) #928

Merged
brenno merged 4 commits from fix/926-windows-mirror-ci-test-leg into main 2026-07-27 23:13:34 +00:00
Owner

De volledige-matrix-CI op de GitHub-spiegel (.github/workflows/ci.yml, draait op elke push) had een al langer rode Windows-leg (Test (windows-2022)) — alle recente main-pushes faalden identiek. Linux-gate, macOS, web-hardening, supply-chain en docs zijn groen. Geen release-impact: de echte uitbrengpoort is Forgejo-op-tag (Mac-runner, make check-no-coverage) en kent geen Windows-leg; de spiegel-Windows-leg is puur een tweede faalmail-kanaal. Fixt #926.

Aard: 15 falende tests in 8 bestanden — allemaal testbugs

Geen enkele is een productbug. De app gebruikt overal p.join (platform-eigen), _hardenedEnv draagt de Windows-essentials (SystemRoot/PATHEXT/PATH), en de pin/guard-argv-opbouw slaagt óók op Windows. De tests maakten POSIX-aannames.

  • Padscheiding / -normalisatie (9 tests)bulk_import_runner_test (5), slide_dedup_dialogs_test (2), save_destination_dialog_test (1) bouwen de verwachte paden nu via p.join; import_note_l10n_test (1) geeft parseFile een p.normalize-pad (het gemengde /+\-pad wees de analyzer af).
  • Spawn-milieu (1 test)git_cli_test: de rauwe debugSpawn('git', ['--version'])-smoke-test kreeg een leeg milieu; _spawn sluit het milieu, en Windows' CreateProcess heeft dan SystemRoot/PATHEXT/PATH nodig. _smokeEnv() geeft ze op Windows mee. Het app-pad (probe(), via _hardenedEnv) slaagde al op Windows.
  • Mock-contract (3 tests)image_service_coverage_test: het pasteboard-pakket verwacht voor image op Windows een bestandspad (leest+verwijdert het zelf), op macOS/Linux bytes. De mock volgt nu het contract per platform.

Twee bewust overgeslagen beveiligings-tests + open vraag

git_native_cert_pin_test en git_network_guard_test bevatten elk één test die een echte lokale HTTPS-server start en er échte git tegenaan draait. Die verbinding komt op de windows-2022-runner niet tot stand (Could not connect to server after 2 ms). Ik sla die twee op Windows over mét gedocumenteerde reden, geen stille verzwakking: de guard/pin-config die wíj meegeven is op Windows al gedekt door de zustertests (die geen verbinding nodig hebben en daar groen zijn).

Open beveiligingsvraag (staat in #926): of native git op Windows — schannel i.p.v. openssl/curl — http.sslCAInfo en http.curloptResolve daadwerkelijk honoreert, is hiermee niet beantwoord en vraagt een échte Windows-machine. Op macOS/Linux blijven beide eigenschappen volledig getoetst.

Verificatie

  • make check lokaal (macOS) volledig groen: format, analyze, toolchain, conventies, privacy, methodelengte, dode code, hardgecodeerde tekst, commentaartaal, de volledige testsuite (+6767), dekkingsvloer (86,7%) en per-bestand-vloer.
  • make check-secrets schoon (gitleaks "no leaks found", trufflehog 0 geverifieerd/ongeverifieerd) en make sast schoon (semgrep, 0 findings, 3 regels op 792 bestanden).
  • Echte Windows-proef: de branch is ook naar de spiegel gepusht; de Windows-leg draait daar (GitHub Actions-run 30310360646). Deze PR wordt pas gemerged nadat die leg groen is.
  • Niet gedraaid: DAST (ZAP niet geïnstalleerd; niet zinvol voor deze test-only wijziging).

Bewaker

Test-only wijziging: raakt geen bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer of publieke belofte. Bewaker-stap daarom bewust overgeslagen — met bovenstaande expliciete vermelding van de overgeslagen beveiligings-test en de open Windows-git-TLS-vraag, zodat die te wegen zijn.

De volledige-matrix-CI op de GitHub-spiegel (`.github/workflows/ci.yml`, draait op elke push) had een al langer **rode Windows-leg** (`Test (windows-2022)`) — alle recente main-pushes faalden identiek. Linux-gate, macOS, web-hardening, supply-chain en docs zijn groen. **Geen release-impact:** de echte uitbrengpoort is Forgejo-op-tag (Mac-runner, `make check-no-coverage`) en kent geen Windows-leg; de spiegel-Windows-leg is puur een tweede faalmail-kanaal. Fixt #926. ## Aard: 15 falende tests in 8 bestanden — allemaal testbugs Geen enkele is een productbug. De app gebruikt overal `p.join` (platform-eigen), `_hardenedEnv` draagt de Windows-essentials (`SystemRoot`/`PATHEXT`/`PATH`), en de pin/guard-argv-opbouw slaagt óók op Windows. De tests maakten POSIX-aannames. - **Padscheiding / -normalisatie (9 tests)** — `bulk_import_runner_test` (5), `slide_dedup_dialogs_test` (2), `save_destination_dialog_test` (1) bouwen de verwachte paden nu via `p.join`; `import_note_l10n_test` (1) geeft `parseFile` een `p.normalize`-pad (het gemengde `/`+`\`-pad wees de analyzer af). - **Spawn-milieu (1 test)** — `git_cli_test`: de rauwe `debugSpawn('git', ['--version'])`-smoke-test kreeg een leeg milieu; `_spawn` sluit het milieu, en Windows' `CreateProcess` heeft dan SystemRoot/PATHEXT/PATH nodig. `_smokeEnv()` geeft ze op Windows mee. Het app-pad (`probe()`, via `_hardenedEnv`) slaagde al op Windows. - **Mock-contract (3 tests)** — `image_service_coverage_test`: het `pasteboard`-pakket verwacht voor `image` op Windows een bestandspad (leest+verwijdert het zelf), op macOS/Linux bytes. De mock volgt nu het contract per platform. ## Twee bewust overgeslagen beveiligings-tests + open vraag `git_native_cert_pin_test` en `git_network_guard_test` bevatten elk één test die een echte lokale HTTPS-server start en er échte git tegenaan draait. Die verbinding komt op de windows-2022-runner niet tot stand (`Could not connect to server after 2 ms`). Ik sla die twee op Windows over **mét gedocumenteerde reden**, geen stille verzwakking: de guard/pin-config die wíj meegeven is op Windows al gedekt door de zustertests (die geen verbinding nodig hebben en daar groen zijn). **Open beveiligingsvraag (staat in #926):** of native git op Windows — schannel i.p.v. openssl/curl — `http.sslCAInfo` en `http.curloptResolve` daadwerkelijk honoreert, is hiermee niet beantwoord en vraagt een échte Windows-machine. Op macOS/Linux blijven beide eigenschappen volledig getoetst. ## Verificatie - `make check` lokaal (macOS) volledig groen: format, analyze, toolchain, conventies, privacy, methodelengte, dode code, hardgecodeerde tekst, commentaartaal, de **volledige testsuite (+6767)**, dekkingsvloer (86,7%) en per-bestand-vloer. - `make check-secrets` schoon (gitleaks "no leaks found", trufflehog 0 geverifieerd/ongeverifieerd) en `make sast` schoon (semgrep, 0 findings, 3 regels op 792 bestanden). - **Echte Windows-proef:** de branch is ook naar de spiegel gepusht; de Windows-leg draait daar (GitHub Actions-run 30310360646). Deze PR wordt pas gemerged nadat die leg groen is. - **Niet gedraaid:** DAST (ZAP niet geïnstalleerd; niet zinvol voor deze test-only wijziging). ## Bewaker Test-only wijziging: raakt geen bestandsformaat, opslag, afhankelijkheid, uitgaand verkeer of publieke belofte. Bewaker-stap daarom bewust overgeslagen — met bovenstaande expliciete vermelding van de overgeslagen beveiligings-*test* en de open Windows-git-TLS-vraag, zodat die te wegen zijn.
Vier tests namen POSIX-padscheiding aan waar de code correct `p.join` gebruikt,
en faalden daardoor alleen op de Windows-leg van de spiegel-CI (#926):

- bulk_import_runner_test: de doelpaden gebouwd via `inUit()` = `p.join`.
- save_destination_dialog_test: de laatste twee hardgecodeerde `/`-paden (de
  images-submap en de tweede bibliotheek) net als regel 64 via `p.join`.
- slide_dedup_dialogs_test: het geabsoluteerde afbeeldingspad via `p.join`.
- import_note_l10n_test: `parseFile` kreeg een gemengd pad (hardgecodeerde `/`
  plus Windows' `\` uit listSync) en wees dat af; `p.normalize` maakt er één
  scheiding van.

Geen productbug: de app gebruikt overal de platform-eigen scheiding. No-op op
macOS/Linux, waar `/` de scheiding is.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`debugSpawn('git', ['--version'])` draaide met een leeg milieu; `_spawn` sluit
het milieu (`includeParentEnvironment: false`), en op Windows heeft
`CreateProcess` dan SystemRoot/PATHEXT/PATH nodig om git.exe te vinden en de
systeem-DLL's te laden. Zonder die faalt de spawn met "The parameter is
incorrect" — een leeg-milieu-artefact, geen echt codepad: het app-pad geeft via
`_hardenedEnv` altijd die essentials mee (en de zuster-test `probe()` slaagt op
Windows). `_smokeEnv()` levert ze op Windows; op POSIX blijft het milieu leeg,
want daar lost de spawn de executable via het ouderpad op (#926).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Het pasteboard-pakket kent voor `image` twee contracten: op macOS/Linux zijn het
de bytes rechtstreeks, op Windows een bestandspad dat het pakket zelf leest én
verwijdert. De mock gaf overal bytes terug, dus op Windows strandde de echte
`Pasteboard.image` op `image as String`. De mock schrijft de bytes nu op Windows
naar een tijdelijk bestand en geeft het pad terug, zodat dezelfde drie tests op
elk platform de echte service-weg beproeven in plaats van op de cast te
stranden (#926). No-op op macOS/Linux.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
test(windows): sla de twee echt-server git-TLS-tests over op Windows, mét reden
All checks were successful
scans / scans (pull_request) Successful in 3m19s
ff68780e20
De enige twee tests die een echte lokale HTTPS-server starten en er échte git
tegenaan draaien, falen op de windows-2022-CI-runner doordat de verbinding niet
tot stand komt ("Could not connect to server after 2 ms"). De guard/pin-logica
die wíj meegeven — de argv en omgeving — is op Windows al gedekt door de
zustertests die geen verbinding nodig hebben en daar groen zijn.

Bewust een gedocumenteerde skip, geen stille verzwakking: of native git op
Windows (schannel i.p.v. openssl) `http.sslCAInfo` en `http.curloptResolve`
honoreert, is een open beveiligingsvraag die een échte Windows-machine vraagt.
Die staat als zodanig in #926; op macOS/Linux blijven beide eigenschappen
volledig getoetst.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit ba0853a508 into main 2026-07-27 23:13:34 +00:00
Sign in to join this conversation.
No description provided.