Prevent the frame decryptor being set if the channel is stopped.
This change deals with a race condition if the media channel has been stopped
and is in the process of changing while we get a call to set a FrameDecryptor
or FrameEncryptor.
Bug: webrtc:9926, webrtc:9932
Change-Id: Ie2da2fa1f31f5cb5eb0b481861a7008e635f562d
Reviewed-on: https://webrtc-review.googlesource.com/c/107986
Commit-Queue: Benjamin Wright <benwright@webrtc.org>
Reviewed-by: Qingsi Wang <qingsi@webrtc.org>
Reviewed-by: Seth Hampson <shampson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25398}diff --git a/pc/rtpsenderreceiver_unittest.cc b/pc/rtpsenderreceiver_unittest.cc
index 70b1601..fa42615 100644
--- a/pc/rtpsenderreceiver_unittest.cc
+++ b/pc/rtpsenderreceiver_unittest.cc
@@ -1424,6 +1424,18 @@
audio_rtp_sender_->GetFrameEncryptor().get());
}
+// Validate that setting a FrameEncryptor after the send stream is stopped does
+// nothing.
+TEST_F(RtpSenderReceiverTest, AudioSenderCannotSetFrameEncryptorAfterStop) {
+ CreateAudioRtpSender();
+ rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
+ new FakeFrameEncryptor());
+ EXPECT_EQ(nullptr, audio_rtp_sender_->GetFrameEncryptor());
+ audio_rtp_sender_->Stop();
+ audio_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
+ // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
+}
+
// Validate that the default FrameEncryptor setting is nullptr.
TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetFrameDecryptor) {
CreateAudioRtpReceiver();
@@ -1435,4 +1447,60 @@
audio_rtp_receiver_->GetFrameDecryptor().get());
}
+// Validate that the default FrameEncryptor setting is nullptr.
+TEST_F(RtpSenderReceiverTest, AudioReceiverCannotSetFrameDecryptorAfterStop) {
+ CreateAudioRtpReceiver();
+ rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
+ new FakeFrameDecryptor());
+ EXPECT_EQ(nullptr, audio_rtp_receiver_->GetFrameDecryptor());
+ audio_rtp_receiver_->Stop();
+ audio_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
+ // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
+}
+
+// Validate that the default FrameEncryptor setting is nullptr.
+TEST_F(RtpSenderReceiverTest, VideoSenderCanSetFrameEncryptor) {
+ CreateVideoRtpSender();
+ rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
+ new FakeFrameEncryptor());
+ EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
+ video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
+ EXPECT_EQ(fake_frame_encryptor.get(),
+ video_rtp_sender_->GetFrameEncryptor().get());
+}
+
+// Validate that setting a FrameEncryptor after the send stream is stopped does
+// nothing.
+TEST_F(RtpSenderReceiverTest, VideoSenderCannotSetFrameEncryptorAfterStop) {
+ CreateVideoRtpSender();
+ rtc::scoped_refptr<FrameEncryptorInterface> fake_frame_encryptor(
+ new FakeFrameEncryptor());
+ EXPECT_EQ(nullptr, video_rtp_sender_->GetFrameEncryptor());
+ video_rtp_sender_->Stop();
+ video_rtp_sender_->SetFrameEncryptor(fake_frame_encryptor);
+ // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
+}
+
+// Validate that the default FrameEncryptor setting is nullptr.
+TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetFrameDecryptor) {
+ CreateVideoRtpReceiver();
+ rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
+ new FakeFrameDecryptor());
+ EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
+ video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
+ EXPECT_EQ(fake_frame_decryptor.get(),
+ video_rtp_receiver_->GetFrameDecryptor().get());
+}
+
+// Validate that the default FrameEncryptor setting is nullptr.
+TEST_F(RtpSenderReceiverTest, VideoReceiverCannotSetFrameDecryptorAfterStop) {
+ CreateVideoRtpReceiver();
+ rtc::scoped_refptr<FrameDecryptorInterface> fake_frame_decryptor(
+ new FakeFrameDecryptor());
+ EXPECT_EQ(nullptr, video_rtp_receiver_->GetFrameDecryptor());
+ video_rtp_receiver_->Stop();
+ video_rtp_receiver_->SetFrameDecryptor(fake_frame_decryptor);
+ // TODO(webrtc:9926) - Validate media channel not set once fakes updated.
+}
+
} // namespace webrtc