public static Task <bool> Before(this Task primary, TimeSpan timeout, params CancellationToken[] tokens) { var localTCS = new TaskCompletionSource(); foreach (var token in tokens) { token.Register(localTCS.SetResult); } CancellationTokenHelpers.Timeout(timeout).Token.Register(localTCS.SetResult); return(Task.WhenAny(primary, localTCS.Task).ContinueWith(t => { return (primary.Status == TaskStatus.RanToCompletion); })); }
public async Task Should_receive_multiple_packets() { TcpTransport transport = CreateTcpTransport(); var receivedMessages = new AsyncProducerConsumerQueue <byte[]>(); transport.Subscribe(receivedMessages.Enqueue); await transport.ConnectAsync(); Socket clientSocket = _serverSocket.Accept(); byte[] payload1 = Enumerable.Range(0, 10).Select(i => (byte)i).ToArray(); var packet1 = new TcpTransportPacket(0, payload1); byte[] payload2 = Enumerable.Range(11, 40).Select(i => (byte)i).ToArray(); var packet2 = new TcpTransportPacket(1, payload2); byte[] payload3 = Enumerable.Range(51, 205).Select(i => (byte)i).ToArray(); var packet3 = new TcpTransportPacket(2, payload3); byte[] allData = ArrayUtils.Combine(packet1.Data, packet2.Data, packet3.Data); byte[] dataPart1; byte[] dataPart2; allData.Split(50, out dataPart1, out dataPart2); clientSocket.Send(dataPart1); await Task.Delay(100); clientSocket.Send(dataPart2); await Task.Delay(100); byte[] receivedData1 = await receivedMessages.DequeueAsync(CancellationTokenHelpers.Timeout(1000).Token); receivedData1.Should().BeEquivalentTo(payload1); byte[] receivedData2 = await receivedMessages.DequeueAsync(CancellationTokenHelpers.Timeout(1000).Token); receivedData2.Should().BeEquivalentTo(payload2); byte[] receivedData3 = await receivedMessages.DequeueAsync(CancellationTokenHelpers.Timeout(1000).Token); receivedData3.Should().BeEquivalentTo(payload3); await transport.DisconnectAsync(); clientSocket.Close(); }