RTCRtpTransceiver-stop.html (5945B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <title>RTCRtpTransceiver.prototype.stop</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="RTCPeerConnection-helper.js"></script> 7 <script> 8 // FIXME: Add a test adding a transceiver, stopping it and trying to create an empty offer. 9 10 promise_test(async (t)=> { 11 const pc1 = new RTCPeerConnection(); 12 t.add_cleanup(() => pc1.close()); 13 14 pc1.addTransceiver("audio", { direction: "sendonly" }); 15 pc1.addTransceiver("video"); 16 pc1.getTransceivers()[0].stop(); 17 18 const offer = await pc1.createOffer(); 19 20 assert_false(offer.sdp.includes("m=audio"), "offer should not contain an audio m-section"); 21 assert_true(offer.sdp.includes("m=video"), "offer should contain a video m-section"); 22 }, "A transceiver added and stopped before the initial offer generation should not trigger an offer m-section generation"); 23 24 promise_test(async (t)=> { 25 const pc1 = new RTCPeerConnection(); 26 t.add_cleanup(() => pc1.close()); 27 28 pc1.addTransceiver("audio", { direction: "sendonly" }); 29 pc1.addTransceiver("video"); 30 assert_equals(null, pc1.getTransceivers()[1].receiver.transport); 31 32 pc1.getTransceivers()[1].stop(); 33 assert_equals(pc1.getTransceivers()[1].receiver.transport, null); 34 }, "A transceiver added and stopped should not crash when getting receiver's transport"); 35 36 promise_test(async (t)=> { 37 const pc1 = new RTCPeerConnection(); 38 const pc2 = new RTCPeerConnection(); 39 t.add_cleanup(() => pc1.close()); 40 t.add_cleanup(() => pc2.close()); 41 42 pc1.addTransceiver("audio"); 43 44 await exchangeOfferAnswer(pc1, pc2); 45 46 pc1.addTransceiver("video"); 47 48 pc1.getTransceivers()[0].stop(); 49 pc1.getTransceivers()[1].stop(); 50 51 const offer = await pc1.createOffer(); 52 53 assert_true(offer.sdp.includes("m=audio"), "offer should contain an audio m-section"); 54 assert_true(offer.sdp.includes("m=audio 0"), "The audio m-section should be rejected"); 55 56 assert_false(offer.sdp.includes("m=video"), "offer should not contain a video m-section"); 57 }, "During renegotiation, adding and stopping a transceiver should not trigger a renegotiated offer m-section generation"); 58 59 promise_test(async (t)=> { 60 const pc1 = new RTCPeerConnection(); 61 const pc2 = new RTCPeerConnection(); 62 t.add_cleanup(() => pc1.close()); 63 t.add_cleanup(() => pc2.close()); 64 65 pc1.addTransceiver("audio"); 66 67 await exchangeOfferAnswer(pc1, pc2); 68 69 pc1.getTransceivers()[0].direction = "sendonly"; 70 pc1.getTransceivers()[0].stop(); 71 72 const offer = await pc1.createOffer(); 73 74 assert_true(offer.sdp.includes("a=inactive"), "The audio m-section should be inactive"); 75 }, "A stopped sendonly transceiver should generate an inactive m-section in the offer"); 76 77 promise_test(async (t)=> { 78 const pc1 = new RTCPeerConnection(); 79 const pc2 = new RTCPeerConnection(); 80 t.add_cleanup(() => pc1.close()); 81 t.add_cleanup(() => pc2.close()); 82 83 pc1.addTransceiver("audio"); 84 85 await exchangeOfferAnswer(pc1, pc2); 86 87 pc1.getTransceivers()[0].direction = "inactive"; 88 pc1.getTransceivers()[0].stop(); 89 90 const offer = await pc1.createOffer(); 91 92 assert_true(offer.sdp.includes("a=inactive"), "The audio m-section should be inactive"); 93 }, "A stopped inactive transceiver should generate an inactive m-section in the offer"); 94 95 promise_test(async (t) => { 96 const pc1 = new RTCPeerConnection(); 97 const pc2 = new RTCPeerConnection(); 98 t.add_cleanup(() => pc1.close()); 99 t.add_cleanup(() => pc2.close()); 100 pc1.addTransceiver("audio"); 101 await exchangeOfferAnswer(pc1, pc2); 102 pc1.getTransceivers()[0].stop(); 103 await exchangeOfferAnswer(pc1, pc2); 104 await pc1.setLocalDescription(await pc1.createOffer()); 105 }, 'If a transceiver is stopped locally, setting a locally generated answer should still work'); 106 107 promise_test(async (t) => { 108 const pc1 = new RTCPeerConnection(); 109 const pc2 = new RTCPeerConnection(); 110 t.add_cleanup(() => pc1.close()); 111 t.add_cleanup(() => pc2.close()); 112 pc1.addTransceiver("audio"); 113 await exchangeOfferAnswer(pc1, pc2); 114 pc2.getTransceivers()[0].stop(); 115 await exchangeOfferAnswer(pc2, pc1); 116 await pc1.setLocalDescription(await pc1.createOffer()); 117 }, 'If a transceiver is stopped remotely, setting a locally generated answer should still work'); 118 119 promise_test(async (t) => { 120 const pc1 = new RTCPeerConnection(); 121 const pc2 = new RTCPeerConnection(); 122 t.add_cleanup(() => pc1.close()); 123 t.add_cleanup(() => pc2.close()); 124 pc1.addTransceiver("audio"); 125 await exchangeOfferAnswer(pc1, pc2); 126 assert_equals(pc1.getTransceivers().length, 1); 127 assert_equals(pc2.getTransceivers().length, 1); 128 pc1.getTransceivers()[0].stop(); 129 await exchangeOfferAnswer(pc1, pc2); 130 assert_equals(pc1.getTransceivers().length, 0); 131 assert_equals(pc2.getTransceivers().length, 0); 132 assert_equals(pc1.getSenders().length, 0, 'caller senders'); 133 assert_equals(pc1.getReceivers().length, 0, 'caller receivers'); 134 assert_equals(pc2.getSenders().length, 0, 'callee senders'); 135 assert_equals(pc2.getReceivers().length, 0, 'callee receivers'); 136 }, 'If a transceiver is stopped, transceivers, senders and receivers should disappear after offer/answer'); 137 138 promise_test(async (t) => { 139 const pc1 = new RTCPeerConnection(); 140 const pc2 = new RTCPeerConnection(); 141 t.add_cleanup(() => pc1.close()); 142 t.add_cleanup(() => pc2.close()); 143 pc1.addTransceiver("audio"); 144 await exchangeOfferAnswer(pc1, pc2); 145 assert_equals(pc1.getTransceivers().length, 1); 146 assert_equals(pc2.getTransceivers().length, 1); 147 pc1Transceiver = pc1.getTransceivers()[0]; 148 pc2Transceiver = pc2.getTransceivers()[0]; 149 pc1.getTransceivers()[0].stop(); 150 await exchangeOfferAnswer(pc1, pc2); 151 assert_equals(pc1Transceiver.direction, 'stopped'); 152 assert_equals(pc2Transceiver.direction, 'stopped'); 153 }, 'If a transceiver is stopped, transceivers should end up in state stopped'); 154 155 </script>