public void Tcp_listen_stream_must_shut_down_properly_even_if_some_accepted_connection_Flows_have_not_been_subscribed_to ()
{
this.AssertAllStagesStopped(() =>
{
var serverAddress = TestUtils.TemporaryServerAddress();
var firstClientConnected = new TaskCompletionSource<NotUsed>();
var takeTwoAndDropSecond = Flow.Create<Tcp.IncomingConnection>().Select(c =>
{
firstClientConnected.TrySetResult(NotUsed.Instance);
return c;
}).Grouped(2).Take(1).Select(e => e.First());
Sys.TcpStream()
.Bind(serverAddress.Address.ToString(), serverAddress.Port)
.Via(takeTwoAndDropSecond)
.RunForeach(c => c.Flow.Join(Flow.Create<ByteString>()).Run(Materializer), Materializer);
var folder = Source.From(Enumerable.Range(0, 100).Select(_ => ByteString.Create(new byte[] {0})))
.Via(Sys.TcpStream().OutgoingConnection(serverAddress))
.Aggregate(0, (i, s) => i + s.Count)
.ToMaterialized(Sink.First<int>(), Keep.Right);
var total = folder.Run(Materializer);
firstClientConnected.Task.Wait(TimeSpan.FromSeconds(2)).Should().BeTrue();
var rejected = folder.Run(Materializer);
total.Wait(TimeSpan.FromSeconds(10)).Should().BeTrue();
total.Result.Should().Be(100);
rejected.Wait(TimeSpan.FromSeconds(5)).Should().BeTrue();
rejected.Exception.Flatten().InnerExceptions.Any(e => e is StreamTcpException).Should().BeTrue();
}, Materializer);
}
}