Modbus — deletes tests/.../Modbus.IntegrationTests/Pymodbus/ (serve.ps1, standard.json, dl205.json, mitsubishi.json, s7_1500.json, README.md). Profile JSONs live only under Docker/profiles/ now. Docker/README.md loses its "Native-Python fallback" section; docs/drivers/Modbus-Test-Fixture.md "What the fixture is" bullet flipped from "primary launcher is Docker, native fallback under Pymodbus/" to "Docker is the only supported launch path". S7 — deletes tests/.../S7.IntegrationTests/PythonSnap7/ (server.py, s7_1500.json, serve.ps1, README.md). Docker/README.md loses "Native-Python fallback"; docs/drivers/S7-Test-Fixture.md updated to match. AB CIP — the biggest simplification because the native-binary spawn had the most code. AbServerFixture.cs rewrites: drops Process management (no more Process _proc + Kill/WaitForExit), drops LocateBinary() PATH lookup, drops the IAsyncLifetime initialize-spawns-server behavior. Fixture is now a thin TCP probe against localhost:44818 (or AB_SERVER_ENDPOINT override) — same shape as Snap7ServerFixture / ModbusSimulatorFixture / OpcPlcFixture. IsServerAvailable() simplifies to a single 500 ms probe. AbServerProfile.cs drops AbServerPlcArg + SeedTags + BuildCliArgs + ToCliSpec + the entire AbServerSeedTag record — the compose file is the canonical source of truth for which tags + which --plc mode each family gets; the profile record now carries just Family + ComposeProfile (matches the docker-compose service key) + Notes. KnownProfiles.ForFamily + .All stay for tests that iterate families. AbServerProfileTests.cs rewrites to match: drops BuildCliArgs_* + ToCliSpec_* + SeedTags_* tests; keeps the family-coverage contract tests + verifies the ComposeProfile strings match compose-file service names (a typo in either surfaces as a unit-test failure, not a silent "wrong family booted" at runtime). Docker/README.md loses "Native-binary fallback" section; docs/drivers/AbServer-Test-Fixture.md "What the fixture is" flipped to Docker-only with clearer skip rules. dev-environment.md §Docker fixtures — the "Native fallbacks" subsection goes away; replaced with a one-line note that Docker is the only supported path for these four fixtures + a fresh clone needs Docker Desktop and nothing else. Verified: whole-solution build 0 errors, AB CIP profile unit tests 6/6, AB CIP Docker smoke 4/4 (all family theory rows), S7 Docker smoke 3/3. Container lifecycle clean. The deleted native code surface was already redundant — every fixture the native paths served is now covered by Docker; keeping them invited drift between the two paths (the original AB CIP native profile had three undetected bugs per the #162 commit message: case-sensitive --plc, bracket tag notation, --path=1,0 requirement — noise the Docker path now avoids by never running the buggy code). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.5 KiB
C#
41 lines
1.5 KiB
C#
using Shouldly;
|
|
using Xunit;
|
|
using ZB.MOM.WW.OtOpcUa.Driver.AbCip;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.Driver.AbCip.IntegrationTests;
|
|
|
|
/// <summary>
|
|
/// Pure-unit tests for the profile catalog. Verifies <see cref="KnownProfiles"/>
|
|
/// stays in sync with <see cref="AbCipPlcFamily"/> + with the compose-file service
|
|
/// names — a typo in either would surface as a test failure rather than a silent
|
|
/// "wrong family booted" at runtime. Runs without Docker, so CI without the
|
|
/// container still exercises these contracts.
|
|
/// </summary>
|
|
[Trait("Category", "Unit")]
|
|
public sealed class AbServerProfileTests
|
|
{
|
|
[Theory]
|
|
[InlineData(AbCipPlcFamily.ControlLogix, "controllogix")]
|
|
[InlineData(AbCipPlcFamily.CompactLogix, "compactlogix")]
|
|
[InlineData(AbCipPlcFamily.Micro800, "micro800")]
|
|
[InlineData(AbCipPlcFamily.GuardLogix, "guardlogix")]
|
|
public void KnownProfiles_ForFamily_Returns_Expected_ComposeProfile(AbCipPlcFamily family, string expected)
|
|
{
|
|
KnownProfiles.ForFamily(family).ComposeProfile.ShouldBe(expected);
|
|
}
|
|
|
|
[Fact]
|
|
public void KnownProfiles_All_Covers_Every_Family()
|
|
{
|
|
var covered = KnownProfiles.All.Select(p => p.Family).ToHashSet();
|
|
foreach (var family in Enum.GetValues<AbCipPlcFamily>())
|
|
covered.ShouldContain(family, $"Family {family} is missing a KnownProfiles entry.");
|
|
}
|
|
|
|
[Fact]
|
|
public void DefaultPort_Matches_EtherNetIP_Standard()
|
|
{
|
|
AbServerProfile.DefaultPort.ShouldBe(44818);
|
|
}
|
|
}
|