1392 lines
51 KiB
C#
1392 lines
51 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using Mirror.Tests.RemoteAttrributeTest;
|
||
using NUnit.Framework;
|
||
using UnityEngine;
|
||
|
||
namespace Mirror.Tests
|
||
{
|
||
[TestFixture]
|
||
public class NetworkWriterTest : MirrorEditModeTest
|
||
{
|
||
[SetUp]
|
||
public override void SetUp()
|
||
{
|
||
base.SetUp();
|
||
|
||
// start server & connect client because we need spawn functions
|
||
NetworkServer.Listen(1);
|
||
ConnectClientBlockingAuthenticatedAndReady(out _);
|
||
}
|
||
|
||
/* uncomment if needed. commented for faster test workflow. this takes >3s.
|
||
[Test]
|
||
public void Benchmark()
|
||
{
|
||
// 10 million reads, Unity 2019.3, code coverage disabled
|
||
// 4014ms ms
|
||
NetworkWriter writer = new NetworkWriter();
|
||
for (int i = 0; i < 10000000; ++i)
|
||
{
|
||
writer.SetLength(0);
|
||
writer.WriteVector3(new Vector3(1, 2, 3));
|
||
}
|
||
}
|
||
*/
|
||
|
||
// Write/ReadBlittable assumes same endianness on server & client.
|
||
[Test]
|
||
public void LittleEndianPlatform()
|
||
{
|
||
Assert.That(BitConverter.IsLittleEndian, Is.True);
|
||
}
|
||
|
||
// some platforms may not support unaligned *(T*) reads/writes.
|
||
// but it still needs to work with our workaround.
|
||
// let's have an editor test to maybe catch it early.
|
||
// Editor runs Win/Mac/Linux and atm the issue only exists on Android,
|
||
// but let's have a test anyway.
|
||
// see also: https://github.com/vis2k/Mirror/issues/3044
|
||
[Test]
|
||
public void WriteUnaligned()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
// make unaligned
|
||
writer.WriteByte(0xFF);
|
||
// write a double
|
||
writer.WriteDouble(Math.PI);
|
||
// should have written 9 bytes without throwing exceptions
|
||
Assert.That(writer.Position, Is.EqualTo(9));
|
||
}
|
||
|
||
[Test]
|
||
public void TestWritingSmallMessage()
|
||
{
|
||
// try serializing less than 32kb and see what happens
|
||
NetworkWriter writer = new NetworkWriter();
|
||
for (int i = 0; i < 30000 / 4; ++i)
|
||
writer.WriteInt(i);
|
||
Assert.That(writer.Position, Is.EqualTo(30000));
|
||
}
|
||
|
||
[Test]
|
||
public void TestWritingLargeMessage()
|
||
{
|
||
// try serializing more than 32kb and see what happens
|
||
NetworkWriter writer = new NetworkWriter();
|
||
for (int i = 0; i < 40000 / 4; ++i)
|
||
writer.WriteInt(i);
|
||
Assert.That(writer.Position, Is.EqualTo(40000));
|
||
}
|
||
|
||
[Test]
|
||
public void TestWritingHugeArray()
|
||
{
|
||
// try serializing array more than 64KB large and see what happens
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBytesAndSize(new byte[100000]);
|
||
byte[] data = writer.ToArray();
|
||
|
||
NetworkReader reader = new NetworkReader(data);
|
||
byte[] deserialized = reader.ReadBytesAndSize();
|
||
Assert.That(deserialized.Length, Is.EqualTo(100000));
|
||
}
|
||
|
||
[Test]
|
||
public void TestWritingBytesSegment()
|
||
{
|
||
byte[] data = { 1, 2, 3 };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBytes(data, 0, data.Length);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
ArraySegment<byte> deserialized = reader.ReadBytesSegment(data.Length);
|
||
Assert.That(deserialized.Count, Is.EqualTo(data.Length));
|
||
for (int i = 0; i < data.Length; ++i)
|
||
Assert.That(deserialized.Array[deserialized.Offset + i], Is.EqualTo(data[i]));
|
||
}
|
||
|
||
// write byte[], read segment
|
||
[Test]
|
||
public void TestWritingBytesAndReadingSegment()
|
||
{
|
||
byte[] data = { 1, 2, 3 };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBytesAndSize(data);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
ArraySegment<byte> deserialized = reader.ReadBytesAndSizeSegment();
|
||
Assert.That(deserialized.Count, Is.EqualTo(data.Length));
|
||
for (int i = 0; i < data.Length; ++i)
|
||
Assert.That(deserialized.Array[deserialized.Offset + i], Is.EqualTo(data[i]));
|
||
}
|
||
|
||
// write segment, read segment
|
||
[Test]
|
||
public void TestWritingSegmentAndReadingSegment()
|
||
{
|
||
byte[] data = { 1, 2, 3, 4 };
|
||
// [2, 3]
|
||
ArraySegment<byte> segment = new ArraySegment<byte>(data, 1, 1);
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBytesAndSizeSegment(segment);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
ArraySegment<byte> deserialized = reader.ReadBytesAndSizeSegment();
|
||
Assert.That(deserialized.Count, Is.EqualTo(segment.Count));
|
||
for (int i = 0; i < segment.Count; ++i)
|
||
Assert.That(deserialized.Array[deserialized.Offset + i], Is.EqualTo(segment.Array[segment.Offset + i]));
|
||
}
|
||
|
||
[Test]
|
||
public void TestResetSetsPotionAndLength()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteString("I saw");
|
||
writer.WriteLong(0xA_FADED_DEAD_EEL);
|
||
writer.WriteString("and ate it");
|
||
writer.Reset();
|
||
|
||
Assert.That(writer.Position, Is.EqualTo(0));
|
||
|
||
byte[] data = writer.ToArray();
|
||
Assert.That(data, Is.Empty);
|
||
}
|
||
|
||
[Test]
|
||
public void TestReading0LengthBytesAndSize()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBytesAndSize(new byte[] {});
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Assert.That(reader.ReadBytesAndSize().Length, Is.EqualTo(0));
|
||
}
|
||
|
||
[Test]
|
||
public void TestReading0LengthBytes()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBytes(new byte[] {}, 0, 0);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Assert.That(reader.ReadBytes(0).Length, Is.EqualTo(0));
|
||
}
|
||
|
||
[Test]
|
||
public void TestWritingNegativeBytesAndSizeFailure()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
Assert.Throws<OverflowException>(() => writer.WriteBytesAndSize(new byte[0], 0, -1));
|
||
Assert.That(writer.Position, Is.EqualTo(0));
|
||
}
|
||
|
||
[Test]
|
||
public void TestReadingTooMuch()
|
||
{
|
||
void EnsureThrows(Action<NetworkReader> read, byte[] data = null)
|
||
{
|
||
Assert.Throws<System.IO.EndOfStreamException>(() => read(new NetworkReader(data ?? new byte[] {})));
|
||
}
|
||
// Try reading more than there is data to be read from
|
||
// This should throw EndOfStreamException always
|
||
EnsureThrows(r => r.ReadByte());
|
||
EnsureThrows(r => r.ReadSByte());
|
||
EnsureThrows(r => r.ReadChar());
|
||
EnsureThrows(r => r.ReadBool());
|
||
EnsureThrows(r => r.ReadShort());
|
||
EnsureThrows(r => r.ReadUShort());
|
||
EnsureThrows(r => r.ReadInt());
|
||
EnsureThrows(r => r.ReadUInt());
|
||
EnsureThrows(r => r.ReadLong());
|
||
EnsureThrows(r => r.ReadULong());
|
||
EnsureThrows(r => r.ReadDecimal());
|
||
EnsureThrows(r => r.ReadFloat());
|
||
EnsureThrows(r => r.ReadDouble());
|
||
EnsureThrows(r => r.ReadString());
|
||
EnsureThrows(r => r.ReadBytes(1));
|
||
EnsureThrows(r => r.ReadBytes(2));
|
||
EnsureThrows(r => r.ReadBytes(3));
|
||
EnsureThrows(r => r.ReadBytes(4));
|
||
EnsureThrows(r => r.ReadBytes(8));
|
||
EnsureThrows(r => r.ReadBytes(16));
|
||
EnsureThrows(r => r.ReadBytes(32));
|
||
EnsureThrows(r => r.ReadBytes(100));
|
||
EnsureThrows(r => r.ReadBytes(1000));
|
||
EnsureThrows(r => r.ReadBytes(10000));
|
||
EnsureThrows(r => r.ReadBytes(1000000));
|
||
EnsureThrows(r => r.ReadBytes(10000000));
|
||
EnsureThrows(r => r.ReadBytesAndSize());
|
||
EnsureThrows(r => r.ReadVector2());
|
||
EnsureThrows(r => r.ReadVector3());
|
||
EnsureThrows(r => r.ReadVector4());
|
||
EnsureThrows(r => r.ReadVector2Int());
|
||
EnsureThrows(r => r.ReadVector3Int());
|
||
EnsureThrows(r => r.ReadColor());
|
||
EnsureThrows(r => r.ReadColor32());
|
||
EnsureThrows(r => r.ReadQuaternion());
|
||
EnsureThrows(r => r.ReadRect());
|
||
EnsureThrows(r => r.ReadPlane());
|
||
EnsureThrows(r => r.ReadRay());
|
||
EnsureThrows(r => r.ReadMatrix4x4());
|
||
EnsureThrows(r => r.ReadGuid());
|
||
}
|
||
|
||
[Test]
|
||
public void TestBool()
|
||
{
|
||
bool[] inputs = { true, false };
|
||
foreach (bool input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBool(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
bool output = reader.ReadBool();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestBoolNullable()
|
||
{
|
||
bool? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteBoolNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
bool? output = reader.ReadBoolNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestByte()
|
||
{
|
||
byte[] inputs = { 1, 2, 3, 4 };
|
||
foreach (byte input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteByte(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
byte output = reader.ReadByte();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestByteNullable()
|
||
{
|
||
byte? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteByteNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
byte? output = reader.ReadByteNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestSByte()
|
||
{
|
||
sbyte[] inputs = { 1, 2, 3, 4 };
|
||
foreach (sbyte input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteSByte(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
sbyte output = reader.ReadSByte();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestSByteNullable()
|
||
{
|
||
sbyte? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteSByteNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
sbyte? output = reader.ReadSByteNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector2()
|
||
{
|
||
Vector2[] inputs = {
|
||
Vector2.right,
|
||
Vector2.up,
|
||
Vector2.zero,
|
||
Vector2.one,
|
||
Vector2.positiveInfinity,
|
||
new Vector2(0.1f,3.1f)
|
||
};
|
||
foreach (Vector2 input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector2(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector2 output = reader.ReadVector2();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector2Nullable()
|
||
{
|
||
Vector2? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector2Nullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector2? output = reader.ReadVector2Nullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector3()
|
||
{
|
||
Vector3[] inputs = {
|
||
Vector3.right,
|
||
Vector3.up,
|
||
Vector3.zero,
|
||
Vector3.one,
|
||
Vector3.positiveInfinity,
|
||
Vector3.forward,
|
||
new Vector3(0.1f,3.1f,1.4f)
|
||
};
|
||
foreach (Vector3 input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector3(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector3 output = reader.ReadVector3();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector3Nullable()
|
||
{
|
||
Vector3? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector3Nullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector3? output = reader.ReadVector3Nullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector4()
|
||
{
|
||
Vector4[] inputs = {
|
||
Vector3.right,
|
||
Vector3.up,
|
||
Vector4.zero,
|
||
Vector4.one,
|
||
Vector4.positiveInfinity,
|
||
new Vector4(0.1f,3.1f,1.4f,4.9f)
|
||
};
|
||
foreach (Vector4 input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector4(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector4 output = reader.ReadVector4();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector4Nullable()
|
||
{
|
||
Vector4? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector4Nullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector4? output = reader.ReadVector4Nullable();
|
||
Assert.That(output, Is.EqualTo(output));
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector2Int()
|
||
{
|
||
Vector2Int[] inputs = {
|
||
Vector2Int.down,
|
||
Vector2Int.up,
|
||
Vector2Int.left,
|
||
Vector2Int.zero,
|
||
new Vector2Int(-1023,-999999),
|
||
new Vector2Int(257,12345),
|
||
new Vector2Int(0x7fffffff,-12345),
|
||
};
|
||
foreach (Vector2Int input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector2Int(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector2Int output = reader.ReadVector2Int();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector2IntNullable()
|
||
{
|
||
Vector2Int? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector2IntNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector2Int? output = reader.ReadVector2IntNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector3Int()
|
||
{
|
||
Vector3Int[] inputs = {
|
||
Vector3Int.down,
|
||
Vector3Int.up,
|
||
Vector3Int.left,
|
||
Vector3Int.one,
|
||
Vector3Int.zero,
|
||
new Vector3Int(-1023,-999999,1392),
|
||
new Vector3Int(257,12345,-6132),
|
||
new Vector3Int(0x7fffffff,-12345,-1),
|
||
};
|
||
foreach (Vector3Int input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector3Int(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector3Int output = reader.ReadVector3Int();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestVector3IntNullable()
|
||
{
|
||
Vector3Int? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteVector3IntNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Vector3Int? output = reader.ReadVector3IntNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestColor()
|
||
{
|
||
Color[] inputs = {
|
||
Color.black,
|
||
Color.blue,
|
||
Color.cyan,
|
||
Color.yellow,
|
||
Color.magenta,
|
||
Color.white,
|
||
new Color(0.401f,0.2f,1.0f,0.123f)
|
||
};
|
||
foreach (Color input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteColor(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Color output = reader.ReadColor();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestColorNullable()
|
||
{
|
||
Color? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteColorNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Color? output = reader.ReadColorNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestColor32()
|
||
{
|
||
Color32[] inputs = {
|
||
Color.black,
|
||
Color.blue,
|
||
Color.cyan,
|
||
Color.yellow,
|
||
Color.magenta,
|
||
Color.white,
|
||
new Color32(0xab,0xcd,0xef,0x12),
|
||
new Color32(125,126,0,255)
|
||
};
|
||
foreach (Color32 input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteColor32(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Color32 output = reader.ReadColor32();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestColor32Nullable()
|
||
{
|
||
Color32? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteColor32Nullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Color32? output = reader.ReadColor32Nullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestQuaternion()
|
||
{
|
||
Quaternion[] inputs = {
|
||
Quaternion.identity,
|
||
default,
|
||
Quaternion.LookRotation(new Vector3(0.3f,0.4f,0.5f)),
|
||
Quaternion.Euler(45f,56f,Mathf.PI)
|
||
};
|
||
foreach (Quaternion input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteQuaternion(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Quaternion output = reader.ReadQuaternion();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestQuaternionNullable()
|
||
{
|
||
Quaternion? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteQuaternionNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Quaternion? output = reader.ReadQuaternionNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestRect()
|
||
{
|
||
Rect[] inputs = {
|
||
Rect.zero,
|
||
new Rect(1004.1f,2.001f,4636,400f),
|
||
new Rect(-100.622f,-200f,300f,975.6f),
|
||
new Rect(-100f,435,-30.04f,400f),
|
||
new Rect(55,-200f,-44,-123),
|
||
};
|
||
foreach (Rect input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteRect(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Rect output = reader.ReadRect();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestRectNullable()
|
||
{
|
||
Rect? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteRectNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Rect? output = reader.ReadRectNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestPlane()
|
||
{
|
||
Plane[] inputs = {
|
||
new Plane(new Vector3(-0.24f,0.34f,0.2f), 120.2f),
|
||
new Plane(new Vector3(0.133f,0.34f,0.122f), -10.135f),
|
||
new Plane(new Vector3(0.133f,-0.0f,float.MaxValue), -13.3f),
|
||
new Plane(new Vector3(0.1f,-0.2f,0.3f), 14.5f),
|
||
};
|
||
foreach (Plane input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WritePlane(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Plane output = reader.ReadPlane();
|
||
// note: Plane constructor does math internally, resulting in
|
||
// floating point precision loss that causes exact comparison
|
||
// to fail the test. So we test that the difference is small.
|
||
Assert.That((output.normal - input.normal).magnitude, Is.LessThan(1e-6f));
|
||
Assert.That(output.distance, Is.EqualTo(input.distance));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestPlaneNullable()
|
||
{
|
||
Plane? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WritePlaneNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Plane? output = reader.ReadPlaneNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestRay()
|
||
{
|
||
Ray[] inputs = {
|
||
new Ray(Vector3.up,Vector3.down),
|
||
new Ray(new Vector3(0.1f,0.2f,0.3f), new Vector3(0.4f,0.5f,0.6f)),
|
||
new Ray(new Vector3(-0.3f,0.5f,0.999f), new Vector3(1f,100.1f,20f)),
|
||
};
|
||
foreach (Ray input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteRay(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Ray output = reader.ReadRay();
|
||
Assert.That((output.direction - input.direction).magnitude, Is.LessThan(1e-6f));
|
||
Assert.That(output.origin, Is.EqualTo(input.origin));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestRayNullable()
|
||
{
|
||
Ray? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteRayNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Ray? output = reader.ReadRayNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestMatrix4x4()
|
||
{
|
||
Matrix4x4[] inputs = {
|
||
Matrix4x4.identity,
|
||
Matrix4x4.zero,
|
||
Matrix4x4.Scale(Vector3.one * 0.12345f),
|
||
Matrix4x4.LookAt(Vector2.up,Vector3.right,Vector3.forward),
|
||
Matrix4x4.Rotate(Quaternion.LookRotation(Vector3.one)),
|
||
};
|
||
foreach (Matrix4x4 input in inputs)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteMatrix4x4(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Matrix4x4 output = reader.ReadMatrix4x4();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestMatrix4x4Nullable()
|
||
{
|
||
Matrix4x4? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteMatrix4x4Nullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Matrix4x4? output = reader.ReadMatrix4x4Nullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestReadingInvalidString()
|
||
{
|
||
// These are all bytes which never show up in valid UTF8 encodings.
|
||
// NetworkReader should gracefully handle maliciously crafted input.
|
||
byte[] invalidUTF8bytes = {
|
||
0xC0, 0xC1, 0xF5, 0xF6,
|
||
0xF7, 0xF8, 0xF9, 0xFA,
|
||
0xFB, 0xFC, 0xFD, 0xFE,
|
||
0xFF,
|
||
};
|
||
foreach (byte invalid in invalidUTF8bytes)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteString("an uncorrupted string");
|
||
byte[] data = writer.ToArray();
|
||
data[10] = invalid;
|
||
NetworkReader reader = new NetworkReader(data);
|
||
Assert.Throws<System.Text.DecoderFallbackException>(() => reader.ReadString());
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestReadingTruncatedString()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteString("a string longer than 10 bytes");
|
||
writer.Reset();
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Assert.Throws<System.IO.EndOfStreamException>(() => reader.ReadString());
|
||
}
|
||
|
||
[Test]
|
||
public void TestToArray()
|
||
{
|
||
// write 2 bytes
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteByte(1);
|
||
writer.WriteByte(2);
|
||
|
||
// .ToArray() length is 2?
|
||
Assert.That(writer.ToArray().Length, Is.EqualTo(2));
|
||
|
||
// set position back by one
|
||
writer.Position = 1;
|
||
|
||
// Changing the position alter the size of the data
|
||
Assert.That(writer.ToArray().Length, Is.EqualTo(1));
|
||
}
|
||
|
||
[Test]
|
||
public void TestToArraySegment()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteString("hello");
|
||
writer.WriteString("world");
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArraySegment());
|
||
Assert.That(reader.ReadString(), Is.EqualTo("hello"));
|
||
Assert.That(reader.ReadString(), Is.EqualTo("world"));
|
||
}
|
||
|
||
// sometimes we may serialize nothing, then call ToArraySegment.
|
||
// make sure this works even if empty.
|
||
[Test]
|
||
public void TestToArraySegment_EmptyContent()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
ArraySegment<byte> segment = writer.ToArraySegment();
|
||
Assert.That(segment.Count, Is.EqualTo(0));
|
||
}
|
||
|
||
[Test]
|
||
public void TestChar()
|
||
{
|
||
char a = 'a';
|
||
char u = 'ⓤ';
|
||
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteChar(a);
|
||
writer.WriteChar(u);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
char a2 = reader.ReadChar();
|
||
Assert.That(a2, Is.EqualTo(a));
|
||
char u2 = reader.ReadChar();
|
||
Assert.That(u2, Is.EqualTo(u));
|
||
}
|
||
|
||
[Test]
|
||
public void TestCharNullable()
|
||
{
|
||
char? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteCharNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
char? output = reader.ReadCharNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestUnicodeString()
|
||
{
|
||
string[] weirdUnicode = {
|
||
"𝔲𝔫𝔦𝔠𝔬𝔡𝔢 𝔱𝔢𝔰𝔱",
|
||
"𝖚𝖓𝖎𝖈𝖔𝖉𝖊 𝖙𝖊𝖘𝖙",
|
||
"𝐮𝐧𝐢𝐜𝐨𝐝𝐞 𝐭𝐞𝐬𝐭",
|
||
"𝘶𝘯𝘪𝘤𝘰𝘥𝘦 𝘵𝘦𝘴𝘵",
|
||
"𝙪𝙣𝙞𝙘𝙤𝙙𝙚 𝙩𝙚𝙨𝙩",
|
||
"𝚞𝚗𝚒𝚌𝚘𝚍𝚎 𝚝𝚎𝚜𝚝",
|
||
"𝓊𝓃𝒾𝒸𝑜𝒹𝑒 𝓉𝑒𝓈𝓉",
|
||
"𝓾𝓷𝓲𝓬𝓸𝓭𝓮 𝓽𝓮𝓼𝓽",
|
||
"𝕦𝕟𝕚𝕔𝕠𝕕𝕖 𝕥𝕖𝕤𝕥",
|
||
"ЦПIᄃӨDΣ ƬΣƧƬ",
|
||
"ㄩ几丨匚ㄖᗪ乇 ㄒ乇丂ㄒ",
|
||
"ひ刀ノᄃのり乇 イ乇丂イ",
|
||
"Ʉ₦ł₵ØĐɆ ₮Ɇ₴₮",
|
||
"unicode test",
|
||
"ᴜɴɪᴄᴏᴅᴇ ᴛᴇꜱᴛ",
|
||
"ʇsǝʇ ǝpoɔıun",
|
||
"ยภเς๏๔є ՇєรՇ",
|
||
"ᑘᘉᓰᑢᓍᕲᘿ ᖶᘿSᖶ",
|
||
"υɳιƈσԃҽ ƚҽʂƚ",
|
||
"ʊռɨƈօɖɛ ȶɛֆȶ",
|
||
"🆄🅽🅸🅲🅾🅳🅴 🆃🅴🆂🆃",
|
||
"ⓤⓝⓘⓒⓞⓓⓔ ⓣⓔⓢⓣ",
|
||
"̶̝̳̥͈͖̝͌̈͛̽͊̏̚͠",
|
||
// test control codes
|
||
"\r\n", "\n", "\r", "\t",
|
||
"\\", "\"", "\'",
|
||
"\u0000\u0001\u0002\u0003",
|
||
"\u0004\u0005\u0006\u0007",
|
||
"\u0008\u0009\u000A\u000B",
|
||
"\u000C\u000D\u000E\u000F",
|
||
// test invalid bytes as characters
|
||
"\u00C0\u00C1\u00F5\u00F6",
|
||
"\u00F7\u00F8\u00F9\u00FA",
|
||
"\u00FB\u00FC\u00FD\u00FE",
|
||
"\u00FF",
|
||
};
|
||
foreach (string weird in weirdUnicode)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteString(weird);
|
||
byte[] data = writer.ToArray();
|
||
NetworkReader reader = new NetworkReader(data);
|
||
string str = reader.ReadString();
|
||
Assert.That(str, Is.EqualTo(weird));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestGuid()
|
||
{
|
||
Guid originalGuid = new Guid("0123456789abcdef9876543210fedcba");
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteGuid(originalGuid);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Guid readGuid = reader.ReadGuid();
|
||
Assert.That(readGuid, Is.EqualTo(originalGuid));
|
||
}
|
||
|
||
[Test]
|
||
public void TestGuidNullable()
|
||
{
|
||
Guid? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteGuidNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Guid? output = reader.ReadGuidNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestFloats()
|
||
{
|
||
float[] weirdFloats = {
|
||
0f,
|
||
-0f,
|
||
float.Epsilon,
|
||
-float.Epsilon,
|
||
float.MaxValue,
|
||
float.MinValue,
|
||
float.NaN,
|
||
-float.NaN,
|
||
float.PositiveInfinity,
|
||
float.NegativeInfinity,
|
||
(float) double.MaxValue,
|
||
(float) double.MinValue,
|
||
(float) decimal.MaxValue,
|
||
(float) decimal.MinValue,
|
||
(float) Math.PI,
|
||
(float) Math.E
|
||
};
|
||
foreach (float weird in weirdFloats)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteFloat(weird);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
float readFloat = reader.ReadFloat();
|
||
Assert.That(readFloat, Is.EqualTo(weird));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestFloatNullable()
|
||
{
|
||
float? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteFloatNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
float? output = reader.ReadFloatNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestDoubles()
|
||
{
|
||
double[] weirdDoubles = {
|
||
0d,
|
||
-0d,
|
||
double.Epsilon,
|
||
-double.Epsilon,
|
||
double.MaxValue,
|
||
double.MinValue,
|
||
double.NaN,
|
||
-double.NaN,
|
||
double.PositiveInfinity,
|
||
double.NegativeInfinity,
|
||
float.MaxValue,
|
||
float.MinValue,
|
||
(double) decimal.MaxValue,
|
||
(double) decimal.MinValue,
|
||
Math.PI,
|
||
Math.E
|
||
};
|
||
foreach (double weird in weirdDoubles)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteDouble(weird);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
double readDouble = reader.ReadDouble();
|
||
Assert.That(readDouble, Is.EqualTo(weird));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestDoubleNullable()
|
||
{
|
||
double? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteDoubleNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
double? output = reader.ReadDoubleNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestDecimals()
|
||
{
|
||
decimal[] weirdDecimals = {
|
||
decimal.Zero,
|
||
-decimal.Zero,
|
||
decimal.MaxValue,
|
||
decimal.MinValue,
|
||
(decimal) Math.PI,
|
||
(decimal) Math.E
|
||
};
|
||
foreach (decimal weird in weirdDecimals)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteDecimal(weird);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
decimal readDecimal = reader.ReadDecimal();
|
||
Assert.That(readDecimal, Is.EqualTo(weird));
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestDecimalNullable()
|
||
{
|
||
decimal? input = null;
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteDecimalNullable(input);
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
decimal? output = reader.ReadDecimalNullable();
|
||
Assert.That(output, Is.EqualTo(input));
|
||
}
|
||
|
||
[Test]
|
||
public void TestFloatBinaryCompatibility()
|
||
{
|
||
float[] weirdFloats = {
|
||
((float) Math.PI) / 3.0f,
|
||
((float) Math.E) / 3.0f
|
||
};
|
||
byte[] expected = {
|
||
146, 10,134, 63,
|
||
197,245,103, 63,
|
||
};
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (float weird in weirdFloats)
|
||
{
|
||
writer.WriteFloat(weird);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestDoubleBinaryCompatibility()
|
||
{
|
||
double[] weirdDoubles = {
|
||
Math.PI / 3.0d,
|
||
Math.E / 3.0d
|
||
};
|
||
byte[] expected = {
|
||
101,115, 45, 56, 82,193,240, 63,
|
||
140,116,112,185,184,254,236, 63,
|
||
};
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (double weird in weirdDoubles)
|
||
{
|
||
writer.WriteDouble(weird);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestDecimalBinaryCompatibility()
|
||
{
|
||
decimal[] weirdDecimals = {
|
||
((decimal) Math.PI) / 3.0m,
|
||
((decimal) Math.E) / 3.0m
|
||
};
|
||
byte[] expected = {
|
||
0x00, 0x00, 0x1C, 0x00, 0x12, 0x37, 0xD6, 0x21, 0xAB, 0xEA,
|
||
0x84, 0x0A, 0x5B, 0x5E, 0xB1, 0x03, 0x00, 0x00, 0x0E, 0x00,
|
||
0x00, 0x00, 0x00, 0x00, 0xF0, 0x6D, 0xC2, 0xA4, 0x68, 0x52,
|
||
0x00, 0x00
|
||
};
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (decimal weird in weirdDecimals)
|
||
{
|
||
writer.WriteDecimal(weird);
|
||
}
|
||
//Debug.Log(BitConverter.ToString(writer.ToArray()));
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestByteEndianness()
|
||
{
|
||
byte[] values = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 };
|
||
byte[] expected = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (byte value in values)
|
||
{
|
||
writer.WriteByte(value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestUShortEndianness()
|
||
{
|
||
ushort[] values = { 0x0000, 0x1234, 0xabcd, 0xF00F, 0x0FF0, 0xbeef };
|
||
byte[] expected = { 0x00, 0x00, 0x34, 0x12, 0xcd, 0xab, 0x0F, 0xF0, 0xF0, 0x0F, 0xef, 0xbe };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (ushort value in values)
|
||
{
|
||
writer.WriteUShort(value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestUIntEndianness()
|
||
{
|
||
uint[] values = { 0x12345678, 0xabcdef09, 0xdeadbeef };
|
||
byte[] expected = { 0x78, 0x56, 0x34, 0x12, 0x09, 0xef, 0xcd, 0xab, 0xef, 0xbe, 0xad, 0xde };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (uint value in values)
|
||
{
|
||
writer.WriteUInt(value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestULongEndianness()
|
||
{
|
||
ulong[] values = { 0x0123456789abcdef, 0xdeaded_beef_c0ffee };
|
||
byte[] expected = { 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0xee, 0xff, 0xc0, 0xef, 0xbe, 0xed, 0xad, 0xde };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (ulong value in values)
|
||
{
|
||
writer.WriteULong(value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestSbyteEndianness()
|
||
{
|
||
byte[] values = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 };
|
||
byte[] expected = { 0x12, 0x43, 0x00, 0xff, 0xab, 0x02, 0x20 };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (byte value in values)
|
||
{
|
||
writer.WriteSByte((sbyte)value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestShortEndianness()
|
||
{
|
||
ushort[] values = { 0x0000, 0x1234, 0xabcd, 0xF00F, 0x0FF0, 0xbeef };
|
||
byte[] expected = { 0x00, 0x00, 0x34, 0x12, 0xcd, 0xab, 0x0F, 0xF0, 0xF0, 0x0F, 0xef, 0xbe };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (ushort value in values)
|
||
{
|
||
writer.WriteShort((short)value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestIntEndianness()
|
||
{
|
||
uint[] values = { 0x12345678, 0xabcdef09, 0xdeadbeef };
|
||
byte[] expected = { 0x78, 0x56, 0x34, 0x12, 0x09, 0xef, 0xcd, 0xab, 0xef, 0xbe, 0xad, 0xde };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (uint value in values)
|
||
{
|
||
writer.WriteInt((int)value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestLongEndianness()
|
||
{
|
||
ulong[] values = { 0x0123456789abcdef, 0xdeaded_beef_c0ffee };
|
||
byte[] expected = { 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0xee, 0xff, 0xc0, 0xef, 0xbe, 0xed, 0xad, 0xde };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
foreach (ulong value in values)
|
||
{
|
||
writer.WriteLong((long)value);
|
||
}
|
||
Assert.That(writer.ToArray(), Is.EqualTo(expected));
|
||
}
|
||
|
||
[Test]
|
||
public void TestWritingAndReading()
|
||
{
|
||
// write all simple types once
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteChar((char)1);
|
||
writer.WriteByte(2);
|
||
writer.WriteSByte(3);
|
||
writer.WriteBool(true);
|
||
writer.WriteShort(4);
|
||
writer.WriteUShort(5);
|
||
writer.WriteInt(6);
|
||
writer.WriteUInt(7U);
|
||
writer.WriteLong(8L);
|
||
writer.WriteULong(9UL);
|
||
writer.WriteFloat(10.0F);
|
||
writer.WriteDouble(11.0D);
|
||
writer.WriteDecimal(12);
|
||
writer.WriteString(null);
|
||
writer.WriteString("");
|
||
writer.WriteString("13");
|
||
// just the byte array, no size info etc.
|
||
writer.WriteBytes(new byte[] { 14, 15 }, 0, 2);
|
||
// [SyncVar] struct values can have uninitialized byte arrays, null needs to be supported
|
||
writer.WriteBytesAndSize(null);
|
||
// buffer, no-offset, count
|
||
writer.WriteBytesAndSize(new byte[] { 17, 18 }, 0, 2);
|
||
// buffer, offset, count
|
||
writer.WriteBytesAndSize(new byte[] { 19, 20, 21 }, 1, 2);
|
||
// size, buffer
|
||
writer.WriteBytesAndSize(new byte[] { 22, 23 }, 0, 2);
|
||
|
||
// read them
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
|
||
Assert.That(reader.ReadChar(), Is.EqualTo(1));
|
||
Assert.That(reader.ReadByte(), Is.EqualTo(2));
|
||
Assert.That(reader.ReadSByte(), Is.EqualTo(3));
|
||
Assert.That(reader.ReadBool(), Is.True);
|
||
Assert.That(reader.ReadShort(), Is.EqualTo(4));
|
||
Assert.That(reader.ReadUShort(), Is.EqualTo(5));
|
||
Assert.That(reader.ReadInt(), Is.EqualTo(6));
|
||
Assert.That(reader.ReadUInt(), Is.EqualTo(7));
|
||
Assert.That(reader.ReadLong(), Is.EqualTo(8));
|
||
Assert.That(reader.ReadULong(), Is.EqualTo(9));
|
||
Assert.That(reader.ReadFloat(), Is.EqualTo(10));
|
||
Assert.That(reader.ReadDouble(), Is.EqualTo(11));
|
||
Assert.That(reader.ReadDecimal(), Is.EqualTo(12));
|
||
// writing null string should write null in Mirror ("" in original HLAPI)
|
||
Assert.That(reader.ReadString(), Is.Null);
|
||
Assert.That(reader.ReadString(), Is.EqualTo(""));
|
||
Assert.That(reader.ReadString(), Is.EqualTo("13"));
|
||
|
||
Assert.That(reader.ReadBytes(2), Is.EqualTo(new byte[] { 14, 15 }));
|
||
|
||
Assert.That(reader.ReadBytesAndSize(), Is.Null);
|
||
|
||
Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 17, 18 }));
|
||
|
||
Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 20, 21 }));
|
||
|
||
Assert.That(reader.ReadBytesAndSize(), Is.EqualTo(new byte[] { 22, 23 }));
|
||
}
|
||
|
||
[Test]
|
||
public void TestWritingUri()
|
||
{
|
||
|
||
Uri testUri = new Uri("https://www.mirror-networking.com?somthing=other");
|
||
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteUri(testUri);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Assert.That(reader.ReadUri(), Is.EqualTo(testUri));
|
||
}
|
||
|
||
// URI null support test for https://github.com/vis2k/Mirror/pull/2796/
|
||
[Test]
|
||
public void TestWritingNullUri()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteUri(null);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Assert.That(reader.ReadUri(), Is.EqualTo(null));
|
||
}
|
||
|
||
[Test]
|
||
public void TestList()
|
||
{
|
||
List<int> original = new List<int>() { 1, 2, 3, 4, 5 };
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.Write(original);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
List<int> readList = reader.Read<List<int>>();
|
||
Assert.That(readList, Is.EqualTo(original));
|
||
}
|
||
|
||
[Test]
|
||
public void TestNullList()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.Write<List<int>>(null);
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
List<int> readList = reader.Read<List<int>>();
|
||
Assert.That(readList, Is.Null);
|
||
}
|
||
|
||
|
||
const int testArraySize = 4;
|
||
[Test]
|
||
[Description("ReadArray should throw if it is trying to read more than length of segment, this is to stop allocation attacks")]
|
||
public void TestArrayDoesNotThrowWithCorrectLength()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
WriteGoodArray();
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Assert.DoesNotThrow(() =>
|
||
{
|
||
_ = reader.ReadArray<int>();
|
||
});
|
||
|
||
void WriteGoodArray()
|
||
{
|
||
writer.WriteInt(testArraySize);
|
||
int[] array = new int[testArraySize] { 1, 2, 3, 4 };
|
||
for (int i = 0; i < array.Length; i++)
|
||
writer.Write(array[i]);
|
||
}
|
||
}
|
||
[Test]
|
||
[Description("ReadArray should throw if it is trying to read more than length of segment, this is to stop allocation attacks")]
|
||
[TestCase(testArraySize * sizeof(int), Description = "max allowed value to allocate array")]
|
||
[TestCase(testArraySize * 2)]
|
||
[TestCase(testArraySize + 1, Description = "min allowed to allocate")]
|
||
public void TestArrayThrowsIfLengthIsWrong(int badLength)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
WriteBadArray();
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
Assert.Throws<EndOfStreamException>(() => {
|
||
_ = reader.ReadArray<int>();
|
||
});
|
||
|
||
void WriteBadArray()
|
||
{
|
||
writer.WriteInt(badLength);
|
||
int[] array = new int[testArraySize] { 1, 2, 3, 4 };
|
||
for (int i = 0; i < array.Length; i++)
|
||
writer.Write(array[i]);
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
[Description("ReadArray should throw if it is trying to read more than length of segment, this is to stop allocation attacks")]
|
||
[TestCase(testArraySize * sizeof(int) + 1, Description = "min read count is 1 byte, 16 array bytes are writen so 17 should throw error")]
|
||
[TestCase(20_000)]
|
||
[TestCase(int.MaxValue)]
|
||
[TestCase(int.MaxValue - 1)]
|
||
// todo add fuzzy testing to check more values
|
||
public void TestArrayThrowsIfLengthIsTooBig(int badLength)
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
WriteBadArray();
|
||
|
||
NetworkReader reader = new NetworkReader(writer.ToArray());
|
||
EndOfStreamException exception = Assert.Throws<EndOfStreamException>(() =>
|
||
{
|
||
_ = reader.ReadArray<int>();
|
||
});
|
||
Assert.That(exception, Has.Message.EqualTo($"Received array that is too large: {badLength}"));
|
||
|
||
void WriteBadArray()
|
||
{
|
||
writer.WriteInt(badLength);
|
||
int[] array = new int[testArraySize] { 1, 2, 3, 4 };
|
||
for (int i = 0; i < array.Length; i++)
|
||
writer.Write(array[i]);
|
||
}
|
||
}
|
||
|
||
[Test]
|
||
public void TestNetworkBehaviour()
|
||
{
|
||
// create spawned because we will look up netId in .spawned
|
||
CreateNetworkedAndSpawn(out _, out _, out RpcNetworkIdentityBehaviour behaviour,
|
||
out _, out _, out _);
|
||
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteNetworkBehaviour(behaviour);
|
||
|
||
byte[] bytes = writer.ToArray();
|
||
|
||
Assert.That(bytes.Length, Is.EqualTo(5), "Networkbehaviour should be 5 bytes long.");
|
||
|
||
NetworkReader reader = new NetworkReader(bytes);
|
||
RpcNetworkIdentityBehaviour actual = reader.ReadNetworkBehaviour<RpcNetworkIdentityBehaviour>();
|
||
Assert.That(actual, Is.EqualTo(behaviour), "Read should find the same behaviour as written");
|
||
}
|
||
|
||
[Test]
|
||
public void TestNetworkBehaviourNull()
|
||
{
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.WriteNetworkBehaviour(null);
|
||
|
||
byte[] bytes = writer.ToArray();
|
||
|
||
Assert.That(bytes.Length, Is.EqualTo(4), "null Networkbehaviour should be 4 bytes long.");
|
||
|
||
NetworkReader reader = new NetworkReader(bytes);
|
||
RpcNetworkIdentityBehaviour actual = reader.ReadNetworkBehaviour<RpcNetworkIdentityBehaviour>();
|
||
Assert.That(actual, Is.Null, "should read null");
|
||
|
||
Assert.That(reader.Position, Is.EqualTo(4), "should read 4 bytes when netid is 0");
|
||
}
|
||
|
||
[Test]
|
||
[Description("Uses Generic read function to check weaver correctly creates it")]
|
||
public void TestNetworkBehaviourWeaverGenerated()
|
||
{
|
||
// create spawned because we will look up netId in .spawned
|
||
CreateNetworkedAndSpawn(out _, out _, out RpcNetworkIdentityBehaviour behaviour,
|
||
out _, out _, out _);
|
||
|
||
NetworkWriter writer = new NetworkWriter();
|
||
writer.Write(behaviour);
|
||
|
||
byte[] bytes = writer.ToArray();
|
||
|
||
Assert.That(bytes.Length, Is.EqualTo(5), "Networkbehaviour should be 5 bytes long.");
|
||
|
||
NetworkReader reader = new NetworkReader(bytes);
|
||
RpcNetworkIdentityBehaviour actual = reader.Read<RpcNetworkIdentityBehaviour>();
|
||
Assert.That(actual, Is.EqualTo(behaviour), "Read should find the same behaviour as written");
|
||
}
|
||
}
|
||
}
|