| <!doctype html> |
| <meta charset=utf-8> |
| <title>RTCRtpReceiver</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| 'use strict'; |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const transceiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| assert_equals(transceiver.receiver.transport, null); |
| }, 'RTCRtpReceiver 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.receiver.transport instanceof RTCDtlsTransport); |
| }, 'RTCRtpReceiver 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.receiver.transport, null); |
| }, 'RTCRtpReceiver 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 receiver = pc1.addTransceiver('audio', { direction: 'recvonly' }); |
| await pc2.setRemoteDescription(await pc1.createOffer()); |
| const transceiver = pc2.getTransceivers()[0]; |
| assert_equals(transceiver.receiver.transport, null); |
| }, 'RTCRtpReceiver 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.receiver.transport, transceiver.sender.transport); |
| }, 'RTCRtpReceiver should have the same transport object as its corresponding RTCRtpSender'); |
| |
| 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.receiver.transport, audioTransceiver.receiver.transport); |
| }, 'RTCRtpReceivers 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.receiver.transport, audioTransceiver.receiver.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.receiver.transport, audioTransceiver.receiver.transport); |
| }, 'RTCRtpReceivers 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.receiver.transport; |
| |
| await pc2.setRemoteDescription(pc1.localDescription); |
| await pc1.setRemoteDescription(await pc2.createAnswer()); |
| await pc1.setLocalDescription(await pc1.createOffer({iceRestart: true})); |
| |
| const transportAfter = transceiver.receiver.transport; |
| assert_equals(transportAfter, transportBefore); |
| }, 'RTCRtpReceiver should have the same transport object after an ICE restart'); |
| |
| </script> |