mirror of
https://github.com/servo/servo.git
synced 2025-07-10 08:53:41 +01:00
89 lines
2.9 KiB
HTML
89 lines
2.9 KiB
HTML
<!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:
|
|
// coupleIceCandidates
|
|
// doSignalingHandshake
|
|
// 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 = coupleIceCandidates(pc1, pc2);
|
|
await doSignalingHandshake(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>
|