docs(sweep): AbLegacy verified green — fixture-deployment gap, no code (#4) #449
@@ -26,7 +26,7 @@ need sudo to create new ones — I deployed FOCAS to `~/otopcua-focas` on the ho
|
||||
| **Modbus** (dl205 / mitsubishi / s7_1500 / exception_injection) | ✅ 16/13/10/17 (was 8F/5F/3F/8F) | **NOT drift** — fixture-cycling artifact, re-verified GREEN 2026-07-15 — see below |
|
||||
| **AbCip** | ✅ 10P/3skip (was 6F/1P/3skip) | static-init-order bug FIXED 2026-07-15 (`326b22a7`) — see below |
|
||||
| **FOCAS** | ❌ 9F/1P | tests assume a localhost-colocated mock — see below |
|
||||
| **AbLegacy** | ❌ 4F | no AbLegacy sim fixture deployed to the host |
|
||||
| **AbLegacy** | ✅ slc500 2/2, micrologix 1/1, plc5 1/1 (was 4F) | fixture-deployment gap FIXED 2026-07-15 — see below |
|
||||
| **OpcUaServer** | ✅ 4/4 (was 4F) | cert-store gap + SDK read-throws drift FIXED 2026-07-15 — see below |
|
||||
|
||||
### Headline conclusion
|
||||
@@ -37,8 +37,10 @@ correctly bound — the sweep's non-standard "failures" were the stale-container
|
||||
and all driver **unit** suites + the live `/run` gates pass. These integration suites were DEFERRED in round 2
|
||||
and never run, so they'd bit-rotted in several distinct ways.
|
||||
|
||||
**Follow-up progress (2026-07-15):** #1 AbCip (PR #446), #5 OpcUaServer (PR #447), and #2 Modbus (PR #448 — false
|
||||
alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each needs a design/infra decision.
|
||||
**Follow-up progress (2026-07-15):** #1 AbCip (PR #446), #5 OpcUaServer (PR #447), #2 Modbus (PR #448 — false
|
||||
alarm, no code), and #4 AbLegacy (PR #449 — fixture-deployment gap, no code) all closed. **4 of 7 done; all
|
||||
driver suites now verified GREEN.** Remaining: #3 FOCAS + #6 Host (each needs a design/infra decision) and #7
|
||||
(FOCAS fixture deploy).
|
||||
|
||||
---
|
||||
|
||||
@@ -78,8 +80,16 @@ alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each n
|
||||
a remote sim. **Fix:** reconcile the mock topology — either run the FOCAS mock on localhost, or make the test
|
||||
node-keys honor `OTOPCUA_FOCAS_SIM_ENDPOINT`/`FOCAS_MOCK_HOST`.
|
||||
|
||||
- **AbLegacy** — 4F on `StatusCode` because **no AbLegacy sim exists on the host** (no `/opt/otopcua-ablegacy`,
|
||||
none deployed). Reads return Bad. **Fix:** deploy an AbLegacy fixture (check `tests/.../AbLegacy.IntegrationTests/Docker/`).
|
||||
- **AbLegacy** — ✅ **FIXED 2026-07-15 (PR #449). Fixture-deployment gap, not a code defect.** The AbLegacy suite
|
||||
needs `ab_server` in **PCCC mode** (`--plc=SLC500|Micrologix|PLC/5`), which reuses the **AbCip image**
|
||||
(`otopcua-ab-server:libplctag-release`, already on the host) and binds `:44818`. Two issues: (a) no PCCC
|
||||
container was deployed (`~/otopcua-ablegacy` didn't exist); (b) the sweep's *4F-not-skip* means `:44818` was
|
||||
reachable but answering **CIP** (a leftover AbCip container) — the PCCC reads returned Bad. Same shared-port
|
||||
contamination class as the Modbus false alarm. Deployed the compose to `~/otopcua-ablegacy` on the host (image
|
||||
already present, no build needed) and ran each family with `AB_LEGACY_COMPOSE_PROFILE` set to match the running
|
||||
container (**required** — without it the `[Theory]` parametrises over all 3 families and 2 fail against a
|
||||
single-family container): **slc500 2/2, micrologix 1/1 (+1 skip), plc5 1/1 (+1 skip)** — the skips are
|
||||
family-inapplicable file types (e.g. no `F8` float file seeded on micrologix/plc5). **No code change.**
|
||||
|
||||
- **OpcUaServer** — ✅ **FIXED 2026-07-15** (PR #447). Was 4F on `Opc.Ua.ServiceResultException :
|
||||
TrustedIssuerCertificates StorePath must be specified` — the in-test *client* `SecurityConfiguration`
|
||||
@@ -114,7 +124,10 @@ alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each n
|
||||
Re-verified all four profiles GREEN (16/13/10/17). Added a profile-cycling gotcha + reliable-cycle recipe
|
||||
to `Docker/README.md`.
|
||||
3. **FOCAS** — reconcile the 127.0.0.1-mock topology with the remote-fixture model.
|
||||
4. **AbLegacy** — deploy an AbLegacy sim fixture (none on host).
|
||||
4. ~~**AbLegacy** — deploy an AbLegacy sim fixture (none on host).~~
|
||||
✅ **DONE 2026-07-15 (PR #449) — fixture-deployment gap, no code defect.** Deployed the PCCC compose to
|
||||
`~/otopcua-ablegacy` (reuses the AbCip image, already on host). All 3 families GREEN (slc500 2/2, micrologix
|
||||
1/1, plc5 1/1). Recipe added below; `AB_LEGACY_COMPOSE_PROFILE` MUST match the running container.
|
||||
5. ~~**OpcUaServer** — supply cert-store StorePath in the harness config.~~
|
||||
✅ **DONE 2026-07-15** (PR #447). Added `TestClientSecurity` helper building a validated client
|
||||
`SecurityConfiguration` with Directory own/issuer/trusted/rejected stores under a throwaway PKI dir
|
||||
@@ -123,8 +136,8 @@ alarm, no code) all closed. Remaining: #3 FOCAS, #4 AbLegacy, #6 Host — each n
|
||||
*throws* `ServiceResultException(BadNodeIdUnknown)` for a removed node instead of returning a bad
|
||||
`DataValue` — updated the two subscription-survival assertions to `Should.ThrowAsync`. Suite **4F → 4/4**.
|
||||
6. **Host** — replace `bitnami/openldap:2.6` (image gone); run E2E on real SQL or raise deadlines.
|
||||
7. **Fixture deployment gap** — FOCAS + AbLegacy fixtures aren't on the host at `/opt/otopcua-*`; the sweep
|
||||
requires deploying them (and `/opt` needs sudo — used `~/otopcua-<driver>` for FOCAS).
|
||||
7. **Fixture deployment gap** — FOCAS fixture isn't on the host at `/opt/otopcua-*` (and `/opt` needs sudo —
|
||||
use `~/otopcua-<driver>`). **AbLegacy is now deployed** at `~/otopcua-ablegacy` (2026-07-15, PR #449).
|
||||
|
||||
---
|
||||
|
||||
@@ -137,7 +150,8 @@ ssh dohertj2@10.100.0.35 'cd /opt/otopcua-modbus && docker compose --profile
|
||||
ssh dohertj2@10.100.0.35 'cd /opt/otopcua-abcip && docker compose --profile controllogix up -d' # :44818
|
||||
ssh dohertj2@10.100.0.35 'cd /opt/otopcua-s7 && docker compose --profile s7_1500 up -d' # :1102
|
||||
ssh dohertj2@10.100.0.35 'cd /opt/otopcua-opcuaclient && docker compose up -d' # :50000
|
||||
# FOCAS/AbLegacy not on host — rsync tests/.../Docker/ to ~/otopcua-<driver> then `docker compose up -d --build`
|
||||
ssh dohertj2@10.100.0.35 'cd ~/otopcua-ablegacy && docker compose --profile slc500 up -d' # :44818 (PCCC; reuses AbCip image)
|
||||
# FOCAS not on host — rsync tests/.../Docker/ to ~/otopcua-focas then `docker compose up -d --build`
|
||||
```
|
||||
|
||||
Run per suite (env → project):
|
||||
@@ -148,6 +162,7 @@ Run per suite (env → project):
|
||||
| S7 | `S7_SIM_ENDPOINT=10.100.0.35:1102` | `tests/Drivers/…S7.IntegrationTests` |
|
||||
| Modbus | `MODBUS_SIM_ENDPOINT=10.100.0.35:5020` `MODBUS_SIM_PROFILE=<standard\|dl205\|mitsubishi\|s7_1500\|exception_injection>` (swap the host sim to match) | `tests/Drivers/…Modbus.IntegrationTests` |
|
||||
| AbCip | `AB_SERVER_ENDPOINT=10.100.0.35:44818` `AB_SERVER_PROFILE=controllogix` | `tests/Drivers/…AbCip.IntegrationTests` |
|
||||
| AbLegacy | `AB_LEGACY_ENDPOINT=10.100.0.35:44818` `AB_LEGACY_COMPOSE_PROFILE=<slc500\|micrologix\|plc5>` (**must** match the running PCCC container — else the `[Theory]` runs all 3 families and 2 fail) | `tests/Drivers/…AbLegacy.IntegrationTests` |
|
||||
| FOCAS | `OTOPCUA_FOCAS_SIM_ENDPOINT=10.100.0.35:8193` (but tests assume 127.0.0.1 — see above) | `tests/Drivers/…FOCAS.IntegrationTests` |
|
||||
| Host | `OTOPCUA_HARNESS_USE_SQL=1` (+ SQL `:14331` via `tests/Server/…Host.IntegrationTests/docker-compose.yml up sql`) `OTOPCUA_HARNESS_USE_LDAP=0` | `tests/Server/…Host.IntegrationTests` |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user