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,
});
}
}