1
0

Updated to .NET 10
All checks were successful
Branch Build / build-test-deploy (push) Successful in 53s

This commit is contained in:
2026-01-12 21:34:11 +01:00
parent 09199753e4
commit 3740c87528
10 changed files with 69 additions and 70 deletions

View File

@@ -1,5 +1,7 @@
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<CollectCoverage>true</CollectCoverage>
@@ -20,7 +22,9 @@
</ItemGroup>
<ItemGroup>
<Using Include="AMWD.Net.Api.Fritz.CallMonitor" />
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
<Using Include="Moq" />
</ItemGroup>
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)\..'))" />

View File

@@ -4,11 +4,9 @@ using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using AMWD.Net.Api.Fritz.CallMonitor;
using AMWD.Net.Api.Fritz.CallMonitor.Utils;
using AMWD.Net.Api.Fritz.CallMonitor.Wrappers;
using Microsoft.Extensions.Logging;
using Moq;
namespace FritzCallMonitor.Tests
{
@@ -21,11 +19,10 @@ namespace FritzCallMonitor.Tests
private const string HOST = "localhost";
private const int PORT = 1012;
private readonly DateTime NOW = new(2025, 8, 25, 20, 15, 30, DateTimeKind.Local);
private readonly DateTime _now = new(2025, 8, 25, 20, 15, 30, DateTimeKind.Local);
private string _dateOffset;
private Mock<ReconnectTcpClient> _tcpClientMock;
private Mock<NetworkStreamWrapper> _networkStreamMock;
@@ -35,7 +32,7 @@ namespace FritzCallMonitor.Tests
[TestInitialize]
public void Initialize()
{
var offset = TimeZoneInfo.Local.GetUtcOffset(NOW);
var offset = TimeZoneInfo.Local.GetUtcOffset(_now);
_dateOffset = offset < TimeSpan.Zero
? "-" + offset.ToString("hh\\:mm")
: "+" + offset.ToString("hh\\:mm");
@@ -44,7 +41,7 @@ namespace FritzCallMonitor.Tests
_readAsyncResponses = new Queue<(int, byte[])>();
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{NOW:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;\r\n")));
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{_now:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;\r\n")));
_readAsyncResponses.Enqueue((Timeout.Infinite, Array.Empty<byte>()));
}
@@ -83,7 +80,7 @@ namespace FritzCallMonitor.Tests
// Arrange
var loggerMock = new Mock<ILogger>();
var client = GetClient();
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
// Act
client.Logger = loggerMock.Object;
@@ -107,7 +104,7 @@ namespace FritzCallMonitor.Tests
{
// Arrange
var client = GetClient();
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
// Act
client.Dispose();
@@ -131,7 +128,7 @@ namespace FritzCallMonitor.Tests
_tcpClientMock.Setup(m => m.GetStream()).Returns((NetworkStreamWrapper)null);
// Act
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
client.Dispose();
// Assert
@@ -156,7 +153,7 @@ namespace FritzCallMonitor.Tests
};
// Act
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
client.Dispose();
// Assert
@@ -185,7 +182,7 @@ namespace FritzCallMonitor.Tests
{
// Arrange
_readAsyncResponses.Clear();
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{NOW:dd.MM.yy HH:mm:ss};RING;")));
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{_now:dd.MM.yy HH:mm:ss};RING;")));
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes("2;012345678901;9876543;SIP0;\n")));
_readAsyncResponses.Enqueue((Timeout.Infinite, Array.Empty<byte>()));
@@ -199,7 +196,7 @@ namespace FritzCallMonitor.Tests
};
// Act
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
client.Dispose();
// Assert
@@ -228,7 +225,7 @@ namespace FritzCallMonitor.Tests
{
// Arrange
_readAsyncResponses.Clear();
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{NOW:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;\n{NOW:dd.MM.yy HH:mm:ss}")));
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{_now:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;\n{_now:dd.MM.yy HH:mm:ss}")));
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes(";RING;2;012345678901;9876543;SIP0;\r\n")));
_readAsyncResponses.Enqueue((Timeout.Infinite, Array.Empty<byte>()));
@@ -240,7 +237,7 @@ namespace FritzCallMonitor.Tests
};
// Act
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
client.Dispose();
// Assert
@@ -260,7 +257,7 @@ namespace FritzCallMonitor.Tests
{
// Arrange
_readAsyncResponses.Clear();
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{NOW:dd.MM.yy HH:mm:ss};TEST;2;012345678901;9876543;SIP0;\n{NOW:dd.MM.yy HH:mm:ss}")));
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes($"{_now:dd.MM.yy HH:mm:ss};TEST;2;012345678901;9876543;SIP0;\n{_now:dd.MM.yy HH:mm:ss}")));
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes(";RING;2;012345678901;9876543;SIP0;\r\n")));
_readAsyncResponses.Enqueue((Timeout.Infinite, Array.Empty<byte>()));
@@ -272,7 +269,7 @@ namespace FritzCallMonitor.Tests
};
// Act
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
client.Dispose();
// Assert
@@ -328,9 +325,9 @@ namespace FritzCallMonitor.Tests
tcpClientField.SetValue(client, _tcpClientMock.Object);
var onConnectedMethodInfo = client.GetType().GetMethod("OnConnected", BindingFlags.NonPublic | BindingFlags.Instance);
_tcpClientMock.SetupGet(c => c.OnConnected).Returns((Func<ReconnectTcpClient, Task>)onConnectedMethodInfo.CreateDelegate(typeof(Func<ReconnectTcpClient, Task>), client));
_tcpClientMock.SetupGet(c => c.OnConnected).Returns(onConnectedMethodInfo.CreateDelegate<Func<ReconnectTcpClient, Task>>(client));
_tcpClientMock.Object.OnConnected(_tcpClientMock.Object).Wait();
_tcpClientMock.Object.OnConnected(_tcpClientMock.Object).Wait(TestContext.CancellationToken);
return client;
}
}

View File

@@ -1,5 +1,4 @@
using System;
using AMWD.Net.Api.Fritz.CallMonitor;
namespace FritzCallMonitor.Tests
{
@@ -8,12 +7,12 @@ namespace FritzCallMonitor.Tests
{
private string _dateOffset;
private readonly DateTime NOW = new(2025, 8, 25, 20, 15, 30, DateTimeKind.Local);
private readonly DateTime _now = new(2025, 8, 25, 20, 15, 30, DateTimeKind.Local);
[TestInitialize]
public void Initialize()
{
var offset = TimeZoneInfo.Local.GetUtcOffset(NOW);
var offset = TimeZoneInfo.Local.GetUtcOffset(_now);
_dateOffset = offset < TimeSpan.Zero
? "-" + offset.ToString("hh\\:mm")
: "+" + offset.ToString("hh\\:mm");
@@ -23,7 +22,7 @@ namespace FritzCallMonitor.Tests
public void ShouldParseRingEvent()
{
// Arrange
string line = $"{NOW:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;";
string line = $"{_now:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
@@ -39,7 +38,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldParseConnectEvent()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};CONNECT;1;3;012345678901;";
string line = $"{_now:dd.MM.yy HH:mm:ss};CONNECT;1;3;012345678901;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
@@ -55,7 +54,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldParseDisconnectEvent()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};DISCONNECT;2;42;";
string line = $"{_now:dd.MM.yy HH:mm:ss};DISCONNECT;2;42;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
@@ -71,7 +70,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldParseCallEvent()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};CALL;4;7;9876543;012345678901;SIP0;";
string line = $"{_now:dd.MM.yy HH:mm:ss};CALL;4;7;9876543;012345678901;SIP0;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
@@ -95,7 +94,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldReturnNullOnUnknownEventType()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};UNKNOWN;2;012345678901;9876543;SIP0;";
string line = $"{_now:dd.MM.yy HH:mm:ss};UNKNOWN;2;012345678901;9876543;SIP0;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNull(result);
}
@@ -103,7 +102,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldReturnNullOnInvalidConnectionId()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};RING;abc;012345678901;9876543;SIP0;";
string line = $"{_now:dd.MM.yy HH:mm:ss};RING;abc;012345678901;9876543;SIP0;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNull(result);
}
@@ -111,7 +110,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldHandleInvalidLinePortInConnect()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};CONNECT;1;abc;012345678901;";
string line = $"{_now:dd.MM.yy HH:mm:ss};CONNECT;1;abc;012345678901;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
Assert.IsNull(result.LinePort);
@@ -120,7 +119,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldHandleInvalidLinePortInCall()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};CALL;4;abc;9876543;012345678901;SIP0;";
string line = $"{_now:dd.MM.yy HH:mm:ss};CALL;4;abc;9876543;012345678901;SIP0;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
Assert.IsNull(result.LinePort);
@@ -129,7 +128,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldHandleInvalidDurationInDisconnect()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};DISCONNECT;2;abc;";
string line = $"{_now:dd.MM.yy HH:mm:ss};DISCONNECT;2;abc;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
Assert.IsNull(result.Duration);
@@ -138,7 +137,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldReturnNullOnTooFewColumns()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};RING;";
string line = $"{_now:dd.MM.yy HH:mm:ss};RING;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNull(result);
}
@@ -146,7 +145,7 @@ namespace FritzCallMonitor.Tests
[TestMethod]
public void ShouldParseWithExtraColumns()
{
string line = $"{NOW:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;EXTRA;COLUMN;";
string line = $"{_now:dd.MM.yy HH:mm:ss};RING;2;012345678901;9876543;SIP0;EXTRA;COLUMN;";
var result = CallMonitorEventArgs.Parse(line);
Assert.IsNotNull(result);
Assert.AreEqual("012345678901", result.ExternalNumber);

View File

@@ -1,7 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<NoWarn>$(NoWarn);CA1873</NoWarn>
</PropertyGroup>

View File

@@ -7,7 +7,6 @@ using System.Threading.Tasks;
using AMWD.Net.Api.Fritz.CallMonitor.Utils;
using AMWD.Net.Api.Fritz.CallMonitor.Wrappers;
using Microsoft.Extensions.Logging;
using Moq;
namespace FritzCallMonitor.Tests
{
@@ -80,8 +79,8 @@ namespace FritzCallMonitor.Tests
{
// Arrange
var client = GetClient();
await client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StartAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
// Act
client.Dispose();
@@ -105,8 +104,8 @@ namespace FritzCallMonitor.Tests
{
// Arrange
using var client = GetClient();
await client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StartAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
// Act
client.Dispose();
@@ -134,7 +133,7 @@ namespace FritzCallMonitor.Tests
client.Dispose();
// Act & Assert
await Assert.ThrowsExactlyAsync<ObjectDisposedException>(async () => await client.StartAsync(TestContext.CancellationTokenSource.Token));
await Assert.ThrowsExactlyAsync<ObjectDisposedException>(async () => await client.StartAsync(TestContext.CancellationToken));
VerifyNoOtherCalls();
}
@@ -147,7 +146,7 @@ namespace FritzCallMonitor.Tests
client.Dispose();
// Act & Assert
await Assert.ThrowsExactlyAsync<ObjectDisposedException>(async () => await client.StopAsync(TestContext.CancellationTokenSource.Token));
await Assert.ThrowsExactlyAsync<ObjectDisposedException>(async () => await client.StopAsync(TestContext.CancellationToken));
VerifyNoOtherCalls();
}
@@ -172,8 +171,8 @@ namespace FritzCallMonitor.Tests
_tcpClientConnectTaskDelays.Enqueue(Timeout.Infinite);
var client = GetClient();
await client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StartAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
// Act & Assert
_tcpClientConnected = true;
@@ -208,10 +207,10 @@ namespace FritzCallMonitor.Tests
};
// Act
await client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StopAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StartAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
await client.StopAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
// Assert
Assert.IsTrue(callbackCalled);
@@ -236,10 +235,10 @@ namespace FritzCallMonitor.Tests
var client = GetClient();
// Act & Assert
await client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StopAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StartAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
await client.StopAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
_socketMock.Verify(m => m.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true), Times.Once);
@@ -261,7 +260,7 @@ namespace FritzCallMonitor.Tests
var client = GetClient();
// Act & Assert
await client.StopAsync(TestContext.CancellationTokenSource.Token);
await client.StopAsync(TestContext.CancellationToken);
VerifyNoOtherCalls();
}
@@ -271,8 +270,8 @@ namespace FritzCallMonitor.Tests
{
// Arrange
var client = GetClient();
await client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StartAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
// Act
var stream = client.GetStream();
@@ -317,10 +316,10 @@ namespace FritzCallMonitor.Tests
using var client = GetClient();
// Act
var startTask = client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
await client.StopAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
var startTask = client.StartAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
await client.StopAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
await startTask;
// Assert
@@ -350,10 +349,10 @@ namespace FritzCallMonitor.Tests
.ThrowsAsync(new SocketException());
// Act
var startTask = client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(1000, TestContext.CancellationTokenSource.Token); // Should try to connect two times.
await client.StopAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
var startTask = client.StartAsync(TestContext.CancellationToken);
await Task.Delay(1000, TestContext.CancellationToken); // Should try to connect two times.
await client.StopAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
await startTask;
// Assert
@@ -394,10 +393,10 @@ namespace FritzCallMonitor.Tests
.ThrowsAsync(new ObjectDisposedException("Test"));
// Act
var startTask = client.StartAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(1000, TestContext.CancellationTokenSource.Token); // Should try to connect two times.
await client.StopAsync(TestContext.CancellationTokenSource.Token);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
var startTask = client.StartAsync(TestContext.CancellationToken);
await Task.Delay(1000, TestContext.CancellationToken); // Should try to connect two times.
await client.StopAsync(TestContext.CancellationToken);
await Task.Delay(ASYNC_DELAY, TestContext.CancellationToken);
await startTask;
// Assert