Skip to content

Commit 42e44b4

Browse files
authored
fix!: allow sending named/unnamed to all with null client list (#1242)
* fix: allow sending named/unnamed to all with null client list * Applied review feedback.
1 parent fe06a89 commit 42e44b4

File tree

3 files changed

+149
-2
lines changed

3 files changed

+149
-2
lines changed

com.unity.netcode.gameobjects/Runtime/Messaging/CustomMessageManager.cs

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,19 +43,35 @@ internal void InvokeUnnamedMessage(ulong clientId, FastBufferReader reader)
4343
m_NetworkManager.NetworkMetrics.TrackUnnamedMessageReceived(clientId, reader.Length);
4444
}
4545

46+
/// <summary>
47+
/// Sends unnamed message to all clients
48+
/// </summary>
49+
/// <param name="messageBuffer">The message stream containing the data</param>
50+
/// <param name="networkDelivery">The delivery type (QoS) to send data with</param>
51+
public void SendUnnamedMessageToAll(FastBufferWriter messageBuffer, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
52+
{
53+
SendUnnamedMessage(m_NetworkManager.ConnectedClientsIds, messageBuffer, networkDelivery);
54+
}
55+
56+
4657
/// <summary>
4758
/// Sends unnamed message to a list of clients
4859
/// </summary>
4960
/// <param name="clientIds">The clients to send to, sends to everyone if null</param>
5061
/// <param name="messageBuffer">The message stream containing the data</param>
5162
/// <param name="networkDelivery">The delivery type (QoS) to send data with</param>
52-
public void SendUnnamedMessage(List<ulong> clientIds, FastBufferWriter messageBuffer, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
63+
public void SendUnnamedMessage(IReadOnlyList<ulong> clientIds, FastBufferWriter messageBuffer, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
5364
{
5465
if (!m_NetworkManager.IsServer)
5566
{
5667
throw new InvalidOperationException("Can not send unnamed messages to multiple users as a client");
5768
}
5869

70+
if (clientIds == null)
71+
{
72+
throw new ArgumentNullException("You must pass in a valid clientId List");
73+
}
74+
5975
var message = new UnnamedMessage
6076
{
6177
Data = messageBuffer
@@ -175,6 +191,16 @@ public void UnregisterNamedMessageHandler(string name)
175191
m_MessageHandlerNameLookup64.Remove(hash64);
176192
}
177193

194+
/// <summary>
195+
/// Sends a named message to all clients
196+
/// </summary>
197+
/// <param name="messageStream">The message stream containing the data</param>
198+
/// <param name="networkDelivery">The delivery type (QoS) to send data with</param>
199+
public void SendNamedMessageToAll(string messageName, FastBufferWriter messageStream, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
200+
{
201+
SendNamedMessage(messageName, m_NetworkManager.ConnectedClientsIds, messageStream, networkDelivery);
202+
}
203+
178204
/// <summary>
179205
/// Sends a named message
180206
/// </summary>
@@ -216,13 +242,18 @@ public void SendNamedMessage(string messageName, ulong clientId, FastBufferWrite
216242
/// <param name="clientIds">The clients to send to, sends to everyone if null</param>
217243
/// <param name="messageStream">The message stream containing the data</param>
218244
/// <param name="networkDelivery">The delivery type (QoS) to send data with</param>
219-
public void SendNamedMessage(string messageName, List<ulong> clientIds, FastBufferWriter messageStream, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
245+
public void SendNamedMessage(string messageName, IReadOnlyList<ulong> clientIds, FastBufferWriter messageStream, NetworkDelivery networkDelivery = NetworkDelivery.ReliableSequenced)
220246
{
221247
if (!m_NetworkManager.IsServer)
222248
{
223249
throw new InvalidOperationException("Can not send unnamed messages to multiple users as a client");
224250
}
225251

252+
if (clientIds == null)
253+
{
254+
throw new ArgumentNullException("You must pass in a valid clientId List");
255+
}
256+
226257
ulong hash = 0;
227258
switch (m_NetworkManager.NetworkConfig.RpcHashSize)
228259
{

com.unity.netcode.gameobjects/Tests/Runtime/Messaging/NamedMessageTests.cs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,65 @@ public IEnumerator NamedMessageIsReceivedOnMultipleClientsWithContent()
9292
Assert.AreEqual(messageContent, secondReceivedMessageContent);
9393
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);
9494
}
95+
96+
[UnityTest]
97+
public IEnumerator WhenSendingNamedMessageToAll_AllClientsReceiveIt()
98+
{
99+
var messageName = Guid.NewGuid().ToString();
100+
var messageContent = Guid.NewGuid();
101+
var writer = new FastBufferWriter(1300, Allocator.Temp);
102+
using (writer)
103+
{
104+
writer.WriteValueSafe(messageContent);
105+
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessageToAll(messageName, writer);
106+
}
107+
108+
ulong firstReceivedMessageSender = 0;
109+
var firstReceivedMessageContent = new Guid();
110+
FirstClient.CustomMessagingManager.RegisterNamedMessageHandler(
111+
messageName,
112+
(ulong sender, FastBufferReader reader) =>
113+
{
114+
firstReceivedMessageSender = sender;
115+
116+
reader.ReadValueSafe(out firstReceivedMessageContent);
117+
});
118+
119+
ulong secondReceivedMessageSender = 0;
120+
var secondReceivedMessageContent = new Guid();
121+
SecondClient.CustomMessagingManager.RegisterNamedMessageHandler(
122+
messageName,
123+
(ulong sender, FastBufferReader reader) =>
124+
{
125+
secondReceivedMessageSender = sender;
126+
127+
reader.ReadValueSafe(out secondReceivedMessageContent);
128+
});
129+
130+
yield return new WaitForSeconds(0.2f);
131+
132+
Assert.AreEqual(messageContent, firstReceivedMessageContent);
133+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, firstReceivedMessageSender);
134+
135+
Assert.AreEqual(messageContent, secondReceivedMessageContent);
136+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);
137+
}
138+
139+
[Test]
140+
public void WhenSendingNamedMessageToNullClientList_ArgumentNullExceptionIsThrown()
141+
{
142+
var messageName = Guid.NewGuid().ToString();
143+
var messageContent = Guid.NewGuid();
144+
var writer = new FastBufferWriter(1300, Allocator.Temp);
145+
using (writer)
146+
{
147+
writer.WriteValueSafe(messageContent);
148+
Assert.Throws<ArgumentNullException>(
149+
() =>
150+
{
151+
m_ServerNetworkManager.CustomMessagingManager.SendNamedMessage(messageName, null, writer);
152+
});
153+
}
154+
}
95155
}
96156
}

com.unity.netcode.gameobjects/Tests/Runtime/Messaging/UnnamedMessageTests.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,61 @@ public IEnumerator UnnamedMessageIsReceivedOnMultipleClientsWithContent()
8585
Assert.AreEqual(messageContent, secondReceivedMessageContent);
8686
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);
8787
}
88+
89+
[UnityTest]
90+
public IEnumerator WhenSendingUnnamedMessageToAll_AllClientsReceiveIt()
91+
{
92+
var messageContent = Guid.NewGuid();
93+
var writer = new FastBufferWriter(1300, Allocator.Temp);
94+
using (writer)
95+
{
96+
writer.WriteValueSafe(messageContent);
97+
m_ServerNetworkManager.CustomMessagingManager.SendUnnamedMessageToAll(writer);
98+
}
99+
100+
ulong firstReceivedMessageSender = 0;
101+
var firstReceivedMessageContent = new Guid();
102+
FirstClient.CustomMessagingManager.OnUnnamedMessage +=
103+
(ulong sender, FastBufferReader reader) =>
104+
{
105+
firstReceivedMessageSender = sender;
106+
107+
reader.ReadValueSafe(out firstReceivedMessageContent);
108+
};
109+
110+
ulong secondReceivedMessageSender = 0;
111+
var secondReceivedMessageContent = new Guid();
112+
SecondClient.CustomMessagingManager.OnUnnamedMessage +=
113+
(ulong sender, FastBufferReader reader) =>
114+
{
115+
secondReceivedMessageSender = sender;
116+
117+
reader.ReadValueSafe(out secondReceivedMessageContent);
118+
};
119+
120+
yield return new WaitForSeconds(0.2f);
121+
122+
Assert.AreEqual(messageContent, firstReceivedMessageContent);
123+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, firstReceivedMessageSender);
124+
125+
Assert.AreEqual(messageContent, secondReceivedMessageContent);
126+
Assert.AreEqual(m_ServerNetworkManager.LocalClientId, secondReceivedMessageSender);
127+
}
128+
129+
[Test]
130+
public void WhenSendingNamedMessageToNullClientList_ArgumentNullExceptionIsThrown()
131+
{
132+
var messageContent = Guid.NewGuid();
133+
var writer = new FastBufferWriter(1300, Allocator.Temp);
134+
using (writer)
135+
{
136+
writer.WriteValueSafe(messageContent);
137+
Assert.Throws<ArgumentNullException>(
138+
() =>
139+
{
140+
m_ServerNetworkManager.CustomMessagingManager.SendUnnamedMessage(null, writer);
141+
});
142+
}
143+
}
88144
}
89145
}

0 commit comments

Comments
 (0)