#pragma warning disable IDE0073 // Copyright 2019 The gRPC Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. using System.Threading.Channels; using Grpc.Core; namespace Microsoft.AutoGen.RuntimeGateway.Grpc.Tests.Helpers.Grpc; public class TestAsyncStreamReader : IDisposable, IAsyncStreamReader where T : class { private readonly Channel _channel; private readonly ServerCallContext _serverCallContext; public T Current { get; private set; } = null!; public TestAsyncStreamReader(ServerCallContext serverCallContext) { _channel = Channel.CreateUnbounded(); _serverCallContext = serverCallContext; } public void AddMessage(T message) { if (!_channel.Writer.TryWrite(message)) { throw new InvalidOperationException("Unable to write message."); } } public void Complete() { _channel.Writer.Complete(); } public async Task MoveNext(CancellationToken cancellationToken) { _serverCallContext.CancellationToken.ThrowIfCancellationRequested(); if (await _channel.Reader.WaitToReadAsync(cancellationToken) && _channel.Reader.TryRead(out var message)) { Current = message; return true; } else { Current = null!; return false; } } public void Dispose() { Complete(); } }