您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

113 行
4.6 KiB

#if MULTIPLAYER_TOOLS
using System.Collections;
using System.Linq;
using NUnit.Framework;
using Unity.Collections;
using Unity.Multiplayer.Tools.MetricTypes;
using UnityEngine;
using UnityEngine.TestTools;
using Unity.Netcode.TestHelpers.Runtime;
using Unity.Netcode.TestHelpers.Runtime.Metrics;
namespace Unity.Netcode.RuntimeTests.Metrics
{
internal class OwnershipChangeMetricsTests : SingleClientMetricTestBase
{
private const string k_NewNetworkObjectName = "TestNetworkObjectToSpawn";
private NetworkObject m_NewNetworkPrefab;
// Header is dynamically sized due to packing, will be 2 bytes for all test messages.
private const int k_MessageHeaderSize = 2;
protected override void OnServerAndClientsCreated()
{
var gameObject = new GameObject(k_NewNetworkObjectName);
m_NewNetworkPrefab = gameObject.AddComponent<NetworkObject>();
NetcodeIntegrationTestHelpers.MakeNetworkObjectTestPrefab(m_NewNetworkPrefab);
var networkPrefab = new NetworkPrefab { Prefab = gameObject };
m_ServerNetworkManager.NetworkConfig.NetworkPrefabs.Add(networkPrefab);
foreach (var client in m_ClientNetworkManagers)
{
client.NetworkConfig.NetworkPrefabs.Add(networkPrefab);
}
base.OnServerAndClientsCreated();
}
private NetworkObject SpawnNetworkObject()
{
// Spawn another network object so we can hide multiple.
var gameObject = Object.Instantiate(m_NewNetworkPrefab); // new GameObject(NewNetworkObjectName);
var networkObject = gameObject.GetComponent<NetworkObject>();
networkObject.NetworkManagerOwner = Server;
networkObject.Spawn();
return networkObject;
}
private int GetWriteSizeForOwnerChange(NetworkObject networkObject, ulong newOwner)
{
var message = new ChangeOwnershipMessage
{
NetworkObjectId = networkObject.NetworkObjectId,
OwnerClientId = newOwner
};
using var writer = new FastBufferWriter(1024, Allocator.Temp);
message.Serialize(writer, message.Version);
return writer.Length;
}
[UnityTest]
public IEnumerator TrackOwnershipChangeSentMetric()
{
var networkObject = SpawnNetworkObject();
yield return new WaitForSeconds(0.2f);
var waitForMetricValues = new WaitForEventMetricValues<OwnershipChangeEvent>(ServerMetrics.Dispatcher, NetworkMetricTypes.OwnershipChangeSent);
networkObject.ChangeOwnership(1);
yield return waitForMetricValues.WaitForMetricsReceived();
var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
var ownershipChangeSent = metricValues.First();
Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeSent.NetworkId.NetworkId);
Assert.AreEqual(Server.LocalClientId, ownershipChangeSent.Connection.Id);
Assert.AreEqual(0, ownershipChangeSent.BytesCount);
// The first metric is to the server(self), so its size is now correctly reported as 0.
// Let's check the last one instead, to have a valid value
ownershipChangeSent = metricValues.Last();
Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeSent.NetworkId.NetworkId);
Assert.AreEqual(Client.LocalClientId, ownershipChangeSent.Connection.Id);
var serializedLength = GetWriteSizeForOwnerChange(networkObject, 1);
Assert.AreEqual(serializedLength + k_MessageHeaderSize, ownershipChangeSent.BytesCount);
}
[UnityTest]
public IEnumerator TrackOwnershipChangeReceivedMetric()
{
var networkObject = SpawnNetworkObject();
yield return new WaitForSeconds(0.2f);
var waitForMetricValues = new WaitForEventMetricValues<OwnershipChangeEvent>(ClientMetrics.Dispatcher, NetworkMetricTypes.OwnershipChangeReceived);
networkObject.ChangeOwnership(1);
yield return waitForMetricValues.WaitForMetricsReceived();
var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
Assert.AreEqual(1, metricValues.Count);
var ownershipChangeReceived = metricValues.First();
Assert.AreEqual(networkObject.NetworkObjectId, ownershipChangeReceived.NetworkId.NetworkId);
var serializedLength = GetWriteSizeForOwnerChange(networkObject, 1);
Assert.AreEqual(serializedLength, ownershipChangeReceived.BytesCount);
}
}
}
#endif