Esempio n. 1
0
        private async Task RunConcurrentStreams(bool writeResponseHeaders)
        {
            var streamCount = 201;
            var count       = 0;
            var tcs         = new TaskCompletionSource <object?>(TaskCreationOptions.RunContinuationsAsynchronously);

            async Task WaitForAllStreams(IAsyncStreamReader <DataMessage> requestStream, IServerStreamWriter <DataMessage> responseStream, ServerCallContext context)
            {
                Interlocked.Increment(ref count);

                if (writeResponseHeaders)
                {
                    await context.WriteResponseHeadersAsync(new Metadata());
                }

                if (count == streamCount)
                {
                    tcs.SetResult(null);
                }

                await tcs.Task;
            }

            // Arrange
            var method = Fixture.DynamicGrpc.AddDuplexStreamingMethod <DataMessage, DataMessage>(WaitForAllStreams);

            var channel = GrpcChannel.ForAddress(Fixture.GetUrl(TestServerEndpointName.Http2));

            var client = TestClientFactory.Create(channel, method);

            var calls = new AsyncDuplexStreamingCall <DataMessage, DataMessage> [streamCount];

            try
            {
                // Act
                for (var i = 0; i < calls.Length; i++)
                {
                    var call = client.DuplexStreamingCall();
                    calls[i] = call;

                    if (writeResponseHeaders)
                    {
                        await call.ResponseHeadersAsync.DefaultTimeout();
                    }
                }

                // Assert
                await Task.WhenAll(calls.Select(c => c.ResponseHeadersAsync)).DefaultTimeout();
            }
            catch (Exception ex)
            {
                throw new Exception($"Received {count} of {streamCount} on the server.", ex);
            }
            finally
            {
                for (var i = 0; i < calls.Length; i++)
                {
                    calls[i].Dispose();
                }
            }
        }