RtpTransceiverInterface: introduce HeaderExtensionsNegotiated.

This changes adds exposure of a new transceiver method for
accessing header extensions that have been negotiated, following
spec details in https://w3c.github.io/webrtc-extensions/#rtcrtptransceiver-interface.

The change contains unit tests testing the functionality.

Note: support for signalling directionality of header extensions
in the SDP isn't implemented yet.

https://chromestatus.com/feature/5680189201711104.
Intent to prototype: https://groups.google.com/a/chromium.org/g/blink-dev/c/65YdUi02yZk

Bug: chromium:1051821
Change-Id: If963beed37e96eed2dff3a2822db4e30caaea4a0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/198126
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32860}
diff --git a/pc/rtp_transceiver_unittest.cc b/pc/rtp_transceiver_unittest.cc
index 96e38b0..91e1aa3 100644
--- a/pc/rtp_transceiver_unittest.cc
+++ b/pc/rtp_transceiver_unittest.cc
@@ -14,6 +14,8 @@
 
 #include <memory>
 
+#include "absl/types/optional.h"
+#include "api/rtp_parameters.h"
 #include "media/base/fake_media_engine.h"
 #include "pc/test/mock_channel_interface.h"
 #include "pc/test/mock_rtp_receiver_internal.h"
@@ -22,9 +24,7 @@
 #include "test/gtest.h"
 
 using ::testing::ElementsAre;
-using ::testing::Eq;
-using ::testing::Field;
-using ::testing::Not;
+using ::testing::Optional;
 using ::testing::Property;
 using ::testing::Return;
 using ::testing::ReturnRef;
@@ -206,4 +206,62 @@
   EXPECT_EQ(transceiver_.HeaderExtensionsToOffer(), extensions_);
 }
 
+TEST_F(RtpTransceiverTestForHeaderExtensions,
+       NoNegotiatedHdrExtsWithoutChannel) {
+  EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
+}
+
+TEST_F(RtpTransceiverTestForHeaderExtensions,
+       NoNegotiatedHdrExtsWithChannelWithoutNegotiation) {
+  cricket::MockChannelInterface mock_channel;
+  sigslot::signal1<cricket::ChannelInterface*> signal;
+  ON_CALL(mock_channel, SignalFirstPacketReceived)
+      .WillByDefault(ReturnRef(signal));
+  transceiver_.SetChannel(&mock_channel);
+  EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(), ElementsAre());
+}
+
+TEST_F(RtpTransceiverTestForHeaderExtensions, ReturnsNegotiatedHdrExts) {
+  cricket::MockChannelInterface mock_channel;
+  sigslot::signal1<cricket::ChannelInterface*> signal;
+  ON_CALL(mock_channel, SignalFirstPacketReceived)
+      .WillByDefault(ReturnRef(signal));
+  cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
+                                             webrtc::RtpExtension("uri2", 2)};
+  EXPECT_CALL(mock_channel, GetNegotiatedRtpHeaderExtensions)
+      .WillOnce(Return(extensions));
+  transceiver_.SetChannel(&mock_channel);
+  EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
+              ElementsAre(RtpHeaderExtensionCapability(
+                              "uri1", 1, RtpTransceiverDirection::kSendRecv),
+                          RtpHeaderExtensionCapability(
+                              "uri2", 2, RtpTransceiverDirection::kSendRecv)));
+}
+
+TEST_F(RtpTransceiverTestForHeaderExtensions,
+       ReturnsNegotiatedHdrExtsSecondTime) {
+  cricket::MockChannelInterface mock_channel;
+  sigslot::signal1<cricket::ChannelInterface*> signal;
+  ON_CALL(mock_channel, SignalFirstPacketReceived)
+      .WillByDefault(ReturnRef(signal));
+  cricket::RtpHeaderExtensions extensions = {webrtc::RtpExtension("uri1", 1),
+                                             webrtc::RtpExtension("uri2", 2)};
+
+  EXPECT_CALL(mock_channel, GetNegotiatedRtpHeaderExtensions)
+      .WillOnce(Return(extensions));
+  transceiver_.SetChannel(&mock_channel);
+  transceiver_.HeaderExtensionsNegotiated();
+  testing::Mock::VerifyAndClearExpectations(&mock_channel);
+
+  extensions = {webrtc::RtpExtension("uri3", 4),
+                webrtc::RtpExtension("uri5", 6)};
+  EXPECT_CALL(mock_channel, GetNegotiatedRtpHeaderExtensions)
+      .WillOnce(Return(extensions));
+  EXPECT_THAT(transceiver_.HeaderExtensionsNegotiated(),
+              ElementsAre(RtpHeaderExtensionCapability(
+                              "uri3", 4, RtpTransceiverDirection::kSendRecv),
+                          RtpHeaderExtensionCapability(
+                              "uri5", 6, RtpTransceiverDirection::kSendRecv)));
+}
+
 }  // namespace webrtc