зеркало из https://github.com/mozilla/gecko-dev.git
106 строки
3.5 KiB
HTML
106 строки
3.5 KiB
HTML
<!doctype html>
|
|
<meta charset="utf-8">
|
|
<title>RTCDtlsTransport.prototype.getRemoteCertificates</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
|
|
// doSignalingHandshake
|
|
|
|
/*
|
|
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"
|
|
};
|
|
|
|
getRemoteCertificates
|
|
Returns the certificate chain in use by the remote side, with each certificate
|
|
encoded in binary Distinguished Encoding Rules (DER) [X690].
|
|
getRemoteCertificates() will return an empty list prior to selection of the
|
|
remote certificate, which will be completed by the time RTCDtlsTransportState
|
|
transitions to "connected".
|
|
*/
|
|
async_test(t => {
|
|
const pc1 = new RTCPeerConnection();
|
|
const pc2 = new RTCPeerConnection();
|
|
|
|
pc1.createDataChannel('test');
|
|
exchangeIceCandidates(pc1, pc2);
|
|
|
|
doSignalingHandshake(pc1, pc2)
|
|
.then(t.step_func(() => {
|
|
// pc.sctp is set when set*Description(answer) is called
|
|
const sctpTransport1 = pc1.sctp;
|
|
const sctpTransport2 = pc2.sctp;
|
|
|
|
assert_true(sctpTransport1 instanceof RTCSctpTransport,
|
|
'Expect pc.sctp to be set to valid RTCSctpTransport');
|
|
|
|
assert_true(sctpTransport2 instanceof RTCSctpTransport,
|
|
'Expect pc.sctp to be set to valid RTCSctpTransport');
|
|
|
|
const dtlsTransport1 = sctpTransport1.transport;
|
|
const dtlsTransport2 = sctpTransport2.transport;
|
|
|
|
const testedTransports = new Set();
|
|
|
|
// Callback function that test the respective DTLS transports
|
|
// when they become connected.
|
|
const onConnected = t.step_func(dtlsTransport => {
|
|
const certs = dtlsTransport.getRemoteCertificates();
|
|
|
|
assert_greater_than(certs.length, 0,
|
|
'Expect DTLS transport to have at least one remote certificate when connected');
|
|
|
|
for(const cert of certs) {
|
|
assert_true(cert instanceof ArrayBuffer,
|
|
'Expect certificate elements be instance of ArrayBuffer');
|
|
}
|
|
|
|
testedTransports.add(dtlsTransport);
|
|
|
|
// End the test if both dtlsTransports are tested.
|
|
if(testedTransports.has(dtlsTransport1) && testedTransports.has(dtslTransport2)) {
|
|
t.done();
|
|
}
|
|
})
|
|
|
|
for(const dtlsTransport of [dtlsTransport1, dtlsTransport2]) {
|
|
if(dtlsTransport.state === 'connected') {
|
|
onConnected(dtlsTransport);
|
|
} else {
|
|
assert_array_equals(dtlsTransport.getCertificates(), [],
|
|
'Expect DTLS certificates be initially empty until become connected');
|
|
|
|
dtlsTransport.addEventListener('statechange', t.step_func(() => {
|
|
if(dtlsTransport.state === 'connected') {
|
|
onConnected(dtlsTransport);
|
|
}
|
|
}));
|
|
|
|
dtlsTransport.addEventListener('error', t.step_func(err => {
|
|
assert_unreached(`Unexpected error during DTLS handshake: ${err}`);
|
|
}));
|
|
}
|
|
}
|
|
}));
|
|
});
|
|
|
|
</script>
|