| # 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 |
| from autotest_lib.client.common_lib.cros import chrome |
| |
| DEFAULT_TIMEOUT = 30 |
| DIAGNOSTIC_RUN_TIMEOUT = 180 |
| |
| def get_cfm_webview_context(browser, ext_id): |
| """Get context for CFM webview. |
| |
| @param broswer: Telemetry broswer object. |
| @param ext_id: Extension id of the hangouts app. |
| @return webview context. |
| """ |
| ext_contexts = wait_for_kiosk_ext(browser, ext_id) |
| |
| for context in ext_contexts: |
| context.WaitForDocumentReadyStateToBeInteractiveOrBetter() |
| tagName = context.EvaluateJavaScript( |
| "document.querySelector('webview') ? 'WEBVIEW' : 'NOWEBVIEW'") |
| |
| if tagName == "WEBVIEW": |
| def webview_context(): |
| try: |
| wb_contexts = context.GetWebviewContexts() |
| if len(wb_contexts) == 1: |
| return wb_contexts[0] |
| except (KeyError, chrome.Error): |
| pass |
| return None |
| return utils.poll_for_condition( |
| webview_context, |
| exception=error.TestFail('Hangouts webview not available.'), |
| timeout=DEFAULT_TIMEOUT, |
| sleep_interval=1) |
| |
| |
| def wait_for_kiosk_ext(browser, ext_id): |
| """Wait for kiosk extension launch. |
| |
| @param browser: Telemetry browser object. |
| @param ext_id: Extension id of the hangouts app. |
| @return extension contexts. |
| """ |
| def kiosk_ext_contexts(): |
| try: |
| ext_contexts = browser.extensions.GetByExtensionId(ext_id) |
| if len(ext_contexts) > 1: |
| return ext_contexts |
| except (KeyError, chrome.Error): |
| pass |
| return [] |
| return utils.poll_for_condition( |
| kiosk_ext_contexts, |
| exception=error.TestFail('Kiosk app failed to launch'), |
| timeout=DEFAULT_TIMEOUT, |
| sleep_interval=1) |
| |
| |
| def wait_for_telemetry_commands(webview_context): |
| """Wait for hotrod app to load and telemetry commands to be available. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.WaitForJavaScriptExpression( |
| "typeof window.hrOobIsStartPageForTest == 'function'", |
| DEFAULT_TIMEOUT) |
| logging.info('Hotrod telemetry commands available for testing.') |
| |
| |
| # UI commands/functions |
| def wait_for_oobe_start_page(webview_context): |
| """Wait for oobe start screen to launch. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.WaitForJavaScriptExpression( |
| "window.hrOobIsStartPageForTest() === true;", DEFAULT_TIMEOUT) |
| logging.info('Reached oobe start page') |
| |
| |
| def skip_oobe_screen(webview_context): |
| """Skip Chromebox for Meetings oobe screen. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript("window.hrOobSkipForTest()") |
| utils.poll_for_condition(lambda: not 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(webview_context): |
| """Check if device is on CFM oobe start screen. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if 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(webview_context, hangout_name): |
| """Start a new hangout session. |
| |
| @param webview_context: Context for hangouts webview. |
| @param hangout_name: Name of the hangout session. |
| """ |
| if not is_ready_to_start_hangout_session(webview_context): |
| if is_in_hangout_session(webview_context): |
| end_hangout_session(webview_context) |
| utils.poll_for_condition(lambda: webview_context.EvaluateJavaScript( |
| "window.hrIsReadyToStartHangoutForTest()"), |
| exception=error.TestFail('Not ready to start hangout session.'), |
| timeout=DEFAULT_TIMEOUT, |
| sleep_interval=1) |
| |
| webview_context.ExecuteJavaScript("window.hrStartCallForTest('" + |
| hangout_name + "')") |
| utils.poll_for_condition(lambda: 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(webview_context): |
| """End current hangout session. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript("window.hrHangupCallForTest()") |
| utils.poll_for_condition(lambda: not 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(webview_context): |
| """Check if device is in hangout session. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if 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(webview_context): |
| """Check if device is ready to start a new hangout session. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if (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 |
| |
| |
| # Diagnostics commands/functions |
| def is_diagnostic_run_in_progress(webview_context): |
| """Check if hotrod diagnostics is running. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if (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(webview_context): |
| """Wait for hotrod diagnostics to complete. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| utils.poll_for_condition(lambda: not 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(webview_context): |
| """Run hotrod diagnostics. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if is_diagnostic_run_in_progress(webview_context): |
| wait_for_diagnostic_run_to_complete(webview_context) |
| webview_context.ExecuteJavaScript("window.hrRunDiagnosticsForTest()") |
| logging.info('Started diagnostics run.') |
| |
| |
| def get_last_diagnostics_results(webview_context): |
| """Get latest hotrod diagnostics results. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if is_diagnostic_run_in_progress(webview_context): |
| wait_for_diagnostic_run_to_complete(webview_context) |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetLastDiagnosticsResultForTest()") |
| |
| |
| # Mic audio commands/functions |
| def is_mic_muted(webview_context): |
| """Check if mic is muted. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if webview_context.EvaluateJavaScript("window.hrGetAudioInMutedForTest()"): |
| logging.info('Mic is muted.') |
| return True |
| logging.info('Mic is not muted.') |
| return False |
| |
| def mute_mic(webview_context): |
| """Local mic mute from toolbar. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript("window.hrSetAudioInMutedForTest(true)") |
| logging.info('Locally muted mic.') |
| |
| |
| def unmute_mic(webview_context): |
| """Local mic unmute from toolbar. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript("window.hrSetAudioInMutedForTest(false)") |
| logging.info('Locally unmuted mic.') |
| |
| |
| def remote_mute_mic(webview_context): |
| """Remote mic mute request from cPanel. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript("window.hrMuteAudioForTest()") |
| logging.info('Remotely muted mic.') |
| |
| |
| def remote_unmute_mic(webview_context): |
| """Remote mic unmute request from cPanel. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript("window.hrUnmuteAudioForTest()") |
| logging.info('Remotely unmuted mic.') |
| |
| |
| def get_mic_devices(webview_context): |
| """Get all mic devices detected by hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetAudioInDevicesForTest()") |
| |
| |
| def get_preferred_mic(webview_context): |
| """Get mic preferred for hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetAudioInPrefForTest()") |
| |
| |
| def set_preferred_mic(webview_context, mic): |
| """Set preferred mic for hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| @param mic: String with mic name. |
| """ |
| webview_context.ExecuteJavaScript( |
| "window.hrSetAudioInPrefForTest('" + mic + "')") |
| logging.info('Setting preferred mic to %s.', mic) |
| |
| |
| # Speaker commands/functions |
| def get_speaker_devices(webview_context): |
| """Get all speaker devices detected by hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetAudioOutDevicesForTest()") |
| |
| |
| def get_preferred_speaker(webview_context): |
| """Get speaker preferred for hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetAudioOutPrefForTest()") |
| |
| |
| def set_preferred_speaker(webview_context, speaker): |
| """Set preferred speaker for hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| @param mic: String with speaker name. |
| """ |
| webview_context.ExecuteJavaScript( |
| "window.hrSetAudioOutPrefForTest('" + speaker + "')") |
| logging.info('Set preferred speaker to %s.', speaker) |
| |
| |
| def set_speaker_volume(webview_context, volume_level): |
| """Set speaker volume. |
| |
| @param webview_context: Context for hangouts webview. |
| @param volume_level: String value ranging from 0-100 to set volume to. |
| """ |
| webview_context.ExecuteJavaScript( |
| "window.hrSetAudioOutVolumeLevelForTest('" + volume_level + "')") |
| logging.info('Set speaker volume to %s', volume_level) |
| |
| |
| def get_speaker_volume(webview_context): |
| """Get current speaker volume. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetAudioOutVolumeLevelForTest()") |
| |
| |
| def play_test_sound(webview_context): |
| """Play test sound. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript("window.hrPlayTestSoundForTest()") |
| logging.info('Playing test sound.') |
| |
| |
| # Camera commands/functions |
| def get_camera_devices(webview_context): |
| """Get all camera devices detected by hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetVideoCaptureDevicesForTest()") |
| |
| |
| def get_preferred_camera(webview_context): |
| """Get camera preferred for hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| return webview_context.EvaluateJavaScript( |
| "window.hrGetVideoCapturePrefForTest()") |
| |
| |
| def set_preferred_camera(webview_context, camera): |
| """Set preferred camera for hotrod. |
| |
| @param webview_context: Context for hangouts webview. |
| @param mic: String with camera name. |
| """ |
| webview_context.ExecuteJavaScript( |
| "window.hrSetVideoCapturePrefForTest('" + camera + "')") |
| logging.info('Set preferred camera to %s.', camera) |
| |
| |
| def is_camera_muted(webview_context): |
| """Check if camera is muted (turned off). |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| if webview_context.EvaluateJavaScript("window.hrGetVideoCaptureMutedForTest()"): |
| logging.info('Camera is muted.') |
| return True |
| logging.info('Camera is not muted.') |
| return False |
| |
| |
| def mute_camera(webview_context): |
| """Turned camera off. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript( |
| "window.hrSetVideoCaptureMutedForTest(true)") |
| logging.info('Camera muted.') |
| |
| |
| def unmute_camera(webview_context): |
| """Turned camera on. |
| |
| @param webview_context: Context for hangouts webview. |
| """ |
| webview_context.ExecuteJavaScript( |
| "window.hrSetVideoCaptureMutedForTest(false)") |
| logging.info('Camera unmuted.') |