2019-02-01 14:57:09 -08:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Diagnostics;
|
|
|
|
|
using System.Net.WebSockets;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using System.Threading.Tasks;
|
2020-04-14 20:08:03 -04:00
|
|
|
using k8s.Tests.Mock;
|
2019-02-01 14:57:09 -08:00
|
|
|
using Xunit;
|
|
|
|
|
using Xunit.Abstractions;
|
|
|
|
|
|
|
|
|
|
namespace k8s.Tests
|
|
|
|
|
{
|
|
|
|
|
public class StreamDemuxerTests
|
|
|
|
|
{
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task SendDataRemoteCommand()
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
using (var ws = new MockWebSocket())
|
|
|
|
|
using (var demuxer = new StreamDemuxer(ws))
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
var sentBuffer = new List<byte>();
|
2020-04-23 11:40:06 -07:00
|
|
|
ws.MessageSent += (sender, args) => { sentBuffer.AddRange(args.Data.Buffer); };
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2019-03-20 16:53:04 +01:00
|
|
|
demuxer.Start();
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
byte channelIndex = 12;
|
|
|
|
|
var stream = demuxer.GetStream(channelIndex, channelIndex);
|
|
|
|
|
var b = GenerateRandomBuffer(100, 0xEF);
|
|
|
|
|
stream.Write(b, 0, b.Length);
|
|
|
|
|
|
|
|
|
|
// Send 100 bytes, expect 1 (channel index) + 100 (payload) = 101 bytes
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
await WaitForAsync(() => sentBuffer.Count == 101).ConfigureAwait(false),
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to send 101 bytes, but actually send {sentBuffer.Count} bytes.");
|
2019-02-01 14:57:09 -08:00
|
|
|
Assert.True(sentBuffer[0] == channelIndex, "The first sent byte is not channel index!");
|
|
|
|
|
Assert.True(sentBuffer[1] == 0xEF, "Incorrect payload!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task SendMultipleDataRemoteCommand()
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
using (var ws = new MockWebSocket())
|
|
|
|
|
using (var demuxer = new StreamDemuxer(ws))
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
var sentBuffer = new List<byte>();
|
2020-04-23 11:40:06 -07:00
|
|
|
ws.MessageSent += (sender, args) => { sentBuffer.AddRange(args.Data.Buffer); };
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2019-03-20 16:53:04 +01:00
|
|
|
demuxer.Start();
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
byte channelIndex = 12;
|
|
|
|
|
var stream = demuxer.GetStream(channelIndex, channelIndex);
|
|
|
|
|
var b = GenerateRandomBuffer(100, 0xEF);
|
|
|
|
|
stream.Write(b, 0, b.Length);
|
|
|
|
|
b = GenerateRandomBuffer(200, 0xAB);
|
|
|
|
|
stream.Write(b, 0, b.Length);
|
|
|
|
|
|
|
|
|
|
// Send 300 bytes in 2 messages, expect 1 (channel index) * 2 + 300 (payload) = 302 bytes
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
await WaitForAsync(() => sentBuffer.Count == 302).ConfigureAwait(false),
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to send 302 bytes, but actually send {sentBuffer.Count} bytes.");
|
2019-02-01 14:57:09 -08:00
|
|
|
Assert.True(sentBuffer[0] == channelIndex, "The first sent byte is not channel index!");
|
|
|
|
|
Assert.True(sentBuffer[1] == 0xEF, "The first part of payload incorrect!");
|
|
|
|
|
Assert.True(sentBuffer[101] == channelIndex, "The second message first byte is not channel index!");
|
|
|
|
|
Assert.True(sentBuffer[102] == 0xAB, "The second part of payload incorrect!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task ReceiveDataRemoteCommand()
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
using (var ws = new MockWebSocket())
|
|
|
|
|
using (var demuxer = new StreamDemuxer(ws))
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
2019-03-20 16:53:04 +01:00
|
|
|
demuxer.Start();
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
var receivedBuffer = new List<byte>();
|
2019-02-01 14:57:09 -08:00
|
|
|
byte channelIndex = 12;
|
|
|
|
|
var stream = demuxer.GetStream(channelIndex, channelIndex);
|
|
|
|
|
|
|
|
|
|
// Receive 600 bytes in 3 messages. Exclude 1 channel index byte per message, expect 597 bytes payload.
|
2020-11-22 14:52:09 -08:00
|
|
|
var expectedCount = 597;
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
var t = Task.Run(async () =>
|
|
|
|
|
{
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(100, channelIndex, 0xAA, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(200, channelIndex, 0xAB, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(300, channelIndex, 0xAC, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await WaitForAsync(() => receivedBuffer.Count == expectedCount).ConfigureAwait(false);
|
|
|
|
|
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal", CancellationToken.None).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
});
|
|
|
|
|
var buffer = new byte[50];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-10-23 08:31:57 -07:00
|
|
|
var cRead = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
if (cRead == 0)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < cRead; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
receivedBuffer.Add(buffer[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await t.ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
receivedBuffer.Count == expectedCount,
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to receive {expectedCount} bytes, but actually got {receivedBuffer.Count} bytes.");
|
2019-02-01 14:57:09 -08:00
|
|
|
Assert.True(receivedBuffer[0] == 0xAA, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[98] == 0xAA, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[99] == 0xAB, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[297] == 0xAB, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[298] == 0xAC, "The third payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[596] == 0xAC, "The third payload incorrect!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task ReceiveDataPortForward()
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
using (var ws = new MockWebSocket())
|
|
|
|
|
using (var demuxer = new StreamDemuxer(ws, StreamType.PortForward))
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
2019-03-20 16:53:04 +01:00
|
|
|
demuxer.Start();
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
var receivedBuffer = new List<byte>();
|
2019-02-01 14:57:09 -08:00
|
|
|
byte channelIndex = 12;
|
|
|
|
|
var stream = demuxer.GetStream(channelIndex, channelIndex);
|
|
|
|
|
|
|
|
|
|
// Receive 600 bytes in 3 messages. Exclude 1 channel index byte per message, and 2 port bytes in the first message.
|
|
|
|
|
// expect 600 - 3 - 2 = 595 bytes payload.
|
2020-11-22 14:52:09 -08:00
|
|
|
var expectedCount = 595;
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
var t = Task.Run(async () =>
|
|
|
|
|
{
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(100, channelIndex, 0xB1, true)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(200, channelIndex, 0xB2, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(300, channelIndex, 0xB3, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await WaitForAsync(() => receivedBuffer.Count == expectedCount).ConfigureAwait(false);
|
|
|
|
|
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal", CancellationToken.None).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
});
|
|
|
|
|
var buffer = new byte[50];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-10-23 08:31:57 -07:00
|
|
|
var cRead = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
if (cRead == 0)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < cRead; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
receivedBuffer.Add(buffer[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await t.ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
receivedBuffer.Count == expectedCount,
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to receive {expectedCount} bytes, but actually got {receivedBuffer.Count} bytes.");
|
2019-02-01 14:57:09 -08:00
|
|
|
Assert.True(receivedBuffer[0] == 0xB1, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[96] == 0xB1, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[97] == 0xB2, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[295] == 0xB2, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[296] == 0xB3, "The third payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[594] == 0xB3, "The third payload incorrect!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task ReceiveDataPortForwardOneByteMessage()
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
using (var ws = new MockWebSocket())
|
|
|
|
|
using (var demuxer = new StreamDemuxer(ws, StreamType.PortForward))
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
2019-03-20 16:53:04 +01:00
|
|
|
demuxer.Start();
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
var receivedBuffer = new List<byte>();
|
2019-02-01 14:57:09 -08:00
|
|
|
byte channelIndex = 12;
|
|
|
|
|
var stream = demuxer.GetStream(channelIndex, channelIndex);
|
|
|
|
|
|
|
|
|
|
// Receive 402 bytes in 3 buffers of 2 messages. Exclude 1 channel index byte per message, and 2 port bytes in the first message.
|
|
|
|
|
// expect 402 - 1 x 2 - 2 = 398 bytes payload.
|
2020-11-22 14:52:09 -08:00
|
|
|
var expectedCount = 398;
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
var t = Task.Run(async () =>
|
|
|
|
|
{
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(2, channelIndex, 0xC1, true)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, false).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(100, channelIndex, 0xC2, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(300, channelIndex, 0xC3, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await WaitForAsync(() => receivedBuffer.Count == expectedCount).ConfigureAwait(false);
|
|
|
|
|
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal", CancellationToken.None).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
});
|
|
|
|
|
var buffer = new byte[50];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-10-23 08:31:57 -07:00
|
|
|
var cRead = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
if (cRead == 0)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < cRead; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
receivedBuffer.Add(buffer[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await t.ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
receivedBuffer.Count == expectedCount,
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to receive {expectedCount} bytes, but actually got {receivedBuffer.Count} bytes.");
|
2019-02-01 14:57:09 -08:00
|
|
|
Assert.True(receivedBuffer[0] == 0xC2, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[98] == 0xC2, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[99] == 0xC3, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer[397] == 0xC3, "The second payload incorrect!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task ReceiveDataRemoteCommandMultipleStream()
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
using (var ws = new MockWebSocket())
|
|
|
|
|
using (var demuxer = new StreamDemuxer(ws))
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
2019-03-20 16:53:04 +01:00
|
|
|
demuxer.Start();
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
var receivedBuffer1 = new List<byte>();
|
2019-02-01 14:57:09 -08:00
|
|
|
byte channelIndex1 = 1;
|
|
|
|
|
var stream1 = demuxer.GetStream(channelIndex1, channelIndex1);
|
2020-11-22 14:52:09 -08:00
|
|
|
var receivedBuffer2 = new List<byte>();
|
2019-02-01 14:57:09 -08:00
|
|
|
byte channelIndex2 = 2;
|
|
|
|
|
var stream2 = demuxer.GetStream(channelIndex2, channelIndex2);
|
|
|
|
|
|
|
|
|
|
// stream 1: receive 100 + 300 = 400 bytes, exclude 1 channel index per message, expect 400 - 1 x 2 = 398 bytes.
|
2020-11-22 14:52:09 -08:00
|
|
|
var expectedCount1 = 398;
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
// stream 2: receive 200 bytes, exclude 1 channel index per message, expect 200 - 1 = 199 bytes.
|
2020-11-22 14:52:09 -08:00
|
|
|
var expectedCount2 = 199;
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
var t1 = Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
// Simulate WebSocket received remote data to multiple streams
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(100, channelIndex1, 0xD1, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(200, channelIndex2, 0xD2, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(300, channelIndex1, 0xD3, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await WaitForAsync(() => receivedBuffer1.Count == expectedCount1).ConfigureAwait(false);
|
|
|
|
|
await WaitForAsync(() => receivedBuffer2.Count == expectedCount2).ConfigureAwait(false);
|
|
|
|
|
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal", CancellationToken.None).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
});
|
|
|
|
|
var t2 = Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
var buffer = new byte[50];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-10-23 08:31:57 -07:00
|
|
|
var cRead = await stream1.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
if (cRead == 0)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < cRead; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
receivedBuffer1.Add(buffer[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
var t3 = Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
var buffer = new byte[50];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-10-23 08:31:57 -07:00
|
|
|
var cRead = await stream2.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
if (cRead == 0)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < cRead; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
receivedBuffer2.Add(buffer[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
2020-10-23 08:31:57 -07:00
|
|
|
await Task.WhenAll(t1, t2, t3).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
receivedBuffer1.Count == expectedCount1,
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to receive {expectedCount1} bytes, but actually got {receivedBuffer1.Count} bytes.");
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
receivedBuffer2.Count == expectedCount2,
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to receive {expectedCount2} bytes, but actually got {receivedBuffer2.Count} bytes.");
|
2019-02-01 14:57:09 -08:00
|
|
|
Assert.True(receivedBuffer1[0] == 0xD1, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer1[98] == 0xD1, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer1[99] == 0xD3, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer1[397] == 0xD3, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer2[0] == 0xD2, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer2[198] == 0xD2, "The first payload incorrect!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public async Task ReceiveDataPortForwardMultipleStream()
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
using (var ws = new MockWebSocket())
|
|
|
|
|
using (var demuxer = new StreamDemuxer(ws, StreamType.PortForward))
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
2019-03-20 16:53:04 +01:00
|
|
|
demuxer.Start();
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
var receivedBuffer1 = new List<byte>();
|
2019-02-01 14:57:09 -08:00
|
|
|
byte channelIndex1 = 1;
|
|
|
|
|
var stream1 = demuxer.GetStream(channelIndex1, channelIndex1);
|
2020-11-22 14:52:09 -08:00
|
|
|
var receivedBuffer2 = new List<byte>();
|
2019-02-01 14:57:09 -08:00
|
|
|
byte channelIndex2 = 2;
|
|
|
|
|
var stream2 = demuxer.GetStream(channelIndex2, channelIndex2);
|
|
|
|
|
|
|
|
|
|
// stream 1: receive 100 + 300 = 400 bytes, exclude 1 channel index per message, exclude port bytes in the first message,
|
|
|
|
|
// expect 400 - 1 x 2 - 2 = 396 bytes.
|
2020-11-22 14:52:09 -08:00
|
|
|
var expectedCount1 = 396;
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
// stream 2: receive 200 bytes, exclude 1 channel index per message, exclude port bytes in the first message,
|
|
|
|
|
// expect 200 - 1 - 2 = 197 bytes.
|
2020-11-22 14:52:09 -08:00
|
|
|
var expectedCount2 = 197;
|
2019-02-01 14:57:09 -08:00
|
|
|
|
|
|
|
|
var t1 = Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
// Simulate WebSocket received remote data to multiple streams
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(100, channelIndex1, 0xE1, true)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(200, channelIndex2, 0xE2, true)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2020-04-23 11:40:06 -07:00
|
|
|
await ws.InvokeReceiveAsync(
|
|
|
|
|
new ArraySegment<byte>(GenerateRandomBuffer(300, channelIndex1, 0xE3, false)),
|
2020-10-23 08:31:57 -07:00
|
|
|
WebSocketMessageType.Binary, true).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await WaitForAsync(() => receivedBuffer1.Count == expectedCount1).ConfigureAwait(false);
|
|
|
|
|
await WaitForAsync(() => receivedBuffer2.Count == expectedCount2).ConfigureAwait(false);
|
|
|
|
|
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "normal", CancellationToken.None).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
});
|
|
|
|
|
var t2 = Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
var buffer = new byte[50];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-10-23 08:31:57 -07:00
|
|
|
var cRead = await stream1.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
if (cRead == 0)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < cRead; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
receivedBuffer1.Add(buffer[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
var t3 = Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
var buffer = new byte[50];
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
2020-10-23 08:31:57 -07:00
|
|
|
var cRead = await stream2.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
if (cRead == 0)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < cRead; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
receivedBuffer2.Add(buffer[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
2020-10-23 08:31:57 -07:00
|
|
|
await Task.WhenAll(t1, t2, t3).ConfigureAwait(false);
|
2019-02-01 14:57:09 -08:00
|
|
|
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
receivedBuffer1.Count == expectedCount1,
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to receive {expectedCount1} bytes, but actually got {receivedBuffer1.Count} bytes.");
|
2020-11-01 12:24:51 -08:00
|
|
|
Assert.True(
|
|
|
|
|
receivedBuffer2.Count == expectedCount2,
|
2020-04-23 11:40:06 -07:00
|
|
|
$"Demuxer error: expect to receive {expectedCount2} bytes, but actually got {receivedBuffer2.Count} bytes.");
|
2019-02-01 14:57:09 -08:00
|
|
|
Assert.True(receivedBuffer1[0] == 0xE1, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer1[96] == 0xE1, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer1[97] == 0xE3, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer1[395] == 0xE3, "The second payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer2[0] == 0xE2, "The first payload incorrect!");
|
|
|
|
|
Assert.True(receivedBuffer2[196] == 0xE2, "The first payload incorrect!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static byte[] GenerateRandomBuffer(int length, byte channelIndex, byte content, bool portForward)
|
|
|
|
|
{
|
|
|
|
|
var buffer = GenerateRandomBuffer(length, content);
|
|
|
|
|
buffer[0] = channelIndex;
|
|
|
|
|
if (portForward)
|
|
|
|
|
{
|
|
|
|
|
if (length > 1)
|
|
|
|
|
{
|
2020-04-23 11:40:06 -07:00
|
|
|
buffer[1] = 0xFF; // the first port bytes
|
2019-02-01 14:57:09 -08:00
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2019-02-01 14:57:09 -08:00
|
|
|
if (length > 2)
|
|
|
|
|
{
|
2020-04-23 11:40:06 -07:00
|
|
|
buffer[2] = 0xFF; // the 2nd port bytes
|
2019-02-01 14:57:09 -08:00
|
|
|
}
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2019-02-01 14:57:09 -08:00
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static byte[] GenerateRandomBuffer(int length, byte content)
|
|
|
|
|
{
|
|
|
|
|
var buffer = new byte[length];
|
2020-11-22 14:52:09 -08:00
|
|
|
for (var i = 0; i < length; i++)
|
2019-02-01 14:57:09 -08:00
|
|
|
{
|
|
|
|
|
buffer[i] = content;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2019-02-01 14:57:09 -08:00
|
|
|
return buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task<bool> WaitForAsync(Func<bool> handler, float waitForSeconds = 1)
|
|
|
|
|
{
|
2020-11-22 14:52:09 -08:00
|
|
|
var w = Stopwatch.StartNew();
|
2019-02-01 14:57:09 -08:00
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
do
|
|
|
|
|
{
|
|
|
|
|
if (handler())
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2020-10-23 08:31:57 -07:00
|
|
|
await Task.Delay(10).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
while (w.Elapsed.Duration().TotalSeconds < waitForSeconds);
|
2020-04-23 11:40:06 -07:00
|
|
|
|
2019-02-01 14:57:09 -08:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
w.Stop();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|