diff --git a/src/Tests/NetworkTests/NetworkTests.cs b/src/Tests/NetworkTests/NetworkTests.cs new file mode 100644 index 00000000..5ae560d8 --- /dev/null +++ b/src/Tests/NetworkTests/NetworkTests.cs @@ -0,0 +1,198 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Moq; +using Void.Proxy.Api.Network; +using Void.Proxy.Api.Network.Channels; +using Void.Proxy.Api.Network.Messages; +using Void.Proxy.Api.Network.Streams; +using Void.Proxy.Api.Network.Streams.Manual.Network; +using Xunit; + +namespace Void.Tests.NetworkTests; + +public class NetworkTests +{ + [Fact] + public void NetworkChannel_CanRead_WhenConfigured_ReturnsExpectedValue() + { + var mockChannel = new Mock(); + mockChannel.Setup(c => c.CanRead).Returns(true); + + var channel = mockChannel.Object; + + Assert.True(channel.CanRead); + } + + [Fact] + public void NetworkChannel_CanWrite_WhenConfigured_ReturnsExpectedValue() + { + var mockChannel = new Mock(); + mockChannel.Setup(c => c.CanWrite).Returns(true); + + var channel = mockChannel.Object; + + Assert.True(channel.CanWrite); + } + + [Fact] + public void NetworkChannel_IsAlive_WhenActive_ReturnsTrue() + { + var mockChannel = new Mock(); + mockChannel.Setup(c => c.IsAlive).Returns(true); + + var channel = mockChannel.Object; + + Assert.True(channel.IsAlive); + } + + [Fact] + public async Task NetworkChannel_ReadMessageAsync_WhenMessageAvailable_ReturnsMessage() + { + var mockChannel = new Mock(); + var mockMessage = new Mock(); + + mockChannel.Setup(c => c.ReadMessageAsync(It.IsAny())) + .ReturnsAsync(mockMessage.Object); + + var channel = mockChannel.Object; + var message = await channel.ReadMessageAsync(); + + Assert.NotNull(message); + mockChannel.Verify(c => c.ReadMessageAsync(It.IsAny()), Times.Once); + } + + [Fact] + public async Task NetworkChannel_WriteMessageAsync_WhenCalled_WritesMessage() + { + var mockChannel = new Mock(); + var mockMessage = new Mock(); + + mockChannel.Setup(c => c.WriteMessageAsync(It.IsAny(), It.IsAny())) + .Returns(ValueTask.CompletedTask); + + var channel = mockChannel.Object; + await channel.WriteMessageAsync(mockMessage.Object); + + mockChannel.Verify(c => c.WriteMessageAsync(mockMessage.Object, It.IsAny()), Times.Once); + } + + [Fact] + public void NetworkChannel_Pause_WhenCalledWithReadOperation_PausesChannel() + { + var mockChannel = new Mock(); + + mockChannel.Setup(c => c.Pause(It.IsAny())); + + var channel = mockChannel.Object; + channel.Pause(Operation.Read); + + mockChannel.Verify(c => c.Pause(Operation.Read), Times.Once); + } + + [Fact] + public void NetworkChannel_Resume_WhenCalledWithReadOperation_ResumesChannel() + { + var mockChannel = new Mock(); + + mockChannel.Setup(c => c.Resume(It.IsAny())); + + var channel = mockChannel.Object; + channel.Resume(Operation.Read); + + mockChannel.Verify(c => c.Resume(Operation.Read), Times.Once); + } + + [Fact] + public void NetworkChannel_TryPause_WhenSuccessful_ReturnsTrue() + { + var mockChannel = new Mock(); + mockChannel.Setup(c => c.TryPause(It.IsAny())).Returns(true); + + var channel = mockChannel.Object; + var result = channel.TryPause(Operation.Write); + + Assert.True(result); + mockChannel.Verify(c => c.TryPause(Operation.Write), Times.Once); + } + + [Fact] + public void NetworkChannel_TryResume_WhenSuccessful_ReturnsTrue() + { + var mockChannel = new Mock(); + mockChannel.Setup(c => c.TryResume(It.IsAny())).Returns(true); + + var channel = mockChannel.Object; + var result = channel.TryResume(Operation.Write); + + Assert.True(result); + mockChannel.Verify(c => c.TryResume(Operation.Write), Times.Once); + } + + [Fact] + public async Task NetworkChannel_FlushAsync_WhenCalled_FlushesChannel() + { + var mockChannel = new Mock(); + + mockChannel.Setup(c => c.FlushAsync(It.IsAny())) + .Returns(ValueTask.CompletedTask); + + var channel = mockChannel.Object; + await channel.FlushAsync(); + + mockChannel.Verify(c => c.FlushAsync(It.IsAny()), Times.Once); + } + + [Fact] + public async Task NetworkStream_ReadAsync_WhenDataAvailable_ReturnsReadBytes() + { + var mockNetworkStream = new Mock(); + var testData = new byte[] { 1, 2, 3, 4, 5 }; + var buffer = new byte[5]; + + mockNetworkStream.Setup(s => s.ReadAsync(It.IsAny>(), It.IsAny())) + .ReturnsAsync((Memory memory, CancellationToken _) => + { + testData.CopyTo(memory); + return testData.Length; + }); + + var stream = mockNetworkStream.Object; + var bytesRead = await stream.ReadAsync(buffer); + + Assert.Equal(5, bytesRead); + Assert.Equal(testData, buffer); + } + + [Fact] + public async Task NetworkStream_WriteAsync_WhenCalled_WritesData() + { + var mockNetworkStream = new Mock(); + var testData = new byte[] { 1, 2, 3, 4, 5 }; + var capturedData = Array.Empty(); + + mockNetworkStream.Setup(s => s.WriteAsync(It.IsAny>(), It.IsAny())) + .Callback, CancellationToken>((memory, _) => capturedData = memory.ToArray()) + .Returns(ValueTask.CompletedTask); + + var stream = mockNetworkStream.Object; + await stream.WriteAsync(testData); + + Assert.Equal(testData, capturedData); + mockNetworkStream.Verify(s => s.WriteAsync(It.IsAny>(), It.IsAny()), Times.Once); + } + + [Fact] + public void NetworkStream_PrependBuffer_WhenCalled_BuffersData() + { + var mockNetworkStream = new Mock(); + var testData = new byte[] { 1, 2, 3 }; + + mockNetworkStream.Setup(s => s.PrependBuffer(It.IsAny>())); + + var stream = mockNetworkStream.Object; + stream.PrependBuffer(testData); + + mockNetworkStream.Verify(s => s.PrependBuffer(It.IsAny>()), Times.Once); + } +} diff --git a/src/Tests/Void.Tests.csproj b/src/Tests/Void.Tests.csproj index f93a6a57..5c003acb 100644 --- a/src/Tests/Void.Tests.csproj +++ b/src/Tests/Void.Tests.csproj @@ -8,6 +8,7 @@ + @@ -23,5 +24,6 @@ +