Bug 1282262 - Reduce number of (slow) gUM requests in test_gUM_mediaStreamClone. r?padenot draft
authorAndreas Pehrson <pehrsons@mozilla.com>
Wed, 30 May 2018 14:45:38 +0200
changeset 801441 61523f5ebb1f08eb86d0829ff6d41ab1b862af50
parent 799714 1bdf8e7d1cfe6d8b9bfa891f43473345210ee281
push id111671
push userbmo:apehrson@mozilla.com
push dateWed, 30 May 2018 13:23:32 +0000
reviewerspadenot
bugs1282262
milestone62.0a1
Bug 1282262 - Reduce number of (slow) gUM requests in test_gUM_mediaStreamClone. r?padenot MozReview-Commit-ID: 1By46JEdXj6
dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
--- a/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
+++ b/dom/media/tests/mochitest/test_getUserMedia_mediaStreamClone.html
@@ -15,241 +15,245 @@ createHTML({
 
 runTest(async () => {
   await pushPrefs(
     ["media.getusermedia.camera.stop_on_disable.enabled", true],
     ["media.getusermedia.camera.stop_on_disable.delay_ms", 0],
     ["media.getusermedia.microphone.stop_on_disable.enabled", true],
     ["media.getusermedia.microphone.stop_on_disable.delay_ms", 0]);
 
-  let stream = await getUserMedia({audio: true, video: true});
-  info("Test clone()ing an audio/video gUM stream");
-  let clone = stream.clone();
+  let gUMStream = await getUserMedia({audio: true, video: true});
+  {
+    info("Test clone()ing an audio/video gUM stream");
+    let clone = gUMStream.clone();
 
-  checkMediaStreamCloneAgainstOriginal(clone, stream);
-  checkMediaStreamTrackCloneAgainstOriginal(clone.getAudioTracks()[0],
-                                            stream.getAudioTracks()[0]);
-  checkMediaStreamTrackCloneAgainstOriginal(clone.getVideoTracks()[0],
-                                            stream.getVideoTracks()[0]);
+    checkMediaStreamCloneAgainstOriginal(clone, gUMStream);
+    checkMediaStreamTrackCloneAgainstOriginal(clone.getAudioTracks()[0],
+                                              gUMStream.getAudioTracks()[0]);
+    checkMediaStreamTrackCloneAgainstOriginal(clone.getVideoTracks()[0],
+                                              gUMStream.getVideoTracks()[0]);
 
-  isnot(clone.id.length, 0, "Stream clone should have an id string");
-  isnot(clone.getAudioTracks()[0].id.length, 0,
-        "Audio track clone should have an id string");
-  isnot(clone.getVideoTracks()[0].id.length, 0,
-        "Audio track clone should have an id string");
+    isnot(clone.id.length, 0, "Stream clone should have an id string");
+    isnot(clone.getAudioTracks()[0].id.length, 0,
+          "Audio track clone should have an id string");
+    isnot(clone.getVideoTracks()[0].id.length, 0,
+          "Audio track clone should have an id string");
 
-  info("Stopping original tracks");
-  stream.getTracks().forEach(t => t.stop());
-
-  info("Playing from track clones");
-  let test = createMediaElement('video', 'testClonePlayback');
-  let playback = new MediaStreamPlayback(test, clone);
-  await playback.playMedia(false);
-
+    info("Playing from track clones");
+    let test = createMediaElement('video', 'testClonePlayback');
+    let playback = new MediaStreamPlayback(test, clone);
+    await playback.playMedia(false);
+  }
 
-  stream = await getUserMedia({video: true});
-  let otherStream = await getUserMedia({video: true});
-  info("Test addTrack()ing a video track to a stream without affecting its clone");
-  let track = stream.getTracks()[0];
-  let otherTrack = otherStream.getTracks()[0];
+  {
+    info("Test addTrack()ing a video track to a stream without affecting its clone");
+    let stream = new MediaStream(gUMStream.getVideoTracks());
+    let otherStream = await getUserMedia({video: true});
+    let track = stream.getTracks()[0];
+    let otherTrack = otherStream.getTracks()[0];
 
-  let streamClone = stream.clone();
-  let trackClone = streamClone.getTracks()[0];
-  checkMediaStreamContains(streamClone, [trackClone], "Initial clone");
+    let streamClone = stream.clone();
+    let trackClone = streamClone.getTracks()[0];
+    checkMediaStreamContains(streamClone, [trackClone], "Initial clone");
 
-  stream.addTrack(otherTrack);
-  checkMediaStreamContains(stream, [track, otherTrack],
-                           "Added video to original");
-  checkMediaStreamContains(streamClone, [trackClone],
-                           "Clone not affected");
+    stream.addTrack(otherTrack);
+    checkMediaStreamContains(stream, [track, otherTrack],
+                             "Added video to original");
+    checkMediaStreamContains(streamClone, [trackClone],
+                             "Clone not affected");
 
-  stream.removeTrack(track);
-  streamClone.addTrack(track);
-  checkMediaStreamContains(streamClone, [trackClone, track],
-                           "Added video to clone");
-  checkMediaStreamContains(stream, [otherTrack],
-                           "Original not affected");
+    stream.removeTrack(track);
+    streamClone.addTrack(track);
+    checkMediaStreamContains(streamClone, [trackClone, track],
+                             "Added video to clone");
+    checkMediaStreamContains(stream, [otherTrack],
+                             "Original not affected");
 
-  // Not part of streamClone. Does not get stopped by the playback test.
-  otherTrack.stop();
-  otherStream.stop();
+    // Not part of streamClone. Does not get stopped by the playback test.
+    otherTrack.stop();
+    otherStream.stop();
+
+    let test = createMediaElement('video', 'testClonePlayback');
+    let playback = new MediaStreamPlayback(test, streamClone);
+    await playback.playMedia(false);
+  }
 
-  test = createMediaElement('video', 'testClonePlayback');
-  playback = new MediaStreamPlayback(test, streamClone);
-  await playback.playMedia(false);
-  stream.getTracks().forEach(t => t.stop());
-  stream.stop();
-
+  {
+    info("Test cloning a stream into inception");
+    let stream = gUMStream.clone()
+    let clone = stream;
+    let clones = Array(10).fill().map(() => clone = clone.clone());
+    let inceptionClone = clones.pop();
+    checkMediaStreamCloneAgainstOriginal(inceptionClone, stream);
+    stream.getTracks().forEach(t => (stream.removeTrack(t),
+                                     inceptionClone.addTrack(t)));
+    is(inceptionClone.getAudioTracks().length, 2,
+       "The inception clone should contain the original audio track and a track clone");
+    is(inceptionClone.getVideoTracks().length, 2,
+       "The inception clone should contain the original video track and a track clone");
 
-  stream = await getUserMedia({audio: true, video: true});
-  info("Test cloning a stream into inception");
-  clone = stream;
-  let clones = Array(10).fill().map(() => clone = clone.clone());
-  let inceptionClone = clones.pop();
-  checkMediaStreamCloneAgainstOriginal(inceptionClone, stream);
-  stream.getTracks().forEach(t => (stream.removeTrack(t),
-                                   inceptionClone.addTrack(t)));
-  is(inceptionClone.getAudioTracks().length, 2,
-     "The inception clone should contain the original audio track and a track clone");
-  is(inceptionClone.getVideoTracks().length, 2,
-     "The inception clone should contain the original video track and a track clone");
+    let test = createMediaElement('video', 'testClonePlayback');
+    let playback = new MediaStreamPlayback(test, inceptionClone);
+    await playback.playMedia(false);
+    clones.forEach(c => c.getTracks().forEach(t => t.stop()));
+    stream.getTracks().forEach(t => t.stop());
+  }
 
-  test = createMediaElement('video', 'testClonePlayback');
-  playback = new MediaStreamPlayback(test, inceptionClone);
-  await playback.playMedia(false);
-  clones.forEach(c => c.getTracks().forEach(t => t.stop()));
-
-
-  stream = await getUserMedia({audio: true, video: true});
-  info("Test adding tracks from many stream clones to the original stream");
+  {
+    info("Test adding tracks from many stream clones to the original stream");
+    let stream = gUMStream.clone();
 
-  const LOOPS = 3;
-  for (let i = 0; i < LOOPS; i++) {
-    stream.clone().getTracks().forEach(t => stream.addTrack(t));
-  }
-  is(stream.getAudioTracks().length, Math.pow(2, LOOPS),
-     "The original track should contain the original audio track and all the audio clones");
-  is(stream.getVideoTracks().length, Math.pow(2, LOOPS),
-     "The original track should contain the original video track and all the video clones");
-  stream.getTracks().forEach(t1 => is(stream.getTracks()
-                                            .filter(t2 => t1.id == t2.id)
-                                            .length,
-                                      1, "Each track should be unique"));
+    const LOOPS = 3;
+    for (let i = 0; i < LOOPS; i++) {
+      stream.clone().getTracks().forEach(t => stream.addTrack(t));
+    }
+    is(stream.getAudioTracks().length, Math.pow(2, LOOPS),
+       "The original track should contain the original audio track and all the audio clones");
+    is(stream.getVideoTracks().length, Math.pow(2, LOOPS),
+       "The original track should contain the original video track and all the video clones");
+    stream.getTracks().forEach(t1 => is(stream.getTracks()
+                                              .filter(t2 => t1.id == t2.id)
+                                              .length,
+                                        1, "Each track should be unique"));
 
-  test = createMediaElement('video', 'testClonePlayback');
-  playback = new MediaStreamPlayback(test, stream);
-  await playback.playMedia(false);
+    let test = createMediaElement('video', 'testClonePlayback');
+    let playback = new MediaStreamPlayback(test, stream);
+    await playback.playMedia(false);
+  }
 
-
-  info("Testing audio content routing with MediaStream.clone()");
-  let ac = new AudioContext();
+  {
+    info("Testing audio content routing with MediaStream.clone()");
+    let ac = new AudioContext();
 
-  let osc1kOriginal = createOscillatorStream(ac, 1000);
-  let audioTrack1kOriginal = osc1kOriginal.getTracks()[0];
-  let audioTrack1kClone = osc1kOriginal.clone().getTracks()[0];
+    let osc1kOriginal = createOscillatorStream(ac, 1000);
+    let audioTrack1kOriginal = osc1kOriginal.getTracks()[0];
+    let audioTrack1kClone = osc1kOriginal.clone().getTracks()[0];
 
-  let osc5kOriginal = createOscillatorStream(ac, 5000);
-  let audioTrack5kOriginal = osc5kOriginal.getTracks()[0];
-  let audioTrack5kClone = osc5kOriginal.clone().getTracks()[0];
+    let osc5kOriginal = createOscillatorStream(ac, 5000);
+    let audioTrack5kOriginal = osc5kOriginal.getTracks()[0];
+    let audioTrack5kClone = osc5kOriginal.clone().getTracks()[0];
+
+    info("Analysing audio output of original stream (1k + 5k)");
+    let stream = new MediaStream();
+    stream.addTrack(audioTrack1kOriginal);
+    stream.addTrack(audioTrack5kOriginal);
 
-  info("Analysing audio output of original stream (1k + 5k)");
-  stream = new MediaStream();
-  stream.addTrack(audioTrack1kOriginal);
-  stream.addTrack(audioTrack5kOriginal);
+    let analyser = new AudioStreamAnalyser(ac, stream);
+    await analyser.waitForAnalysisSuccess(array =>
+            array[analyser.binIndexForFrequency(50)] < 50 &&
+            array[analyser.binIndexForFrequency(1000)] > 200 &&
+            array[analyser.binIndexForFrequency(3000)] < 50 &&
+            array[analyser.binIndexForFrequency(5000)] > 200 &&
+            array[analyser.binIndexForFrequency(10000)] < 50);
 
-  let analyser = new AudioStreamAnalyser(ac, stream);
-  await analyser.waitForAnalysisSuccess(array =>
-          array[analyser.binIndexForFrequency(50)] < 50 &&
-          array[analyser.binIndexForFrequency(1000)] > 200 &&
-          array[analyser.binIndexForFrequency(3000)] < 50 &&
-          array[analyser.binIndexForFrequency(5000)] > 200 &&
-          array[analyser.binIndexForFrequency(10000)] < 50);
+    info("Waiting for original tracks to stop");
+    stream.getTracks().forEach(t => t.stop());
+    await analyser.waitForAnalysisSuccess(array =>
+            array[analyser.binIndexForFrequency(50)] < 50 &&
+            // WebAudioDestination streams do not handle stop()
+            // XXX Should they? Plan to resolve that in bug 1208384.
+            // array[analyser.binIndexForFrequency(1000)] < 50 &&
+            array[analyser.binIndexForFrequency(3000)] < 50 &&
+            // array[analyser.binIndexForFrequency(5000)] < 50 &&
+            array[analyser.binIndexForFrequency(10000)] < 50);
+    analyser.disconnect();
 
-  info("Waiting for original tracks to stop");
-  stream.getTracks().forEach(t => t.stop());
-  await analyser.waitForAnalysisSuccess(array =>
-          array[analyser.binIndexForFrequency(50)] < 50 &&
-          // WebAudioDestination streams do not handle stop()
-          // XXX Should they? Plan to resolve that in bug 1208384.
-          // array[analyser.binIndexForFrequency(1000)] < 50 &&
-          array[analyser.binIndexForFrequency(3000)] < 50 &&
-          // array[analyser.binIndexForFrequency(5000)] < 50 &&
-          array[analyser.binIndexForFrequency(10000)] < 50);
-  analyser.disconnect();
+    info("Analysing audio output of stream clone (1k + 5k)");
+    stream = new MediaStream();
+    stream.addTrack(audioTrack1kClone);
+    stream.addTrack(audioTrack5kClone);
 
-  info("Analysing audio output of stream clone (1k + 5k)");
-  stream = new MediaStream();
-  stream.addTrack(audioTrack1kClone);
-  stream.addTrack(audioTrack5kClone);
+    analyser = new AudioStreamAnalyser(ac, stream);
+    await analyser.waitForAnalysisSuccess(array =>
+            array[analyser.binIndexForFrequency(50)] < 50 &&
+            array[analyser.binIndexForFrequency(1000)] > 200 &&
+            array[analyser.binIndexForFrequency(3000)] < 50 &&
+            array[analyser.binIndexForFrequency(5000)] > 200 &&
+            array[analyser.binIndexForFrequency(10000)] < 50);
+    analyser.disconnect();
 
-  analyser = new AudioStreamAnalyser(ac, stream);
-  await analyser.waitForAnalysisSuccess(array =>
-          array[analyser.binIndexForFrequency(50)] < 50 &&
-          array[analyser.binIndexForFrequency(1000)] > 200 &&
-          array[analyser.binIndexForFrequency(3000)] < 50 &&
-          array[analyser.binIndexForFrequency(5000)] > 200 &&
-          array[analyser.binIndexForFrequency(10000)] < 50);
-  analyser.disconnect();
+    info("Analysing audio output of clone of clone (1k + 5k)");
+    stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]).clone();
 
-  info("Analysing audio output of clone of clone (1k + 5k)");
-  stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]).clone();
+    analyser = new AudioStreamAnalyser(ac, stream);
+    await analyser.waitForAnalysisSuccess(array =>
+            array[analyser.binIndexForFrequency(50)] < 50 &&
+            array[analyser.binIndexForFrequency(1000)] > 200 &&
+            array[analyser.binIndexForFrequency(3000)] < 50 &&
+            array[analyser.binIndexForFrequency(5000)] > 200 &&
+            array[analyser.binIndexForFrequency(10000)] < 50);
+    analyser.disconnect();
 
-  analyser = new AudioStreamAnalyser(ac, stream);
-  await analyser.waitForAnalysisSuccess(array =>
-          array[analyser.binIndexForFrequency(50)] < 50 &&
-          array[analyser.binIndexForFrequency(1000)] > 200 &&
-          array[analyser.binIndexForFrequency(3000)] < 50 &&
-          array[analyser.binIndexForFrequency(5000)] > 200 &&
-          array[analyser.binIndexForFrequency(10000)] < 50);
-  analyser.disconnect();
-
-  info("Analysing audio output of clone() + addTrack()ed tracks (1k + 5k)");
-  stream = new MediaStream(new MediaStream([ audioTrack1kClone
-                                           , audioTrack5kClone
-                                           ]).clone().getTracks());
+    info("Analysing audio output of clone() + addTrack()ed tracks (1k + 5k)");
+    stream = new MediaStream(new MediaStream([ audioTrack1kClone
+                                             , audioTrack5kClone
+                                             ]).clone().getTracks());
 
-  analyser = new AudioStreamAnalyser(ac, stream);
-  await analyser.waitForAnalysisSuccess(array =>
-          array[analyser.binIndexForFrequency(50)] < 50 &&
-          array[analyser.binIndexForFrequency(1000)] > 200 &&
-          array[analyser.binIndexForFrequency(3000)] < 50 &&
-          array[analyser.binIndexForFrequency(5000)] > 200 &&
-          array[analyser.binIndexForFrequency(10000)] < 50);
-  analyser.disconnect();
+    analyser = new AudioStreamAnalyser(ac, stream);
+    await analyser.waitForAnalysisSuccess(array =>
+            array[analyser.binIndexForFrequency(50)] < 50 &&
+            array[analyser.binIndexForFrequency(1000)] > 200 &&
+            array[analyser.binIndexForFrequency(3000)] < 50 &&
+            array[analyser.binIndexForFrequency(5000)] > 200 &&
+            array[analyser.binIndexForFrequency(10000)] < 50);
+    analyser.disconnect();
 
-  info("Analysing audio output of clone()d tracks in original stream (1k) " +
-       "and clone()d tracks in stream clone (5k)");
-  stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
-  streamClone = stream.clone();
+    info("Analysing audio output of clone()d tracks in original stream (1k) " +
+         "and clone()d tracks in stream clone (5k)");
+    stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
+    let streamClone = stream.clone();
 
-  stream.getTracks().forEach(t => stream.removeTrack(t));
-  stream.addTrack(streamClone.getTracks()[0]);
-  streamClone.removeTrack(streamClone.getTracks()[0]);
+    stream.getTracks().forEach(t => stream.removeTrack(t));
+    stream.addTrack(streamClone.getTracks()[0]);
+    streamClone.removeTrack(streamClone.getTracks()[0]);
 
-  analyser = new AudioStreamAnalyser(ac, stream);
-  await analyser.waitForAnalysisSuccess(array =>
-          array[analyser.binIndexForFrequency(50)] < 50 &&
-          array[analyser.binIndexForFrequency(1000)] > 200 &&
-          array[analyser.binIndexForFrequency(3000)] < 50 &&
-          array[analyser.binIndexForFrequency(5000)] < 50);
-  analyser.disconnect();
+    analyser = new AudioStreamAnalyser(ac, stream);
+    await analyser.waitForAnalysisSuccess(array =>
+            array[analyser.binIndexForFrequency(50)] < 50 &&
+            array[analyser.binIndexForFrequency(1000)] > 200 &&
+            array[analyser.binIndexForFrequency(3000)] < 50 &&
+            array[analyser.binIndexForFrequency(5000)] < 50);
+    analyser.disconnect();
 
-  let cloneAnalyser = new AudioStreamAnalyser(ac, streamClone);
-  await cloneAnalyser.waitForAnalysisSuccess(array =>
-          array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
-          array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
-          array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
-          array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
-  cloneAnalyser.disconnect();
+    let cloneAnalyser = new AudioStreamAnalyser(ac, streamClone);
+    await cloneAnalyser.waitForAnalysisSuccess(array =>
+            array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
+            array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
+            array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
+            array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
+    cloneAnalyser.disconnect();
 
-  info("Analysing audio output enabled and disabled tracks that don't affect each other");
-  stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
-  clone = stream.clone();
+    info("Analysing audio output enabled and disabled tracks that don't affect each other");
+    stream = new MediaStream([audioTrack1kClone, audioTrack5kClone]);
+    let clone = stream.clone();
 
-  stream.getTracks()[0].enabled = true;
-  stream.getTracks()[1].enabled = false;
+    stream.getTracks()[0].enabled = true;
+    stream.getTracks()[1].enabled = false;
 
-  clone.getTracks()[0].enabled = false;
-  clone.getTracks()[1].enabled = true;
+    clone.getTracks()[0].enabled = false;
+    clone.getTracks()[1].enabled = true;
 
-  analyser = new AudioStreamAnalyser(ac, stream);
-  await analyser.waitForAnalysisSuccess(array =>
-          array[analyser.binIndexForFrequency(50)] < 50 &&
-          array[analyser.binIndexForFrequency(1000)] > 200 &&
-          array[analyser.binIndexForFrequency(3000)] < 50 &&
-          array[analyser.binIndexForFrequency(5000)] < 50);
-  analyser.disconnect();
+    analyser = new AudioStreamAnalyser(ac, stream);
+    await analyser.waitForAnalysisSuccess(array =>
+            array[analyser.binIndexForFrequency(50)] < 50 &&
+            array[analyser.binIndexForFrequency(1000)] > 200 &&
+            array[analyser.binIndexForFrequency(3000)] < 50 &&
+            array[analyser.binIndexForFrequency(5000)] < 50);
+    analyser.disconnect();
 
-  cloneAnalyser = new AudioStreamAnalyser(ac, clone);
-  await cloneAnalyser.waitForAnalysisSuccess(array =>
-          array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
-          array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
-          array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
-          array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
-  cloneAnalyser.disconnect();
+    cloneAnalyser = new AudioStreamAnalyser(ac, clone);
+    await cloneAnalyser.waitForAnalysisSuccess(array =>
+            array[cloneAnalyser.binIndexForFrequency(1000)] < 50 &&
+            array[cloneAnalyser.binIndexForFrequency(3000)] < 50 &&
+            array[cloneAnalyser.binIndexForFrequency(5000)] > 200 &&
+            array[cloneAnalyser.binIndexForFrequency(10000)] < 50);
+    cloneAnalyser.disconnect();
 
-  // Restore original tracks
-  stream.getTracks().forEach(t => t.enabled = true);
+    // Restore original tracks
+    stream.getTracks().forEach(t => t.enabled = true);
+  }
+
+  gUMStream.getTracks().forEach(t => t.stop());
 });
 </script>
 </pre>
 </body>
 </html>