This change adds utility functions to test::RunLoop for allowing to waiting. Bug: webrtc:381524905 Change-Id: Idb6bfd8f4b39c9908c95809768fd695fe63e2bbf Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/430681 Auto-Submit: Evan Shrubsole <eshr@webrtc.org> Commit-Queue: Evan Shrubsole <eshr@webrtc.org> Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org> Cr-Commit-Position: refs/heads/main@{#46432}
101 lines
3.0 KiB
C++
101 lines
3.0 KiB
C++
/*
|
|
* 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
|