integration/js/pages/MeetingReadinessCheckerPage.js (186 lines of code) (raw):
const {By} = require('selenium-webdriver');
const {TestUtils} = require('kite-common');
const elements = {
authenticateButton: By.id('authenticate'),
speakerTestButton: By.id('speakertest-button'),
speakerTest: By.id('speaker-test'),
speakerFeedbackYes: By.id('speaker-yes'),
speakerFeedbackNo: By.id('speaker-no'),
speakerAudioElement: By.id('speaker-test-audio-element'),
micTest: By.id('mic-test'),
videoTest: By.id('video-test'),
cameraResolutionTest1: By.id('camera-test1'),
cameraResolutionTest2: By.id('camera-test2'),
cameraResolutionTest3: By.id('camera-test3'),
networkTCPTest: By.id('networktcp-test'),
networkUDPTest: By.id('networkudp-test'),
audioConnectivityTest: By.id('audioconnectivity-test'),
videoConnectivityTest: By.id('videoconnectivity-test'),
contentShareConnectivityTest: By.id('contentshare-test'),
contentShareConnectivityTestButton: By.id('contentshare-button'),
readinessCheckerFlow: By.id('flow-readinesstest'),
};
const badgeSuccessLabel = 'bg-success';
class MeetingReadinessCheckerPage {
constructor(driver, logger) {
this.driver = driver;
this.logger = logger;
}
async open(stepInfo) {
await TestUtils.open(stepInfo);
}
async close(stepInfo) {
await stepInfo.driver.close();
}
async startCheck() {
let authenticateButton = await this.driver.findElement(elements.authenticateButton);
await authenticateButton.click();
}
async startContentShareConnectivityCheck() {
let contentShareConnectivityCheckButton = await this.driver.findElement(elements.contentShareConnectivityTestButton);
await contentShareConnectivityCheckButton.click();
}
async startSpeakerTest() {
let spekerTestButtonExists = await this.driver.findElements(elements.speakerTestButton);
if (spekerTestButtonExists.length > 0) {
let speakerTestButton = await this.driver.findElement(elements.speakerTestButton);
await speakerTestButton.click();
}
}
async speakerCheckFeedbackYes() {
let speakerCheckFeedbackYesButton = await this.driver.findElement(elements.speakerFeedbackYes);
await speakerCheckFeedbackYesButton.click();
}
async speakerCheckFeedbackNo() {
let speakerCheckFeedbackNoButton = await this.driver.findElement(elements.speakerFeedbackNo);
await speakerCheckFeedbackNoButton.click();
}
async checkSpeakerTestSucceed() {
let audioFrequencyCheckResult = await this.audioFrequencyCheck();
if(audioFrequencyCheckResult) {
await this.speakerCheckFeedbackYes();
} else {
await this.speakerCheckFeedbackNo();
}
await TestUtils.waitAround(3000);
let checkSpeakerFeedback = await this.driver.findElement(elements.speakerTest).getAttribute('class');
return checkSpeakerFeedback.includes(badgeSuccessLabel);
}
async checkAudioConnectivitySucceed() {
let checkAudioConnectivityFeedback = await this.driver.findElement(elements.audioConnectivityTest).getAttribute('class');
return checkAudioConnectivityFeedback.includes(badgeSuccessLabel);
}
async checkVideoConnectivitySucceed() {
let checkVideoConnectivityFeedback = await this.driver.findElement(elements.videoConnectivityTest).getAttribute('class');
return checkVideoConnectivityFeedback.includes(badgeSuccessLabel);
}
async checkContentShareConnectivitySucceed() {
let checkContentShareConnectivityFeedback = await this.driver.findElement(elements.contentShareConnectivityTest).getAttribute('class');
return checkContentShareConnectivityFeedback.includes(badgeSuccessLabel);
}
async checkNetworkUDPConnectivitySucceed() {
let checkNetworkUDPConnectivityFeedback = await this.driver.findElement(elements.networkUDPTest).getAttribute('class');
return checkNetworkUDPConnectivityFeedback.includes(badgeSuccessLabel);
}
async checkNetworkTCPConnectivitySucceed() {
let checkNetworkTCPConnectivityFeedback = await this.driver.findElement(elements.networkTCPTest).getAttribute('class');
return checkNetworkTCPConnectivityFeedback.includes(badgeSuccessLabel);
}
async audioFrequencyCheck() {
let res = undefined;
try {
res = await this.driver.executeAsyncScript(async () => {
let logs = [];
let callback = arguments[arguments.length - 1];
const sleep = (milliseconds) => {
return new Promise(resolve => setTimeout(resolve, milliseconds))
};
let successfulToneChecks = 0;
let totalToneChecks = 0;
let audioContext = new (window.AudioContext || window.webkitAudioContext)();
let minToneError = Infinity;
let maxToneError = -Infinity;
try {
let stream = document.getElementById("speaker-test-audio-element").srcObject;
let source = audioContext.createMediaStreamSource(stream);
let analyser = audioContext.createAnalyser();
source.connect(analyser);
let byteFrequencyData = new Uint8Array(analyser.frequencyBinCount);
let floatFrequencyData = new Float32Array(analyser.frequencyBinCount);
await sleep(5000);
const checkFrequency = (targetReceiveFrequency) => {
analyser.getFloatFrequencyData(floatFrequencyData);
let maxBinDb = -Infinity;
let hotBinFrequency = 0;
const binSize = audioContext.sampleRate / analyser.fftSize; // default fftSize is 2048
for (let i = 0; i < floatFrequencyData.length; i++) {
const v = floatFrequencyData[i];
if (v > maxBinDb) {
maxBinDb = v;
hotBinFrequency = i * binSize;
}
}
const error = Math.abs(hotBinFrequency - targetReceiveFrequency);
if (maxBinDb > -Infinity) {
if (error < minToneError) {
minToneError = error;
}
if (error > maxToneError) {
maxToneError = error;
}
}
if (error <= 2 * binSize) {
successfulToneChecks++;
}
totalToneChecks++;
return hotBinFrequency
};
const checkFrequencyFor = async (runCount, freq) => {
let i = 0;
for (i = 0; i < runCount; i++) {
const testFrequency = checkFrequency(freq);
logs.push(`Resulting Frequency ${testFrequency}`);
i++;
await sleep(100)
}
};
await checkFrequencyFor(50, 440);
} catch (e) {
logs.push(`${e}`)
} finally {
logs.push(`Frequency check completed`);
await audioContext.close();
callback({
percentage: successfulToneChecks / totalToneChecks,
logs
});
}
});
} catch (e) {
this.logger(`Audio output check failed ${e}`)
} finally {
if (res) {
res.logs.forEach(l => {
this.logger(l)
})
}
}
this.logger(`Audio output check success rate: ${res.percentage * 100}%`);
if (res.percentage >= 0.75) {
return true
}
return false
}
async isTestContentShareConnectivityButtonEnabled() {
let button = await this.driver.findElement(elements.contentShareConnectivityTestButton);
return await button.isEnabled();
}
async isStartMeetingReadinessCheckerButtonEnabled() {
let authenticateButton = await this.driver.findElement(elements.authenticateButton);
return await authenticateButton.isEnabled();
}
async checkIfMeetingAuthenticatedAndMeetingReadinessCheckerInitialized() {
return await this.driver.findElement(elements.readinessCheckerFlow).isDisplayed();
}
}
module.exports = MeetingReadinessCheckerPage;