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,