Implement support for Chrome task origin tracing. #3.5/4

This CL migrates unit tests to the new TaskQueueBase interface.

Bug: chromium:1416199
Change-Id: Ic15c694b28eb67450ac99fdd56754de1246a4d95
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/295621
Commit-Queue: Markus Handell <handellm@webrtc.org>
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39434}
This commit is contained in:
Markus Handell 2023-03-01 10:13:28 +01:00 committed by WebRTC LUCI CQ
parent f6afb3fd57
commit a1ceae206b
14 changed files with 129 additions and 102 deletions

View file

@ -20,15 +20,22 @@ namespace webrtc {
class MockTaskQueueBase : public TaskQueueBase { class MockTaskQueueBase : public TaskQueueBase {
public: public:
using TaskQueueBase::PostDelayedTaskTraits;
using TaskQueueBase::PostTaskTraits;
MOCK_METHOD(void, Delete, (), (override)); MOCK_METHOD(void, Delete, (), (override));
MOCK_METHOD(void, PostTask, (absl::AnyInvocable<void() &&>), (override));
MOCK_METHOD(void, MOCK_METHOD(void,
PostDelayedTask, PostTaskImpl,
(absl::AnyInvocable<void() &&>, TimeDelta), (absl::AnyInvocable<void() &&>,
const PostTaskTraits&,
const Location&),
(override)); (override));
MOCK_METHOD(void, MOCK_METHOD(void,
PostDelayedHighPrecisionTask, PostDelayedTaskImpl,
(absl::AnyInvocable<void() &&>, TimeDelta), (absl::AnyInvocable<void() &&>,
TimeDelta,
const PostDelayedTaskTraits&,
const Location&),
(override)); (override));
}; };

View file

@ -40,7 +40,9 @@ struct FakeAsyncAudioProcessingHelper {
FakeTaskQueue() = default; FakeTaskQueue() = default;
void Delete() override { delete this; } void Delete() override { delete this; }
void PostTask(absl::AnyInvocable<void() &&> task) override { void PostTaskImpl(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& /*traits*/,
const Location& /*location*/) override {
std::move(task)(); std::move(task)();
} }
}; };

View file

@ -14,6 +14,7 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h" #include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h" #include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/call/transport.h" #include "api/call/transport.h"
#include "api/task_queue/task_queue_base.h"
#include "api/task_queue/task_queue_factory.h" #include "api/task_queue/task_queue_factory.h"
#include "audio/voip/test/mock_task_queue.h" #include "audio/voip/test/mock_task_queue.h"
#include "modules/audio_mixer/audio_mixer_impl.h" #include "modules/audio_mixer/audio_mixer_impl.h"
@ -31,6 +32,7 @@ using ::testing::Invoke;
using ::testing::NiceMock; using ::testing::NiceMock;
using ::testing::Return; using ::testing::Return;
using ::testing::Unused; using ::testing::Unused;
using ::testing::WithArg;
constexpr uint64_t kStartTime = 123456789; constexpr uint64_t kStartTime = 123456789;
constexpr uint32_t kLocalSsrc = 0xdeadc0de; constexpr uint32_t kLocalSsrc = 0xdeadc0de;
@ -49,9 +51,9 @@ class AudioChannelTest : public ::testing::Test {
decoder_factory_ = CreateBuiltinAudioDecoderFactory(); decoder_factory_ = CreateBuiltinAudioDecoderFactory();
// By default, run the queued task immediately. // By default, run the queued task immediately.
ON_CALL(task_queue_, PostTask) ON_CALL(task_queue_, PostTaskImpl)
.WillByDefault( .WillByDefault(WithArg<0>(
[](absl::AnyInvocable<void() &&> task) { std::move(task)(); }); [](absl::AnyInvocable<void() &&> task) { std::move(task)(); }));
} }
void SetUp() override { audio_channel_ = CreateAudioChannel(kLocalSsrc); } void SetUp() override { audio_channel_ = CreateAudioChannel(kLocalSsrc); }

View file

@ -20,6 +20,7 @@
namespace dcsctp { namespace dcsctp {
namespace { namespace {
using ::testing::_; using ::testing::_;
using ::testing::Field;
using ::testing::MockFunction; using ::testing::MockFunction;
using ::testing::NiceMock; using ::testing::NiceMock;
@ -118,7 +119,14 @@ TEST_F(TaskQueueTimeoutTest, KilledBeforeExpired) {
TEST(TaskQueueTimeoutWithMockTaskQueueTest, CanSetTimeoutPrecisionToLow) { TEST(TaskQueueTimeoutWithMockTaskQueueTest, CanSetTimeoutPrecisionToLow) {
NiceMock<webrtc::MockTaskQueueBase> mock_task_queue; NiceMock<webrtc::MockTaskQueueBase> mock_task_queue;
EXPECT_CALL(mock_task_queue, PostDelayedTask(_, _)); EXPECT_CALL(
mock_task_queue,
PostDelayedTaskImpl(
_, _,
Field(
&webrtc::MockTaskQueueBase::PostDelayedTaskTraits::high_precision,
false),
_));
TaskQueueTimeoutFactory factory( TaskQueueTimeoutFactory factory(
mock_task_queue, []() { return TimeMs(1337); }, mock_task_queue, []() { return TimeMs(1337); },
[](TimeoutID timeout_id) {}); [](TimeoutID timeout_id) {});
@ -129,7 +137,14 @@ TEST(TaskQueueTimeoutWithMockTaskQueueTest, CanSetTimeoutPrecisionToLow) {
TEST(TaskQueueTimeoutWithMockTaskQueueTest, CanSetTimeoutPrecisionToHigh) { TEST(TaskQueueTimeoutWithMockTaskQueueTest, CanSetTimeoutPrecisionToHigh) {
NiceMock<webrtc::MockTaskQueueBase> mock_task_queue; NiceMock<webrtc::MockTaskQueueBase> mock_task_queue;
EXPECT_CALL(mock_task_queue, PostDelayedHighPrecisionTask(_, _)); EXPECT_CALL(
mock_task_queue,
PostDelayedTaskImpl(
_, _,
Field(
&webrtc::MockTaskQueueBase::PostDelayedTaskTraits::high_precision,
true),
_));
TaskQueueTimeoutFactory factory( TaskQueueTimeoutFactory factory(
mock_task_queue, []() { return TimeMs(1337); }, mock_task_queue, []() { return TimeMs(1337); },
[](TimeoutID timeout_id) {}); [](TimeoutID timeout_id) {});
@ -140,7 +155,14 @@ TEST(TaskQueueTimeoutWithMockTaskQueueTest, CanSetTimeoutPrecisionToHigh) {
TEST(TaskQueueTimeoutWithMockTaskQueueTest, TimeoutPrecisionIsLowByDefault) { TEST(TaskQueueTimeoutWithMockTaskQueueTest, TimeoutPrecisionIsLowByDefault) {
NiceMock<webrtc::MockTaskQueueBase> mock_task_queue; NiceMock<webrtc::MockTaskQueueBase> mock_task_queue;
EXPECT_CALL(mock_task_queue, PostDelayedTask(_, _)); EXPECT_CALL(
mock_task_queue,
PostDelayedTaskImpl(
_, _,
Field(
&webrtc::MockTaskQueueBase::PostDelayedTaskTraits::high_precision,
false),
_));
TaskQueueTimeoutFactory factory( TaskQueueTimeoutFactory factory(
mock_task_queue, []() { return TimeMs(1337); }, mock_task_queue, []() { return TimeMs(1337); },
[](TimeoutID timeout_id) {}); [](TimeoutID timeout_id) {});

View file

@ -36,6 +36,7 @@ if (rtc_include_tests) {
"..:rtc_task_queue", "..:rtc_task_queue",
"..:task_queue_for_test", "..:task_queue_for_test",
"../../api/task_queue", "../../api/task_queue",
"../../api/task_queue/test:mock_task_queue_base",
"../../api/units:time_delta", "../../api/units:time_delta",
"../../api/units:timestamp", "../../api/units:timestamp",
"../../system_wrappers:system_wrappers", "../../system_wrappers:system_wrappers",

View file

@ -15,6 +15,7 @@
#include "absl/functional/any_invocable.h" #include "absl/functional/any_invocable.h"
#include "api/task_queue/task_queue_base.h" #include "api/task_queue/task_queue_base.h"
#include "api/task_queue/test/mock_task_queue_base.h"
#include "api/units/time_delta.h" #include "api/units/time_delta.h"
#include "api/units/timestamp.h" #include "api/units/timestamp.h"
#include "rtc_base/event.h" #include "rtc_base/event.h"
@ -32,6 +33,7 @@ using ::testing::Invoke;
using ::testing::MockFunction; using ::testing::MockFunction;
using ::testing::NiceMock; using ::testing::NiceMock;
using ::testing::Return; using ::testing::Return;
using ::testing::WithArg;
constexpr TimeDelta kTimeout = TimeDelta::Millis(1000); constexpr TimeDelta kTimeout = TimeDelta::Millis(1000);
@ -41,21 +43,10 @@ class MockClosure {
MOCK_METHOD(void, Delete, ()); MOCK_METHOD(void, Delete, ());
}; };
class MockTaskQueue : public TaskQueueBase { class MockTaskQueue : public MockTaskQueueBase {
public: public:
MockTaskQueue() : task_queue_setter_(this) {} MockTaskQueue() : task_queue_setter_(this) {}
MOCK_METHOD(void, Delete, (), (override));
MOCK_METHOD(void, PostTask, (absl::AnyInvocable<void() &&>), (override));
MOCK_METHOD(void,
PostDelayedTask,
(absl::AnyInvocable<void() &&>, TimeDelta),
(override));
MOCK_METHOD(void,
PostDelayedHighPrecisionTask,
(absl::AnyInvocable<void() &&>, TimeDelta),
(override));
private: private:
CurrentTaskQueueSetter task_queue_setter_; CurrentTaskQueueSetter task_queue_setter_;
}; };
@ -67,23 +58,22 @@ class FakeTaskQueue : public TaskQueueBase {
void Delete() override {} void Delete() override {}
void PostTask(absl::AnyInvocable<void() &&> task) override { void PostTaskImpl(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& /*traits*/,
const Location& /*location*/) override {
last_task_ = std::move(task); last_task_ = std::move(task);
last_precision_ = absl::nullopt; last_precision_ = absl::nullopt;
last_delay_ = TimeDelta::Zero(); last_delay_ = TimeDelta::Zero();
} }
void PostDelayedTask(absl::AnyInvocable<void() &&> task, void PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override { TimeDelta delay,
const PostDelayedTaskTraits& traits,
const Location& /*location*/) override {
last_task_ = std::move(task); last_task_ = std::move(task);
last_precision_ = TaskQueueBase::DelayPrecision::kLow; last_precision_ = traits.high_precision
last_delay_ = delay; ? TaskQueueBase::DelayPrecision::kHigh
} : TaskQueueBase::DelayPrecision::kLow;
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override {
last_task_ = std::move(task);
last_precision_ = TaskQueueBase::DelayPrecision::kHigh;
last_delay_ = delay; last_delay_ = delay;
} }
@ -339,8 +329,10 @@ TEST(RepeatingTaskTest, ClockIntegration) {
SimulatedClock clock(Timestamp::Zero()); SimulatedClock clock(Timestamp::Zero());
NiceMock<MockTaskQueue> task_queue; NiceMock<MockTaskQueue> task_queue;
ON_CALL(task_queue, PostDelayedTask) ON_CALL(task_queue, PostDelayedTaskImpl)
.WillByDefault([&](absl::AnyInvocable<void() &&> task, TimeDelta delay) { .WillByDefault([&](absl::AnyInvocable<void() &&> task, TimeDelta delay,
const MockTaskQueue::PostDelayedTaskTraits&,
const Location&) {
EXPECT_EQ(delay, expected_delay); EXPECT_EQ(delay, expected_delay);
delayed_task = std::move(task); delayed_task = std::move(task);
}); });
@ -368,10 +360,10 @@ TEST(RepeatingTaskTest, CanBeStoppedAfterTaskQueueDeletedTheRepeatingTask) {
absl::AnyInvocable<void() &&> repeating_task; absl::AnyInvocable<void() &&> repeating_task;
MockTaskQueue task_queue; MockTaskQueue task_queue;
EXPECT_CALL(task_queue, PostDelayedTask) EXPECT_CALL(task_queue, PostDelayedTaskImpl)
.WillOnce([&](absl::AnyInvocable<void() &&> task, TimeDelta delay) { .WillOnce(WithArg<0>([&](absl::AnyInvocable<void() &&> task) {
repeating_task = std::move(task); repeating_task = std::move(task);
}); }));
RepeatingTaskHandle handle = RepeatingTaskHandle handle =
RepeatingTaskHandle::DelayedStart(&task_queue, TimeDelta::Millis(100), RepeatingTaskHandle::DelayedStart(&task_queue, TimeDelta::Millis(100),

View file

@ -33,11 +33,13 @@ class FakeTaskQueue : public webrtc::TaskQueueBase {
FakeTaskQueue() : task_queue_setter_(this) {} FakeTaskQueue() : task_queue_setter_(this) {}
void Delete() override {} void Delete() override {}
void PostTask(absl::AnyInvocable<void() &&> task) override {} void PostTaskImpl(absl::AnyInvocable<void() &&> task,
void PostDelayedTask(absl::AnyInvocable<void() &&> task, const PostTaskTraits& traits,
webrtc::TimeDelta delay) override {} const webrtc::Location& location) override {}
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task, void PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
webrtc::TimeDelta delay) override {} webrtc::TimeDelta delay,
const PostDelayedTaskTraits& traits,
const webrtc::Location& location) override {}
private: private:
CurrentTaskQueueSetter task_queue_setter_; CurrentTaskQueueSetter task_queue_setter_;

View file

@ -33,23 +33,24 @@ class ExternalTimeController::TaskQueueWrapper : public TaskQueueBase {
std::unique_ptr<TaskQueueBase, TaskQueueDeleter> base) std::unique_ptr<TaskQueueBase, TaskQueueDeleter> base)
: parent_(parent), base_(std::move(base)) {} : parent_(parent), base_(std::move(base)) {}
void PostTask(absl::AnyInvocable<void() &&> task) override { void PostTaskImpl(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& traits,
const Location& location) override {
parent_->UpdateTime(); parent_->UpdateTime();
base_->PostTask(TaskWrapper(std::move(task))); base_->PostTask(TaskWrapper(std::move(task)));
parent_->ScheduleNext(); parent_->ScheduleNext();
} }
void PostDelayedTask(absl::AnyInvocable<void() &&> task, void PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override { TimeDelta delay,
parent_->UpdateTime(); const PostDelayedTaskTraits& traits,
base_->PostDelayedTask(TaskWrapper(std::move(task)), delay); const Location& location) override {
parent_->ScheduleNext();
}
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override {
parent_->UpdateTime(); parent_->UpdateTime();
if (traits.high_precision) {
base_->PostDelayedHighPrecisionTask(TaskWrapper(std::move(task)), delay); base_->PostDelayedHighPrecisionTask(TaskWrapper(std::move(task)), delay);
} else {
base_->PostDelayedTask(TaskWrapper(std::move(task)), delay);
}
parent_->ScheduleNext(); parent_->ScheduleNext();
} }

View file

@ -66,20 +66,19 @@ void SimulatedTaskQueue::RunReady(Timestamp at_time) {
} }
} }
void SimulatedTaskQueue::PostTask(absl::AnyInvocable<void() &&> task) { void SimulatedTaskQueue::PostTaskImpl(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& /*traits*/,
const Location& /*location*/) {
MutexLock lock(&lock_); MutexLock lock(&lock_);
ready_tasks_.push_back(std::move(task)); ready_tasks_.push_back(std::move(task));
next_run_time_ = Timestamp::MinusInfinity(); next_run_time_ = Timestamp::MinusInfinity();
} }
void SimulatedTaskQueue::PostDelayedTask(absl::AnyInvocable<void() &&> task, void SimulatedTaskQueue::PostDelayedTaskImpl(
TimeDelta delay) {
PostDelayedHighPrecisionTask(std::move(task), delay);
}
void SimulatedTaskQueue::PostDelayedHighPrecisionTask(
absl::AnyInvocable<void() &&> task, absl::AnyInvocable<void() &&> task,
TimeDelta delay) { TimeDelta delay,
const PostDelayedTaskTraits& /*traits*/,
const Location& /*location*/) {
MutexLock lock(&lock_); MutexLock lock(&lock_);
Timestamp target_time = handler_->CurrentTime() + delay; Timestamp target_time = handler_->CurrentTime() + delay;
delayed_tasks_[target_time].push_back(std::move(task)); delayed_tasks_[target_time].push_back(std::move(task));

View file

@ -40,11 +40,13 @@ class SimulatedTaskQueue : public TaskQueueBase,
// TaskQueueBase interface // TaskQueueBase interface
void Delete() override; void Delete() override;
void PostTask(absl::AnyInvocable<void() &&> task) override; void PostTaskImpl(absl::AnyInvocable<void() &&> task,
void PostDelayedTask(absl::AnyInvocable<void() &&> task, const PostTaskTraits& traits,
TimeDelta delay) override; const Location& location) override;
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task, void PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override; TimeDelta delay,
const PostDelayedTaskTraits& traits,
const Location& location) override;
private: private:
sim_time_impl::SimulatedTimeControllerImpl* const handler_; sim_time_impl::SimulatedTimeControllerImpl* const handler_;

View file

@ -77,24 +77,19 @@ void SimulatedThread::BlockingCall(rtc::FunctionView<void()> functor) {
} }
} }
void SimulatedThread::PostTask(absl::AnyInvocable<void() &&> task) { void SimulatedThread::PostTaskImpl(absl::AnyInvocable<void() &&> task,
rtc::Thread::PostTask(std::move(task)); const PostTaskTraits& traits,
const Location& location) {
rtc::Thread::PostTaskImpl(std::move(task), traits, location);
MutexLock lock(&lock_); MutexLock lock(&lock_);
next_run_time_ = Timestamp::MinusInfinity(); next_run_time_ = Timestamp::MinusInfinity();
} }
void SimulatedThread::PostDelayedTask(absl::AnyInvocable<void() &&> task, void SimulatedThread::PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
TimeDelta delay) { TimeDelta delay,
rtc::Thread::PostDelayedTask(std::move(task), delay); const PostDelayedTaskTraits& traits,
MutexLock lock(&lock_); const Location& location) {
next_run_time_ = rtc::Thread::PostDelayedTaskImpl(std::move(task), delay, traits, location);
std::min(next_run_time_, Timestamp::Millis(rtc::TimeMillis()) + delay);
}
void SimulatedThread::PostDelayedHighPrecisionTask(
absl::AnyInvocable<void() &&> task,
TimeDelta delay) {
rtc::Thread::PostDelayedHighPrecisionTask(std::move(task), delay);
MutexLock lock(&lock_); MutexLock lock(&lock_);
next_run_time_ = next_run_time_ =
std::min(next_run_time_, Timestamp::Millis(rtc::TimeMillis()) + delay); std::min(next_run_time_, Timestamp::Millis(rtc::TimeMillis()) + delay);

View file

@ -37,11 +37,13 @@ class SimulatedThread : public rtc::Thread,
// Thread interface // Thread interface
void BlockingCall(rtc::FunctionView<void()> functor) override; void BlockingCall(rtc::FunctionView<void()> functor) override;
void PostTask(absl::AnyInvocable<void() &&> task) override; void PostTaskImpl(absl::AnyInvocable<void() &&> task,
void PostDelayedTask(absl::AnyInvocable<void() &&> task, const PostTaskTraits& traits,
TimeDelta delay) override; const Location& location) override;
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task, void PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override; TimeDelta delay,
const PostDelayedTaskTraits& traits,
const Location& location) override;
void Stop() override; void Stop() override;

View file

@ -106,15 +106,15 @@ class TokenTaskQueue : public TaskQueueBase {
using CurrentTaskQueueSetter = TaskQueueBase::CurrentTaskQueueSetter; using CurrentTaskQueueSetter = TaskQueueBase::CurrentTaskQueueSetter;
void Delete() override { RTC_DCHECK_NOTREACHED(); } void Delete() override { RTC_DCHECK_NOTREACHED(); }
void PostTask(absl::AnyInvocable<void() &&> /*task*/) override { void PostTaskImpl(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& traits,
const Location& location) override {
RTC_DCHECK_NOTREACHED(); RTC_DCHECK_NOTREACHED();
} }
void PostDelayedTask(absl::AnyInvocable<void() &&> /*task*/, void PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
TimeDelta /*delay*/) override { TimeDelta delay,
RTC_DCHECK_NOTREACHED(); const PostDelayedTaskTraits& traits,
} const Location& location) override {
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> /*task*/,
TimeDelta /*delay*/) override {
RTC_DCHECK_NOTREACHED(); RTC_DCHECK_NOTREACHED();
} }
}; };

View file

@ -9220,15 +9220,15 @@ TEST(VideoStreamEncoderSimpleTest, CreateDestroy) {
private: private:
void Delete() override { delete this; } void Delete() override { delete this; }
void PostTask(absl::AnyInvocable<void() &&> task) override { void PostTaskImpl(absl::AnyInvocable<void() &&> task,
const PostTaskTraits& traits,
const Location& location) override {
// meh. // meh.
} }
void PostDelayedTask(absl::AnyInvocable<void() &&> task, void PostDelayedTaskImpl(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override { TimeDelta delay,
ASSERT_TRUE(false); const PostDelayedTaskTraits& traits,
} const Location& location) override {
void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task,
TimeDelta delay) override {
ADD_FAILURE(); ADD_FAILURE();
} }
}; };