| /* | |
| * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #include "test/run_loop.h" | |
| #include "api/environment/environment.h" | |
| #include "api/task_queue/task_queue_base.h" | |
| #include "api/units/time_delta.h" | |
| #include "api/units/timestamp.h" | |
| #include "test/create_test_environment.h" | |
| #include "test/gtest.h" | |
| namespace webrtc { | |
| TEST(RunLoopTest, TaskQueueOnThread) { | |
| test::RunLoop loop; | |
| EXPECT_EQ(TaskQueueBase::Current(), loop.task_queue()); | |
| EXPECT_TRUE(loop.task_queue()->IsCurrent()); | |
| } | |
| TEST(RunLoopTest, Flush) { | |
| test::RunLoop loop; | |
| int counter = 0; | |
| loop.PostTask([&counter]() { ++counter; }); | |
| EXPECT_EQ(counter, 0); | |
| loop.Flush(); | |
| EXPECT_EQ(counter, 1); | |
| } | |
| TEST(RunLoopTest, Delayed) { | |
| test::RunLoop loop; | |
| bool ran = false; | |
| loop.task_queue()->PostDelayedTask( | |
| [&ran, &loop]() { | |
| ran = true; | |
| loop.Quit(); | |
| }, | |
| TimeDelta::Millis(100)); | |
| loop.Flush(); | |
| EXPECT_FALSE(ran); | |
| loop.Run(); | |
| EXPECT_TRUE(ran); | |
| } | |
| TEST(RunLoopTest, PostAndQuit) { | |
| test::RunLoop loop; | |
| bool ran = false; | |
| loop.PostTask([&ran, &loop]() { | |
| ran = true; | |
| loop.Quit(); | |
| }); | |
| loop.Run(); | |
| EXPECT_TRUE(ran); | |
| } | |
| TEST(RunLoopTest, RunForWaitsForMaxWaitDurationIfNoQuit) { | |
| Environment env = CreateTestEnvironment(); | |
| test::RunLoop loop; | |
| Timestamp start = env.clock().CurrentTime(); | |
| loop.RunFor(TimeDelta::Millis(20)); | |
| EXPECT_GE(env.clock().CurrentTime() - start, TimeDelta::Millis(19)); | |
| } | |
| TEST(RunLoopTest, RunForQuitsEarlyIfQuitCalled) { | |
| Environment env = CreateTestEnvironment(); | |
| test::RunLoop loop; | |
| Timestamp start = env.clock().CurrentTime(); | |
| loop.task_queue()->PostDelayedHighPrecisionTask(loop.QuitClosure(), | |
| TimeDelta::Millis(10)); | |
| loop.RunFor(TimeDelta::Millis(20)); | |
| EXPECT_LE(env.clock().CurrentTime() - start, TimeDelta::Millis(11)); | |
| } | |
| TEST(RunLoopTest, RunForQuitsEarlyAndCancelsQuitCalls) { | |
| Environment env = CreateTestEnvironment(); | |
| test::RunLoop loop; | |
| Timestamp start = env.clock().CurrentTime(); | |
| loop.task_queue()->PostDelayedHighPrecisionTask(loop.QuitClosure(), | |
| TimeDelta::Millis(10)); | |
| loop.RunFor(TimeDelta::Millis(20)); | |
| EXPECT_LE(env.clock().CurrentTime() - start, TimeDelta::Millis(11)); | |
| Timestamp seconds_task_start = env.clock().CurrentTime(); | |
| loop.task_queue()->PostDelayedHighPrecisionTask(loop.QuitClosure(), | |
| TimeDelta::Millis(100)); | |
| loop.Run(); | |
| // If the old `RunFor` causes the loop to quit then this will be much shorter | |
| // than 100ms. | |
| EXPECT_GE(env.clock().CurrentTime() - seconds_task_start, | |
| TimeDelta::Millis(99)); | |
| } | |
| } // namespace webrtc |