Class NetworkTransformTests
Integration tests for NetworkTransform that will test both server and host operating modes and will test both authoritative models for each operating mode.
Inheritance
Inherited Members
Namespace: Unity.Netcode.RuntimeTests
Assembly: solution.dll
Syntax
public class NetworkTransformTests : NetworkTransformBase
Constructors
NetworkTransformTests(HostOrServer, Authority, RotationCompression, Rotation, Precision)
Constructor
Declaration
public NetworkTransformTests(NetcodeIntegrationTest.HostOrServer testWithHost, NetworkTransformBase.Authority authority, NetworkTransformBase.RotationCompression rotationCompression, NetworkTransformBase.Rotation rotation, NetworkTransformBase.Precision precision)
Parameters
Type | Name | Description |
---|---|---|
NetcodeIntegrationTest.HostOrServer | testWithHost | Determines if we are running as a server or host |
NetworkTransformBase.Authority | authority | Determines if we are using server or owner authority |
NetworkTransformBase.RotationCompression | rotationCompression | |
NetworkTransformBase.Rotation | rotation | |
NetworkTransformBase.Precision | precision |
Fields
k_TickRate
Declaration
protected const int k_TickRate = 60
Field Value
Type | Description |
---|---|
int |
Properties
m_EnableTimeTravel
Enables "Time Travel" within the test, which swaps the time provider for the SDK from Unity's Time class to MockTimeProvider, and also swaps the transport implementation from UnityTransport to MockTransport.
This enables five important things that help with both performance and determinism of tests that involve a lot of time and waiting:
- It allows time to move in a completely deterministic way (testing that something happens after n seconds, the test will always move exactly n seconds with no chance of any variability in the timing),
- It allows skipping periods of time without actually waiting that amount of time, while still simulating SDK frames as if that time were passing,
- It dissociates the SDK's update loop from Unity's update loop, allowing us to simulate SDK frame updates without waiting for Unity to process things like physics, animation, and rendering that aren't relevant to the test,
- It dissociates the SDK's messaging system from the networking hardware, meaning there's no delay between a message being sent and it being received, allowing us to deterministically rely on the message being received within specific time frames for the test, and
- It allows tests to be written without the use of coroutines, which not only improves the test's runtime, but also results in easier-to-read callstacks and removes the possibility for an assertion to result in the test hanging.
When time travel is enabled, the following methods become available:
TimeTravel(double, int): Simulates a specific number of frames passing over a specific time period TimeTravelToNextTick(): Skips forward to the next tick, siumlating at the current application frame rate WaitForConditionOrTimeOutWithTimeTravel(Func<bool>, int): Simulates frames at the application frame rate until the given condition is true WaitForMessageReceivedWithTimeTravel<T>(List<NetworkManager>, ReceiptType): Simulates frames at the application frame rate until the required message is received WaitForMessagesReceivedWithTimeTravel(List<Type>, List<NetworkManager>, ReceiptType): Simulates frames at the application frame rate until the required messages are received StartServerAndClientsWithTimeTravel(): Starts a server and client and allows them to connect via simulated frames CreateAndStartNewClientWithTimeTravel(): Creates a client and waits for it to connect via simulated frames WaitForClientsConnectedOrTimeOutWithTimeTravel(NetworkManager[]) Simulates frames at the application frame rate until the given clients are connected StopOneClientWithTimeTravel(NetworkManager, bool): Stops a client and simulates frames until it's fully disconnected.
When time travel is enabled, NetcodeIntegrationTest will automatically use these in its methods when doing things like automatically connecting clients during SetUp.
Additionally, the following methods replace their non-time-travel equivalents with variants that are not coroutines: OnTimeTravelStartedServerAndClients() - called when server and clients are started OnTimeTravelServerAndClientsConnected() - called when server and clients are connected
Note that all of the non-time travel functions can still be used even when time travel is enabled - this is sometimes needed for, e.g., testing NetworkAnimator, where the unity update loop needs to run to process animations. However, it's VERY important to note here that, because the SDK will not be operating based on real-world time but based on the frozen time that's locked in from MockTimeProvider, actions that pass 10 seconds apart by real-world clock time will be perceived by the SDK as having happened simultaneously if you don't call TimeTravel(double) to cover the equivalent time span in the mock time provider. (Calling TimeTravel(double) instead of TimeTravel(double, int) will move time forward without simulating any frames, which, in the case where real-world time has passed, is likely more desirable). In most cases, this desynch won't affect anything, but it is worth noting that it happens just in case a tested system depends on both the unity update loop happening and time moving forward.
Declaration
protected override bool m_EnableTimeTravel { get; }
Property Value
Type | Description |
---|---|
bool |
Overrides
m_SetupIsACoroutine
If this is false, SetUp will call OnInlineSetUp instead of OnSetUp. This is a performance advantage when not using the coroutine functionality, as a coroutine that has no yield instructions in it will nonetheless still result in delaying the continuation of the method that called it for a full frame after it returns.
Declaration
protected override bool m_SetupIsACoroutine { get; }
Property Value
Type | Description |
---|---|
bool |
Overrides
m_TearDownIsACoroutine
If this is false, TearDown will call OnInlineTearDown instead of OnTearDown. This is a performance advantage when not using the coroutine functionality, as a coroutine that has no yield instructions in it will nonetheless still result in delaying the continuation of the method that called it for a full frame after it returns.
Declaration
protected override bool m_TearDownIsACoroutine { get; }
Property Value
Type | Description |
---|---|
bool |
Overrides
Methods
GetTickRate()
Declaration
protected override uint GetTickRate()
Returns
Type | Description |
---|---|
uint |
Overrides
LateJoiningPlayerInitialScaleValues(TransformSpace, Interpolation, OverrideState)
Checks scale of a late joining client for all instances of the late joining client's player
Declaration
public void LateJoiningPlayerInitialScaleValues(NetworkTransformBase.TransformSpace testLocalTransform, NetworkTransformBase.Interpolation interpolation, NetworkTransformBase.OverrideState overideState)
Parameters
Type | Name | Description |
---|---|---|
NetworkTransformBase.TransformSpace | testLocalTransform | |
NetworkTransformBase.Interpolation | interpolation | |
NetworkTransformBase.OverrideState | overideState |
NetworkTransformMultipleChangesOverTime(TransformSpace, OverrideState, Axis)
Declaration
public void NetworkTransformMultipleChangesOverTime(NetworkTransformBase.TransformSpace testLocalTransform, NetworkTransformBase.OverrideState overideState, NetworkTransformBase.Axis axis)
Parameters
Type | Name | Description |
---|---|---|
NetworkTransformBase.TransformSpace | testLocalTransform | |
NetworkTransformBase.OverrideState | overideState | |
NetworkTransformBase.Axis | axis |
ParentedNetworkTransformTest(Interpolation, bool, float)
Validates that transform values remain the same when a NetworkTransform is parented under another NetworkTransform under all of the possible axial conditions as well as when the parent has a varying scale.
Declaration
public void ParentedNetworkTransformTest(NetworkTransformBase.Interpolation interpolation, bool worldPositionStays, float scale)
Parameters
Type | Name | Description |
---|---|---|
NetworkTransformBase.Interpolation | interpolation | |
bool | worldPositionStays | |
float | scale |
TeleportTest(Interpolation)
The tests teleporting with and without interpolation
Declaration
public void TeleportTest(NetworkTransformBase.Interpolation interpolation)
Parameters
Type | Name | Description |
---|---|---|
NetworkTransformBase.Interpolation | interpolation |
TestAuthoritativeTransformChangeOneAtATime(TransformSpace, Interpolation, OverrideState)
Tests changing all axial values one at a time. These tests are performed:
- While in local space and world space
- While interpolation is enabled and disabled
- Using the TryCommitTransformToServer "override" that can be used from a child derived or external class.
Declaration
public void TestAuthoritativeTransformChangeOneAtATime(NetworkTransformBase.TransformSpace testLocalTransform, NetworkTransformBase.Interpolation interpolation, NetworkTransformBase.OverrideState overideState)
Parameters
Type | Name | Description |
---|---|---|
NetworkTransformBase.TransformSpace | testLocalTransform | |
NetworkTransformBase.Interpolation | interpolation | |
NetworkTransformBase.OverrideState | overideState |