com.fullteaching.backend.e2e.FullTeachingTestE2ESleep.java Source code

Java tutorial

Introduction

Here is the source code for com.fullteaching.backend.e2e.FullTeachingTestE2ESleep.java

Source

/*
 * (C) Copyright 2017 OpenVidu (http://openvidu.io/)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

package com.fullteaching.backend.e2e;

import static java.lang.invoke.MethodHandles.lookup;
import static org.slf4j.LoggerFactory.getLogger;

import java.util.concurrent.TimeUnit;

import static java.lang.System.getProperty;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.After;
import org.junit.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.slf4j.Logger;

import io.github.bonigarcia.SeleniumExtension;
import io.github.bonigarcia.wdm.ChromeDriverManager;
import io.github.bonigarcia.wdm.FirefoxDriverManager;

/**
 * E2E tests for openvidu-testapp.
 *
 * @author Pablo Fuente (pablo.fuente@urjc.es)
 * @since 1.1.1
 */
@Tag("e2e")
@DisplayName("E2E tests for OpenVidu TestApp")
@ExtendWith(SeleniumExtension.class)
@RunWith(JUnitPlatform.class)
public class FullTeachingTestE2ESleep {

    static String APP_URL = "https://localhost:5000/";
    static Exception ex = null;

    final static Logger log = getLogger(lookup().lookupClass());

    BrowserUser user;

    @BeforeAll()
    static void setupAll() {

        if (System.getenv("ET_EUS_API") == null) {
            //Outside ElasTest
            ChromeDriverManager.getInstance().setup();
            FirefoxDriverManager.getInstance().setup();
        }

        if (System.getenv("ET_SUT_HOST") != null) {
            APP_URL = "https://" + System.getenv("ET_SUT_HOST") + ":5000/";
        }

        log.info("Using URL {} to connect to openvidu-testapp", APP_URL);
    }

    BrowserUser setupBrowser(String browser) {

        BrowserUser u;

        switch (browser) {
        case "chrome":
            u = new ChromeUser("TestUser", 50);
            break;
        case "firefox":
            u = new FirefoxUser("TestUser", 50);
            break;
        default:
            u = new ChromeUser("TestUser", 50);
        }

        u.getDriver().get(APP_URL);

        final String GLOBAL_JS_FUNCTION = "var s = window.document.createElement('script');"
                + "s.innerText = 'window.MY_FUNC = function(containerQuerySelector) {"
                + "var elem = document.createElement(\"div\");" + "elem.id = \"video-playing-div\";"
                + "elem.innerText = \"VIDEO PLAYING\";" + "document.body.appendChild(elem);"
                + "console.error(\"ERRRRORRRR!!!!\")}';" + "window.document.head.appendChild(s);";

        u.runJavascript(GLOBAL_JS_FUNCTION);

        return u;
    }

    @AfterEach
    void dispose() {

        this.logut(user);

        user.dispose();
    }

    @Test
    @DisplayName("Test video session")
    void oneToOneVideoAudioSessionChrome() throws Exception {

        // TEACHER

        final String userEmail = "teacher@gmail.com";
        final String userPass = "pass";

        this.user = setupBrowser("chrome");

        log.info("Test video session");

        this.login(user, userEmail, userPass);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        user.getWaiter().until(ExpectedConditions.presenceOfElementLocated(
                By.cssSelector(("ul.collection li.collection-item:first-child div.course-title"))));
        user.getDriver()
                .findElement(By.cssSelector("ul.collection li.collection-item:first-child div.course-title"))
                .click();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        user.getWaiter().until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(("#md-tab-label-0-1"))));
        user.getDriver().findElement(By.cssSelector("#md-tab-label-0-1")).click();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        user.getDriver().findElement(By.cssSelector("ul div:first-child li.session-data div.session-ready"))
                .click();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        user.getWaiter()
                .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(("div.participant video"))));

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        checkVideoPlaying(user, user.getDriver().findElement(By.cssSelector(("div.participant video"))),
                "div.participant");

        // STUDENT

        BrowserUser student = setupBrowser("chrome");
        login(student, "student1@gmail.com", "pass");

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        student.getWaiter().until(ExpectedConditions.presenceOfElementLocated(
                By.cssSelector(("ul.collection li.collection-item:first-child div.course-title"))));
        student.getDriver()
                .findElement(By.cssSelector("ul.collection li.collection-item:first-child div.course-title"))
                .click();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        student.getWaiter()
                .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(("#md-tab-label-0-1"))));
        student.getDriver().findElement(By.cssSelector("#md-tab-label-0-1")).click();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        student.getDriver().findElement(By.cssSelector("ul div:first-child li.session-data div.session-ready"))
                .click();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        student.getWaiter()
                .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(("div.participant video"))));

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        checkVideoPlaying(student, student.getDriver().findElement(By.cssSelector(("div.participant video"))),
                "div.participant");

        // Student ask for intervention
        student.getWaiter().until(ExpectedConditions.elementToBeClickable(
                By.xpath("//div[@id='div-header-buttons']//i[text() = 'record_voice_over']")));
        student.getDriver()
                .findElement(By.xpath("//div[@id='div-header-buttons']//i[text() = 'record_voice_over']")).click();

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Teacher accepts intervention
        user.getWaiter()
                .until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(@class, 'usr-btn')]")));
        user.getDriver().findElement(By.xpath("//a[contains(@class, 'usr-btn')]")).click();

        // Check both videos
        student.getWaiter().until(
                ExpectedConditions.presenceOfElementLocated(By.cssSelector(("div.participant-small video"))));
        checkVideoPlaying(student, student.getDriver().findElement(By.cssSelector(("div.participant-small video"))),
                "div.participant-small");
        checkVideoPlaying(student, student.getDriver().findElement(By.cssSelector(("div.participant-small video"))),
                "div.participant-small");

        user.getWaiter().until(
                ExpectedConditions.presenceOfElementLocated(By.cssSelector(("div.participant-small video"))));
        checkVideoPlaying(user, user.getDriver().findElement(By.cssSelector(("div.participant-small video"))),
                "div.participant-small");
        checkVideoPlaying(user, user.getDriver().findElement(By.cssSelector(("div.participant-small video"))),
                "div.participant-small");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Teacher removes user
        user.getWaiter()
                .until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(@class, 'usr-btn')]")));
        user.getDriver().findElement(By.xpath("//a[contains(@class, 'usr-btn')]")).click();

        // Wait until only one video
        user.getWaiter().until(ExpectedConditions.not(ExpectedConditions
                .presenceOfAllElementsLocatedBy(By.cssSelector(("div.participant-small video")))));
        student.getWaiter().until(ExpectedConditions.not(ExpectedConditions
                .presenceOfAllElementsLocatedBy(By.cssSelector(("div.participant-small video")))));

        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Logout student
        this.logut(student);
        student.dispose();

    }

    /*@Test
    @DisplayName("Cross-Browser test")
    void crossBrowserTest() throws Exception {
           
       setupBrowser("chrome");
        
       log.info("Cross-Browser test");
        
       Thread.UncaughtExceptionHandler h = new Thread.UncaughtExceptionHandler() {
     public void uncaughtException(Thread th, Throwable ex) {
        System.out.println("Uncaught exception: " + ex);
        synchronized (lock) {
           OpenViduTestAppE2eTest.ex = new Exception(ex);
        }
     }
       };
        
       Thread t = new Thread(() -> {
     BrowserUser user2 = new FirefoxUser("TestUser", 30);
     user2.getDriver().get(APP_URL);
     WebElement urlInput = user2.getDriver().findElement(By.id("openvidu-url"));
     urlInput.clear();
     urlInput.sendKeys(OPENVIDU_URL);
     WebElement secretInput = user2.getDriver().findElement(By.id("openvidu-secret"));
     secretInput.clear();
     secretInput.sendKeys(OPENVIDU_SECRET);
        
     user2.getEventManager().startPolling();
        
     user2.getDriver().findElement(By.id("add-user-btn")).click();
     user2.getDriver().findElement(By.className("join-btn")).click();
     try {
        user2.getEventManager().waitUntilNumberOfEvent("videoPlaying", 2);
        Assert.assertTrue(user2.getEventManager()
              .assertMediaTracks(user2.getDriver().findElements(By.tagName("video")), true, true));
        user2.getEventManager().waitUntilNumberOfEvent("streamDestroyed", 1);
        user2.getDriver().findElement(By.id("remove-user-btn")).click();
        user2.getEventManager().waitUntilNumberOfEvent("sessionDisconnected", 1);
     } catch (Exception e) {
        e.printStackTrace();
        Thread.currentThread().interrupt();
     }
     user2.dispose();
       });
       t.setUncaughtExceptionHandler(h);
       t.start();
        
       user.getDriver().findElement(By.id("add-user-btn")).click();
       user.getDriver().findElement(By.className("join-btn")).click();
        
       user.getEventManager().waitUntilNumberOfEvent("videoPlaying", 2);
           
       try {
     System.out.println(getBase64Screenshot(user));
       } catch (Exception e) {
     e.printStackTrace();
       }
        
       Assert.assertTrue(user.getEventManager().assertMediaTracks(user.getDriver().findElements(By.tagName("video")),
        true, true));
        
       user.getDriver().findElement(By.id("remove-user-btn")).click();
        
       user.getEventManager().waitUntilNumberOfEvent("sessionDisconnected", 1);
        
       t.join();
        
       synchronized (lock) {
     if (OpenViduTestAppE2eTest.ex != null) {
        throw OpenViduTestAppE2eTest.ex;
     }
       }
    }*/

    private void login(BrowserUser user, String userEmail, String userPass) {
        user.getDriver().findElement(By.id("download-button")).click();

        // Find form elements (login modal is already opened)
        WebElement userNameField = user.getDriver().findElement(By.id("email"));
        WebElement userPassField = user.getDriver().findElement(By.id("password"));

        // Fill input fields
        userNameField.sendKeys(userEmail);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        userPassField.sendKeys(userPass);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Ensure fields contain what has been entered
        Assert.assertEquals(userNameField.getAttribute("value"), userEmail);
        Assert.assertEquals(userPassField.getAttribute("value"), userPass);

        user.getDriver().findElement(By.id("log-in-btn")).click();
    }

    private void logut(BrowserUser user) {
        if (user.getDriver().findElements(By.cssSelector("#fixed-icon")).size() > 0) {
            // Get out of video session page
            user.getDriver().findElement(By.cssSelector("#fixed-icon")).click();
            watiForAngularAnimations(500);
            user.getWaiter().until(ExpectedConditions.elementToBeClickable(By.cssSelector("#exit-icon")));
            user.getDriver().findElement(By.cssSelector("#exit-icon")).click();
        }
        //if (user.getDriver().findElements(By.cssSelector("#arrow-drop-down")).size() > 0) {
        try {
            // Up bar menu
            user.getWaiter().withTimeout(1000, TimeUnit.MILLISECONDS)
                    .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#arrow-drop-down")));
            user.getDriver().findElement(By.cssSelector("#arrow-drop-down")).click();
            watiForAngularAnimations(250);
            user.getWaiter().until(ExpectedConditions.elementToBeClickable(By.cssSelector("#logout-button")));
            user.getDriver().findElement(By.cssSelector("#logout-button")).click();
        } catch (TimeoutException e) {
            // Shrunk menu
            user.getWaiter().withTimeout(1000, TimeUnit.MILLISECONDS)
                    .until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("a.button-collapse")));
            user.getDriver().findElement(By.cssSelector("a.button-collapse")).click();
            watiForAngularAnimations(250);
            user.getWaiter().until(ExpectedConditions
                    .elementToBeClickable(By.xpath("//ul[@id='nav-mobile']//a[text() = 'Logout']")));
            user.getDriver().findElement(By.xpath("//ul[@id='nav-mobile']//a[text() = 'Logout']")).click();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        user.getWaiter().until(ExpectedConditions.elementToBeClickable(By.id("download-button")));
    }

    private boolean checkVideoPlaying(BrowserUser user, WebElement videoElement, String containerQuerySelector) {

        // Video element should be in 'readyState'='HAVE_ENOUGH_DATA'
        user.getWaiter().until(ExpectedConditions.attributeToBe(videoElement, "readyState", "4"));

        // Video should have a srcObject (type MediaStream) with the attribute 'active' to true
        Assert.assertTrue((boolean) user.runJavascript("return document.querySelector('" + containerQuerySelector
                + "').getElementsByTagName('video')[0].srcObject.active"));

        // Video should trigger 'playing' event
        user.runJavascript("document.querySelector('" + containerQuerySelector
                + "').getElementsByTagName('video')[0].addEventListener('playing', window.MY_FUNC('"
                + containerQuerySelector + "'));");

        user.getWaiter().until(
                ExpectedConditions.attributeContains(By.id("video-playing-div"), "innerHTML", "VIDEO PLAYING"));

        user.runJavascript("document.body.removeChild(document.getElementById('video-playing-div'))");

        return true;
    }

    private void watiForAngularAnimations(int milliseconds) {
        try {
            Thread.sleep(milliseconds);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}