Fixes for flexfec crash in scenario tests.

Bug: webrtc:9510
Change-Id: I39bb4ed9afc4837f88f0db798495f34b685f4c24
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/142232
Reviewed-by: Jonas Olsson <jonasolsson@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28309}
diff --git a/test/scenario/video_stream.cc b/test/scenario/video_stream.cc
index c516ddf..b7324bd 100644
--- a/test/scenario/video_stream.cc
+++ b/test/scenario/video_stream.cc
@@ -540,7 +540,10 @@
       flexfec.protected_media_ssrcs = send_stream->rtx_ssrcs_;
       flexfec.local_ssrc = recv_config.rtp.local_ssrc;
       receiver_->ssrc_media_types_[flexfec.remote_ssrc] = MediaType::VIDEO;
-      flecfec_stream_ = receiver_->call_->CreateFlexfecReceiveStream(flexfec);
+
+      receiver_->SendTask([this, &flexfec] {
+        flecfec_stream_ = receiver_->call_->CreateFlexfecReceiveStream(flexfec);
+      });
     }
     receiver_->ssrc_media_types_[recv_config.rtp.remote_ssrc] =
         MediaType::VIDEO;
diff --git a/test/scenario/video_stream_unittest.cc b/test/scenario/video_stream_unittest.cc
index 84384d0..ebd9d62 100644
--- a/test/scenario/video_stream_unittest.cc
+++ b/test/scenario/video_stream_unittest.cc
@@ -21,8 +21,7 @@
 using CodecImpl = VideoStreamConfig::Encoder::Implementation;
 }  // namespace
 
-// TODO(srte): Enable this after resolving flakiness issues.
-TEST(VideoStreamTest, DISABLED_ReceivesFramesFromFileBasedStreams) {
+TEST(VideoStreamTest, ReceivesFramesFromFileBasedStreams) {
   TimeDelta kRunTime = TimeDelta::ms(500);
   std::vector<int> kFrameRates = {15, 30};
   std::deque<std::atomic<int>> frame_counts(2);
@@ -68,7 +67,6 @@
   EXPECT_GE(frame_counts[1], expected_counts[1]);
 }
 
-// TODO(srte): Enable this after resolving flakiness issues.
 TEST(VideoStreamTest, RecievesVp8SimulcastFrames) {
   TimeDelta kRunTime = TimeDelta::ms(500);
   int kFrameRate = 30;
@@ -115,5 +113,38 @@
   EXPECT_GE(frame_counts[1], kExpectedCount);
   EXPECT_GE(frame_counts[2], kExpectedCount);
 }
+
+TEST(VideoStreamTest, SendsFecWithUlpFec) {
+  Scenario s;
+  auto route =
+      s.CreateRoutes(s.CreateClient("caller", CallClientConfig()),
+                     {s.CreateSimulationNode([](NetworkSimulationConfig* c) {
+                       c->loss_rate = 0.1;
+                     })},
+                     s.CreateClient("callee", CallClientConfig()),
+                     {s.CreateSimulationNode(NetworkSimulationConfig())});
+  auto video = s.CreateVideoStream(route->forward(), [&](VideoStreamConfig* c) {
+    c->stream.use_ulpfec = true;
+  });
+  s.RunFor(TimeDelta::seconds(5));
+  VideoSendStream::Stats video_stats = video->send()->GetStats();
+  EXPECT_GT(video_stats.substreams.begin()->second.rtp_stats.fec.packets, 0u);
+}
+TEST(VideoStreamTest, SendsFecWithFlexFec) {
+  Scenario s;
+  auto route =
+      s.CreateRoutes(s.CreateClient("caller", CallClientConfig()),
+                     {s.CreateSimulationNode([](NetworkSimulationConfig* c) {
+                       c->loss_rate = 0.1;
+                     })},
+                     s.CreateClient("callee", CallClientConfig()),
+                     {s.CreateSimulationNode(NetworkSimulationConfig())});
+  auto video = s.CreateVideoStream(route->forward(), [&](VideoStreamConfig* c) {
+    c->stream.use_flexfec = true;
+  });
+  s.RunFor(TimeDelta::seconds(5));
+  VideoSendStream::Stats video_stats = video->send()->GetStats();
+  EXPECT_GT(video_stats.substreams.begin()->second.rtp_stats.fec.packets, 0u);
+}
 }  // namespace test
 }  // namespace webrtc