diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/webrtc/RTCDTMFSender-insertDTMF.https.html | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webrtc/RTCDTMFSender-insertDTMF.https.html')
-rw-r--r-- | testing/web-platform/tests/webrtc/RTCDTMFSender-insertDTMF.https.html | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCDTMFSender-insertDTMF.https.html b/testing/web-platform/tests/webrtc/RTCDTMFSender-insertDTMF.https.html new file mode 100644 index 0000000000..71cfe70171 --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCDTMFSender-insertDTMF.https.html @@ -0,0 +1,176 @@ +<!doctype html> +<meta charset=utf-8> +<title>RTCDTMFSender.prototype.insertDTMF</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="RTCPeerConnection-helper.js"></script> +<script src="RTCDTMFSender-helper.js"></script> +<script> + 'use strict'; + + // Test is based on the following editor draft: + // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html + + // The following helper functions are called from RTCPeerConnection-helper.js + // generateAnswer + + // The following helper functions are called from RTCDTMFSender-helper.js + // createDtmfSender + // test_tone_change_events + // getTransceiver + + /* + 7. Peer-to-peer DTMF + partial interface RTCRtpSender { + readonly attribute RTCDTMFSender? dtmf; + }; + + interface RTCDTMFSender : EventTarget { + void insertDTMF(DOMString tones, + optional unsigned long duration = 100, + optional unsigned long interToneGap = 70); + attribute EventHandler ontonechange; + readonly attribute DOMString toneBuffer; + }; + */ + + /* + 7.2. insertDTMF + The tones parameter is treated as a series of characters. + + The characters 0 through 9, A through D, #, and * generate the associated + DTMF tones. + + The characters a to d MUST be normalized to uppercase on entry and are + equivalent to A to D. + + As noted in [RTCWEB-AUDIO] Section 3, support for the characters 0 through 9, + A through D, #, and * are required. + + The character ',' MUST be supported, and indicates a delay of 2 seconds + before processing the next character in the tones parameter. + + All other characters (and only those other characters) MUST be considered + unrecognized. + */ + promise_test(async t => { + const dtmfSender = await createDtmfSender(); + dtmfSender.insertDTMF(''); + dtmfSender.insertDTMF('012345689'); + dtmfSender.insertDTMF('ABCD'); + dtmfSender.insertDTMF('abcd'); + dtmfSender.insertDTMF('#*'); + dtmfSender.insertDTMF(','); + dtmfSender.insertDTMF('0123456789ABCDabcd#*,'); + }, 'insertDTMF() should succeed if tones contains valid DTMF characters'); + + + /* + 7.2. insertDTMF + 6. If tones contains any unrecognized characters, throw an + InvalidCharacterError. + */ + promise_test(async t => { + const dtmfSender = await createDtmfSender(); + assert_throws_dom('InvalidCharacterError', () => + // 'F' is invalid + dtmfSender.insertDTMF('123FFABC')); + + assert_throws_dom('InvalidCharacterError', () => + // 'E' is invalid + dtmfSender.insertDTMF('E')); + + assert_throws_dom('InvalidCharacterError', () => + // ' ' is invalid + dtmfSender.insertDTMF('# *')); + }, 'insertDTMF() should throw InvalidCharacterError if tones contains invalid DTMF characters'); + + /* + 7.2. insertDTMF + 3. If transceiver.stopped is true, throw an InvalidStateError. + */ + test(t => { + const pc = new RTCPeerConnection(); + const transceiver = pc.addTransceiver('audio'); + const dtmfSender = transceiver.sender.dtmf; + + transceiver.stop(); + assert_throws_dom('InvalidStateError', () => dtmfSender.insertDTMF('')); + + }, 'insertDTMF() should throw InvalidStateError if transceiver is stopped'); + + /* + 7.2. insertDTMF + 4. If transceiver.currentDirection is recvonly or inactive, throw an InvalidStateError. + */ + promise_test(async t => { + const caller = new RTCPeerConnection(); + t.add_cleanup(() => caller.close()); + const callee = new RTCPeerConnection(); + t.add_cleanup(() => callee.close()); + const transceiver = + caller.addTransceiver('audio', { direction: 'recvonly' }); + const dtmfSender = transceiver.sender.dtmf; + + const offer = await caller.createOffer(); + await caller.setLocalDescription(offer); + await callee.setRemoteDescription(offer); + const stream = await getNoiseStream({audio: true}); + t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); + const [track] = stream.getTracks(); + callee.addTrack(track, stream); + const answer = await callee.createAnswer(); + await callee.setLocalDescription(answer); + await caller.setRemoteDescription(answer); + assert_equals(transceiver.currentDirection, 'recvonly'); + assert_throws_dom('InvalidStateError', () => dtmfSender.insertDTMF('')); + }, 'insertDTMF() should throw InvalidStateError if transceiver.currentDirection is recvonly'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = + pc.addTransceiver('audio', { direction: 'inactive' }); + const dtmfSender = transceiver.sender.dtmf; + + const offer = await pc.createOffer(); + await pc.setLocalDescription(offer); + const answer = await generateAnswer(offer); + await pc.setRemoteDescription(answer); + assert_equals(transceiver.currentDirection, 'inactive'); + assert_throws_dom('InvalidStateError', () => dtmfSender.insertDTMF('')); + }, 'insertDTMF() should throw InvalidStateError if transceiver.currentDirection is inactive'); + + /* + 7.2. insertDTMF + The characters a to d MUST be normalized to uppercase on entry and are + equivalent to A to D. + + 7. Set the object's toneBuffer attribute to tones. + */ + promise_test(async t => { + const dtmfSender = await createDtmfSender(); + dtmfSender.insertDTMF('123'); + assert_equals(dtmfSender.toneBuffer, '123'); + + dtmfSender.insertDTMF('ABC'); + assert_equals(dtmfSender.toneBuffer, 'ABC'); + + dtmfSender.insertDTMF('bcd'); + assert_equals(dtmfSender.toneBuffer, 'BCD'); + }, 'insertDTMF() should set toneBuffer to provided tones normalized, with old tones overridden'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const [track, mediaStream] = await getTrackFromUserMedia('audio'); + const sender = pc.addTrack(track, mediaStream); + await pc.setLocalDescription(await pc.createOffer()); + const dtmfSender = sender.dtmf; + pc.removeTrack(sender); + pc.close(); + assert_throws_dom('InvalidStateError', () => + dtmfSender.insertDTMF('123')); + }, 'insertDTMF() after remove and close should reject'); + +</script> |