| <!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(); |
| t.add_cleanup(() => pc1.close()); |
| const pc2 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc2.close()); |
| |
| 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(dtlsTransport2)) { |
| 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> |