xref: /aosp_15_r20/external/openscreen/testing/util/task_util.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef TESTING_UTIL_TASK_UTIL_H_
6*3f982cf4SFabien Sanglard #define TESTING_UTIL_TASK_UTIL_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <thread>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
11*3f982cf4SFabien Sanglard #include "platform/api/time.h"
12*3f982cf4SFabien Sanglard #include "util/osp_logging.h"
13*3f982cf4SFabien Sanglard 
14*3f982cf4SFabien Sanglard namespace openscreen {
15*3f982cf4SFabien Sanglard 
16*3f982cf4SFabien Sanglard template <typename Cond>
17*3f982cf4SFabien Sanglard void WaitForCondition(Cond condition,
18*3f982cf4SFabien Sanglard                       Clock::duration delay = std::chrono::milliseconds(250),
19*3f982cf4SFabien Sanglard                       int max_attempts = 8) {
20*3f982cf4SFabien Sanglard   int attempts = 1;
21*3f982cf4SFabien Sanglard   do {
22*3f982cf4SFabien Sanglard     OSP_LOG_INFO << "--- Checking condition, attempt " << attempts << "/"
23*3f982cf4SFabien Sanglard                  << max_attempts;
24*3f982cf4SFabien Sanglard     if (condition()) {
25*3f982cf4SFabien Sanglard       break;
26*3f982cf4SFabien Sanglard     }
27*3f982cf4SFabien Sanglard     std::this_thread::sleep_for(delay);
28*3f982cf4SFabien Sanglard   } while (attempts++ < max_attempts);
29*3f982cf4SFabien Sanglard   ASSERT_TRUE(condition());
30*3f982cf4SFabien Sanglard }
31*3f982cf4SFabien Sanglard 
32*3f982cf4SFabien Sanglard }  // namespace openscreen
33*3f982cf4SFabien Sanglard 
34*3f982cf4SFabien Sanglard #endif  // TESTING_UTIL_TASK_UTIL_H_
35