use rtc::peer_connection::RTCPeerConnectionBuilder;
use rtc::peer_connection::configuration::media_engine::MediaEngine;
use rtc::peer_connection::event::RTCPeerConnectionEvent;
use rtc::rtp_transceiver::RTCRtpTransceiverDirection;
use rtc::rtp_transceiver::rtp_sender::RtpCodecKind;
use sansio::Protocol;
fn count_negotiation_needed<I: rtc::interceptor::Interceptor>(
pc: &mut rtc::peer_connection::RTCPeerConnection<I>,
) -> usize {
let mut count = 0;
while let Some(event) = pc.poll_event() {
if matches!(event, RTCPeerConnectionEvent::OnNegotiationNeededEvent) {
count += 1;
}
}
count
}
#[test]
fn test_set_direction_updates_negotiation_needed_flag() -> Result<(), Box<dyn std::error::Error>> {
let mut me = MediaEngine::default();
me.register_default_codecs()?;
let me2 = me.clone();
let mut offerer = RTCPeerConnectionBuilder::new()
.with_media_engine(me)
.build()?;
let mut answerer = RTCPeerConnectionBuilder::new()
.with_media_engine(me2)
.build()?;
let transceiver_id = offerer.add_transceiver_from_kind(RtpCodecKind::Video, None)?;
answerer.add_transceiver_from_kind(RtpCodecKind::Video, None)?;
let offer = offerer.create_offer(None)?;
offerer.set_local_description(offer.clone())?;
answerer.set_remote_description(offer)?;
let answer = answerer.create_answer(None)?;
answerer.set_local_description(answer.clone())?;
offerer.set_remote_description(answer)?;
let _ = count_negotiation_needed(&mut offerer);
assert_eq!(
count_negotiation_needed(&mut offerer),
0,
"connection should be idle after a clean negotiation",
);
assert_eq!(
offerer
.rtp_transceiver(transceiver_id)
.expect("transceiver should exist")
.direction(),
RTCRtpTransceiverDirection::Recvonly,
);
offerer
.rtp_transceiver(transceiver_id)
.expect("transceiver should exist")
.set_direction(RTCRtpTransceiverDirection::Inactive);
assert_eq!(
count_negotiation_needed(&mut offerer),
1,
"changing the transceiver direction must trigger negotiation-needed",
);
offerer
.rtp_transceiver(transceiver_id)
.expect("transceiver should exist")
.set_direction(RTCRtpTransceiverDirection::Inactive);
assert_eq!(
count_negotiation_needed(&mut offerer),
0,
"setting the same direction must not trigger negotiation-needed",
);
offerer.close()?;
answerer.close()?;
Ok(())
}