| <!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'); |
| |
| </script> |