| // META: variant=?exclude=(RTCSessionDescription|RTCPeerConnectionIceErrorEvent|RTCRtpReceiver|RTCDtlsTransport|RTCIceTransport|RTCDTMFToneChangeEvent|RTCError|RTCErrorEvent) | |
| // META: variant=?include=(RTCSessionDescription|RTCPeerConnectionIceErrorEvent|RTCRtpReceiver|RTCDtlsTransport|RTCIceTransport|RTCDTMFToneChangeEvent|RTCError|RTCErrorEvent) | |
| // META: script=/common/subset-tests-by-key.js | |
| // META: script=/resources/WebIDLParser.js | |
| // META: script=/resources/idlharness.js | |
| // META: script=./RTCPeerConnection-helper.js | |
| // META: timeout=long | |
| 'use strict'; | |
| // The following helper functions are called from RTCPeerConnection-helper.js: | |
| // generateAnswer() | |
| // getNoiseStream() | |
| // Put the global IDL test objects under a parent object. | |
| // This allows easier search for the test cases when | |
| // viewing the web page | |
| const idlTestObjects = {}; | |
| // Helper function to create RTCTrackEvent object | |
| function initTrackEvent() { | |
| const pc = new RTCPeerConnection(); | |
| const transceiver = pc.addTransceiver('audio'); | |
| const { sender, receiver } = transceiver; | |
| const { track } = receiver; | |
| return new RTCTrackEvent('track', { | |
| receiver, track, transceiver | |
| }); | |
| } | |
| // Helper function to create an RTCErrorEvent object | |
| function initRTCErrorEvent() { | |
| // errorDetail is required | |
| const errorInit = { errorDetail: 'data-channel-failure' }; | |
| const error = new RTCError(errorInit); | |
| // error is required | |
| const errorEventInit = { error }; | |
| return new RTCErrorEvent('whoops', errorEventInit); | |
| } | |
| // List of async test driver functions | |
| const asyncInitTasks = [ | |
| asyncInitCertificate, | |
| asyncInitTransports, | |
| asyncInitMediaStreamTrack, | |
| ]; | |
| // Asynchronously generate an RTCCertificate | |
| function asyncInitCertificate() { | |
| return RTCPeerConnection.generateCertificate({ | |
| name: 'RSASSA-PKCS1-v1_5', | |
| modulusLength: 2048, | |
| publicExponent: new Uint8Array([1, 0, 1]), | |
| hash: 'SHA-256' | |
| }).then(cert => { | |
| idlTestObjects.certificate = cert; | |
| }); | |
| } | |
| // Asynchronously generate instances of | |
| // RTCSctpTransport, RTCDtlsTransport, | |
| // and RTCIceTransport | |
| async function asyncInitTransports() { | |
| const pc1 = new RTCPeerConnection(); | |
| const pc2 = new RTCPeerConnection(); | |
| pc1.createDataChannel('test'); | |
| exchangeIceCandidates(pc1, pc2); | |
| await exchangeOfferAnswer(pc1, pc2); | |
| const sctpTransport = pc1.sctp; | |
| assert_true(sctpTransport instanceof RTCSctpTransport, | |
| 'Expect pc1.sctp to be instance of RTCSctpTransport'); | |
| idlTestObjects.sctpTransport = sctpTransport; | |
| const dtlsTransport = sctpTransport.transport; | |
| assert_true(dtlsTransport instanceof RTCDtlsTransport, | |
| 'Expect dtlsTransport.transport to be instance of RTCDtlsTransport'); | |
| idlTestObjects.dtlsTransport = dtlsTransport; | |
| const iceTransport = dtlsTransport.iceTransport; | |
| assert_true(iceTransport instanceof RTCIceTransport, | |
| 'Expect iceTransport.transport to be instance of RTCIceTransport'); | |
| idlTestObjects.iceTransport = iceTransport; | |
| await waitForIceStateChange(pc1, ['connected']); | |
| assert_not_equals(iceTransport.state, "new", 'Expect iceTransport.state to be not new'); | |
| assert_not_equals(iceTransport.state, "closed", 'Expect iceTransport.state to be not closed'); | |
| const iceCandidatePair = iceTransport.getSelectedCandidatePair(); | |
| assert_not_equals(iceCandidatePair, null, 'Expect iceTransport selected pair to be not null'); | |
| assert_true(iceCandidatePair instanceof RTCIceCandidatePair, | |
| 'Expect iceTransport.getSelectedCandidatePair() to be instance of RTCIceTransport'); | |
| idlTestObjects.iceCandidatePair = iceCandidatePair; | |
| } | |
| // Asynchoronously generate MediaStreamTrack from getUserMedia | |
| function asyncInitMediaStreamTrack() { | |
| return getNoiseStream({ audio: true }) | |
| .then(mediaStream => { | |
| idlTestObjects.mediaStreamTrack = mediaStream.getTracks()[0]; | |
| }); | |
| } | |
| // Run all async test drivers, report and swallow any error | |
| // thrown/rejected. Proper test for correct initialization | |
| // of the objects are done in their respective test files. | |
| function asyncInit() { | |
| return Promise.all(asyncInitTasks.map( | |
| task => { | |
| const t = async_test(`Test driver for ${task.name}`); | |
| let promise; | |
| t.step(() => { | |
| promise = task().then( | |
| t.step_func_done(), | |
| t.step_func(err => | |
| assert_unreached(`Failed to run ${task.name}: ${err}`))); | |
| }); | |
| return promise; | |
| })); | |
| } | |
| idl_test( | |
| ['webrtc'], | |
| ['webidl', 'mediacapture-streams', 'hr-time', 'dom', 'html', 'websockets'], | |
| async idlArray => { | |
| idlArray.add_objects({ | |
| RTCPeerConnection: [`new RTCPeerConnection()`], | |
| RTCSessionDescription: [`new RTCSessionDescription({ type: 'offer' })`], | |
| RTCIceCandidate: [`new RTCIceCandidate({ sdpMid: 1 })`], | |
| RTCDataChannel: [`new RTCPeerConnection().createDataChannel('')`], | |
| RTCRtpTransceiver: [`new RTCPeerConnection().addTransceiver('audio')`], | |
| RTCRtpSender: [`new RTCPeerConnection().addTransceiver('audio').sender`], | |
| RTCRtpReceiver: [`new RTCPeerConnection().addTransceiver('audio').receiver`], | |
| RTCPeerConnectionIceEvent: [`new RTCPeerConnectionIceEvent('ice')`], | |
| RTCPeerConnectionIceErrorEvent: [ | |
| `new RTCPeerConnectionIceErrorEvent('ice-error', { port: 0, errorCode: 701 });` | |
| ], | |
| RTCTrackEvent: [`initTrackEvent()`], | |
| RTCErrorEvent: [`initRTCErrorEvent()`], | |
| RTCDataChannelEvent: [ | |
| `new RTCDataChannelEvent('channel', { | |
| channel: new RTCPeerConnection().createDataChannel('') | |
| })` | |
| ], | |
| // Async initialized objects below | |
| RTCCertificate: ['idlTestObjects.certificate'], | |
| RTCSctpTransport: ['idlTestObjects.sctpTransport'], | |
| RTCDtlsTransport: ['idlTestObjects.dtlsTransport'], | |
| RTCIceTransport: ['idlTestObjects.iceTransport'], | |
| RTCIceCandidatePair: ['idlTestObjects.iceCandidatePair'], | |
| MediaStreamTrack: ['idlTestObjects.mediaStreamTrack'], | |
| }); | |
| /* | |
| TODO | |
| RTCRtpContributingSource | |
| RTCRtpSynchronizationSource | |
| RTCDTMFSender | |
| RTCDTMFToneChangeEvent | |
| RTCIdentityProviderRegistrar | |
| RTCIdentityAssertion | |
| */ | |
| await asyncInit(); | |
| } | |
| ); |