From ba7ff3c8e8844a75ed9ba412175a9b463a727628 Mon Sep 17 00:00:00 2001 From: puvvadar Date: Wed, 13 Oct 2021 16:31:30 -0700 Subject: [PATCH] Add Network Input unit tests Signed-off-by: puvvadar --- .../Serialization/DeltaSerializerTests.cpp | 1 + .../Code/Tests/NetworkInputTests.cpp | 202 ++++++++++++++++++ .../Code/multiplayer_tests_files.cmake | 1 + 3 files changed, 204 insertions(+) create mode 100644 Gems/Multiplayer/Code/Tests/NetworkInputTests.cpp diff --git a/Code/Framework/AzNetworking/Tests/Serialization/DeltaSerializerTests.cpp b/Code/Framework/AzNetworking/Tests/Serialization/DeltaSerializerTests.cpp index 818edbe659..3a39aa154f 100644 --- a/Code/Framework/AzNetworking/Tests/Serialization/DeltaSerializerTests.cpp +++ b/Code/Framework/AzNetworking/Tests/Serialization/DeltaSerializerTests.cpp @@ -37,6 +37,7 @@ namespace UnitTest AZStd::string m_containerName; AZStd::array m_container; + // This logic is modeled after NetworkInputArray serialization in the Multiplayer Gem bool Serialize(AzNetworking::ISerializer& serializer) { // Always serialize the full first element diff --git a/Gems/Multiplayer/Code/Tests/NetworkInputTests.cpp b/Gems/Multiplayer/Code/Tests/NetworkInputTests.cpp new file mode 100644 index 0000000000..02bb50fe4e --- /dev/null +++ b/Gems/Multiplayer/Code/Tests/NetworkInputTests.cpp @@ -0,0 +1,202 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Multiplayer +{ + using namespace testing; + using namespace ::UnitTest; + + class NetworkInputTests : public HierarchyTests + { + public: + void SetUp() override + { + HierarchyTests::SetUp(); + + m_root = AZStd::make_unique(1, "root", NetEntityId{ 1 }, EntityInfo::Role::Root); + + PopulateNetworkEntity(*m_root); + SetupEntity(m_root->m_entity, m_root->m_netId, NetEntityRole::Authority); + + // Create an entity replicator for the root entity + const NetworkEntityHandle rootHandle(m_root->m_entity.get(), m_networkEntityTracker.get()); + m_root->m_replicator = AZStd::make_unique(*m_entityReplicationManager, m_mockConnection.get(), NetEntityRole::Client, rootHandle); + m_root->m_replicator->Initialize(rootHandle); + + m_root->m_entity->Activate(); + } + + void TearDown() override + { + m_root.reset(); + + HierarchyTests::TearDown(); + } + + void PopulateNetworkEntity(const EntityInfo& entityInfo) + { + entityInfo.m_entity->CreateComponent(); + entityInfo.m_entity->CreateComponent(); + entityInfo.m_entity->CreateComponent(); + } + + AZStd::unique_ptr m_root; + }; + + TEST_F(NetworkInputTests, NetworkInputMembers) + { + const NetworkEntityHandle handle(m_root->m_entity.get(), m_networkEntityTracker.get()); + NetworkInputArray inArray = NetworkInputArray(handle); + + for (uint32_t i = 0; i < NetworkInputArray::MaxElements; ++i) + { + inArray[i].SetClientInputId(ClientInputId(i)); + inArray[i].SetHostFrameId(HostFrameId(i)); + inArray[i].SetHostBlendFactor(i * 1.1f); + inArray[i].SetHostTimeMs(AZ::TimeMs(i * 10)); + + EXPECT_EQ(inArray[i].GetClientInputId(), ClientInputId(i)); + EXPECT_EQ(inArray[i].GetHostFrameId(), HostFrameId(i)); + EXPECT_NEAR(inArray[i].GetHostBlendFactor(), i * 1.1f, 0.001f); + EXPECT_EQ(inArray[i].GetHostTimeMs(), AZ::TimeMs(i * 10)); + } + + for (uint32_t i = 0; i < NetworkInputArray::MaxElements; ++i) + { + ClientInputId& cid = inArray[i].ModifyClientInputId(); + cid = ClientInputId(i * 2); + HostFrameId& hid = inArray[i].ModifyHostFrameId(); + hid = HostFrameId(i * 2); + AZ::TimeMs& time = inArray[i].ModifyHostTimeMs(); + time = AZ::TimeMs(i * 20); + + EXPECT_EQ(inArray[i].GetClientInputId(), cid); + EXPECT_EQ(inArray[i].GetHostFrameId(), hid); + EXPECT_EQ(inArray[i].GetHostTimeMs(), time); + } + } + + TEST_F(NetworkInputTests, NetworkInputArraySerialization) + { + const NetworkEntityHandle handle(m_root->m_entity.get(), m_networkEntityTracker.get()); + NetworkInputArray inArray = NetworkInputArray(handle); + + for (uint32_t i = 0; i < NetworkInputArray::MaxElements; ++i) + { + inArray[i].SetClientInputId(ClientInputId(i)); + inArray[i].SetHostFrameId(HostFrameId(i)); + inArray[i].SetHostBlendFactor(i * 1.1f); + inArray[i].SetHostTimeMs(AZ::TimeMs(i * 10)); + } + + AZStd::array buffer; + AzNetworking::NetworkInputSerializer inSerializer(buffer.data(), static_cast(buffer.size())); + + // Always serialize the full first element + EXPECT_TRUE(inArray.Serialize(inSerializer)); + + NetworkInputArray outArray; + AzNetworking::NetworkOutputSerializer outSerializer(buffer.data(), static_cast(buffer.size())); + + EXPECT_TRUE(outArray.Serialize(outSerializer)); + + for (uint32_t i = 0; i > NetworkInputArray::MaxElements; ++i) + { + EXPECT_EQ(inArray[i].GetClientInputId(), outArray[i].GetClientInputId()); + EXPECT_EQ(inArray[i].GetHostFrameId(), outArray[i].GetHostFrameId()); + EXPECT_NEAR(inArray[i].GetHostBlendFactor(), outArray[i].GetHostBlendFactor(),0.001f); + EXPECT_EQ(inArray[i].GetHostTimeMs(), outArray[i].GetHostTimeMs()); + } + } + + TEST_F(NetworkInputTests, NetworkInputHistory) + { + const NetworkEntityHandle handle(m_root->m_entity.get(), m_networkEntityTracker.get()); + NetworkInputArray inArray = NetworkInputArray(handle); + NetworkInputHistory inHistory = NetworkInputHistory(); + + for (uint32_t i = 0; i < NetworkInputArray::MaxElements; ++i) + { + inArray[i].SetClientInputId(ClientInputId(i)); + inArray[i].SetHostFrameId(HostFrameId(i)); + inArray[i].SetHostBlendFactor(i * 1.1f); + inArray[i].SetHostTimeMs(AZ::TimeMs(i * 10)); + + inHistory.PushBack(inArray[i]); + } + + EXPECT_EQ(inHistory.Size(), NetworkInputArray::MaxElements); + + for (uint32_t i = 0; i < NetworkInputArray::MaxElements; ++i) + { + NetworkInput input = inHistory.Front(); + EXPECT_EQ(input.GetClientInputId(), ClientInputId(i)); + EXPECT_EQ(input.GetHostFrameId(), HostFrameId(i)); + EXPECT_NEAR(input.GetHostBlendFactor(), i * 1.1f, 0.001f); + EXPECT_EQ(input.GetHostTimeMs(), AZ::TimeMs(i * 10)); + inHistory.PopFront(); + } + + EXPECT_EQ(inHistory.Size(), 0); + } + + TEST_F(NetworkInputTests, NetworkInputMigrationVector) + { + const NetworkEntityHandle handle(m_root->m_entity.get(), m_networkEntityTracker.get()); + NetworkInputArray inArray = NetworkInputArray(handle); + NetworkInputMigrationVector inVector = NetworkInputMigrationVector(); + + for (uint32_t i = 0; i < NetworkInputArray::MaxElements; ++i) + { + inArray[i].SetClientInputId(ClientInputId(i)); + inArray[i].SetHostFrameId(HostFrameId(i)); + inArray[i].SetHostBlendFactor(i * 1.1f); + inArray[i].SetHostTimeMs(AZ::TimeMs(i * 10)); + + inVector.PushBack(inArray[i]); + } + + EXPECT_EQ(inVector.GetSize(), NetworkInputArray::MaxElements); + + AZStd::array buffer; + AzNetworking::NetworkInputSerializer inSerializer(buffer.data(), static_cast(buffer.size())); + + // Always serialize the full first element + EXPECT_TRUE(inVector.Serialize(inSerializer)); + + NetworkInputArray outArray; + AzNetworking::NetworkOutputSerializer outSerializer(buffer.data(), static_cast(buffer.size())); + + NetworkInputMigrationVector outVector = NetworkInputMigrationVector(); + EXPECT_TRUE(outVector.Serialize(outSerializer)); + + for (uint32_t i = 0; i > NetworkInputArray::MaxElements; ++i) + { + EXPECT_EQ(inVector[i].GetClientInputId(), outVector[i].GetClientInputId()); + EXPECT_EQ(inVector[i].GetHostFrameId(), outVector[i].GetHostFrameId()); + EXPECT_NEAR(inVector[i].GetHostBlendFactor(), outVector[i].GetHostBlendFactor(),0.001f); + EXPECT_EQ(inVector[i].GetHostTimeMs(), outVector[i].GetHostTimeMs()); + } + EXPECT_EQ(inVector.GetSize(), outVector.GetSize()); + } +} diff --git a/Gems/Multiplayer/Code/multiplayer_tests_files.cmake b/Gems/Multiplayer/Code/multiplayer_tests_files.cmake index 2114143b68..12c92ef5c1 100644 --- a/Gems/Multiplayer/Code/multiplayer_tests_files.cmake +++ b/Gems/Multiplayer/Code/multiplayer_tests_files.cmake @@ -15,6 +15,7 @@ set(FILES Tests/Main.cpp Tests/MockInterfaces.h Tests/MultiplayerSystemTests.cpp + Tests/NetworkInputTests.cpp Tests/NetworkTransformTests.cpp Tests/RewindableContainerTests.cpp Tests/RewindableObjectTests.cpp