@@ -164,6 +164,28 @@ class PeerConnectionRtpTestUnifiedPlan : public PeerConnectionRtpBaseTest {
164
164
protected:
165
165
PeerConnectionRtpTestUnifiedPlan ()
166
166
: 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
+ }
167
189
};
168
190
169
191
// These tests cover |webrtc::PeerConnectionObserver| callbacks firing upon
@@ -1573,6 +1595,42 @@ TEST_F(PeerConnectionRtpTestUnifiedPlan,
1573
1595
EXPECT_EQ (0U , callee->pc ()->GetReceivers ().size ());
1574
1596
}
1575
1597
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
+
1576
1634
// Test that AddTransceiver fails if trying to use unimplemented RTP encoding
1577
1635
// parameters with the send_encodings parameters.
1578
1636
TEST_F (PeerConnectionRtpTestUnifiedPlan,
0 commit comments