Add support for injecting Clock to RepeatingTaskHandle.
This will improve support for tests that use Clock as well as offer a way to remove use of Sleep() in the tests. Bug: none Change-Id: I25fd0c6fc1b52ec0c917e56fae6807b136213d8d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175566 Commit-Queue: Tommi <tommi@webrtc.org> Reviewed-by: Sebastian Jansson <srte@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31305}
This commit is contained in:
@ -44,6 +44,21 @@ class MockClosure {
|
||||
MOCK_METHOD(void, Delete, ());
|
||||
};
|
||||
|
||||
class MockTaskQueue : public TaskQueueBase {
|
||||
public:
|
||||
MockTaskQueue() : task_queue_setter_(this) {}
|
||||
|
||||
MOCK_METHOD(void, Delete, (), (override));
|
||||
MOCK_METHOD(void, PostTask, (std::unique_ptr<QueuedTask> task), (override));
|
||||
MOCK_METHOD(void,
|
||||
PostDelayedTask,
|
||||
(std::unique_ptr<QueuedTask> task, uint32_t milliseconds),
|
||||
(override));
|
||||
|
||||
private:
|
||||
CurrentTaskQueueSetter task_queue_setter_;
|
||||
};
|
||||
|
||||
class MoveOnlyClosure {
|
||||
public:
|
||||
explicit MoveOnlyClosure(MockClosure* mock) : mock_(mock) {}
|
||||
@ -228,4 +243,37 @@ TEST(RepeatingTaskTest, Example) {
|
||||
// task queue destruction and running the desctructor closure.
|
||||
}
|
||||
|
||||
TEST(RepeatingTaskTest, ClockIntegration) {
|
||||
std::unique_ptr<QueuedTask> delayed_task;
|
||||
uint32_t expected_ms = 0;
|
||||
SimulatedClock clock(Timestamp::Millis(0));
|
||||
|
||||
NiceMock<MockTaskQueue> task_queue;
|
||||
ON_CALL(task_queue, PostDelayedTask)
|
||||
.WillByDefault(
|
||||
Invoke([&delayed_task, &expected_ms](std::unique_ptr<QueuedTask> task,
|
||||
uint32_t milliseconds) {
|
||||
EXPECT_EQ(milliseconds, expected_ms);
|
||||
delayed_task = std::move(task);
|
||||
}));
|
||||
|
||||
expected_ms = 100;
|
||||
RepeatingTaskHandle handle = RepeatingTaskHandle::DelayedStart(
|
||||
&task_queue, TimeDelta::Millis(100),
|
||||
[&clock]() {
|
||||
EXPECT_EQ(Timestamp::Millis(100), clock.CurrentTime());
|
||||
// Simulate work happening for 10ms.
|
||||
clock.AdvanceTimeMilliseconds(10);
|
||||
return TimeDelta::Millis(100);
|
||||
},
|
||||
&clock);
|
||||
|
||||
clock.AdvanceTimeMilliseconds(100);
|
||||
QueuedTask* task_to_run = delayed_task.release();
|
||||
expected_ms = 90;
|
||||
EXPECT_FALSE(task_to_run->Run());
|
||||
EXPECT_NE(nullptr, delayed_task.get());
|
||||
handle.Stop();
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user