67 lines
2.7 KiB
C#
67 lines
2.7 KiB
C#
using Shouldly;
|
|
using Xunit;
|
|
using ZB.MOM.WW.OtOpcUa.Core.Abstractions;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.Driver.S7.Tests;
|
|
|
|
/// <summary>
|
|
/// Scaffold-level tests that don't need a live S7 PLC — exercise driver lifecycle shape,
|
|
/// default option values, and failure-mode transitions. PR 64 adds IReadable/IWritable
|
|
/// tests against a mock-server, PR 65 adds discovery + subscribe.
|
|
/// </summary>
|
|
[Trait("Category", "Unit")]
|
|
public sealed class S7DriverScaffoldTests
|
|
{
|
|
[Fact]
|
|
public void Default_options_target_S7_1500_slot_0_on_port_102()
|
|
{
|
|
var opts = new S7DriverOptions();
|
|
opts.Port.ShouldBe(102, "ISO-on-TCP is always 102 for S7; documented in driver-specs.md §5");
|
|
opts.CpuType.ShouldBe(global::S7.Net.CpuType.S71500);
|
|
opts.Rack.ShouldBe((short)0);
|
|
opts.Slot.ShouldBe((short)0, "S7-1200/1500 onboard PN ports are slot 0 by convention");
|
|
}
|
|
|
|
[Fact]
|
|
public void Default_probe_interval_is_reasonable_for_S7_scan_cycle()
|
|
{
|
|
// S7 PLCs scan 2-10 ms but comms mailbox typically processed once per scan.
|
|
// 5 s default probe is lightweight — ~0.001% of comms budget.
|
|
new S7ProbeOptions().Interval.ShouldBe(TimeSpan.FromSeconds(5));
|
|
}
|
|
|
|
[Fact]
|
|
public void Tag_definition_defaults_to_writable_with_S7_max_string_length()
|
|
{
|
|
var tag = new S7TagDefinition("T", "DB1.DBW0", S7DataType.Int16);
|
|
tag.Writable.ShouldBeTrue();
|
|
tag.StringLength.ShouldBe(254, "S7 STRING type max length is 254 chars");
|
|
}
|
|
|
|
[Fact]
|
|
public void Driver_instance_reports_type_and_id_before_connect()
|
|
{
|
|
var opts = new S7DriverOptions { Host = "127.0.0.1" };
|
|
using var drv = new S7Driver(opts, "s7-test");
|
|
drv.DriverType.ShouldBe("S7");
|
|
drv.DriverInstanceId.ShouldBe("s7-test");
|
|
drv.GetHealth().State.ShouldBe(DriverState.Unknown, "health starts Unknown until InitializeAsync runs");
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Initialize_against_unreachable_host_transitions_to_Faulted_and_throws()
|
|
{
|
|
// Pick an RFC 5737 reserved-for-documentation IP so the connect attempt fails fast
|
|
// (no DNS mismatch, no accidental traffic to a real PLC).
|
|
var opts = new S7DriverOptions { Host = "192.0.2.1", Timeout = TimeSpan.FromMilliseconds(250) };
|
|
using var drv = new S7Driver(opts, "s7-unreach");
|
|
|
|
await Should.ThrowAsync<Exception>(async () =>
|
|
await drv.InitializeAsync("{}", TestContext.Current.CancellationToken));
|
|
|
|
var health = drv.GetHealth();
|
|
health.State.ShouldBe(DriverState.Faulted, "unreachable host must flip the driver to Faulted so operators see it");
|
|
health.LastError.ShouldNotBeNull();
|
|
}
|
|
}
|