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>