Fix fake media engine to return header extensions when queried

Not a fix for the referenced bug, but discovered while working on it.

Bug: webrtc:383078466
Change-Id: I4b4933faa4f6bbf755d400f74a37834c976594e6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/396001
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#44871}
diff --git a/media/base/fake_media_engine.h b/media/base/fake_media_engine.h
index 9cb3dd4..5336846 100644
--- a/media/base/fake_media_engine.h
+++ b/media/base/fake_media_engine.h
@@ -331,7 +331,10 @@
   RtpParameters GetRtpSendParameters(uint32_t ssrc) const override {
     auto parameters_iterator = rtp_send_parameters_.find(ssrc);
     if (parameters_iterator != rtp_send_parameters_.end()) {
-      return parameters_iterator->second;
+      // Take header extensions from channel global, not iterated.
+      auto parameters = parameters_iterator->second;
+      parameters.header_extensions = send_extensions_;
+      return parameters;
     }
     return RtpParameters();
   }
diff --git a/pc/peer_connection_header_extension_unittest.cc b/pc/peer_connection_header_extension_unittest.cc
index def77de..5342b3b 100644
--- a/pc/peer_connection_header_extension_unittest.cc
+++ b/pc/peer_connection_header_extension_unittest.cc
@@ -44,12 +44,12 @@
 using ::testing::Combine;
 using ::testing::ElementsAre;
 using ::testing::Field;
+using ::testing::IsEmpty;
 using ::testing::Return;
 using ::testing::Values;
 
 class PeerConnectionHeaderExtensionTest
-    : public ::testing::TestWithParam<
-          std::tuple<webrtc::MediaType, SdpSemantics>> {
+    : public ::testing::TestWithParam<std::tuple<MediaType, SdpSemantics>> {
  protected:
   PeerConnectionHeaderExtensionTest()
       : socket_server_(CreateDefaultSocketServer()),
@@ -70,10 +70,10 @@
                  RtpTransceiverDirection::kSendRecv)}) {}
 
   std::unique_ptr<PeerConnectionWrapper> CreatePeerConnection(
-      webrtc::MediaType media_type,
+      MediaType media_type,
       std::optional<SdpSemantics> semantics) {
     auto media_engine = std::make_unique<FakeMediaEngine>();
-    if (media_type == webrtc::MediaType::AUDIO)
+    if (media_type == MediaType::AUDIO)
       media_engine->fake_voice_engine()->SetRtpHeaderExtensions(extensions_);
     else
       media_engine->fake_video_engine()->SetRtpHeaderExtensions(extensions_);
@@ -111,7 +111,7 @@
 };
 
 TEST_P(PeerConnectionHeaderExtensionTest, TransceiverOffersHeaderExtensions) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -124,7 +124,7 @@
 
 TEST_P(PeerConnectionHeaderExtensionTest,
        SenderReceiverCapabilitiesReturnNotStoppedExtensions) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   std::unique_ptr<PeerConnectionWrapper> wrapper =
@@ -144,7 +144,7 @@
 }
 
 TEST_P(PeerConnectionHeaderExtensionTest, OffersUnstoppedDefaultExtensions) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -163,7 +163,7 @@
 }
 
 TEST_P(PeerConnectionHeaderExtensionTest, OffersUnstoppedModifiedExtensions) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -187,7 +187,7 @@
 }
 
 TEST_P(PeerConnectionHeaderExtensionTest, AnswersUnstoppedModifiedExtensions) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -220,7 +220,7 @@
 }
 
 TEST_P(PeerConnectionHeaderExtensionTest, NegotiatedExtensionsAreAccessible) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -256,7 +256,7 @@
 }
 
 TEST_P(PeerConnectionHeaderExtensionTest, OfferedExtensionsArePerTransceiver) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -286,7 +286,7 @@
 }
 
 TEST_P(PeerConnectionHeaderExtensionTest, RemovalAfterRenegotiation) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -318,7 +318,7 @@
 
 TEST_P(PeerConnectionHeaderExtensionTest,
        StoppedByDefaultExtensionCanBeActivatedByRemoteSdp) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -353,7 +353,7 @@
 
 TEST_P(PeerConnectionHeaderExtensionTest,
        UnknownExtensionInRemoteOfferDoesNotShowUp) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -370,7 +370,7 @@
       "AD:7E:77:43:2A:29:EC:93\r\n"
       "a=ice-ufrag:6HHHdzzeIhkE0CKj\r\n"
       "a=ice-pwd:XYDGVpfvklQIEnZ6YnyLsAew\r\n";
-  if (media_type == webrtc::MediaType::AUDIO) {
+  if (media_type == MediaType::AUDIO) {
     sdp +=
         "m=audio 9 RTP/AVPF 111\r\n"
         "a=rtpmap:111 fake_audio_codec/8000\r\n";
@@ -407,7 +407,7 @@
 // of the API to only offer non-stopped extensions.
 TEST_P(PeerConnectionHeaderExtensionTest,
        SdpMungingAnswerWithoutApiUsageEnablesExtensions) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -424,7 +424,7 @@
       "AD:7E:77:43:2A:29:EC:93\r\n"
       "a=ice-ufrag:6HHHdzzeIhkE0CKj\r\n"
       "a=ice-pwd:XYDGVpfvklQIEnZ6YnyLsAew\r\n";
-  if (media_type == webrtc::MediaType::AUDIO) {
+  if (media_type == MediaType::AUDIO) {
     sdp +=
         "m=audio 9 RTP/AVPF 111\r\n"
         "a=rtpmap:111 fake_audio_codec/8000\r\n";
@@ -464,7 +464,7 @@
 
 TEST_P(PeerConnectionHeaderExtensionTest,
        SdpMungingOfferWithoutApiUsageEnablesExtensions) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -494,7 +494,7 @@
 }
 
 TEST_P(PeerConnectionHeaderExtensionTest, EnablingExtensionsAfterRemoteOffer) {
-  webrtc::MediaType media_type;
+  MediaType media_type;
   SdpSemantics semantics;
   std::tie(media_type, semantics) = GetParam();
   if (semantics != SdpSemantics::kUnifiedPlan)
@@ -511,7 +511,7 @@
       "AD:7E:77:43:2A:29:EC:93\r\n"
       "a=ice-ufrag:6HHHdzzeIhkE0CKj\r\n"
       "a=ice-pwd:XYDGVpfvklQIEnZ6YnyLsAew\r\n";
-  if (media_type == webrtc::MediaType::AUDIO) {
+  if (media_type == MediaType::AUDIO) {
     sdp +=
         "m=audio 9 RTP/AVPF 111\r\n"
         "a=rtpmap:111 fake_audio_codec/8000\r\n";
@@ -552,21 +552,54 @@
   EXPECT_EQ(extensions[0].id, 5);
 }
 
+TEST_P(PeerConnectionHeaderExtensionTest, SenderParametersReflectNegotiation) {
+  SdpSemantics semantics;
+  MediaType media_type;
+  std::tie(media_type, semantics) = GetParam();
+  if (semantics != SdpSemantics::kUnifiedPlan) {
+    GTEST_SKIP() << "This test only works with Unified Plan";
+  }
+  std::unique_ptr<PeerConnectionWrapper> pc1 =
+      CreatePeerConnection(media_type, semantics);
+  std::unique_ptr<PeerConnectionWrapper> pc2 =
+      CreatePeerConnection(media_type, semantics);
+  auto transceiver1 = pc1->AddTransceiver(media_type);
+  // Before connection, sender sender_parameters should be empty.
+  {
+    auto sender_parameters = pc1->pc()->GetSenders()[0]->GetParameters();
+    EXPECT_THAT(sender_parameters.header_extensions, IsEmpty());
+  }
+
+  auto offer = pc1->CreateOfferAndSetAsLocal(
+      PeerConnectionInterface::RTCOfferAnswerOptions());
+  pc2->SetRemoteDescription(std::move(offer));
+  auto answer = pc2->CreateAnswerAndSetAsLocal(
+      PeerConnectionInterface::RTCOfferAnswerOptions());
+  pc1->SetRemoteDescription(std::move(answer));
+  {
+    auto sender_parameters = pc1->pc()->GetSenders()[0]->GetParameters();
+    // We expect to see all send or sendrecv extensions from the answer.
+    EXPECT_THAT(sender_parameters.header_extensions,
+                UnorderedElementsAre(Field(&RtpExtension::uri, "uri4"),
+                                     Field(&RtpExtension::uri, "uri2"),
+                                     Field(&RtpExtension::uri, "uri3")));
+  }
+}
+
 INSTANTIATE_TEST_SUITE_P(
     ,
     PeerConnectionHeaderExtensionTest,
     Combine(Values(SdpSemantics::kPlanB_DEPRECATED, SdpSemantics::kUnifiedPlan),
-            Values(webrtc::MediaType::AUDIO, webrtc::MediaType::VIDEO)),
+            Values(MediaType::AUDIO, MediaType::VIDEO)),
     [](const testing::TestParamInfo<
         PeerConnectionHeaderExtensionTest::ParamType>& info) {
-      webrtc::MediaType media_type;
+      MediaType media_type;
       SdpSemantics semantics;
       std::tie(media_type, semantics) = info.param;
       return (StringBuilder("With")
               << (semantics == SdpSemantics::kPlanB_DEPRECATED ? "PlanB"
                                                                : "UnifiedPlan")
-              << "And"
-              << (media_type == webrtc::MediaType::AUDIO ? "Voice" : "Video")
+              << "And" << (media_type == MediaType::AUDIO ? "Voice" : "Video")
               << "Engine")
           .str();
     });