RewindableObjectTests.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Multiplayer/IMultiplayer.h>
  9. #include <Multiplayer/NetworkTime/RewindableObject.h>
  10. #include <Source/NetworkTime/NetworkTime.h>
  11. #include <AzCore/Console/LoggerSystemComponent.h>
  12. #include <AzCore/Time/TimeSystem.h>
  13. #include <AzCore/UnitTest/TestTypes.h>
  14. namespace UnitTest
  15. {
  16. class RewindableObjectTests
  17. : public LeakDetectionFixture
  18. {
  19. public:
  20. Multiplayer::NetworkTime m_networkTime;
  21. AZ::LoggerSystemComponent m_loggerComponent;
  22. AZ::TimeSystem m_timeSystem;
  23. };
  24. static constexpr uint32_t RewindableBufferFrames = 32;
  25. TEST_F(RewindableObjectTests, BasicTests)
  26. {
  27. Multiplayer::RewindableObject<uint32_t, RewindableBufferFrames> test(0);
  28. for (uint32_t i = 0; i < 16; ++i)
  29. {
  30. test = i;
  31. EXPECT_EQ(i, test);
  32. Multiplayer::GetNetworkTime()->IncrementHostFrameId();
  33. }
  34. for (uint32_t i = 0; i < 16; ++i)
  35. {
  36. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(i), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  37. EXPECT_EQ(i, test);
  38. }
  39. for (uint32_t i = 16; i < 48; ++i)
  40. {
  41. test = i;
  42. EXPECT_EQ(i, test);
  43. Multiplayer::GetNetworkTime()->IncrementHostFrameId();
  44. }
  45. for (uint32_t i = 16; i < 48; ++i)
  46. {
  47. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(i), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  48. EXPECT_EQ(i, test);
  49. }
  50. }
  51. TEST_F(RewindableObjectTests, CurrentPreviousTests)
  52. {
  53. Multiplayer::RewindableObject<uint32_t, RewindableBufferFrames> test(0);
  54. for (uint32_t i = 0; i < RewindableBufferFrames; ++i)
  55. {
  56. test = i;
  57. EXPECT_EQ(i, test);
  58. Multiplayer::GetNetworkTime()->IncrementHostFrameId();
  59. }
  60. {
  61. // Test that Get/GetPrevious return different value when not on the owning connection
  62. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(RewindableBufferFrames - 1), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  63. EXPECT_EQ(RewindableBufferFrames - 1, test.Get());
  64. EXPECT_EQ(RewindableBufferFrames - 2, test.GetPrevious());
  65. EXPECT_EQ(0, test.GetLastSerializedValue());
  66. }
  67. // Test that Get/GetPrevious return the unaltered frame on the owning conection
  68. Multiplayer::GetNetworkTime()->AlterTime(static_cast<Multiplayer::HostFrameId>(RewindableBufferFrames - 1), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::ConnectionId(0));
  69. {
  70. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(RewindableBufferFrames - 1), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::ConnectionId(0));
  71. test.SetOwningConnectionId(AzNetworking::ConnectionId(0));
  72. EXPECT_EQ(RewindableBufferFrames - 1, test.Get());
  73. EXPECT_EQ(RewindableBufferFrames - 1, test.GetPrevious());
  74. EXPECT_EQ(0, test.GetLastSerializedValue());
  75. }
  76. Multiplayer::GetNetworkTime()->AlterTime(static_cast<Multiplayer::HostFrameId>(RewindableBufferFrames), AZ::TimeMs(0), 1.f, AzNetworking::InvalidConnectionId);
  77. }
  78. TEST_F(RewindableObjectTests, OverflowTests)
  79. {
  80. Multiplayer::RewindableObject<uint32_t, RewindableBufferFrames> test(0);
  81. for (uint32_t i = 0; i < RewindableBufferFrames; ++i)
  82. {
  83. test = i;
  84. EXPECT_EQ(i, test);
  85. Multiplayer::GetNetworkTime()->IncrementHostFrameId();
  86. }
  87. {
  88. // Note that we didn't actually set any value for time rewindableBufferFrames, so we're testing fetching a value past the last time set
  89. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(RewindableBufferFrames), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  90. EXPECT_EQ(RewindableBufferFrames - 1, test);
  91. }
  92. }
  93. struct Object
  94. {
  95. uint32_t value;
  96. };
  97. TEST_F(RewindableObjectTests, ComplexObject)
  98. {
  99. Multiplayer::RewindableObject<Object, RewindableBufferFrames> test({ 0 });
  100. for (uint32_t i = 0; i < RewindableBufferFrames; ++i)
  101. {
  102. Object& value = test.Modify();
  103. value.value = i;
  104. AZ::Interface<Multiplayer::INetworkTime>::Get()->IncrementHostFrameId();
  105. }
  106. for (uint32_t i = 0; i < RewindableBufferFrames; ++i)
  107. {
  108. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(i), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  109. const Object& value = test;
  110. EXPECT_EQ(value.value, i);
  111. }
  112. }
  113. TEST_F(RewindableObjectTests, TestBackfillOnLargeTimestep)
  114. {
  115. Multiplayer::RewindableObject<uint32_t, RewindableBufferFrames> test(0);
  116. Multiplayer::ScopedAlterTime time1(static_cast<Multiplayer::HostFrameId>(0), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  117. test = 1;
  118. Multiplayer::ScopedAlterTime time2(static_cast<Multiplayer::HostFrameId>(31), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  119. test = 2;
  120. for (uint32_t i = 0; i < 31; ++i)
  121. {
  122. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(i), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  123. EXPECT_EQ(1, test);
  124. }
  125. Multiplayer::ScopedAlterTime time3(static_cast<Multiplayer::HostFrameId>(31), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  126. EXPECT_EQ(2, test);
  127. }
  128. TEST_F(RewindableObjectTests, TestMassiveValueOverflow)
  129. {
  130. Multiplayer::RewindableObject<uint32_t, RewindableBufferFrames> test(0);
  131. for (uint32_t i = 0; i < 1000; ++i)
  132. {
  133. AZ::Interface<Multiplayer::INetworkTime>::Get()->IncrementHostFrameId();
  134. }
  135. test = 1000;
  136. for (uint32_t i = 0; i < 1000; ++i)
  137. {
  138. Multiplayer::ScopedAlterTime time(static_cast<Multiplayer::HostFrameId>(1000 - i), AZ::Time::ZeroTimeMs, 1.f, AzNetworking::InvalidConnectionId);
  139. EXPECT_EQ(1000, test);
  140. }
  141. }
  142. }