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}
diff --git a/video/end_to_end_tests/stats_tests.cc b/video/end_to_end_tests/stats_tests.cc
index 9e8a9b6..cc6ed69 100644
--- a/video/end_to_end_tests/stats_tests.cc
+++ b/video/end_to_end_tests/stats_tests.cc
@@ -411,27 +411,29 @@
 
 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 @@
           << "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);
 }