StatsEndToEndTest.TestReceivedRtpPacketStats: Fix flaky test.

Add PendingTaskSafetyFlag to avoid use after free.

Bug: webrtc:13379
Change-Id: Ia5e97d3798d2d25fb785944fd18de6775e1d65a9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/237501
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35335}
This commit is contained in:
Asa Persson 2021-11-10 19:30:14 +01:00 committed by WebRTC LUCI CQ
parent c694270149
commit c86e1c2e70

View File

@ -411,27 +411,29 @@ TEST_F(StatsEndToEndTest, TimingFramesAreReported) {
TEST_F(StatsEndToEndTest, TestReceivedRtpPacketStats) {
static const size_t kNumRtpPacketsToSend = 5;
class ReceivedRtpStatsObserver : public test::EndToEndTest,
public QueuedTask {
class ReceivedRtpStatsObserver : public test::EndToEndTest {
public:
ReceivedRtpStatsObserver()
: EndToEndTest(kDefaultTimeoutMs),
receive_stream_(nullptr),
sent_rtp_(0) {}
explicit ReceivedRtpStatsObserver(TaskQueueBase* task_queue)
: EndToEndTest(kDefaultTimeoutMs), task_queue_(task_queue) {}
private:
void OnVideoStreamsCreated(
VideoSendStream* send_stream,
const std::vector<VideoReceiveStream*>& receive_streams) override {
receive_stream_ = receive_streams[0];
task_queue_ = TaskQueueBase::Current();
EXPECT_TRUE(task_queue_ != nullptr);
}
void OnStreamsStopped() override { task_safety_flag_->SetNotAlive(); }
Action OnSendRtp(const uint8_t* packet, size_t length) override {
if (sent_rtp_ >= kNumRtpPacketsToSend) {
// Need to check the stats on the correct thread.
task_queue_->PostTask(std::unique_ptr<QueuedTask>(this));
task_queue_->PostTask(ToQueuedTask(task_safety_flag_, [this]() {
VideoReceiveStream::Stats stats = receive_stream_->GetStats();
if (kNumRtpPacketsToSend == stats.rtp_stats.packet_counter.packets) {
observation_complete_.Set();
}
}));
return DROP_PACKET;
}
++sent_rtp_;
@ -443,18 +445,12 @@ TEST_F(StatsEndToEndTest, TestReceivedRtpPacketStats) {
<< "Timed out while verifying number of received RTP packets.";
}
bool Run() override {
VideoReceiveStream::Stats stats = receive_stream_->GetStats();
if (kNumRtpPacketsToSend == stats.rtp_stats.packet_counter.packets) {
observation_complete_.Set();
}
return false;
}
VideoReceiveStream* receive_stream_;
uint32_t sent_rtp_;
TaskQueueBase* task_queue_ = nullptr;
} test;
VideoReceiveStream* receive_stream_ = nullptr;
uint32_t sent_rtp_ = 0;
TaskQueueBase* const task_queue_;
rtc::scoped_refptr<PendingTaskSafetyFlag> task_safety_flag_ =
PendingTaskSafetyFlag::CreateDetached();
} test(task_queue());
RunBaseTest(&test);
}