From 7f1d2a4aa3f9279dc0b6543bf2162969a53dedf3 Mon Sep 17 00:00:00 2001
From: Mohamed Amine Ben Salah <damineone@gmail.com>
Date: Tue, 10 Mar 2020 12:20:48 -0300
Subject: [PATCH] adds share/load/check webcams test specs with multi users

---
 .../video-list/video-list-item/component.jsx  |  1 +
 .../tests/puppeteer/webcam.test.js            | 32 ++++++++++-
 .../tests/puppeteer/webcam/check.js           | 16 ++++++
 .../tests/puppeteer/webcam/elements.js        |  2 +
 .../tests/puppeteer/webcam/loadtime.js        | 21 ++++++++
 .../tests/puppeteer/webcam/share.js           |  8 +--
 .../tests/puppeteer/webcam/util.js            | 54 +++++++++++++++++--
 7 files changed, 126 insertions(+), 8 deletions(-)
 create mode 100644 bigbluebutton-html5/tests/puppeteer/webcam/check.js
 create mode 100644 bigbluebutton-html5/tests/puppeteer/webcam/loadtime.js

diff --git a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx
index c500f626d2..22e69bca86 100755
--- a/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/video-provider/video-list/video-list-item/component.jsx
@@ -123,6 +123,7 @@ class VideoListItem extends Component {
 
     return (
       <FullscreenButtonContainer
+        data-test="presentationFullscreenButton"
         fullscreenRef={this.videoContainer}
         elementName={name}
         isFullscreen={isFullscreen}
diff --git a/bigbluebutton-html5/tests/puppeteer/webcam.test.js b/bigbluebutton-html5/tests/puppeteer/webcam.test.js
index 5aa12d60b8..d2497889b7 100644
--- a/bigbluebutton-html5/tests/puppeteer/webcam.test.js
+++ b/bigbluebutton-html5/tests/puppeteer/webcam.test.js
@@ -1,6 +1,8 @@
 const Share = require('./webcam/share');
+const Check = require('./webcam/check');
+const LoadingTime = require('./webcam/loadtime');
 
-describe('Webcam', () => {
+describe('Webcams multiplayer', () => {
   test('Shares webcam', async () => {
     const test = new Share();
     let response;
@@ -14,4 +16,32 @@ describe('Webcam', () => {
     }
     expect(response).toBe(true);
   });
+
+  test('Check Webcam loading time', async () => {
+    const test = new LoadingTime();
+    let response;
+    try {
+      await test.init();
+      response = await test.test();
+    } catch (e) {
+      console.log(e);
+    } finally {
+      await test.close();
+    }
+    expect(response).toBeLessThan(parseInt(process.env.CAMERA_SHARE_FAILED_WAIT_TIME));
+  });
+
+  test('Checks content of webcam', async () => {
+    const test = new Check();
+    let response;
+    try {
+      await test.init();
+      response = await test.test();
+    } catch (e) {
+      console.log(e);
+    } finally {
+      await test.close();
+    }
+    expect(response).toBe(true);
+  });
 });
diff --git a/bigbluebutton-html5/tests/puppeteer/webcam/check.js b/bigbluebutton-html5/tests/puppeteer/webcam/check.js
new file mode 100644
index 0000000000..5518825084
--- /dev/null
+++ b/bigbluebutton-html5/tests/puppeteer/webcam/check.js
@@ -0,0 +1,16 @@
+const Share = require('./share');
+const util = require('./util');
+
+class Check extends Share {
+  constructor() {
+    super('check-webcam-content');
+  }
+
+  async test() {
+    const response1 = await util.startAndCheckForWebcams(this.page1);
+    const response2 = await util.startAndCheckForWebcams(this.page2);
+    const response = response1 && response2;
+    return response;
+  }
+}
+module.exports = exports = Check;
diff --git a/bigbluebutton-html5/tests/puppeteer/webcam/elements.js b/bigbluebutton-html5/tests/puppeteer/webcam/elements.js
index 26c23a44b9..2f5ecf6431 100644
--- a/bigbluebutton-html5/tests/puppeteer/webcam/elements.js
+++ b/bigbluebutton-html5/tests/puppeteer/webcam/elements.js
@@ -2,3 +2,5 @@ exports.joinVideo = 'button[data-test="joinVideo"]';
 exports.videoPreview = 'video[data-test="videoPreview"]';
 exports.startSharingWebcam = 'button[data-test="startSharingWebcam"]';
 exports.videoContainer = 'video[data-test="videoContainer"]';
+exports.webcamConnectingStatus = '[data-test="webcamConnectingStatus"]';
+exports.presentationFullscreenButton = '[data-test="presentationFullscreenButton"]';
diff --git a/bigbluebutton-html5/tests/puppeteer/webcam/loadtime.js b/bigbluebutton-html5/tests/puppeteer/webcam/loadtime.js
new file mode 100644
index 0000000000..42ea167f41
--- /dev/null
+++ b/bigbluebutton-html5/tests/puppeteer/webcam/loadtime.js
@@ -0,0 +1,21 @@
+const Share = require('./share');
+const util = require('./util');
+
+class LoadingTime extends Share {
+  constructor() {
+    super('check-webcam-loading-time');
+  }
+
+  async test() {
+    await util.enableWebcam(this.page1);
+    await util.enableWebcam(this.page2);
+    const now = new Date().getMilliseconds();
+    await util.waitForWebcamsLoading(this.page1);
+    await util.waitForWebcamsLoading(this.page2);
+    const end = new Date().getMilliseconds();
+
+    const response = end - now;
+    return response;
+  }
+}
+module.exports = exports = LoadingTime;
diff --git a/bigbluebutton-html5/tests/puppeteer/webcam/share.js b/bigbluebutton-html5/tests/puppeteer/webcam/share.js
index 81cde5ebbe..9b5a8e33b7 100644
--- a/bigbluebutton-html5/tests/puppeteer/webcam/share.js
+++ b/bigbluebutton-html5/tests/puppeteer/webcam/share.js
@@ -14,9 +14,11 @@ class Share {
   }
 
   async test() {
-    await util.enableWebcam(this.page1, this.page2);
-    const response = await util.evaluateCheck(this.page1, this.page2);
-    return response;
+    await util.enableWebcam(this.page1);
+    await util.enableWebcam(this.page2);
+    const response1 = await util.evaluateCheck(this.page1);
+    const response2 = await util.evaluateCheck(this.page2);
+    return response1 && response2;
   }
 
   async close() {
diff --git a/bigbluebutton-html5/tests/puppeteer/webcam/util.js b/bigbluebutton-html5/tests/puppeteer/webcam/util.js
index a1fd33b243..b1f4937902 100644
--- a/bigbluebutton-html5/tests/puppeteer/webcam/util.js
+++ b/bigbluebutton-html5/tests/puppeteer/webcam/util.js
@@ -3,10 +3,10 @@ const we = require('./elements');
 async function enableWebcam(test) {
   // Enabling webcam
   await test.waitForSelector(we.joinVideo);
-  await test.click(we.joinVideo);
+  await test.click(we.joinVideo, true);
   await test.waitForSelector(we.videoPreview);
   await test.waitForSelector(we.startSharingWebcam);
-  await test.click(we.startSharingWebcam);
+  await test.click(we.startSharingWebcam, true);
 }
 
 async function getTestElement(element) {
@@ -14,12 +14,58 @@ async function getTestElement(element) {
 }
 
 async function evaluateCheck(test) {
-  await test.waitForSelector(we.videoContainer);
-  const videoContainer = await test.page.evaluate(getTestElement, we.videoContainer);
+  const videoContainer = await test.page.evaluate(getTestElement, we.presentationFullscreenButton);
   const response = videoContainer !== null;
   return response;
 }
 
+async function waitForWebcamsLoading(test) {
+  await test.waitForSelector(we.videoContainer);
+  await test.waitForSelector(we.webcamConnectingStatus);
+  await test.waitForSelector(we.presentationFullscreenButton);
+}
+
+async function startAndCheckForWebcams(test) {
+  await enableWebcam(test);
+  await waitForWebcamsLoading(test);
+  const response = await evaluateCheck(test);
+  return response;
+}
+
+async function webcamContentCheck(test) {
+  await waitForWebcamsLoading(test);
+  const repeats = 5;
+  let check;
+  for (let i = repeats; i >= 0; i--) {
+    const checkCameras = function (i) {
+      const videos = document.querySelectorAll('video');
+      const lastVideoColor = document.lastVideoColor || {};
+      document.lastVideoColor = lastVideoColor;
+
+      for (let v = 0; v < videos.length; v++) {
+        const video = videos[v];
+        const canvas = document.createElement('canvas');
+        const context = canvas.getContext('2d');
+        context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
+        const pixel = context.getImageData(50, 50, 1, 1).data;
+        const pixelString = new Array(pixel).join(' ').toString();
+
+        if (lastVideoColor[v]) {
+          if (lastVideoColor[v] == pixelString) {
+            return false;
+          }
+        }
+        lastVideoColor[v] = pixelString;
+      }
+      return true;
+    };
+    return check = await test.page.evaluate(checkCameras, i);
+  }
+}
+
+exports.startAndCheckForWebcams = startAndCheckForWebcams;
+exports.waitForWebcamsLoading = waitForWebcamsLoading;
+exports.webcamContentCheck = webcamContentCheck;
 exports.evaluateCheck = evaluateCheck;
 exports.getTestElement = getTestElement;
 exports.enableWebcam = enableWebcam;
-- 
GitLab