Bug 1088621 - Test constraining of microphones. draft
authorJan-Ivar Bruaroey <jib@mozilla.com>
Wed, 28 Jun 2017 16:30:57 -0700
changeset 645194 1e9e6f98be1b0dd046a79b8de64d3435118caae5
parent 645193 6efee62b466dfab253ade493cf1b5c2579cf4c1d
child 645195 f082478ea84fa37dfe3dc5130ceec41b88416fb9
push id73691
push userjbruaroey@mozilla.com
push dateFri, 11 Aug 2017 23:12:29 +0000
bugs1088621
milestone57.0a1
Bug 1088621 - Test constraining of microphones. MozReview-Commit-ID: 8xtEbUUQe9t
dom/media/tests/mochitest/mochitest.ini
dom/media/tests/mochitest/test_getUserMedia_constrainAudio.html
--- a/dom/media/tests/mochitest/mochitest.ini
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -57,16 +57,17 @@ skip-if = toolkit == 'android' # no scre
 [test_getUserMedia_basicTabshare.html]
 skip-if = toolkit == 'android' # no windowshare on android
 [test_getUserMedia_basicWindowshare.html]
 skip-if = toolkit == 'android' # no windowshare on android
 [test_getUserMedia_basicVideoAudio.html]
 [test_getUserMedia_bug1223696.html]
 [test_getUserMedia_constraints.html]
 [test_getUserMedia_constrainVideo.html]
+[test_getUserMedia_constrainAudio.html]
 [test_getUserMedia_callbacks.html]
 [test_getUserMedia_getTrackById.html]
 [test_getUserMedia_gumWithinGum.html]
 [test_getUserMedia_loadedmetadata.html]
 [test_getUserMedia_mediaElementCapture_audio.html]
 skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
 [test_getUserMedia_mediaElementCapture_tracks.html]
 skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
new file mode 100644
--- /dev/null
+++ b/dom/media/tests/mochitest/test_getUserMedia_constrainAudio.html
@@ -0,0 +1,86 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <script src="mediaStreamPlayback.js"></script>
+</head>
+<body>
+<div id="content" style="display: none">
+  <audio id="audio" autoplay></audio><br>
+  <audio id="audio2" autoplay></audio><br>
+</div>
+<pre id="test">
+<script type="application/javascript">
+createHTML({ title: "Test getUserMedia constraint audio", bug: "1088621" });
+
+let gum = c => navigator.mediaDevices.getUserMedia({ fake: true, audio: c });
+
+let testGum = (constraints, expected) => {
+  expected = expected || constraints;
+  let msg = "Testing " + JSON.stringify(constraints) + " - ";
+  let expectedError = (typeof expected == "string")? expected : null;
+
+  return gum(constraints).then(stream => {
+    if (expectedError) {
+      throw ({ name: "success" });
+    }
+    let settings = stream.getTracks()[0].getSettings();
+    for (let prop in expected) {
+      is(settings[prop], expected[prop], msg + "Get expected " + prop);
+    }
+    audio.srcObject = stream;
+    return new Promise(resolve => audio.onloadedmetadata = resolve);
+  })
+  .then(() => {
+    audio.srcObject.stop();
+    audio.srcObject = null;
+  })
+  .then(() => wait(200)) // TODO: Remove this workaround for Bug 1289665.
+  .catch(e => {
+    is(e.name, expectedError,
+       msg + (e.name == "success" ? "Get expected success" :
+                                    "Get expected error (" + e.message +")"));
+  });
+};
+
+let egn = (e, g, n) =>
+    ({ echoCancellation: e, autoGainControl: g, noiseSuppression: n });
+
+let tests = [
+ [false, "NotSupportedError"],
+ [true, egn(true, false, true)],
+ [{}, egn(true, false, true)],
+ [{ echoCancellation: false }, egn(false, false, true)],
+ [{ echoCancellation: true }, egn(true, false, true)],
+ [egn(false, true, false)],
+ [{ echoCancellation: { exact: false }, autoGainControl: { ideal: true } },
+  egn(false, true, true)],
+];
+
+let concurrentConstraints = { echoCancellation: false,
+                              autoGainControl: { exact: true } };
+let concurrentTests = [
+ [true, egn(false, true, true)],
+ [egn(true, false, false), egn(false, true, false)],
+ [{ autoGainControl: { exact: false } }, "OverconstrainedError"],
+ [{ autoGainControl: { exact: true } }, egn(false, true, true)],
+];
+
+runTest(() => tests.reduce((p, test) => p.then(() => testGum(...test)),
+                           Promise.resolve())
+  // Test concurrent gUM requests.
+  .then(() => gum(concurrentConstraints))
+  .then(stream => {
+    audio2.srcObject = stream;
+    return concurrentTests.reduce((p, test) => p.then(() => testGum(...test)),
+                                  Promise.resolve());
+  })
+  .then(() => {
+    audio2.srcObject.getTracks().forEach(track => track.stop());
+    audio2.srcObject = null;
+  })
+  .catch(e => ok(false, "Unexpected " + e)));
+
+</script>
+</pre>
+</body>
+</html>