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:
Tommi
2020-05-18 14:53:42 +02:00
committed by Commit Bot
parent 3e9068a6b4
commit 532cac526c
4 changed files with 72 additions and 13 deletions

View File

@ -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