RTCRtpSender-transport.https.html (7658B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <meta name="timeout" content="long"> 4 <title>RTCRtpSender.transport</title> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="dictionary-helper.js"></script> 8 <script src="RTCPeerConnection-helper.js"></script> 9 <script> 10 'use strict'; 11 12 // Spec link: http://w3c.github.io/webrtc-pc/#dom-rtcrtpsender-transport 13 promise_test(async t => { 14 const caller = new RTCPeerConnection(); 15 t.add_cleanup(() => caller.close()); 16 const stream = await getNoiseStream({audio: true}); 17 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 18 const [track] = stream.getTracks(); 19 const sender = caller.addTrack(track); 20 assert_equals(sender.transport, null); 21 }, 'RTCRtpSender.transport is null when unconnected'); 22 23 // Test for the simple/happy path of connecting a single track 24 promise_test(async t => { 25 const caller = new RTCPeerConnection(); 26 t.add_cleanup(() => caller.close()); 27 const stream = await getNoiseStream({audio: true}); 28 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 29 const [track] = stream.getTracks(); 30 const sender = caller.addTrack(track); 31 const callee = new RTCPeerConnection(); 32 t.add_cleanup(() => callee.close()); 33 exchangeIceCandidates(caller, callee); 34 await exchangeOfferAndListenToOntrack(t, caller, callee); 35 assert_not_equals(sender.transport, null); 36 const [transceiver] = caller.getTransceivers(); 37 assert_equals(transceiver.sender.transport, 38 transceiver.receiver.transport); 39 assert_not_equals(sender.transport.iceTransport, null); 40 }, 'RTCRtpSender/receiver.transport has a value when connected'); 41 42 // Test with multiple tracks, and checking details of when things show up 43 // for different bundle policies. 44 for (let bundle_policy of ['balanced', 'max-bundle', 'max-compat']) { 45 promise_test(async t => { 46 const caller = new RTCPeerConnection({bundlePolicy: bundle_policy}); 47 t.add_cleanup(() => caller.close()); 48 const stream = await getNoiseStream( 49 {audio: true, video:true}); 50 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 51 const [track1, track2] = stream.getTracks(); 52 const sender1 = caller.addTrack(track1); 53 const sender2 = caller.addTrack(track2); 54 const callee = new RTCPeerConnection(); 55 t.add_cleanup(() => callee.close()); 56 exchangeIceCandidates(caller, callee); 57 const offer = await caller.createOffer(); 58 assert_equals(sender1.transport, null); 59 assert_equals(sender2.transport, null); 60 await caller.setLocalDescription(offer); 61 assert_not_equals(sender1.transport, null); 62 assert_not_equals(sender2.transport, null); 63 const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers(); 64 assert_equals(sender1.transport, caller_transceiver1.sender.transport); 65 if (bundle_policy == 'max-bundle') { 66 assert_equals(caller_transceiver1.sender.transport, 67 caller_transceiver2.sender.transport); 68 } else { 69 assert_not_equals(caller_transceiver1.sender.transport, 70 caller_transceiver2.sender.transport); 71 } 72 await callee.setRemoteDescription(offer); 73 const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers(); 74 // According to spec, setRemoteDescription only updates the transports 75 // if the remote description is an answer. 76 assert_equals(callee_transceiver1.receiver.transport, null); 77 assert_equals(callee_transceiver2.receiver.transport, null); 78 const answer = await callee.createAnswer(); 79 await callee.setLocalDescription(answer); 80 assert_not_equals(callee_transceiver1.receiver.transport, null); 81 assert_not_equals(callee_transceiver2.receiver.transport, null); 82 // At this point, bundle should have kicked in. 83 assert_equals(callee_transceiver1.receiver.transport, 84 callee_transceiver2.receiver.transport); 85 await caller.setRemoteDescription(answer); 86 assert_equals(caller_transceiver1.receiver.transport, 87 caller_transceiver2.receiver.transport); 88 }, 'RTCRtpSender/receiver.transport at the right time, with bundle policy ' + bundle_policy); 89 90 // Do the same test again, with DataChannel in the mix. 91 promise_test(async t => { 92 const caller = new RTCPeerConnection({bundlePolicy: bundle_policy}); 93 t.add_cleanup(() => caller.close()); 94 const stream = await getNoiseStream( 95 {audio: true, video:true}); 96 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 97 const [track1, track2] = stream.getTracks(); 98 const sender1 = caller.addTrack(track1); 99 const sender2 = caller.addTrack(track2); 100 caller.createDataChannel('datachannel'); 101 const callee = new RTCPeerConnection(); 102 t.add_cleanup(() => callee.close()); 103 exchangeIceCandidates(caller, callee); 104 const offer = await caller.createOffer(); 105 assert_equals(sender1.transport, null); 106 assert_equals(sender2.transport, null); 107 if (caller.sctp) { 108 assert_equals(caller.sctp.transport, null); 109 } 110 await caller.setLocalDescription(offer); 111 assert_not_equals(sender1.transport, null); 112 assert_not_equals(sender2.transport, null); 113 assert_not_equals(caller.sctp.transport, null); 114 const [caller_transceiver1, caller_transceiver2] = caller.getTransceivers(); 115 assert_equals(sender1.transport, caller_transceiver1.sender.transport); 116 if (bundle_policy == 'max-bundle') { 117 assert_equals(caller_transceiver1.sender.transport, 118 caller_transceiver2.sender.transport); 119 assert_equals(caller_transceiver1.sender.transport, 120 caller.sctp.transport); 121 } else { 122 assert_not_equals(caller_transceiver1.sender.transport, 123 caller_transceiver2.sender.transport); 124 assert_not_equals(caller_transceiver1.sender.transport, 125 caller.sctp.transport); 126 } 127 await callee.setRemoteDescription(offer); 128 const [callee_transceiver1, callee_transceiver2] = callee.getTransceivers(); 129 // According to spec, setRemoteDescription only updates the transports 130 // if the remote description is an answer. 131 assert_equals(callee_transceiver1.receiver.transport, null); 132 assert_equals(callee_transceiver2.receiver.transport, null); 133 const answer = await callee.createAnswer(); 134 await callee.setLocalDescription(answer); 135 assert_not_equals(callee_transceiver1.receiver.transport, null); 136 assert_not_equals(callee_transceiver2.receiver.transport, null); 137 assert_not_equals(callee.sctp.transport, null); 138 // At this point, bundle should have kicked in. 139 assert_equals(callee_transceiver1.receiver.transport, 140 callee_transceiver2.receiver.transport); 141 assert_equals(callee_transceiver1.receiver.transport, 142 callee.sctp.transport, 143 'Callee SCTP transport does not match:'); 144 await caller.setRemoteDescription(answer); 145 assert_equals(caller_transceiver1.receiver.transport, 146 caller_transceiver2.receiver.transport); 147 assert_equals(caller_transceiver1.receiver.transport, 148 caller.sctp.transport, 149 'Caller SCTP transport does not match:'); 150 }, 'RTCRtpSender/receiver/SCTP transport at the right time, with bundle policy ' + bundle_policy); 151 } 152 </script>