1010#include < userver/components/run.hpp>
1111#include < userver/components/statistics_storage.hpp>
1212#include < userver/engine/deadline.hpp>
13+ #include < userver/engine/single_consumer_event.hpp>
1314#include < userver/engine/sleep.hpp>
1415#include < userver/testsuite/testsuite_support.hpp>
1516#include < userver/utest/utest.hpp>
@@ -19,6 +20,8 @@ USERVER_NAMESPACE_BEGIN
1920
2021namespace {
2122
23+ engine::SingleConsumerEvent checked_metrics_before_update;
24+
2225const auto kStaticConfig = tests::MergeYaml(tests::kMinimalStaticConfig , R"(
2326components_manager:
2427 components:
@@ -47,8 +50,9 @@ class ToyCache final : public components::CachingComponentBase<int> {
4750 const std::chrono::system_clock::time_point& /* now*/ ,
4851 cache::UpdateStatisticsScope& stats_scope
4952 ) override {
50- // Simulate a 3-second update.
51- engine::SleepFor (std::chrono::seconds (3 ));
53+ // Wait until the checker component checks metrics at least once.
54+ const bool wait_succeeded = checked_metrics_before_update.WaitForEventFor (utest::kMaxTestWaitTime );
55+ EXPECT_TRUE (wait_succeeded) << " Timed out waiting for metrics checker" ;
5256
5357 // Complete successfully with size 10.
5458 Set (10 );
@@ -98,6 +102,9 @@ class MetricsChecker final : public components::ComponentBase {
98102 cache_size_seen = true ;
99103 }
100104
105+ // Signal to the cache that we checked the metrics state.
106+ checked_metrics_before_update.Send ();
107+
101108 // If both metrics are set, we're done.
102109 if (cache_age_seen && cache_size_seen) {
103110 break ;
@@ -115,6 +122,8 @@ class CacheMetricsInitializationTest : public ComponentList {};
115122} // namespace
116123
117124TEST_F (CacheMetricsInitializationTest, MetricsNotWrittenBeforeInitialization) {
125+ checked_metrics_before_update.Reset ();
126+
118127 components::RunOnce (
119128 components::InMemoryConfig{kStaticConfig },
120129 components::MinimalComponentList ()
0 commit comments