blob: 8fa000366474c642e255ecb04bad97156aa44901 [file] [log] [blame]
# 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')