public void Outgoing_TCP_stream_must_properly_full_close_if_requested()
{
this.AssertAllStagesStopped(() =>
{
var serverAddress = TestUtils.TemporaryServerAddress();
var writeButIgnoreRead = Flow.FromSinkAndSource(Sink.Ignore<ByteString>(),
Source.Single(ByteString.FromString("Early response")), Keep.Right);
var task =
Sys.TcpStream()
.Bind(serverAddress.Address.ToString(), serverAddress.Port, halfClose: false)
.ToMaterialized(
Sink.ForEach<Tcp.IncomingConnection>(conn => conn.Flow.Join(writeButIgnoreRead).Run(Materializer)),
Keep.Left)
.Run(Materializer);
task.Wait(TimeSpan.FromSeconds(3)).Should().BeTrue();
var binding = task.Result;
var t = Source.Maybe<ByteString>()
.Via(Sys.TcpStream().OutgoingConnection(serverAddress.Address.ToString(), serverAddress.Port))
.ToMaterialized(Sink.Aggregate<ByteString, ByteString>(ByteString.Empty, (s, s1) => s + s1), Keep.Both)
.Run(Materializer);
var promise = t.Item1;
var result = t.Item2;
result.Wait(TimeSpan.FromSeconds(3)).Should().BeTrue();
result.Result.ShouldBeEquivalentTo(ByteString.FromString("Early response"));
promise.SetResult(null); // close client upstream, no more data
binding.Unbind();
}, Materializer);
}