| <!doctype html> |
| <meta charset=utf-8> |
| <title>RTCRtpSender</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| 'use strict'; |
| |
| test((t) => { |
| const pc = new RTCPeerConnection(); |
| t.add_cleanup(() => pc.close()); |
| |
| const t1 = pc.addTransceiver("audio"); |
| const t2 = pc.addTransceiver("video"); |
| |
| assert_not_equals(t1.sender.dtmf, null); |
| assert_equals(t2.sender.dtmf, null); |
| }, "Video sender @dtmf is null"); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| assert_equals(transceiver.sender.transport, null); |
| }, 'RTCRtpSender should have a null transport initially'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| await pc1.setLocalDescription(); |
| assert_true(transceiver.sender.transport instanceof RTCDtlsTransport); |
| }, 'RTCRtpSender should have a transport after sLD(offer)'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| await pc1.setLocalDescription(); |
| await pc1.setLocalDescription({type: 'rollback', sdp: ''}); |
| assert_equals(transceiver.sender.transport, null); |
| }, 'RTCRtpSender should have a null transport after rollback of sLD(offer)'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const pc2 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc2.close()); |
| const sender = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| await pc2.setRemoteDescription(await pc1.createOffer()); |
| const [transceiver] = pc2.getTransceivers(); |
| assert_equals(transceiver.sender.transport, null); |
| }, 'RTCRtpSender should have a null transport after sRD(offer)'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| await pc1.setLocalDescription(); |
| assert_true(transceiver.sender.transport instanceof RTCDtlsTransport); |
| assert_true(transceiver.receiver.transport instanceof RTCDtlsTransport); |
| assert_equals(transceiver.sender.transport, transceiver.receiver.transport); |
| }, 'RTCRtpSender should have the same transport object as its corresponding RTCRtpReceiver'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection({bundlePolicy: 'max-bundle'}); |
| t.add_cleanup(() => pc1.close()); |
| const audioTransceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| const videoTransceiver = pc1.addTransceiver('video', { direction: 'recvonly' }); |
| await pc1.setLocalDescription(); |
| assert_equals(videoTransceiver.sender.transport, audioTransceiver.sender.transport); |
| }, 'RTCRtpSenders that share a bundle transport should have the same transport object'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection({bundlePolicy: 'max-compat'}); |
| t.add_cleanup(() => pc1.close()); |
| const pc2 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc2.close()); |
| const audioTransceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| const videoTransceiver = pc1.addTransceiver('video', { direction: 'recvonly' }); |
| await pc1.setLocalDescription(); |
| assert_not_equals(videoTransceiver.sender.transport, audioTransceiver.sender.transport); |
| await pc2.setRemoteDescription(pc1.localDescription); |
| await pc1.setRemoteDescription(await pc2.createAnswer()); |
| // pc2 will accept the bundle, so these should be the same now |
| assert_equals(videoTransceiver.sender.transport, audioTransceiver.sender.transport); |
| }, 'RTCRtpSenders that do not necessarily share a bundle transport should not have the same transport object'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const pc2 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc2.close()); |
| |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| await pc1.setLocalDescription(); |
| const transportBefore = transceiver.sender.transport; |
| |
| await pc2.setRemoteDescription(pc1.localDescription); |
| await pc1.setRemoteDescription(await pc2.createAnswer()); |
| await pc1.setLocalDescription(await pc1.createOffer({iceRestart: true})); |
| |
| const transportAfter = transceiver.sender.transport; |
| assert_equals(transportAfter, transportBefore); |
| }, 'RTCRtpSender should have the same transport object after an ICE restart'); |
| |
| </script> |