# Copyright 2019 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. # # assistant_util.py is supposed to be called from chrome.py for Assistant # specific logic. from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib import utils from telemetry.core import exceptions def enable_assistant(autotest_ext): """Enables Google Assistant. @param autotest_ext private autotest extension. @raise error.TestFail if failed to start Assistant service within time. """ if autotest_ext is None: raise error.TestFail('Could not start Assistant service because ' 'autotest extension is not available.') try: autotest_ext.ExecuteJavaScript(''' window.__assistant_ready = 0; chrome.autotestPrivate.setAssistantEnabled(true, 10 * 1000 /* timeout_ms */, () => { if (chrome.runtime.lastError) { window.__assistant_ready = -1; window.__assistant_error_msg = chrome.runtime.lastError.message; } else { window.__assistant_ready = 1; } }); ''') except exceptions.EvaluateException as e: raise error.TestFail('Could not start Assistant "%s".' % e) ready = utils.poll_for_condition( lambda: autotest_ext.EvaluateJavaScript( 'window.__assistant_ready'), desc='Wait for the assistant running state to return.') if ready == -1: raise error.TestFail( autotest_ext.EvaluateJavaScript( 'window.__assistant_error_msg')) def enable_hotword(autotest_ext): """Enables hotword in Google Assistant. @param autotest_ext private autotest extension. @raise error.TestFail if failed to enable hotword feature within time. """ try: autotest_ext.ExecuteJavaScript(''' window.__assistant_hotword_ready = 0; chrome.autotestPrivate.setWhitelistedPref( 'settings.voice_interaction.hotword.enabled', true, function(response) { if (chrome.runtime.lastError) { window.__assistant_hotword_ready = -1; window.__assistant_hotword_error_msg = chrome.runtime.lastError.message; } else { window.__assistant_hotword_ready = 1; } }); ''') except exceptions.EvaluateException as e: raise error.TestFail('Could not enable Hotword "{}".'.format(e)) ready = utils.poll_for_condition( lambda: autotest_ext.EvaluateJavaScript( 'window.__assistant_hotword_ready'), desc='Wait for the hotword pref change event to return".') if ready == -1: raise error.TestFail( autotest_ext.EvaluateJavaScript( 'window.__assistant_hotword_error_msg')) def send_text_query(autotest_ext, text_query): """Sends text query to Assistant and returns response. @param autotest_ext private autotest extension. @param text_query text query. @return dictionary containing the information of Assistant query response, mapping from response type to content. """ try: autotest_ext.ExecuteJavaScript(''' window.__assistant_response_ready = 0; chrome.autotestPrivate.sendAssistantTextQuery('%s', 10 * 1000, function(response) { if (chrome.runtime.lastError) { window.__assistant_response_ready = -1; window.__assistant_error_msg = chrome.runtime.lastError.message; } else { window.__assistant_response_ready = 1; window.__query_response = response; } }); ''' % text_query) except exceptions.EvaluateException as e: raise error.TestFail('Could not get Assistant response "%s".' % e) is_ready = utils.poll_for_condition( lambda: autotest_ext.EvaluateJavaScript( 'window.__assistant_response_ready'), desc='Waiting for Assistant response.') if is_ready == -1: raise error.TestFail( autotest_ext.EvaluateJavaScript( 'window.__assistant_error_msg')) return autotest_ext.EvaluateJavaScript('window.__query_response')