Skip to content

Commit 984d563

Browse files
committed
- MonitorEvent: added ConvertArg method
- NetMQMonitor: use above - NetMQMonitorEventArgs: added nullable indicator - NetMQMonitorTests: added tests for ConvertArg method
1 parent 03c3783 commit 984d563

File tree

4 files changed

+53
-23
lines changed

4 files changed

+53
-23
lines changed

src/NetMQ.Tests/NetMQMonitorTests.cs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Linq;
33
using System.Threading;
44
using System.Threading.Tasks;
5+
using AsyncIO;
6+
using NetMQ.Core;
57
using NetMQ.Monitoring;
68
using NetMQ.Sockets;
79
using Xunit;
@@ -157,5 +159,31 @@ public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket()
157159
}
158160
// NOTE If this test fails, it will hang because context.Dispose will block
159161
}
162+
163+
[Fact]
164+
public void ConvertArgDoesNotThrowForNullSocket()
165+
{
166+
AsyncSocket? socket = null;
167+
MonitorEvent monitorEvent = new MonitorEvent(SocketEvents.All, addr: "", arg: socket!);
168+
Assert.Null(monitorEvent.ConvertArg<AsyncSocket>());
169+
}
170+
171+
[Fact]
172+
public void ConvertArgDoesNotThrowForNonNullSocket()
173+
{
174+
using (AsyncSocket socket = AsyncSocket.CreateIPv4Tcp())
175+
{
176+
MonitorEvent monitorEvent = new MonitorEvent(SocketEvents.All, addr: "", arg: socket);
177+
Assert.Equal(socket, monitorEvent.ConvertArg<AsyncSocket>());
178+
}
179+
}
180+
181+
[Fact]
182+
public void ConvertArgThrowsForInvalidType()
183+
{
184+
AsyncSocket? socket = null;
185+
MonitorEvent monitorEvent = new MonitorEvent(SocketEvents.All, addr: "", arg: socket!);
186+
Assert.Throws<ArgumentException>(() => monitorEvent.ConvertArg<int>());
187+
}
160188
}
161189
}

src/NetMQ/Core/MonitorEvent.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics.CodeAnalysis;
23
using System.Runtime.InteropServices;
34
using AsyncIO;
45
using NetMQ.Core.Transports;
@@ -159,5 +160,17 @@ public static MonitorEvent Read(SocketBase s)
159160

160161
return new MonitorEvent(@event, addr, arg);
161162
}
163+
164+
[return: MaybeNull]
165+
public T ConvertArg<T>()
166+
{
167+
if (Arg is T v)
168+
return v;
169+
170+
if (Arg is null && default(T) is null)
171+
return default;
172+
173+
throw new ArgumentException($"Command argument must be of type {typeof(T).Name}.");
174+
}
162175
}
163176
}

src/NetMQ/Monitoring/NetMQMonitor.cs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -156,48 +156,37 @@ private void Handle(object sender, NetMQSocketEventArgs socketEventArgs)
156156
{
157157
var monitorEvent = MonitorEvent.Read(m_monitoringSocket.SocketHandle);
158158

159-
T GetArg<T>()
160-
{
161-
if (monitorEvent.Arg is T v)
162-
return v;
163-
164-
if (monitorEvent.Arg == null && default(T) == null)
165-
return default(T);
166-
167-
throw new ArgumentException($"Command argument must be of type {typeof(T).Name}.");
168-
}
169-
170159
switch (monitorEvent.Event)
171160
{
172161
case SocketEvents.Connected:
173-
InvokeEvent(Connected, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, GetArg<AsyncSocket>(), SocketEvents.Connected));
162+
InvokeEvent(Connected, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, monitorEvent.ConvertArg<AsyncSocket>(), SocketEvents.Connected));
174163
break;
175164
case SocketEvents.ConnectDelayed:
176-
InvokeEvent(ConnectDelayed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)GetArg<int>(), SocketEvents.ConnectDelayed));
165+
InvokeEvent(ConnectDelayed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)monitorEvent.ConvertArg<int>(), SocketEvents.ConnectDelayed));
177166
break;
178167
case SocketEvents.ConnectRetried:
179-
InvokeEvent(ConnectRetried, new NetMQMonitorIntervalEventArgs(this, monitorEvent.Addr, GetArg<int>(), SocketEvents.ConnectRetried));
168+
InvokeEvent(ConnectRetried, new NetMQMonitorIntervalEventArgs(this, monitorEvent.Addr, monitorEvent.ConvertArg<int>(), SocketEvents.ConnectRetried));
180169
break;
181170
case SocketEvents.Listening:
182-
InvokeEvent(Listening, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, GetArg<AsyncSocket>(), SocketEvents.Listening));
171+
InvokeEvent(Listening, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, monitorEvent.ConvertArg<AsyncSocket>(), SocketEvents.Listening));
183172
break;
184173
case SocketEvents.BindFailed:
185-
InvokeEvent(BindFailed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)GetArg<int>(), SocketEvents.BindFailed));
174+
InvokeEvent(BindFailed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)monitorEvent.ConvertArg<int>(), SocketEvents.BindFailed));
186175
break;
187176
case SocketEvents.Accepted:
188-
InvokeEvent(Accepted, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, GetArg<AsyncSocket>(), SocketEvents.Accepted));
177+
InvokeEvent(Accepted, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, monitorEvent.ConvertArg<AsyncSocket>(), SocketEvents.Accepted));
189178
break;
190179
case SocketEvents.AcceptFailed:
191-
InvokeEvent(AcceptFailed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)GetArg<int>(), SocketEvents.AcceptFailed));
180+
InvokeEvent(AcceptFailed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)monitorEvent.ConvertArg<int>(), SocketEvents.AcceptFailed));
192181
break;
193182
case SocketEvents.Closed:
194-
InvokeEvent(Closed, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, GetArg<AsyncSocket>(), SocketEvents.Closed));
183+
InvokeEvent(Closed, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, monitorEvent.ConvertArg<AsyncSocket>(), SocketEvents.Closed));
195184
break;
196185
case SocketEvents.CloseFailed:
197-
InvokeEvent(CloseFailed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)GetArg<int>(), SocketEvents.CloseFailed));
186+
InvokeEvent(CloseFailed, new NetMQMonitorErrorEventArgs(this, monitorEvent.Addr, (ErrorCode)monitorEvent.ConvertArg<int>(), SocketEvents.CloseFailed));
198187
break;
199188
case SocketEvents.Disconnected:
200-
InvokeEvent(Disconnected, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, GetArg<AsyncSocket>(), SocketEvents.Disconnected));
189+
InvokeEvent(Disconnected, new NetMQMonitorSocketEventArgs(this, monitorEvent.Addr, monitorEvent.ConvertArg<AsyncSocket>(), SocketEvents.Disconnected));
201190
break;
202191
default:
203192
throw new Exception("unknown event " + monitorEvent.Event);

src/NetMQ/Monitoring/NetMQMonitorEventArgs.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class NetMQMonitorSocketEventArgs : NetMQMonitorEventArgs
4949
/// <param name="address">The address of the event.</param>
5050
/// <param name="socketEvent">The type of socket event that occurred.</param>
5151
/// <param name="socket">The socket upon which this event occurred.</param>
52-
public NetMQMonitorSocketEventArgs(NetMQMonitor monitor, string address, AsyncSocket socket, SocketEvents socketEvent)
52+
public NetMQMonitorSocketEventArgs(NetMQMonitor monitor, string address, AsyncSocket? socket, SocketEvents socketEvent)
5353
: base(monitor, address, socketEvent)
5454
{
5555
Socket = socket;
@@ -58,7 +58,7 @@ public NetMQMonitorSocketEventArgs(NetMQMonitor monitor, string address, AsyncSo
5858
/// <summary>
5959
/// Gets the socket upon which this event occurred.
6060
/// </summary>
61-
public AsyncSocket Socket { get; }
61+
public AsyncSocket? Socket { get; }
6262
}
6363

6464
/// <summary>

0 commit comments

Comments
 (0)