blob: 16482f7f0763c1c4efea687dc37aeb45c74d4119 [file] [log] [blame]
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
DEFAULT_TIMEOUT = 30
DIAGNOSTIC_RUN_TIMEOUT = 180
class CfmHangoutsAPI(object):
"""Utility class for interacting with Hangouts in CFM."""
def __init__(self, webview_context):
self._webview_context = webview_context
def wait_for_telemetry_commands(self):
"""Wait for hotrod app to load and telemetry commands to be available.
"""
self._webview_context.WaitForJavaScriptCondition(
"typeof window.hrOobIsStartPageForTest == 'function'",
timeout=DEFAULT_TIMEOUT)
logging.info('Hotrod telemetry commands available for testing.')
def wait_for_meetings_in_call_page(self):
"""Waits for the in-call page to launch."""
raise NotImplementedError
def wait_for_meetings_landing_page(self):
"""Waits for the landing page screen."""
raise NotImplementedError
# UI commands/functions
def wait_for_oobe_start_page(self):
"""Wait for oobe start screen to launch."""
self._webview_context.WaitForJavaScriptCondition(
"window.hasOwnProperty('hrOobIsStartPageForTest') "
"&& window.hrOobIsStartPageForTest() === true;",
timeout=DEFAULT_TIMEOUT)
logging.info('Reached oobe start page')
def skip_oobe_screen(self):
"""Skip Chromebox for Meetings oobe screen."""
self._webview_context.ExecuteJavaScript("window.hrOobSkipForTest()")
utils.poll_for_condition(
lambda: not self._webview_context.EvaluateJavaScript(
"window.hrOobIsStartPageForTest()"),
exception=error.TestFail('Not able to skip oobe screen.'),
timeout=DEFAULT_TIMEOUT,
sleep_interval=1)
logging.info('Skipped oobe screen.')
def is_oobe_start_page(self):
"""Check if device is on CFM oobe start screen."""
if self._webview_context.EvaluateJavaScript(
"window.hrOobIsStartPageForTest()"):
logging.info('Is on oobe start page.')
return True
logging.info('Is not on oobe start page.')
return False
# Hangouts commands/functions
def start_new_hangout_session(self, hangout_name):
"""Start a new hangout session.
@param hangout_name: Name of the hangout session.
"""
if not self.is_ready_to_start_hangout_session():
if self.is_in_hangout_session():
self.end_hangout_session()
utils.poll_for_condition(
lambda: self._webview_context.EvaluateJavaScript(
"window.hrIsReadyToStartHangoutForTest()"),
exception=error.TestFail(
'Not ready to start hangout session.'),
timeout=DEFAULT_TIMEOUT,
sleep_interval=1)
self._webview_context.ExecuteJavaScript("window.hrStartCallForTest('" +
hangout_name + "')")
utils.poll_for_condition(
lambda: self._webview_context.EvaluateJavaScript(
"window.hrIsInHangoutForTest()"),
exception=error.TestFail('Not able to start session.'),
timeout=DEFAULT_TIMEOUT,
sleep_interval=1)
logging.info('Started hangout session: %s', hangout_name)
def end_hangout_session(self):
"""End current hangout session."""
self._webview_context.ExecuteJavaScript("window.hrHangupCallForTest()")
utils.poll_for_condition(
lambda: not self._webview_context.EvaluateJavaScript(
"window.hrIsInHangoutForTest()"),
exception=error.TestFail('Not able to end session.'),
timeout=DEFAULT_TIMEOUT,
sleep_interval=1)
logging.info('Ended hangout session.')
def is_in_hangout_session(self):
"""Check if device is in hangout session."""
if self._webview_context.EvaluateJavaScript(
"window.hrIsInHangoutForTest()"):
logging.info('Is in hangout session.')
return True
logging.info('Is not in hangout session.')
return False
def is_ready_to_start_hangout_session(self):
"""Check if device is ready to start a new hangout session."""
if (self._webview_context.EvaluateJavaScript(
"window.hrIsReadyToStartHangoutForTest()")):
logging.info('Is ready to start hangout session.')
return True
logging.info('Is not ready to start hangout session.')
return False
def join_meeting_session(self, meeting_name):
"""Joins a meeting.
@param meeting_name: Name of the meeting session.
"""
raise NotImplementedError
def end_meeting_session(self):
"""End current meeting session."""
raise NotImplementedError
def is_in_meeting_session(self):
"""Check if device is in meeting session."""
raise NotImplementedError
def get_participant_count(self):
"""Returns the total number of participants in a hangout."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetParticipantsCountInCallForTest()")
# Diagnostics commands/functions
def is_diagnostic_run_in_progress(self):
"""Check if hotrod diagnostics is running."""
if (self._webview_context.EvaluateJavaScript(
"window.hrIsDiagnosticRunInProgressForTest()")):
logging.info('Diagnostic run is in progress.')
return True
logging.info('Diagnostic run is not in progress.')
return False
def wait_for_diagnostic_run_to_complete(self):
"""Wait for hotrod diagnostics to complete."""
utils.poll_for_condition(
lambda: not self._webview_context.EvaluateJavaScript(
"window.hrIsDiagnosticRunInProgressForTest()"),
exception=error.TestError('Diagnostic run still in progress '
'after 3 minutes.'),
timeout=DIAGNOSTIC_RUN_TIMEOUT,
sleep_interval=1)
def run_diagnostics(self):
"""Run hotrod diagnostics."""
if self.is_diagnostic_run_in_progress():
self.wait_for_diagnostic_run_to_complete()
self._webview_context.ExecuteJavaScript(
"window.hrRunDiagnosticsForTest()")
logging.info('Started diagnostics run.')
def get_last_diagnostics_results(self):
"""Get latest hotrod diagnostics results."""
if self.is_diagnostic_run_in_progress():
self.wait_for_diagnostic_run_to_complete()
return self._webview_context.EvaluateJavaScript(
"window.hrGetLastDiagnosticsResultForTest()")
# Mic audio commands/functions
def is_mic_muted(self):
"""Check if mic is muted."""
if self._webview_context.EvaluateJavaScript(
"window.hrGetAudioInMutedForTest()"):
logging.info('Mic is muted.')
return True
logging.info('Mic is not muted.')
return False
def mute_mic(self):
"""Local mic mute from toolbar."""
self._webview_context.ExecuteJavaScript(
"window.hrSetAudioInMutedForTest(true)")
logging.info('Locally muted mic.')
def unmute_mic(self):
"""Local mic unmute from toolbar."""
self._webview_context.ExecuteJavaScript(
"window.hrSetAudioInMutedForTest(false)")
logging.info('Locally unmuted mic.')
def remote_mute_mic(self):
"""Remote mic mute request from cPanel."""
self._webview_context.ExecuteJavaScript("window.hrMuteAudioForTest()")
logging.info('Remotely muted mic.')
def remote_unmute_mic(self):
"""Remote mic unmute request from cPanel."""
self._webview_context.ExecuteJavaScript(
"window.hrUnmuteAudioForTest()")
logging.info('Remotely unmuted mic.')
def get_mic_devices(self):
"""Get all mic devices detected by hotrod."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetAudioInDevicesForTest()")
def get_preferred_mic(self):
"""Get mic preferred for hotrod."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetAudioInPrefForTest()")
def set_preferred_mic(self, mic):
"""Set preferred mic for hotrod.
@param mic: String with mic name.
"""
self._webview_context.ExecuteJavaScript(
"window.hrSetAudioInPrefForTest('" + mic + "')")
logging.info('Setting preferred mic to %s.', mic)
# Speaker commands/functions
def get_speaker_devices(self):
"""Get all speaker devices detected by hotrod."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetAudioOutDevicesForTest()")
def get_preferred_speaker(self):
"""Get speaker preferred for hotrod."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetAudioOutPrefForTest()")
def set_preferred_speaker(self, speaker):
"""Set preferred speaker for hotrod.
@param mic: String with speaker name.
"""
self._webview_context.ExecuteJavaScript(
"window.hrSetAudioOutPrefForTest('" + speaker + "')")
logging.info('Set preferred speaker to %s.', speaker)
def set_speaker_volume(self, vol_level):
"""Set speaker volume.
@param vol_level: String value ranging from 0-100 to set volume to.
"""
self._webview_context.ExecuteJavaScript(
"window.hrSetAudioOutVolumeLevelForTest('" + vol_level + "')")
logging.info('Set speaker volume to %s', vol_level)
def get_speaker_volume(self):
"""Get current speaker volume."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetAudioOutVolumeLevelForTest()")
def play_test_sound(self):
"""Play test sound."""
self._webview_context.ExecuteJavaScript(
"window.hrPlayTestSoundForTest()")
logging.info('Playing test sound.')
# Camera commands/functions
def get_camera_devices(self):
"""Get all camera devices detected by hotrod."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetVideoCaptureDevicesForTest()")
def get_preferred_camera(self):
"""Get camera preferred for hotrod."""
return self._webview_context.EvaluateJavaScript(
"window.hrGetVideoCapturePrefForTest()")
def set_preferred_camera(self, camera):
"""Set preferred camera for hotrod.
@param mic: String with camera name.
"""
self._webview_context.ExecuteJavaScript(
"window.hrSetVideoCapturePrefForTest('" + camera + "')")
logging.info('Set preferred camera to %s.', camera)
def is_camera_muted(self):
"""Check if camera is muted (turned off)."""
if self._webview_context.EvaluateJavaScript(
"window.hrGetVideoCaptureMutedForTest()"):
logging.info('Camera is muted.')
return True
logging.info('Camera is not muted.')
return False
def mute_camera(self):
"""Turned camera off."""
self._webview_context.ExecuteJavaScript(
"window.hrSetVideoCaptureMutedForTest(true)")
logging.info('Camera muted.')
def unmute_camera(self):
"""Turned camera on."""
self._webview_context.ExecuteJavaScript(
"window.hrSetVideoCaptureMutedForTest(false)")
logging.info('Camera unmuted.')