| <!doctype html> |
| <meta charset=utf-8> |
| <title>WebRTC IDL Tests</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/resources/WebIDLParser.js"></script> |
| <script src="/resources/idlharness.js"></script> |
| <script src="./RTCPeerConnection-helper.js"></script> |
| <script> |
| 'use strict'; |
| |
| // The following helper functions are called from RTCPeerConnection-helper.js: |
| // generateAnswer() |
| // generateMediaStreamTrack() |
| |
| // 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 |
| }); |
| } |
| |
| // 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 |
| function asyncInitTransports() { |
| const pc = new RTCPeerConnection(); |
| pc.createDataChannel('test'); |
| |
| // setting answer description initializes pc.sctp |
| return pc.createOffer() |
| .then(offer => |
| pc.setLocalDescription(offer) |
| .then(() => generateAnswer(offer))) |
| .then(answer => pc.setRemoteDescription(answer)) |
| .then(() => { |
| const sctpTransport = pc.sctp; |
| assert_true(sctpTransport instanceof RTCSctpTransport, |
| 'Expect pc.sctp to be instance of RTCSctpTransport'); |
| idlTestObjects.sctpTransport = sctpTransport; |
| |
| const dtlsTransport = sctpTransport.transport; |
| assert_true(dtlsTransport instanceof RTCDtlsTransport, |
| 'Expect sctpTransport.transport to be instance of RTCDtlsTransport'); |
| idlTestObjects.dtlsTransport = dtlsTransport; |
| |
| const iceTransport = dtlsTransport.transport; |
| idlTestObjects.iceTransport = iceTransport; |
| }); |
| } |
| |
| // Asynchoronously generate MediaStreamTrack from getUserMedia |
| function asyncInitMediaStreamTrack() { |
| return navigator.mediaDevices.getUserMedia({ audio: true }) |
| .then(mediaStream => { |
| const tracks = mediaStream.getTracks(); |
| assert_greater_than(tracks.length, 0, |
| 'Expect media stream to have at least one track'); |
| |
| idlTestObjects.mediaStreamTrack = tracks[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; |
| })); |
| } |
| |
| // Main function to do the IDL test, using fetched IDL text |
| function doIdlTest(idlText) { |
| const idlArray = new IdlArray(); |
| |
| idlArray.add_untested_idls('interface EventHandler {};'); |
| idlArray.add_idls('interface MediaStreamTrack : EventTarget {};'); |
| idlArray.add_idls(idlText); |
| |
| 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', { errorCode: 701 });`], |
| |
| 'RTCTrackEvent': [`initTrackEvent()`], |
| |
| 'RTCErrorEvent': [`new RTCErrorEvent('error')`], |
| |
| 'RTCDataChannelEvent': [`new RTCDataChannelEvent('channel', |
| { channel: new RTCPeerConnection().createDataChannel('') })`], |
| |
| // Async initialized objects below |
| |
| 'RTCCertificate': ['idlTestObjects.certificate'], |
| |
| 'RTCSctpTransport': ['idlTestObjects.sctpTransport'], |
| |
| 'RTCDtlsTransport': ['idlTestObjects.dtlsTransport'], |
| |
| 'RTCIceTransport': ['idlTestObjects.iceTransport'], |
| |
| // Test on both MediaStreamTrack from getUserMedia and transceiver |
| 'MediaStreamTrack': [ |
| `idlTestObjects.mediaStreamTrack`, |
| `generateMediaStreamTrack('audio')`] |
| }); |
| |
| idlArray.test(); |
| } |
| |
| promise_test(t => { |
| return asyncInit() |
| .then(() => fetch('/interfaces/webrtc-pc.idl')) |
| .then(response => response.text()) |
| .then(doIdlTest); |
| }, 'Main test driver'); |
| |
| /* |
| TODO |
| RTCRtpContributingSource |
| RTCRtpSynchronizationSource |
| RTCDTMFSender |
| RTCDTMFToneChangeEvent |
| RTCIdentityProviderRegistrar |
| RTCIdentityAssertion |
| */ |
| </script> |