Fire OnRenegotiationNeeded when changing transceiver direction
This is specified by the WebRTC specification:
https://w3c.github.io/webrtc-pc/#dom-rtcrtptransceiver-direction
Bug: webrtc:7600
Change-Id: If45ba0383e5040d250cd3c1c2525ff3b03b1eb4f
Reviewed-on: https://webrtc-review.googlesource.com/55880
Reviewed-by: Seth Hampson <shampson@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Commit-Queue: Steve Anton <steveanton@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22139}diff --git a/pc/peerconnection_rtp_unittest.cc b/pc/peerconnection_rtp_unittest.cc
index 09d2dbe..351905d 100644
--- a/pc/peerconnection_rtp_unittest.cc
+++ b/pc/peerconnection_rtp_unittest.cc
@@ -976,6 +976,46 @@
EXPECT_FALSE(caller->observer()->negotiation_needed());
}
+// Test that OnRenegotiationNeeded is fired if SetDirection is called on an
+// active RtpTransceiver with a new direction.
+TEST_F(PeerConnectionRtpUnifiedPlanTest,
+ RenegotiationNeededAfterTransceiverSetDirection) {
+ auto caller = CreatePeerConnectionWithUnifiedPlan();
+
+ auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
+
+ caller->observer()->clear_negotiation_needed();
+ transceiver->SetDirection(RtpTransceiverDirection::kInactive);
+ EXPECT_TRUE(caller->observer()->negotiation_needed());
+}
+
+// Test that OnRenegotiationNeeded is not fired if SetDirection is called on an
+// active RtpTransceiver with current direction.
+TEST_F(PeerConnectionRtpUnifiedPlanTest,
+ NoRenegotiationNeededAfterTransceiverSetSameDirection) {
+ auto caller = CreatePeerConnectionWithUnifiedPlan();
+
+ auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
+
+ caller->observer()->clear_negotiation_needed();
+ transceiver->SetDirection(transceiver->direction());
+ EXPECT_FALSE(caller->observer()->negotiation_needed());
+}
+
+// Test that OnRenegotiationNeeded is not fired if SetDirection is called on a
+// stopped RtpTransceiver.
+TEST_F(PeerConnectionRtpUnifiedPlanTest,
+ NoRenegotiationNeededAfterSetDirectionOnStoppedTransceiver) {
+ auto caller = CreatePeerConnectionWithUnifiedPlan();
+
+ auto transceiver = caller->AddTransceiver(cricket::MEDIA_TYPE_AUDIO);
+ transceiver->Stop();
+
+ caller->observer()->clear_negotiation_needed();
+ transceiver->SetDirection(RtpTransceiverDirection::kInactive);
+ EXPECT_FALSE(caller->observer()->negotiation_needed());
+}
+
// Test MSID signaling between Unified Plan and Plan B endpoints. There are two
// options for this kind of signaling: media section based (a=msid) and ssrc
// based (a=ssrc MSID). While JSEP only specifies media section MSID signaling,