ScheduledEventTests.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 <AzCore/EBus/IEventScheduler.h>
  9. #include <AzCore/EBus/EventSchedulerSystemComponent.h>
  10. #include <AzCore/EBus/ScheduledEvent.h>
  11. #include <AzCore/Interface/Interface.h>
  12. #include <AzCore/Console/LoggerSystemComponent.h>
  13. #include <AzCore/Time/TimeSystem.h>
  14. #include <AzCore/Name/NameDictionary.h>
  15. #include <AzCore/UnitTest/TestTypes.h>
  16. namespace UnitTest
  17. {
  18. class ScheduledEventTests
  19. : public LeakDetectionFixture
  20. {
  21. public:
  22. void SetUp() override
  23. {
  24. AZ::NameDictionary::Create();
  25. m_loggerComponent = AZStd::make_unique<AZ::LoggerSystemComponent>();
  26. m_timeSystem = AZStd::make_unique<AZ::TimeSystem>();
  27. m_eventSchedulerComponent = AZStd::make_unique<AZ::EventSchedulerSystemComponent>();
  28. m_testEvent = AZStd::make_unique<AZ::ScheduledEvent>([this] { TestBasicEvent(); }, AZ::Name("UnitTestEvent fire once event"));
  29. m_testRequeue = AZStd::make_unique<AZ::ScheduledEvent>([this] { TestAutoRequeuedEvent(); }, AZ::Name("UnitTestEvent auto Requeue"));
  30. }
  31. void TearDown() override
  32. {
  33. m_testEvent.reset();
  34. m_testRequeue.reset();
  35. m_eventSchedulerComponent.reset();
  36. m_timeSystem.reset();
  37. m_loggerComponent.reset();
  38. AZ::NameDictionary::Destroy();
  39. }
  40. void TestBasicEvent()
  41. {
  42. ++m_basicEventTriggerCount;
  43. }
  44. void TestAutoRequeuedEvent()
  45. {
  46. ++m_requeuedEventTriggerCount;
  47. }
  48. uint32_t m_basicEventTriggerCount = 0;
  49. uint32_t m_requeuedEventTriggerCount = 0;
  50. AZStd::unique_ptr<AZ::ScheduledEvent> m_testEvent;
  51. AZStd::unique_ptr<AZ::ScheduledEvent> m_testRequeue;
  52. AZStd::unique_ptr<AZ::LoggerSystemComponent> m_loggerComponent;
  53. AZStd::unique_ptr<AZ::TimeSystem> m_timeSystem;
  54. AZStd::unique_ptr<AZ::EventSchedulerSystemComponent> m_eventSchedulerComponent;
  55. };
  56. TEST_F(ScheduledEventTests, TestFireOnce)
  57. {
  58. m_testEvent->Enqueue(AZ::TimeMs(100));
  59. constexpr AZ::TimeMs TotalIterationTimeMs = AZ::TimeMs{ 1050 };
  60. const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs();
  61. for (;;)
  62. {
  63. AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(1));
  64. m_eventSchedulerComponent->OnTick(0.0f, AZ::ScriptTimePoint());
  65. if (AZ::GetElapsedTimeMs() - startTimeMs > TotalIterationTimeMs)
  66. {
  67. break;
  68. }
  69. }
  70. EXPECT_EQ(m_basicEventTriggerCount, 1);
  71. }
  72. TEST_F(ScheduledEventTests, TestRequeue)
  73. {
  74. m_testRequeue->Enqueue(AZ::TimeMs(200), true);
  75. constexpr AZ::TimeMs TotalIterationTimeMs = AZ::TimeMs{ 1050 };
  76. const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs();
  77. for (;;)
  78. {
  79. AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(1));
  80. m_eventSchedulerComponent->OnTick(0.0f, AZ::ScriptTimePoint());
  81. if (AZ::GetElapsedTimeMs() - startTimeMs > TotalIterationTimeMs)
  82. {
  83. break;
  84. }
  85. }
  86. // Use EXPECT_GT in case the OS oversleeps long enough to cause unexpected extra timer pops
  87. EXPECT_GT(m_requeuedEventTriggerCount, 1);
  88. }
  89. }