Updated UnitTests, bump to first release.
This commit is contained in:
@@ -15,17 +15,32 @@ namespace FritzCallMonitor.Tests
|
||||
[TestClass]
|
||||
public class CallMonitorClientTest
|
||||
{
|
||||
private const int ASYNC_DELAY = 100;
|
||||
|
||||
public TestContext TestContext { get; set; }
|
||||
|
||||
private const string HOST = "localhost";
|
||||
private const int PORT = 1012;
|
||||
|
||||
private string _dateOffset;
|
||||
|
||||
|
||||
private Mock<ReconnectTcpClient> _tcpClientMock;
|
||||
private Mock<NetworkStreamWrapper> _networkStreamMock;
|
||||
|
||||
private bool _tcpClientConnected;
|
||||
private Queue<(int DelaySeconds, byte[] BufferResponse)> _readAsyncResponses;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
var offset = TimeZoneInfo.Local.GetUtcOffset(DateTime.Now);
|
||||
_dateOffset = offset < TimeSpan.Zero
|
||||
? "-" + offset.ToString("hh\\:mm")
|
||||
: "+" + offset.ToString("hh\\:mm");
|
||||
|
||||
_tcpClientConnected = true;
|
||||
|
||||
_readAsyncResponses = new Queue<(int, byte[])>();
|
||||
|
||||
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes("25.08.25 20:15:30;RING;2;012345678901;9876543;SIP0;\r\n")));
|
||||
@@ -62,38 +77,211 @@ namespace FritzCallMonitor.Tests
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ShouldSetAndGetLogger()
|
||||
public async Task ShouldSetAndGetLogger()
|
||||
{
|
||||
// Arrange
|
||||
var loggerMock = new Mock<ILogger>();
|
||||
var client = GetClient();
|
||||
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
|
||||
|
||||
// Act
|
||||
client.Logger = loggerMock.Object;
|
||||
client.Dispose();
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(loggerMock.Object, client.Logger);
|
||||
|
||||
_tcpClientMock.VerifySet(m => m.Logger = loggerMock.Object, Times.Once);
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.Once);
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.Exactly(2));
|
||||
_tcpClientMock.Verify(m => m.GetStream(), Times.Once);
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
|
||||
_networkStreamMock.Verify(m => m.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), Times.Exactly(2));
|
||||
|
||||
VerifyNoOtherCalls();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ShouldDisposeOnlyOnce()
|
||||
public async Task ShouldDisposeOnlyOnce()
|
||||
{
|
||||
// Arrange
|
||||
var client = GetClient();
|
||||
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
|
||||
|
||||
// Act
|
||||
client.Dispose();
|
||||
client.Dispose();
|
||||
|
||||
// Assert
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.AtMost(2));
|
||||
_tcpClientMock.Verify(m => m.GetStream(), Times.Once);
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
|
||||
_networkStreamMock.Verify(m => m.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), Times.Exactly(2));
|
||||
|
||||
VerifyNoOtherCalls();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task ShouldSkipTaskWhenStreamIsNull()
|
||||
{
|
||||
// Arrange
|
||||
var client = GetClient();
|
||||
_tcpClientMock.Setup(m => m.GetStream()).Returns((NetworkStreamWrapper)null);
|
||||
|
||||
// Act
|
||||
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
|
||||
client.Dispose();
|
||||
|
||||
// Assert
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.AtMost(2));
|
||||
_tcpClientMock.Verify(m => m.GetStream(), Times.Once);
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
|
||||
VerifyNoOtherCalls();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task ShouldReadAndParseLine()
|
||||
{
|
||||
// Arrange
|
||||
bool eventRaised = false;
|
||||
CallMonitorEventArgs eventArgs = null;
|
||||
var client = GetClient();
|
||||
client.OnEvent += (s, e) =>
|
||||
{
|
||||
eventRaised = true;
|
||||
eventArgs = e;
|
||||
};
|
||||
|
||||
// Act
|
||||
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
|
||||
client.Dispose();
|
||||
|
||||
// Assert
|
||||
Assert.IsTrue(eventRaised);
|
||||
Assert.IsNotNull(eventArgs);
|
||||
|
||||
Assert.AreEqual($"2025-08-25 20:15:30 {_dateOffset}", eventArgs.Timestamp?.ToString("yyyy-MM-dd HH:mm:ss K"));
|
||||
Assert.AreEqual(EventType.Ring, eventArgs.Event);
|
||||
Assert.AreEqual(2, eventArgs.ConnectionId);
|
||||
Assert.IsNull(eventArgs.LinePort);
|
||||
Assert.AreEqual("012345678901", eventArgs.CallerNumber);
|
||||
Assert.AreEqual("9876543", eventArgs.CalleeNumber);
|
||||
Assert.IsNull(eventArgs.Duration);
|
||||
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.Exactly(2));
|
||||
_tcpClientMock.Verify(m => m.GetStream(), Times.Once);
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
|
||||
_networkStreamMock.Verify(m => m.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), Times.Exactly(2));
|
||||
|
||||
VerifyNoOtherCalls();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task ShouldReadAndParseInMultipleReads()
|
||||
{
|
||||
// Arrange
|
||||
_readAsyncResponses.Clear();
|
||||
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes("25.08.25 20:15:30;RING;")));
|
||||
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes("2;012345678901;9876543;SIP0;\n")));
|
||||
_readAsyncResponses.Enqueue((Timeout.Infinite, Array.Empty<byte>()));
|
||||
|
||||
bool eventRaised = false;
|
||||
CallMonitorEventArgs eventArgs = null;
|
||||
var client = GetClient();
|
||||
client.OnEvent += (s, e) =>
|
||||
{
|
||||
eventRaised = true;
|
||||
eventArgs = e;
|
||||
};
|
||||
|
||||
// Act
|
||||
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
|
||||
client.Dispose();
|
||||
|
||||
// Assert
|
||||
Assert.IsTrue(eventRaised);
|
||||
Assert.IsNotNull(eventArgs);
|
||||
|
||||
Assert.AreEqual($"2025-08-25 20:15:30 {_dateOffset}", eventArgs.Timestamp?.ToString("yyyy-MM-dd HH:mm:ss K"));
|
||||
Assert.AreEqual(EventType.Ring, eventArgs.Event);
|
||||
Assert.AreEqual(2, eventArgs.ConnectionId);
|
||||
Assert.IsNull(eventArgs.LinePort);
|
||||
Assert.AreEqual("012345678901", eventArgs.CallerNumber);
|
||||
Assert.AreEqual("9876543", eventArgs.CalleeNumber);
|
||||
Assert.IsNull(eventArgs.Duration);
|
||||
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.Exactly(3));
|
||||
_tcpClientMock.Verify(m => m.GetStream(), Times.Once);
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
|
||||
_networkStreamMock.Verify(m => m.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), Times.Exactly(3));
|
||||
|
||||
VerifyNoOtherCalls();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task ShouldReadAndParseMultipleEvents()
|
||||
{
|
||||
// Arrange
|
||||
_readAsyncResponses.Clear();
|
||||
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes("25.08.25 20:15:30;RING;2;012345678901;9876543;SIP0;\n25.08.25 20:15:30")));
|
||||
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes(";RING;2;012345678901;9876543;SIP0;\r\n")));
|
||||
_readAsyncResponses.Enqueue((Timeout.Infinite, Array.Empty<byte>()));
|
||||
|
||||
int eventsRaised = 0;
|
||||
var client = GetClient();
|
||||
client.OnEvent += (s, e) =>
|
||||
{
|
||||
Interlocked.Increment(ref eventsRaised);
|
||||
};
|
||||
|
||||
// Act
|
||||
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
|
||||
client.Dispose();
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(2, eventsRaised);
|
||||
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.Exactly(3));
|
||||
_tcpClientMock.Verify(m => m.GetStream(), Times.Once);
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
|
||||
_networkStreamMock.Verify(m => m.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), Times.Exactly(3));
|
||||
|
||||
VerifyNoOtherCalls();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public async Task ShouldReadAndParseMultipleEventsWithOneError()
|
||||
{
|
||||
// Arrange
|
||||
_readAsyncResponses.Clear();
|
||||
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes("25.08.25 20:15:30;TEST;2;012345678901;9876543;SIP0;\n25.08.25 20:15:30")));
|
||||
_readAsyncResponses.Enqueue((0, Encoding.UTF8.GetBytes(";RING;2;012345678901;9876543;SIP0;\r\n")));
|
||||
_readAsyncResponses.Enqueue((Timeout.Infinite, Array.Empty<byte>()));
|
||||
|
||||
int eventsRaised = 0;
|
||||
var client = GetClient();
|
||||
client.OnEvent += (s, e) =>
|
||||
{
|
||||
Interlocked.Increment(ref eventsRaised);
|
||||
};
|
||||
|
||||
// Act
|
||||
await Task.Delay(ASYNC_DELAY, TestContext.CancellationTokenSource.Token);
|
||||
client.Dispose();
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(1, eventsRaised);
|
||||
|
||||
_tcpClientMock.VerifyGet(m => m.IsConnected, Times.Exactly(3));
|
||||
_tcpClientMock.Verify(m => m.GetStream(), Times.Once);
|
||||
_tcpClientMock.Verify(c => c.Dispose(), Times.Once);
|
||||
|
||||
_networkStreamMock.Verify(m => m.ReadAsync(It.IsAny<byte[]>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<CancellationToken>()), Times.Exactly(3));
|
||||
|
||||
VerifyNoOtherCalls();
|
||||
}
|
||||
@@ -109,6 +297,10 @@ namespace FritzCallMonitor.Tests
|
||||
_tcpClientMock = new Mock<ReconnectTcpClient>(HOST, PORT);
|
||||
_networkStreamMock = new Mock<NetworkStreamWrapper>(null);
|
||||
|
||||
_tcpClientMock
|
||||
.Setup(m => m.IsConnected)
|
||||
.Returns(() => _tcpClientConnected);
|
||||
|
||||
_tcpClientMock
|
||||
.Setup(m => m.GetStream())
|
||||
.Returns(_networkStreamMock.Object);
|
||||
@@ -121,8 +313,10 @@ namespace FritzCallMonitor.Tests
|
||||
|
||||
return Task.Delay(TimeSpan.FromSeconds(delaySeconds), token).ContinueWith(t =>
|
||||
{
|
||||
Array.Copy(bufferResponse, 0, buffer, offset, bufferResponse.Length);
|
||||
return bufferResponse.Length;
|
||||
int bytesToCopy = Math.Min(count, bufferResponse.Length - offset);
|
||||
|
||||
Array.Copy(bufferResponse, 0, buffer, offset, bytesToCopy);
|
||||
return bytesToCopy;
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user