using System.Collections.Generic; using System.Threading.Tasks; using Opc.Ua; using Shouldly; using Xunit; using ZB.MOM.WW.LmxOpcUa.Host.Domain; using ZB.MOM.WW.LmxOpcUa.Tests.Helpers; namespace ZB.MOM.WW.LmxOpcUa.Tests.Integration { public class HistorizingFlagTests { private static FakeGalaxyRepository CreateRepo() { return new FakeGalaxyRepository { Hierarchy = new List { new GalaxyObjectInfo { GobjectId = 1, TagName = "TestObj", BrowseName = "TestObj", ParentGobjectId = 0, IsArea = false } }, Attributes = new List { new GalaxyAttributeInfo { GobjectId = 1, TagName = "TestObj", AttributeName = "HistorizedAttr", FullTagReference = "TestObj.HistorizedAttr", MxDataType = 2, IsHistorized = true }, new GalaxyAttributeInfo { GobjectId = 1, TagName = "TestObj", AttributeName = "NormalAttr", FullTagReference = "TestObj.NormalAttr", MxDataType = 5, IsHistorized = false }, new GalaxyAttributeInfo { GobjectId = 1, TagName = "TestObj", AttributeName = "AlarmAttr", FullTagReference = "TestObj.AlarmAttr", MxDataType = 1, IsAlarm = true }, } }; } /// /// Verifies that historized Galaxy attributes advertise OPC UA historizing support and history-read access. /// [Fact] public async Task HistorizedAttribute_HasHistorizingTrue_AndHistoryReadAccess() { var fixture = OpcUaServerFixture.WithFakeMxAccessClient(repo: CreateRepo()); await fixture.InitializeAsync(); try { using var client = new OpcUaTestClient(); await client.ConnectAsync(fixture.EndpointUrl); var nodeId = client.MakeNodeId("TestObj.HistorizedAttr"); var historizing = client.ReadAttribute(nodeId, Attributes.Historizing); ((bool)historizing.Value).ShouldBeTrue(); var accessLevel = client.ReadAttribute(nodeId, Attributes.AccessLevel); var level = (byte)accessLevel.Value; (level & AccessLevels.HistoryRead).ShouldBe(AccessLevels.HistoryRead, "HistoryRead bit should be set"); } finally { await fixture.DisposeAsync(); } } /// /// Verifies that non-historized Galaxy attributes do not claim OPC UA history support. /// [Fact] public async Task NormalAttribute_HasHistorizingFalse_AndNoHistoryReadAccess() { var fixture = OpcUaServerFixture.WithFakeMxAccessClient(repo: CreateRepo()); await fixture.InitializeAsync(); try { using var client = new OpcUaTestClient(); await client.ConnectAsync(fixture.EndpointUrl); var nodeId = client.MakeNodeId("TestObj.NormalAttr"); var historizing = client.ReadAttribute(nodeId, Attributes.Historizing); ((bool)historizing.Value).ShouldBeFalse(); var accessLevel = client.ReadAttribute(nodeId, Attributes.AccessLevel); var level = (byte)accessLevel.Value; (level & AccessLevels.HistoryRead).ShouldBe((byte)0, "HistoryRead bit should not be set"); } finally { await fixture.DisposeAsync(); } } } }