diff options
Diffstat (limited to 'testing/web-platform/tests/webrtc/RTCDtlsTransport-state.html')
-rw-r--r-- | testing/web-platform/tests/webrtc/RTCDtlsTransport-state.html | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCDtlsTransport-state.html b/testing/web-platform/tests/webrtc/RTCDtlsTransport-state.html new file mode 100644 index 0000000000..ca49fcc95f --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCDtlsTransport-state.html @@ -0,0 +1,142 @@ +<!doctype html> +<meta charset="utf-8"> +<title>RTCDtlsTransport</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="RTCPeerConnection-helper.js"></script> +<script> +'use strict'; + +// The following helper functions are called from RTCPeerConnection-helper.js: +// exchangeIceCandidates +// exchangeOfferAnswer +// trackFactories.audio() + +/* + 5.5. RTCDtlsTransport Interface + interface RTCDtlsTransport : EventTarget { + readonly attribute RTCDtlsTransportState state; + sequence<ArrayBuffer> getRemoteCertificates(); + attribute EventHandler onstatechange; + attribute EventHandler onerror; + ... + }; + + enum RTCDtlsTransportState { + "new", + "connecting", + "connected", + "closed", + "failed" + }; + +*/ +function resolveWhen(t, dtlstransport, state) { + return new Promise((resolve, reject) => { + if (dtlstransport.state == state) { resolve(); } + dtlstransport.addEventListener('statechange', t.step_func(e => { + if (dtlstransport.state == state) { + resolve(); + } + })); + }); +} + + +async function setupConnections(t) { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + pc1.addTrack(trackFactories.audio()); + const channels = exchangeIceCandidates(pc1, pc2); + await exchangeOfferAnswer(pc1, pc2); + return [pc1, pc2]; +} + +promise_test(async t => { + const [pc1, pc2] = await setupConnections(t); + const dtlsTransport1 = pc1.getTransceivers()[0].sender.transport; + const dtlsTransport2 = pc2.getTransceivers()[0].sender.transport; + assert_true(dtlsTransport1 instanceof RTCDtlsTransport); + assert_true(dtlsTransport2 instanceof RTCDtlsTransport); + await Promise.all([resolveWhen(t, dtlsTransport1, 'connected'), + resolveWhen(t, dtlsTransport2, 'connected')]); +}, 'DTLS transport goes to connected state'); + +promise_test(async t => { + const [pc1, pc2] = await setupConnections(t); + + const dtlsTransport1 = pc1.getTransceivers()[0].sender.transport; + const dtlsTransport2 = pc2.getTransceivers()[0].sender.transport; + await Promise.all([resolveWhen(t, dtlsTransport1, 'connected'), + resolveWhen(t, dtlsTransport2, 'connected')]); + pc1.close(); + assert_equals(dtlsTransport1.state, 'closed'); +}, 'close() causes the local transport to close immediately'); + +promise_test(async t => { + const [pc1, pc2] = await setupConnections(t); + const dtlsTransport1 = pc1.getTransceivers()[0].sender.transport; + const dtlsTransport2 = pc2.getTransceivers()[0].sender.transport; + await Promise.all([resolveWhen(t, dtlsTransport1, 'connected'), + resolveWhen(t, dtlsTransport2, 'connected')]); + pc1.close(); + await resolveWhen(t, dtlsTransport2, 'closed'); +}, 'close() causes the other end\'s DTLS transport to close'); + +promise_test(async t => { + const config = {bundlePolicy: "max-bundle"}; + const pc1 = new RTCPeerConnection(config); + const pc2 = new RTCPeerConnection(config); + t.add_cleanup(() => pc1.close()); + t.add_cleanup(() => pc2.close()); + + pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate); + pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate); + + pc1.addTransceiver("video"); + pc1.addTransceiver("audio"); + await pc1.setLocalDescription(await pc1.createOffer()); + await pc2.setRemoteDescription(pc1.localDescription); + await pc2.setLocalDescription(await pc2.createAnswer()); + await pc1.setRemoteDescription(pc2.localDescription); + + const [videoTc, audioTc] = pc1.getTransceivers(); + const [videoTp, audioTp] = + pc1.getTransceivers().map(tc => tc.sender.transport); + + const [videoPc2Tp, audioPc2Tp] = + pc2.getTransceivers().map(tc => tc.sender.transport); + + assert_equals(pc1.getTransceivers().length, 2, 'pc1 transceiver count'); + assert_equals(pc2.getTransceivers().length, 2, 'pc2 transceiver count'); + assert_equals(videoTc.sender.transport, videoTc.receiver.transport); + assert_equals(videoTc.sender.transport, audioTc.sender.transport); + + await Promise.all([resolveWhen(t, videoTp, 'connected'), + resolveWhen(t, videoPc2Tp, 'connected')]); + + assert_equals(audioTc.sender, pc1.getSenders()[1]); + + let stoppedTransceiver = pc1.getTransceivers()[0]; + assert_equals(stoppedTransceiver, videoTc); // sanity + let onended = new Promise(resolve => { + stoppedTransceiver.receiver.track.onended = resolve; + }); + stoppedTransceiver.stop(); + await onended; + + assert_equals( + pc1.getReceivers().length, 1, + 'getReceivers does not expose a receiver of a stopped transceiver'); + assert_equals( + pc1.getSenders().length, 1, + 'getSenders does not expose a sender of a stopped transceiver'); + assert_equals(audioTc.sender, pc1.getSenders()[0]); // sanity + assert_equals(audioTc.sender.transport, audioTp); // sanity + assert_equals(audioTp.state, 'connected'); +}, 'stop bundled transceiver retains dtls transport state'); + +</script> |