Bug 1093835 - Check video flow in test_pc_replaceVideoThenRenegotiate.html. r?jib draft
authorAndreas Pehrson <pehrsons@gmail.com>
Fri, 28 Apr 2017 14:55:26 +0200
changeset 572687 129f19fc1f28657d6483ddb9a0bd2c53f36354ba
parent 572686 ad13f65eeccbe38ec161e889a9c7e4ea57733d1a
child 572688 894f9627162cf6d7f6c7f8c43e8f7e8618870dad
push id57141
push userbmo:pehrson@telenordigital.com
push dateThu, 04 May 2017 13:31:56 +0000
reviewersjib
bugs1093835
milestone55.0a1
Bug 1093835 - Check video flow in test_pc_replaceVideoThenRenegotiate.html. r?jib MozReview-Commit-ID: 5zUioH6Q4jw
dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html
--- a/dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html
+++ b/dom/media/tests/mochitest/test_peerConnection_replaceVideoThenRenegotiate.html
@@ -1,46 +1,88 @@
 <!DOCTYPE HTML>
 <html>
 <head>
   <script type="application/javascript" src="pc.js"></script>
+  <script type="application/javascript" src="/tests/dom/canvas/test/captureStream_common.js"></script>
 </head>
 <body>
 <pre id="test">
 <script type="application/javascript">
   createHTML({
     bug: "1017888",
     title: "Renegotiation: replaceTrack followed by adding a second video stream"
   });
 
-  var test;
   runNetworkTest(function (options) {
-    test = new PeerConnectionTest(options);
+    const test = new PeerConnectionTest(options);
     test.setMediaConstraints([{video:true}], [{video:true}]);
+    const helper = new VideoStreamHelper();
+    const emitter1 = new VideoFrameEmitter(CaptureStreamTestHelper.prototype.red,
+                                           CaptureStreamTestHelper.prototype.green);
+    const emitter2 = new VideoFrameEmitter(CaptureStreamTestHelper.prototype.blue,
+                                           CaptureStreamTestHelper.prototype.grey);
+    test.chain.replace("PC_LOCAL_GUM", [
+      function PC_LOCAL_ADDTRACK(test) {
+        test.pcLocal.attachLocalStream(emitter1.stream());
+        emitter1.start();
+      },
+    ]);
     addRenegotiation(test.chain,
       [
         function PC_LOCAL_REPLACE_VIDEO_TRACK_THEN_ADD_SECOND_STREAM(test) {
-          var oldstream = test.pcLocal._pc.getLocalStreams()[0];
-          var oldtrack = oldstream.getVideoTracks()[0];
-          var sender = test.pcLocal._pc.getSenders()[0];
-          return navigator.mediaDevices.getUserMedia({video:true})
-            .then(newstream => {
-              var newtrack = newstream.getVideoTracks()[0];
-              return test.pcLocal.senderReplaceTrack(0, newtrack, newstream.id);
-            })
+          emitter1.stop();
+          emitter2.start();
+          const newstream = emitter2.stream();
+          const newtrack = newstream.getVideoTracks()[0];
+          return test.pcLocal.senderReplaceTrack(0, newtrack, newstream.id)
             .then(() => {
               test.setMediaConstraints([{video: true}, {video: true}],
                                        [{video: true}]);
-              return test.pcLocal.getAllUserMedia([{video: true}]);
+              // Use fake:true here since the native fake device on linux
+              // doesn't change color as needed by checkVideoPlaying() below.
+              return test.pcLocal.getAllUserMedia([{video: true, fake: true}]);
             });
         },
+      ],
+      [
+        function PC_REMOTE_CHECK_ORIGINAL_TRACK_ENDED(test) {
+          const vremote = test.pcRemote.remoteMediaElements.find(
+              elem => elem.id.includes(emitter1.stream().getTracks()[0].id));
+          if (!vremote) {
+            return Promise.reject(new Error("Couldn't find video element"));
+          }
+          ok(vremote.ended, "Original track should have ended after renegotiation");
+        },
+        function PC_REMOTE_CHECK_REPLACED_TRACK_FLOW(test) {
+          const vremote = test.pcRemote.remoteMediaElements.find(
+              elem => elem.id.includes(test.pcLocal._pc.getSenders()[0].track.id));
+          if (!vremote) {
+            return Promise.reject(new Error("Couldn't find video element"));
+          }
+          return addFinallyToPromise(helper.checkVideoPlaying(vremote, 10, 10, 16))
+            .finally(() => emitter2.stop())
+            .then(() => {
+              const px = helper._helper.getPixel(vremote, 10, 10);
+              const isBlue = helper._helper.isPixel(
+                  px, CaptureStreamTestHelper.prototype.blue, 5);
+              const isGrey = helper._helper.isPixel(
+                  px, CaptureStreamTestHelper.prototype.grey, 5);
+              ok(isBlue || isGrey, "replaced track should be blue or grey");
+            });
+        },
+        function PC_REMOTE_CHECK_ADDED_TRACK_FLOW(test) {
+          const vremote = test.pcRemote.remoteMediaElements.find(
+              elem => elem.id.includes(test.pcLocal._pc.getSenders()[1].track.id));
+          if (!vremote) {
+            return Promise.reject(new Error("Couldn't find video element"));
+          }
+          return helper.checkVideoPlaying(vremote, 10, 10, 16);
+        },
       ]
     );
 
-    // TODO(bug 1093835):
-    // figure out how to verify if media flows through the new stream
-    // figure out how to verify that media stopped flowing from old stream
     test.run();
   });
 </script>
 </pre>
 </body>
 </html>