@@ -164,6 +164,28 @@ class PeerConnectionRtpTestUnifiedPlan : public PeerConnectionRtpBaseTest {
164164 protected:
165165 PeerConnectionRtpTestUnifiedPlan ()
166166 : PeerConnectionRtpBaseTest(SdpSemantics::kUnifiedPlan ) {}
167+
168+ // Helper to emulate an SFU that rejects an offered media section
169+ // in answer.
170+ bool ExchangeOfferAnswerWhereRemoteStopsTransceiver (
171+ PeerConnectionWrapper* caller,
172+ PeerConnectionWrapper* callee,
173+ size_t mid_to_stop) {
174+ auto offer = caller->CreateOffer ();
175+ caller->SetLocalDescription (CloneSessionDescription (offer.get ()));
176+ callee->SetRemoteDescription (std::move (offer));
177+ EXPECT_LT (mid_to_stop, callee->pc ()->GetTransceivers ().size ());
178+ // Must use StopInternal in order to do instant reject.
179+ callee->pc ()->GetTransceivers ()[mid_to_stop]->StopInternal ();
180+ auto answer = callee->CreateAnswer ();
181+ EXPECT_TRUE (answer);
182+ bool set_local_answer =
183+ callee->SetLocalDescription (CloneSessionDescription (answer.get ()));
184+ EXPECT_TRUE (set_local_answer);
185+ bool set_remote_answer = caller->SetRemoteDescription (std::move (answer));
186+ EXPECT_TRUE (set_remote_answer);
187+ return set_remote_answer;
188+ }
167189};
168190
169191// These tests cover |webrtc::PeerConnectionObserver| callbacks firing upon
@@ -1573,6 +1595,42 @@ TEST_F(PeerConnectionRtpTestUnifiedPlan,
15731595 EXPECT_EQ (0U , callee->pc ()->GetReceivers ().size ());
15741596}
15751597
1598+ TEST_F (PeerConnectionRtpTestUnifiedPlan,
1599+ SetLocalDescriptionWorksAfterRepeatedAddRemove) {
1600+ auto caller = CreatePeerConnection ();
1601+ auto callee = CreatePeerConnection ();
1602+ auto video_track = caller->CreateVideoTrack (" v" );
1603+ auto track = caller->CreateAudioTrack (" a" );
1604+ caller->AddTransceiver (video_track);
1605+ auto transceiver = caller->AddTransceiver (track);
1606+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1607+ caller->pc ()->RemoveTrack (transceiver->sender ());
1608+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1609+ caller->AddTrack (track);
1610+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1611+ caller->pc ()->RemoveTrack (transceiver->sender ());
1612+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1613+ }
1614+
1615+ // This is a repro of Chromium bug https://crbug.com/1134686
1616+ TEST_F (PeerConnectionRtpTestUnifiedPlan,
1617+ SetLocalDescriptionWorksAfterRepeatedAddRemoveWithRemoteReject) {
1618+ auto caller = CreatePeerConnection ();
1619+ auto callee = CreatePeerConnection ();
1620+ auto video_track = caller->CreateVideoTrack (" v" );
1621+ auto track = caller->CreateAudioTrack (" a" );
1622+ caller->AddTransceiver (video_track);
1623+ auto transceiver = caller->AddTransceiver (track);
1624+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1625+ caller->pc ()->RemoveTrack (transceiver->sender ());
1626+ ExchangeOfferAnswerWhereRemoteStopsTransceiver (caller.get (), callee.get (), 1 );
1627+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1628+ caller->AddTrack (track);
1629+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1630+ caller->pc ()->RemoveTrack (transceiver->sender ());
1631+ ASSERT_TRUE (caller->ExchangeOfferAnswerWith (callee.get ()));
1632+ }
1633+
15761634// Test that AddTransceiver fails if trying to use unimplemented RTP encoding
15771635// parameters with the send_encodings parameters.
15781636TEST_F (PeerConnectionRtpTestUnifiedPlan,
0 commit comments