using System.Runtime.CompilerServices; using ZB.MOM.WW.MxGateway.Contracts.Proto; using ZB.MOM.WW.MxGateway.Server.Alarms; namespace ZB.MOM.WW.MxGateway.Tests.TestSupport; /// /// test double — serves a scripted /// active-alarm set and acknowledges every request with an OK status, /// so gRPC service tests can exercise the alarm handlers without the /// real gateway alarm monitor or a worker. /// public sealed class FakeGatewayAlarmService : IGatewayAlarmService { /// public GatewayAlarmMonitorState State { get; set; } = GatewayAlarmMonitorState.Monitoring; /// public string? LastError { get; set; } /// public int? WorkerProcessId { get; set; } /// public IReadOnlyList CurrentAlarms { get; set; } = []; /// public bool SnapshotTruncated { get; set; } /// public async IAsyncEnumerable StreamAsync( string? alarmFilterPrefix, [EnumeratorCancellation] CancellationToken cancellationToken) { foreach (ActiveAlarmSnapshot alarm in CurrentAlarms) { cancellationToken.ThrowIfCancellationRequested(); yield return new AlarmFeedMessage { ActiveAlarm = alarm }; } yield return new AlarmFeedMessage { SnapshotComplete = true }; await Task.CompletedTask.ConfigureAwait(false); if (StreamFault is not null) { throw StreamFault; } } /// /// Gets or sets an exception the feed throws after its snapshot, standing in for the monitor /// completing a subscriber with a fault (for example a slow-subscriber overflow). /// public Exception? StreamFault { get; set; } /// public Task AcknowledgeAsync( AcknowledgeAlarmRequest request, CancellationToken cancellationToken) { return Task.FromResult(new AcknowledgeAlarmReply { CorrelationId = request.ClientCorrelationId, ProtocolStatus = new ProtocolStatus { Code = ProtocolStatusCode.Ok }, DiagnosticMessage = string.Empty, }); } }