6
6
using NUnit . Framework ;
7
7
using UnityEngine ;
8
8
using UnityEngine . SceneManagement ;
9
+ using Object = UnityEngine . Object ;
9
10
10
11
namespace MLAPI . RuntimeTests
11
12
{
12
13
/// <summary>
13
14
/// Provides helpers for running multi instance tests.
14
15
/// </summary>
15
- internal static class MultiInstanceHelpers
16
+ public static class MultiInstanceHelpers
16
17
{
18
+
19
+ public static List < NetworkManager > NetworkManagerInstances = new List < NetworkManager > ( ) ;
20
+
17
21
/// <summary>
18
22
/// Creates NetworkingManagers and configures them for use in a multi instance setting.
19
23
/// </summary>
@@ -28,11 +32,10 @@ public static bool Create(int clientCount, out NetworkManager server, out Networ
28
32
{
29
33
// Create gameObject
30
34
var go = new GameObject ( "NetworkManager - Client - " + i ) ;
31
-
32
35
// Create networkManager component
33
36
clients [ i ] = go . AddComponent < NetworkManager > ( ) ;
34
37
35
- // Set config
38
+ // Set the NetworkConfig
36
39
clients [ i ] . NetworkConfig = new NetworkConfig ( )
37
40
{
38
41
// Set the current scene to prevent unexpected log messages which would trigger a failure
@@ -42,14 +45,17 @@ public static bool Create(int clientCount, out NetworkManager server, out Networ
42
45
} ;
43
46
}
44
47
48
+ NetworkManagerInstances = new List < NetworkManager > ( clients ) ;
49
+
45
50
{
46
51
// Create gameObject
47
52
var go = new GameObject ( "NetworkManager - Server" ) ;
48
53
49
54
// Create networkManager component
50
55
server = go . AddComponent < NetworkManager > ( ) ;
56
+ NetworkManagerInstances . Insert ( 0 , server ) ;
51
57
52
- // Set config
58
+ // Set the NetworkConfig
53
59
server . NetworkConfig = new NetworkConfig ( )
54
60
{
55
61
// Set the current scene to prevent unexpected log messages which would trigger a failure
@@ -62,6 +68,25 @@ public static bool Create(int clientCount, out NetworkManager server, out Networ
62
68
return true ;
63
69
}
64
70
71
+
72
+ public static void ShutdownAndClean ( )
73
+ {
74
+ // Shutdown the server which forces clients to disconnect
75
+ foreach ( var networkManager in NetworkManagerInstances )
76
+ {
77
+ if ( networkManager . IsServer )
78
+ {
79
+ networkManager . StopHost ( ) ;
80
+ }
81
+ }
82
+
83
+ // Destroy the network manager instances
84
+ foreach ( var networkManager in NetworkManagerInstances )
85
+ {
86
+ Object . Destroy ( networkManager . gameObject ) ;
87
+ }
88
+ }
89
+
65
90
/// <summary>
66
91
/// Starts NetworkManager instances created by the Create method.
67
92
/// </summary>
@@ -170,6 +195,52 @@ public static IEnumerator WaitForClientConnected(NetworkManager client, Coroutin
170
195
}
171
196
}
172
197
198
+ public static IEnumerator WaitForClientsConnected ( NetworkManager [ ] clients , CoroutineResultWrapper < bool > result = null , int maxFrames = 64 )
199
+ {
200
+ // Make sure none are the host client
201
+ foreach ( var client in clients )
202
+ {
203
+ if ( client . IsServer )
204
+ {
205
+ throw new InvalidOperationException ( "Cannot wait for connected as server" ) ;
206
+ }
207
+ }
208
+
209
+
210
+ int startFrame = Time . frameCount ;
211
+ var allConnected = true ;
212
+ while ( Time . frameCount - startFrame <= maxFrames )
213
+ {
214
+ allConnected = true ;
215
+ foreach ( var client in clients )
216
+ {
217
+ if ( ! client . IsConnectedClient )
218
+ {
219
+ allConnected = false ;
220
+ break ;
221
+ }
222
+ }
223
+ if ( allConnected )
224
+ {
225
+ break ;
226
+ }
227
+ int nextFrameId = Time . frameCount + 1 ;
228
+ yield return new WaitUntil ( ( ) => Time . frameCount >= nextFrameId ) ;
229
+ }
230
+
231
+ if ( result != null )
232
+ {
233
+ result . Result = allConnected ;
234
+ }
235
+ else
236
+ {
237
+ foreach ( var client in clients )
238
+ {
239
+ Assert . True ( client . IsConnectedClient , $ "Client { client . LocalClientId } never connected") ;
240
+ }
241
+ }
242
+ }
243
+
173
244
/// <summary>
174
245
/// Waits on the server side for 1 client to be connected
175
246
/// </summary>
@@ -199,7 +270,40 @@ public static IEnumerator WaitForClientConnectedToServer(NetworkManager server,
199
270
}
200
271
else
201
272
{
202
- Assert . True ( res , "Client never connected to server" ) ;
273
+ Assert . True ( res , "A Client never connected to server" ) ;
274
+ }
275
+ }
276
+
277
+ /// <summary>
278
+ /// Waits on the server side for 1 client to be connected
279
+ /// </summary>
280
+ /// <param name="server">The server</param>
281
+ /// <param name="result">The result. If null, it will automatically assert</param>
282
+ /// <param name="maxFrames">The max frames to wait for</param>
283
+ public static IEnumerator WaitForClientsConnectedToServer ( NetworkManager server , int clientCount , CoroutineResultWrapper < bool > result = null , int maxFrames = 64 )
284
+ {
285
+ if ( ! server . IsServer )
286
+ {
287
+ throw new InvalidOperationException ( "Cannot wait for connected as client" ) ;
288
+ }
289
+
290
+ int startFrame = Time . frameCount ;
291
+
292
+ while ( Time . frameCount - startFrame <= maxFrames && server . ConnectedClients . Count != clientCount )
293
+ {
294
+ int nextFrameId = Time . frameCount + 1 ;
295
+ yield return new WaitUntil ( ( ) => Time . frameCount >= nextFrameId ) ;
296
+ }
297
+
298
+ bool res = server . ConnectedClients . Count == clientCount ;
299
+
300
+ if ( result != null )
301
+ {
302
+ result . Result = res ;
303
+ }
304
+ else
305
+ {
306
+ Assert . True ( res , "A client never connected to server" ) ;
203
307
}
204
308
}
205
309
0 commit comments