Skip to content

Commit 958cdae

Browse files
authored
Merge pull request #20 from SkorpikFeed/lab-8-improve-test-coverage
Lab 8 Update test projects and add integration tests
2 parents 988e044 + 1b0d38a commit 958cdae

11 files changed

Lines changed: 1094 additions & 17 deletions

EchoTspServer.Tests/EchoTspServer.Tests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
</PackageReference>
2121
<PackageReference Include="FluentAssertions" Version="8.8.0" />
2222
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
23-
<PackageReference Include="Moq" Version="4.20.70" />
24-
<PackageReference Include="xunit" Version="2.9.0" />
25-
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
23+
<PackageReference Include="Moq" Version="4.20.72" />
24+
<PackageReference Include="xunit" Version="2.9.3" />
25+
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
2626
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2727
<PrivateAssets>all</PrivateAssets>
2828
</PackageReference>

EchoTspServer.Tests/UdpTimedSenderTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ public async Task StartSending_ShouldSendMessagesAtInterval()
6868
sender.StopSending();
6969

7070
// Assert
71-
sendCount.Should().BeGreaterOrEqualTo(3);
71+
sendCount.Should().BeGreaterThanOrEqualTo(3);
7272
capturedMessage.Should().NotBeNull();
73-
capturedMessage.Length.Should().Be(1028); // 2 header bytes + 2 sequence bytes + 1024 sample bytes
73+
capturedMessage!.Length.Should().Be(1028); // 2 header bytes + 2 sequence bytes + 1024 sample bytes
7474
capturedMessage[0].Should().Be(0x04);
7575
capturedMessage[1].Should().Be(0x84);
7676
capturedEndpoint.Should().NotBeNull();
77-
capturedEndpoint.Address.ToString().Should().Be("127.0.0.1");
77+
capturedEndpoint!.Address.ToString().Should().Be("127.0.0.1");
7878
capturedEndpoint.Port.Should().Be(5000);
7979
}
8080

@@ -102,7 +102,7 @@ public async Task StartSending_ShouldIncrementSequenceNumber()
102102
sender.StopSending();
103103

104104
// Assert
105-
sequenceNumbers.Should().HaveCountGreaterOrEqualTo(4);
105+
sequenceNumbers.Should().HaveCountGreaterThanOrEqualTo(4);
106106
sequenceNumbers[0].Should().Be(1);
107107
sequenceNumbers[1].Should().Be(2);
108108
sequenceNumbers[2].Should().Be(3);
@@ -134,7 +134,7 @@ public void StopSending_ShouldStopTimer()
134134
int countAfterStop = sendCount;
135135

136136
// Assert
137-
countBeforeStop.Should().BeGreaterOrEqualTo(2);
137+
countBeforeStop.Should().BeGreaterThanOrEqualTo(2);
138138
countAfterStop.Should().Be(countBeforeStop); // No more sends after stop
139139
}
140140

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
using EchoServer;
2+
using FluentAssertions;
3+
using System.Net;
4+
using System.Net.Sockets;
5+
using System.Text;
6+
using Xunit;
7+
8+
namespace EchoTspServer.Tests;
9+
10+
public class WrapperIntegrationTests : IDisposable
11+
{
12+
private TcpListener? _testListener;
13+
private TcpClient? _testClient;
14+
private const int TestPort = 9876;
15+
16+
[Fact]
17+
public async Task TcpListenerWrapper_StartStopAccept_WorksCorrectly()
18+
{
19+
// Arrange
20+
var wrapper = new TcpListenerWrapper(TestPort);
21+
22+
// Act - Start
23+
wrapper.Start();
24+
25+
// Create a client to connect
26+
var client = new TcpClient();
27+
var connectTask = client.ConnectAsync("127.0.0.1", TestPort);
28+
29+
// Accept connection
30+
var acceptTask = wrapper.AcceptTcpClientAsync();
31+
32+
await Task.WhenAll(connectTask, acceptTask);
33+
var acceptedClient = await acceptTask;
34+
35+
// Assert
36+
acceptedClient.Should().NotBeNull();
37+
acceptedClient.Connected.Should().BeTrue();
38+
39+
// Cleanup
40+
acceptedClient.Close();
41+
client.Close();
42+
wrapper.Stop();
43+
}
44+
45+
[Fact]
46+
public void TcpListenerWrapper_Constructor_CreatesListener()
47+
{
48+
// Arrange & Act
49+
var wrapper = new TcpListenerWrapper(TestPort + 1);
50+
51+
// Assert
52+
wrapper.Should().NotBeNull();
53+
54+
// Start and stop to verify it works
55+
wrapper.Start();
56+
wrapper.Stop();
57+
}
58+
59+
[Fact]
60+
public async Task TcpClientWrapper_GetStream_ReturnsWorkingStream()
61+
{
62+
// Arrange - Setup a server
63+
_testListener = new TcpListener(IPAddress.Any, TestPort + 2);
64+
_testListener.Start();
65+
66+
// Create and connect a client
67+
_testClient = new TcpClient();
68+
await _testClient.ConnectAsync("127.0.0.1", TestPort + 2);
69+
70+
var wrapper = new TcpClientWrapper(_testClient);
71+
72+
// Act
73+
var streamWrapper = wrapper.GetStream();
74+
75+
// Assert
76+
streamWrapper.Should().NotBeNull();
77+
streamWrapper.Should().BeAssignableTo<INetworkStreamWrapper>();
78+
}
79+
80+
[Fact]
81+
public async Task TcpClientWrapper_CloseAndDispose_WorksCorrectly()
82+
{
83+
// Arrange
84+
_testListener = new TcpListener(IPAddress.Any, TestPort + 3);
85+
_testListener.Start();
86+
87+
_testClient = new TcpClient();
88+
await _testClient.ConnectAsync("127.0.0.1", TestPort + 3);
89+
90+
var wrapper = new TcpClientWrapper(_testClient);
91+
92+
// Act
93+
wrapper.Close();
94+
95+
// Assert - No exception thrown
96+
wrapper.Dispose(); // Should not throw even after Close
97+
}
98+
99+
[Fact]
100+
public async Task NetworkStreamWrapper_ReadWriteAsync_WorksCorrectly()
101+
{
102+
// Arrange - Setup server and client
103+
_testListener = new TcpListener(IPAddress.Any, TestPort + 4);
104+
_testListener.Start();
105+
106+
var clientTask = Task.Run(async () =>
107+
{
108+
_testClient = new TcpClient();
109+
await _testClient.ConnectAsync("127.0.0.1", TestPort + 4);
110+
return _testClient;
111+
});
112+
113+
var serverClient = await _testListener.AcceptTcpClientAsync();
114+
var client = await clientTask;
115+
116+
var serverStream = new NetworkStreamWrapper(serverClient.GetStream());
117+
var clientStream = new NetworkStreamWrapper(client.GetStream());
118+
119+
// Act - Write from client
120+
var testData = Encoding.UTF8.GetBytes("Hello, Server!");
121+
await clientStream.WriteAsync(testData, 0, testData.Length, CancellationToken.None);
122+
123+
// Read on server
124+
var buffer = new byte[1024];
125+
var bytesRead = await serverStream.ReadAsync(buffer, 0, buffer.Length, CancellationToken.None);
126+
127+
// Assert
128+
bytesRead.Should().Be(testData.Length);
129+
var receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead);
130+
receivedData.Should().Be("Hello, Server!");
131+
132+
// Cleanup
133+
serverStream.Dispose();
134+
clientStream.Dispose();
135+
serverClient.Close();
136+
client.Close();
137+
}
138+
139+
[Fact]
140+
public async Task NetworkStreamWrapper_Dispose_ClosesStream()
141+
{
142+
// Arrange
143+
_testListener = new TcpListener(IPAddress.Any, TestPort + 5);
144+
_testListener.Start();
145+
146+
_testClient = new TcpClient();
147+
await _testClient.ConnectAsync("127.0.0.1", TestPort + 5);
148+
149+
var serverClient = await _testListener.AcceptTcpClientAsync();
150+
var streamWrapper = new NetworkStreamWrapper(serverClient.GetStream());
151+
152+
// Act
153+
streamWrapper.Dispose();
154+
155+
// Assert - After dispose, operations should fail or stream should be closed
156+
// We just verify no exception during dispose
157+
serverClient.Close();
158+
}
159+
160+
[Fact]
161+
public async Task UdpClientWrapper_Send_WorksCorrectly()
162+
{
163+
// Arrange
164+
var wrapper = new UdpClientWrapper();
165+
var testEndpoint = new IPEndPoint(IPAddress.Loopback, TestPort + 6);
166+
var testData = Encoding.UTF8.GetBytes("UDP Test Message");
167+
168+
// Create a receiver
169+
using var receiver = new UdpClient(TestPort + 6);
170+
171+
// Act - Send
172+
var bytesSent = wrapper.Send(testData, testData.Length, testEndpoint);
173+
174+
// Receive
175+
var receiveTask = receiver.ReceiveAsync();
176+
var result = await receiveTask;
177+
178+
// Assert
179+
bytesSent.Should().Be(testData.Length);
180+
result.Buffer.Should().BeEquivalentTo(testData);
181+
182+
// Cleanup
183+
wrapper.Dispose();
184+
}
185+
186+
[Fact]
187+
public void UdpClientWrapper_Send_MultipleMessages_Success()
188+
{
189+
// Arrange
190+
var wrapper = new UdpClientWrapper();
191+
var testEndpoint = new IPEndPoint(IPAddress.Loopback, TestPort + 7);
192+
var testData1 = Encoding.UTF8.GetBytes("Message 1");
193+
var testData2 = Encoding.UTF8.GetBytes("Message 2");
194+
195+
// Act - Send multiple messages
196+
var bytes1 = wrapper.Send(testData1, testData1.Length, testEndpoint);
197+
var bytes2 = wrapper.Send(testData2, testData2.Length, testEndpoint);
198+
199+
// Assert
200+
bytes1.Should().Be(testData1.Length);
201+
bytes2.Should().Be(testData2.Length);
202+
203+
// Cleanup
204+
wrapper.Dispose();
205+
}
206+
207+
[Fact]
208+
public void UdpClientWrapper_Dispose_DoesNotThrow()
209+
{
210+
// Arrange
211+
var wrapper = new UdpClientWrapper();
212+
213+
// Act & Assert
214+
var act = () => wrapper.Dispose();
215+
act.Should().NotThrow();
216+
}
217+
218+
public void Dispose()
219+
{
220+
_testClient?.Close();
221+
_testClient?.Dispose();
222+
_testListener?.Stop();
223+
}
224+
}

NetSdrClientApp/NetSdrClientApp.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
<Nullable>enable</Nullable>
88
</PropertyGroup>
99
<ItemGroup>
10-
<PackageReference Include="Newtonsoft.Json" Version="13.0.0" />
11-
<PackageReference Include="SharpZipLib" Version="1.3.3" />
10+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
11+
<PackageReference Include="SharpZipLib" Version="1.4.2" />
1212
</ItemGroup>
1313

1414
</Project>

NetSdrClientAppTests/ArchitectureTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void Presentation_Should_Not_HaveDependencyOnNetworkingInternals()
2626
.GetResult();
2727

2828
// Assert
29-
Assert.IsTrue(result.IsSuccessful);
29+
Assert.That(result.IsSuccessful, Is.True);
3030
}
3131

3232
[Test]
@@ -46,7 +46,7 @@ public void Networking_Should_BeSealed()
4646
.GetResult();
4747

4848
// Assert
49-
Assert.IsTrue(result.IsSuccessful);
49+
Assert.That(result.IsSuccessful, Is.True);
5050
}
5151
}
5252
}

NetSdrClientAppTests/NetSdrClientAppTests.csproj

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,17 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="coverlet.collector" Version="6.0.0" />
13+
<PackageReference Include="coverlet.collector" Version="6.0.4" />
1414
<PackageReference Include="coverlet.msbuild" Version="6.0.4">
1515
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1616
<PrivateAssets>all</PrivateAssets>
1717
</PackageReference>
18-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
18+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
1919
<PackageReference Include="Moq" Version="4.20.72" />
2020
<PackageReference Include="NetArchTest.Rules" Version="1.3.2" />
2121
<PackageReference Include="NUnit" Version="4.4.0" />
22-
<PackageReference Include="NUnit.Analyzers" Version="3.9.0" />
23-
<PackageReference Include="NUnit" Version="3.14.0" />
2422
<PackageReference Include="NUnit.Analyzers" Version="4.11.2" />
25-
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
23+
<PackageReference Include="NUnit3TestAdapter" Version="5.2.0" />
2624
</ItemGroup>
2725

2826
<ItemGroup>

0 commit comments

Comments
 (0)