Files
pxe-server/playbook/shopfloor-setup/common/test
cproudlock 6dcf96e40a Phase 3+4 rename reorg: repo dir renames + startnet.cmd menu
Pairs with Phase 1+2 from earlier (alias maps in Install-FromManifest,
GE-Enforce, Get-PCProfile, verify-state). See project-shopfloor-rename-reorg
memory for the plan.

Phase 3 (repo + paths):
- git mv per-PC-type dirs to gea-shopfloor-* names:
    Standard      -> gea-shopfloor-collections
    CMM           -> gea-shopfloor-cmm
    Keyence       -> gea-shopfloor-keyence
    Genspect      -> gea-shopfloor-genspect
    WaxAndTrace   -> gea-shopfloor-waxtrace
    Display       -> gea-shopfloor-display
    Lab           -> gea-shopfloor-common (folded; Timeclock+Lab merge)
- New gea-shopfloor-nocollections/ (clone of collections sans UDC scripts).
- New gea-shopfloor-heattreat/ (placeholder, README only).
- Move Standard/ntlars-backups/ -> _ntlars-backups/ (per-MN, not per-type).
- Run-ShopfloorSetup.ps1: Resolve-PCTypeDir helper walks alias group when
  the on-disk dir for the current pcType is missing. Set-MachineNumber
  helper-copy gated on collections|nocollections|legacy Standard-Machine.
- Update-MachineNumber.ps1: pcProfiles lookups try gea-shopfloor-collections
  first, fall back to legacy Standard-Machine. PowerShell 5.1 compatible
  (no null-coalesce).

Phase 4 (startnet.cmd menu):
- Choice 3 "GEA Shopfloor" now drills into a 9-item sub-menu instead of
  going straight to enrollment. Sub-cats:
    1. Machine with Collections        -> gea-shopfloor-collections
    2. Machine without Collections     -> gea-shopfloor-nocollections
    3. Common (Timeclock, Lab)         -> gea-shopfloor-common
    4. Keyence                         -> gea-shopfloor-keyence
    5. CMM                             -> gea-shopfloor-cmm
    6. Genspect                        -> gea-shopfloor-genspect
    7. Heattreat                       -> gea-shopfloor-heattreat
    8. Wax and Trace                   -> gea-shopfloor-waxtrace
    9. Display                         -> gea-shopfloor-display
- Office menu (existing 6-option) follows for every sub-cat.
- Machine number prompt only for collections + nocollections.
- pc-subtype.txt + display-type.txt no longer written. PCTYPE is a
  single full string (gea-shopfloor-*); subtype-aware code paths fall
  back to empty and resolve via the alias map.
- CMM bootstrap stage gate switched from "%PCTYPE%"=="CMM" to
  "%PCTYPE%"=="gea-shopfloor-cmm".

Test harness:
- B-enforce/run.sh PCSUBTYPE default changed from "Machine" to "" so
  single-arg invocation matches the new single-string scheme. Two-arg
  legacy form ("Standard Machine") still works via aliasing.
- B-enforce/tamper.ps1 alias-aware Test-MatrixEntryMatches mirroring
  verify-state.ps1.

Smoke-tested on win11 VM as SYSTEM via qga: B-enforce harness 5-phase
cycle (stage / baseline / tamper / heal / idempotent) passes 10/10
with PCType=gea-shopfloor-collections AND with legacy "Standard Machine"
two-arg form.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-04 08:09:16 -04:00
..

Shopfloor enforcer regression tests

Lightweight harness for end-to-end validation of GE-Enforce.ps1 + Install-FromManifest.ps1 against the v2 staging tree, using the Win11 analyzer VM as a synthetic shopfloor PC.

Files

  • vm-test-harness.ps1 — setup + invocation of GE-Enforce inside the VM. Accepts -PCType and -PCSubType parameters. Creates C:\Enrollment\ stubs (pc-type.txt, pc-subtype.txt, site-config.json), stages the enforcer runtime from \\192.168.122.1\pxe-images\enforcer-stage\, injects a fake SFLD credential in HKLM:\SOFTWARE\GE\SFLD\Credentials\samba pointing at the host's samba share as if it were tsgwp00525, then runs GE-Enforce.ps1 with output captured.

Prereqs

  • win11 libvirt VM running, IP reachable at 192.168.122.210
  • qemu-guest-agent exec path available (/tmp/guest-exec.sh)
  • host samba shares pxe-images + windows-projects writable by camp user
  • enforcer staged at /home/camp/pxe-images/enforcer-stage/ (via cp <repo>/common/GE-Enforce.ps1 <repo>/common/lib/Install-FromManifest.ps1 /home/camp/pxe-images/enforcer-stage/)
  • v2 share staging at /home/camp/pxe-images/tsgwp00525-v2/...

Usage

From the repo root on the host:

# Round 1: Shopfloor scope (exercises common manifest, PCTypes filter for Oracle)
B64=$(iconv -f UTF-8 -t UTF-16LE common/test/vm-test-harness.ps1 | base64 -w0)
/tmp/guest-exec.sh powershell.exe "[\"-NoProfile\",\"-EncodedCommand\",\"$B64\"]"

Or with non-default pcType (wrap in a tiny outer script that sets parameters):

cat > /tmp/round.ps1 <<'EOF'
$PCType = 'Standard'
$PCSubType = 'Machine'
EOF
sed -n '/^param(/,/^)/!p' common/test/vm-test-harness.ps1 >> /tmp/round.ps1
B64=$(iconv -f UTF-8 -t UTF-16LE /tmp/round.ps1 | base64 -w0)
/tmp/guest-exec.sh powershell.exe "[\"-NoProfile\",\"-EncodedCommand\",\"$B64\"]"

What each round validates

Round pcType / pcSubType Exercises
1 Shopfloor / — common manifest only, PCTypes filter (Oracle skips)
2 Standard / Machine common + standard-machine manifests, eDNC upgrade detection, UDC skip, eMxInfo cmd
3 Keyence / — common + keyence manifest, VR-6000 MSI detection, pnputil INF detection
4 Display / — common + display manifest, kiosk-setup CMD wrapper
5 (composite) Shopfloor with a corrupted manifest / bad SFLD creds / tampered local XML graceful-degradation paths + upgrade/rollback via hash mismatch

See the main repo enforcer design doc (TBD) for scenario details.

Known cleanup after test runs

  • The harness intentionally leaves installed apps in place (Acrobat Reader DC, WJF Defect Tracker, 3OF9 font, Edge site-list XML, Firefox if tested). To reset to a clean baseline, revert the VM to the clean-base libvirt snapshot: virsh snapshot-revert win11 clean-base.

  • Orphan msiexec.exe workers from long-running installs (UDC_Setup, PC-DMIS) can leave the MSI mutex held, blocking the next install with 1619/1618. Between rounds if you hit this:

    Get-Process -Name msiexec -ErrorAction SilentlyContinue | Stop-Process -Force
    

    Note: a Stage 2b lib improvement is planned to retry once on 1618 after killing stale msiexec processes.