public void Outgoing_TCP_stream_must_work_when_client_closes_read_then_server_closes_write_then_client_closes_write()
{
this.AssertAllStagesStopped(() =>
{
var testData = ByteString.Create(new byte[] { 1, 2, 3, 4, 5 });
var server = new Server(this);
var tcpWriteProbe = new TcpWriteProbe(this);
var tcpReadProbe = new TcpReadProbe(this);
Source.FromPublisher(tcpWriteProbe.PublisherProbe)
.Via(Sys.TcpStream().OutgoingConnection(server.Address))
.To(Sink.FromSubscriber(tcpReadProbe.SubscriberProbe))
.Run(Materializer);
var serverConnection = server.WaitAccept();
// Server can still write
serverConnection.Write(testData);
tcpReadProbe.Read(5).ShouldBeEquivalentTo(testData);
// Close client side read
tcpReadProbe.TcpReadSubscription.Value.Cancel();
// Client can still write
tcpWriteProbe.Write(testData);
serverConnection.Read(5);
serverConnection.WaitRead().ShouldBeEquivalentTo(testData);
serverConnection.ConfirmedClose();
// Close clint side write
tcpWriteProbe.Close();
serverConnection.ExpectClosed(Akka.IO.Tcp.ConfirmedClosed.Instance);
serverConnection.ExpectTerminated();
}, Materializer);
}