async echoAudioCheck()

in integration/js/pages/AppPage.js [1005:1084]


  async echoAudioCheck(stepInfo, expectedState){
    let res = undefined;
    try {
      res = await this.driver.executeAsyncScript(async (expectedState) => {
        const logs = [];
        const callback = arguments[arguments.length - 1];

        const sleep = (milliseconds) => {
          return new Promise(resolve => setTimeout(resolve, milliseconds));
        };

        const audioContext = new (window.AudioContext || window.webkitAudioContext)();
        let successfulChecks = 0;
        let totalChecks = 0;
        try {
          const stream = document.getElementById('meeting-audio').srcObject;
          const source = audioContext.createMediaStreamSource(stream);
          const analyser = audioContext.createAnalyser();
          source.connect(analyser);
          let byteFrequencyData = new Uint8Array(analyser.frequencyBinCount);

          await sleep(5000);

          // get the average volume from the frequency data
          const getAverageVolume = () => {
            analyser.getByteFrequencyData(byteFrequencyData);

            let values = 0;
            let average = 0;
            const length = byteFrequencyData.length;
            for (const value of byteFrequencyData) {
              values += value;
            }
            average = values / length;
            return average;
          };

          // check the volume for runCount times
          const checkVolumeFor = async (runCount) => {
            for (let i = 0; i < runCount; ++i){
              totalChecks++;
              const avgTestVolume = getAverageVolume();
              logs.push(`Resulting volume ${avgTestVolume}`);
              if (
                (expectedState === 'AUDIO_ON' && avgTestVolume > 0) ||
                (expectedState === 'AUDIO_OFF' && avgTestVolume === 0)
              ) {
                successfulChecks++;
              }
              await sleep(100);
            }
          };

          await checkVolumeFor(25);
        } catch (e) {
          logs.push(`${e}`);
        } finally {
          logs.push(`Echo test completed`);
          await audioContext.close();
          callback({
            percentage: successfulChecks / totalChecks,
            logs
          });
        }
      }, expectedState);
    } catch (e) {
      this.logger(`Echo Audio Check Failed ${e}`);
    } finally {
      if (res) {
        res.logs.forEach(l => {
          this.logger(l);
        })
      }
    }
    this.logger(`Echo Audio check success rate: ${res.percentage * 100}%`);
    if (res.percentage >= 0.75) {
      return true;
    }
    return false;
  }