## Breaking Change * IP Matching no longer supports `?` (e.g. you cannot do: "192.16?.0.1") * IP Matching no longer supports `*` and other values in the same section (e.g. you cannot do "192.1\*.0.1") * To do "192.1\*.0.1", you should use the range option with three separate entries: "192.100-199.0.1", "192.1.0.1", "192.10-19.0.1" ## Non-Breaking Changes - [X] Adds IPv6 support (not for servers though, just clients) - [X] Adds interning support for IPv4 mapped to IPv6 - [X] Updates IPv4ToAddress (don't use this unless you know it is IPv4 or IPv4 mapped to IPv6) ## Note: UO Does not support IPv6 for the server. To support an IPv6 server IP you will need to use CUO or some kind of custom client and probably modify it accordingly. Bumps release version
222 lines
5.9 KiB
C#
222 lines
5.9 KiB
C#
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Server.Network;
|
|
using Xunit;
|
|
|
|
namespace Server.Tests.Network
|
|
{
|
|
public class PipeTests
|
|
{
|
|
private async void DelayedExecute(Action action)
|
|
{
|
|
await Task.Delay(5).ConfigureAwait(false);
|
|
|
|
action();
|
|
}
|
|
|
|
[Fact]
|
|
public async void Await()
|
|
{
|
|
var pipe = new Pipe<byte>(new byte[100]);
|
|
|
|
var reader = pipe.Reader;
|
|
var writer = pipe.Writer;
|
|
|
|
DelayedExecute(() =>
|
|
{
|
|
; // Write some data into the pipe
|
|
var result = writer.TryGetMemory();
|
|
Assert.True(result.Buffer[0].Count == 99);
|
|
result.Buffer[0][0] = 0x1;
|
|
result.Buffer[0][1] = 0x2;
|
|
result.Buffer[0][2] = 0x3;
|
|
|
|
writer.Advance(3);
|
|
writer.Flush();
|
|
});
|
|
|
|
var result = await reader.Read();
|
|
Assert.Equal(3, result.Buffer[0].Count);
|
|
}
|
|
|
|
private bool _signal;
|
|
|
|
private void Consumer(object state)
|
|
{
|
|
var reader = ((Pipe<byte>)state).Reader;
|
|
|
|
int count = 0;
|
|
byte expected_value = 0xFA;
|
|
|
|
while (count < 0x8000000)
|
|
{
|
|
var result = reader.TryRead();
|
|
|
|
var first = result.Buffer[0];
|
|
|
|
for (int i = 0; i < first.Count; i++)
|
|
{
|
|
Assert.True(first[i] == expected_value);
|
|
count++;
|
|
|
|
if (count == 0x1000)
|
|
{
|
|
expected_value = 0xAC;
|
|
}
|
|
}
|
|
|
|
var second = result.Buffer[1];
|
|
for (int i = 0; i < second.Count; i++)
|
|
{
|
|
Assert.True(second[i] == expected_value);
|
|
count++;
|
|
|
|
if (count == 0x1000)
|
|
{
|
|
expected_value = 0xAC;
|
|
}
|
|
}
|
|
|
|
reader.Advance((uint)result.Length);
|
|
}
|
|
|
|
_signal = true;
|
|
}
|
|
|
|
[Fact]
|
|
public void Threading()
|
|
{
|
|
var pipe = new Pipe<byte>(new byte[0x1001]);
|
|
|
|
ThreadPool.UnsafeQueueUserWorkItem(Consumer, pipe);
|
|
|
|
var writer = pipe.Writer;
|
|
|
|
int count = 0;
|
|
byte expected_value = 0xFA;
|
|
|
|
while (count < 0x8000000)
|
|
{
|
|
var result = writer.TryGetMemory();
|
|
|
|
if (result.Length < 16)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
result.CopyFrom(new[] {
|
|
expected_value, expected_value, expected_value, expected_value,
|
|
expected_value, expected_value, expected_value, expected_value,
|
|
expected_value, expected_value, expected_value, expected_value,
|
|
expected_value, expected_value, expected_value, expected_value
|
|
});
|
|
|
|
writer.Advance(16);
|
|
count += 16;
|
|
|
|
if (count == 0x1000)
|
|
{
|
|
expected_value = 0xAC;
|
|
}
|
|
}
|
|
|
|
while (_signal == false) { }
|
|
|
|
_signal = false;
|
|
}
|
|
|
|
[Fact]
|
|
public void Wrap()
|
|
{
|
|
var pipe = new Pipe<byte>(new byte[10]);
|
|
|
|
var reader = pipe.Reader;
|
|
var writer = pipe.Writer;
|
|
|
|
var result = writer.TryGetMemory();
|
|
|
|
Assert.Equal(9, result.Length);
|
|
Assert.Equal(0u, reader.GetAvailable());
|
|
result = reader.TryRead();
|
|
Assert.Equal(0, result.Length);
|
|
|
|
writer.Advance(7);
|
|
result = writer.TryGetMemory();
|
|
Assert.Equal(2, result.Length);
|
|
Assert.Equal(7u, reader.GetAvailable());
|
|
result = reader.TryRead();
|
|
Assert.Equal(7, result.Length);
|
|
|
|
reader.Advance(4);
|
|
result = writer.TryGetMemory();
|
|
Assert.Equal(6, result.Length);
|
|
Assert.Equal(3u, reader.GetAvailable());
|
|
result = reader.TryRead();
|
|
Assert.Equal(3, result.Length);
|
|
|
|
writer.Advance(3);
|
|
result = writer.TryGetMemory();
|
|
Assert.Equal(3, result.Length);
|
|
Assert.Equal(6u, reader.GetAvailable());
|
|
result = reader.TryRead();
|
|
Assert.Equal(6, result.Length);
|
|
}
|
|
|
|
[Fact]
|
|
public void Match()
|
|
{
|
|
var pipe = new Pipe<byte>(new byte[10]);
|
|
|
|
var reader = pipe.Reader;
|
|
var writer = pipe.Writer;
|
|
|
|
for (uint i = 0; i < 9; i++)
|
|
{
|
|
writer.Advance(i);
|
|
writer.Flush();
|
|
|
|
Assert.True(reader.GetAvailable() == i);
|
|
reader.Advance(i);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void Sequence()
|
|
{
|
|
var pipe = new Pipe<byte>(new byte[10]);
|
|
|
|
var reader = pipe.Reader;
|
|
var writer = pipe.Writer;
|
|
|
|
var result = writer.TryGetMemory();
|
|
Assert.Equal(9, result.Length);
|
|
|
|
result.CopyFrom(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 });
|
|
|
|
writer.Advance(9);
|
|
writer.Flush();
|
|
|
|
Assert.Equal(9u, reader.GetAvailable());
|
|
|
|
result = reader.TryRead();
|
|
|
|
var first = result.Buffer[0];
|
|
|
|
for (int i = 0; i < 9; i++)
|
|
{
|
|
Assert.Equal(i, first[i]);
|
|
}
|
|
|
|
reader.Advance(4);
|
|
result = reader.TryRead();
|
|
Assert.Equal(5, result.Length);
|
|
first = result.Buffer[0];
|
|
Assert.Equal(4, first[0]);
|
|
Assert.Equal(5, first[1]);
|
|
Assert.Equal(6, first[2]);
|
|
Assert.Equal(7, first[3]);
|
|
Assert.Equal(8, first[4]);
|
|
}
|
|
}
|
|
}
|