45 lines
2.4 KiB
C#
45 lines
2.4 KiB
C#
// The same application-authored opaque ID and two grant outcomes are independently exercised on SDK1.5.
|
|
using Opc.Ua;
|
|
using Opc.Ua.Client;
|
|
using Shouldly;
|
|
using Xunit;
|
|
using ZB.MOM.WW.OtOpcUa.Commons.OpcUa;
|
|
using ZB.MOM.WW.OtOpcUa.Configuration.Entities;
|
|
using ZB.MOM.WW.OtOpcUa.Configuration.Enums;
|
|
using static ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests.ServerEventRig;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests;
|
|
|
|
public sealed class Sdk2OpaqueScriptedScopeBaselineTests
|
|
{
|
|
[Fact]
|
|
public async Task Opaque_scripted_ID_is_denied_by_its_equipment_grant_but_allowed_by_a_cluster_grant()
|
|
{
|
|
var ct = TestContext.Current.CancellationToken;
|
|
await using var rig = await StartAsync("BaselineScriptedScope", encrypted: false, ct);
|
|
rig.KeyRoles = [];
|
|
const NodePermissions permissions = NodePermissions.ReadOnly | NodePermissions.AlarmAcknowledge | NodePermissions.MethodCall;
|
|
rig.Enforce(true, [Key()], new NodeAcl
|
|
{
|
|
NodeAclId = "narrow", ClusterId = ServerEventRig.Cluster, Principal = KeyPrincipal,
|
|
ScopeKind = NodeAclScopeKind.Equipment, ScopeId = $"eq-{EqA}", PermissionFlags = permissions,
|
|
});
|
|
rig.MaterialiseScripted();
|
|
var routed = 0;
|
|
rig.Nm.AlarmCommandRouter = _ => routed++;
|
|
using var session = await rig.ConnectAsync(anonymous: false, ct);
|
|
rig.Project(false, new AlarmConditionSnapshot(true, true, true, true, AlarmShelvingKind.Unshelved, 500, "scope"));
|
|
var condition = rig.Nm.TryGetAlarmCondition(ScriptedAlarmId, AddressSpaceRealm.Uns).ShouldNotBeNull();
|
|
var eventId = condition.EventId.ShouldNotBeNull().Value;
|
|
var denied = await Should.ThrowAsync<ServiceResultException>(() => session.CallAsync(condition.NodeId,
|
|
MethodIds.AcknowledgeableConditionType_Acknowledge, ct, new Variant[] { Variant.From(eventId), Variant.From(new LocalizedText("denied")) }));
|
|
denied.StatusCode.ShouldBe(StatusCodes.BadUserAccessDenied);
|
|
routed.ShouldBe(0);
|
|
rig.Enforce(true, [Key()], ClusterGrant(KeyPrincipal, "cluster-positive", permissions));
|
|
await session.CallAsync(condition.NodeId, MethodIds.AcknowledgeableConditionType_Acknowledge, ct,
|
|
new Variant[] { Variant.From(eventId), Variant.From(new LocalizedText("allowed")) });
|
|
routed.ShouldBe(1);
|
|
await session.CloseAsync(ct);
|
|
}
|
|
}
|