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