Home | History | Annotate | Download | only in cros
      1 # Copyright 2019 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 #
      5 # assistant_util.py is supposed to be called from chrome.py for Assistant
      6 # specific logic.
      7 
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.common_lib import utils
     10 from telemetry.core import exceptions
     11 
     12 
     13 def enable_assistant(autotest_ext):
     14     """Enables Google Assistant.
     15 
     16     @param autotest_ext private autotest extension.
     17     @raise error.TestFail if failed to start Assistant service within time.
     18     """
     19     if autotest_ext is None:
     20         raise error.TestFail('Could not start Assistant service because '
     21                              'autotest extension is not available.')
     22 
     23     try:
     24         autotest_ext.ExecuteJavaScript('''
     25             window.__assistant_ready = 0;
     26             chrome.autotestPrivate.setAssistantEnabled(true,
     27                 10 * 1000 /* timeout_ms */,
     28                 () => {
     29                     if (chrome.runtime.lastError) {
     30                       window.__assistant_ready = -1;
     31                       window.__assistant_error_msg =
     32                             chrome.runtime.lastError.message;
     33                     } else {
     34                       window.__assistant_ready = 1;
     35                     }
     36                 });
     37         ''')
     38     except exceptions.EvaluateException as e:
     39         raise error.TestFail('Could not start Assistant "%s".' % e)
     40 
     41     ready = utils.poll_for_condition(
     42                 lambda: autotest_ext.EvaluateJavaScript(
     43                     'window.__assistant_ready'),
     44                 desc='Wait for the assistant running state to return.')
     45 
     46     if ready == -1:
     47         raise error.TestFail(
     48                 autotest_ext.EvaluateJavaScript(
     49                         'window.__assistant_error_msg'))
     50 
     51 
     52 def enable_hotword(autotest_ext):
     53     """Enables hotword in Google Assistant.
     54 
     55     @param autotest_ext private autotest extension.
     56     @raise error.TestFail if failed to enable hotword feature within time.
     57     """
     58     try:
     59         autotest_ext.ExecuteJavaScript('''
     60             window.__assistant_hotword_ready = 0;
     61             chrome.autotestPrivate.setWhitelistedPref(
     62               'settings.voice_interaction.hotword.enabled', true,
     63               function(response) {
     64                 if (chrome.runtime.lastError) {
     65                   window.__assistant_hotword_ready = -1;
     66                   window.__assistant_hotword_error_msg =
     67                       chrome.runtime.lastError.message;
     68                 } else {
     69                   window.__assistant_hotword_ready = 1;
     70                 }
     71               });
     72             ''')
     73     except exceptions.EvaluateException as e:
     74         raise error.TestFail('Could not enable Hotword "{}".'.format(e))
     75 
     76     ready = utils.poll_for_condition(
     77             lambda: autotest_ext.EvaluateJavaScript(
     78                     'window.__assistant_hotword_ready'),
     79             desc='Wait for the hotword pref change event to return".')
     80 
     81     if ready == -1:
     82         raise error.TestFail(
     83                 autotest_ext.EvaluateJavaScript(
     84                         'window.__assistant_hotword_error_msg'))
     85 
     86 
     87 def send_text_query(autotest_ext, text_query):
     88     """Sends text query to Assistant and returns response.
     89 
     90     @param autotest_ext private autotest extension.
     91     @param text_query text query.
     92     @return dictionary containing the information of Assistant query
     93             response, mapping from response type to content.
     94     """
     95     try:
     96         autotest_ext.ExecuteJavaScript('''
     97             window.__assistant_response_ready = 0;
     98             chrome.autotestPrivate.sendAssistantTextQuery('%s', 10 * 1000,
     99                 function(response) {
    100                   if (chrome.runtime.lastError) {
    101                     window.__assistant_response_ready = -1;
    102                     window.__assistant_error_msg =
    103                         chrome.runtime.lastError.message;
    104                   } else {
    105                     window.__assistant_response_ready = 1;
    106                     window.__query_response = response;
    107                   }
    108                 });
    109             ''' % text_query)
    110     except exceptions.EvaluateException as e:
    111         raise error.TestFail('Could not get Assistant response "%s".' % e)
    112 
    113     is_ready = utils.poll_for_condition(
    114             lambda: autotest_ext.EvaluateJavaScript(
    115                     'window.__assistant_response_ready'),
    116             desc='Waiting for Assistant response.')
    117 
    118     if is_ready == -1:
    119         raise error.TestFail(
    120                 autotest_ext.EvaluateJavaScript(
    121                         'window.__assistant_error_msg'))
    122 
    123     return autotest_ext.EvaluateJavaScript('window.__query_response')
    124