-
Notifications
You must be signed in to change notification settings - Fork 459
Expand file tree
/
Copy pathUnityTransportTestHelpers.cs
More file actions
112 lines (98 loc) · 4.48 KB
/
UnityTransportTestHelpers.cs
File metadata and controls
112 lines (98 loc) · 4.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using Unity.Netcode.Transports.UTP;
using Unity.Networking.Transport;
using UnityEngine;
namespace Unity.Netcode.RuntimeTests
{
public static class UnityTransportTestHelpers
{
// Half a second might seem like a very long time to wait for a network event, but in CI
// many of the machines are underpowered (e.g. old Android devices or Macs) and there are
// sometimes very high lag spikes. PS4 and Switch are particularly sensitive in this regard
// so we allow even more time for these platforms.
public const float MaxNetworkEventWaitTime = 0.5f;
// Wait for an event to appear in the given event list (must be the very next event).
public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List<TransportEvent> events, float timeout = MaxNetworkEventWaitTime)
{
int initialCount = events.Count;
float startTime = Time.realtimeSinceStartup;
while (Time.realtimeSinceStartup - startTime < timeout)
{
if (events.Count > initialCount)
{
Assert.AreEqual(type, events[initialCount].Type);
yield break;
}
yield return new WaitForSeconds(0.01f);
}
Assert.Fail("Timed out while waiting for network event.");
}
// Wait to ensure no event is sent.
public static IEnumerator EnsureNoNetworkEvent(List<TransportEvent> events, float timeout = MaxNetworkEventWaitTime)
{
int initialCount = events.Count;
float startTime = Time.realtimeSinceStartup;
while (Time.realtimeSinceStartup - startTime < timeout)
{
if (events.Count > initialCount)
{
Assert.Fail("Received unexpected network event.");
}
yield return new WaitForSeconds(0.01f);
}
}
// Common code to initialize a UnityTransport that logs its events.
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events,
int maxPayloadSize = UnityTransport.InitialMaxPayloadSize, int maxSendQueueSize = 0, NetworkFamily family = NetworkFamily.Ipv4)
{
var logger = new TransportEventLogger();
events = logger.Events;
transport = new GameObject().AddComponent<UnityTransport>();
transport.OnTransportEvent += logger.HandleEvent;
transport.MaxPayloadSize = maxPayloadSize;
transport.MaxSendQueueSize = maxSendQueueSize;
if (family == NetworkFamily.Ipv6)
{
transport.SetConnectionData("::1", 7777);
}
transport.Initialize();
}
// Information about an event generated by a transport (basically just the parameters that
// are normally passed along to a TransportEventDelegate).
public struct TransportEvent
{
public NetworkEvent Type;
public ulong ClientID;
public ArraySegment<byte> Data;
public float ReceiveTime;
}
// Utility class that logs events generated by a UnityTransport. Set it up by adding the
// HandleEvent method as an OnTransportEvent delegate of the transport. The list of events
// (in order in which they were generated) can be accessed through the Events property.
public class TransportEventLogger
{
private readonly List<TransportEvent> m_Events = new List<TransportEvent>();
public List<TransportEvent> Events => m_Events;
public void HandleEvent(NetworkEvent type, ulong clientID, ArraySegment<byte> data, float receiveTime)
{
// Copy the data since the backing array will be reused for future messages.
if (data != default(ArraySegment<byte>))
{
var dataCopy = new byte[data.Count];
Array.Copy(data.Array, data.Offset, dataCopy, 0, data.Count);
data = new ArraySegment<byte>(dataCopy);
}
m_Events.Add(new TransportEvent
{
Type = type,
ClientID = clientID,
Data = data,
ReceiveTime = receiveTime
});
}
}
}
}