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