arc_util.py revision 867874a283bc8ae42b70c2df1c344d8b6ab9161e
120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# Copyright 2016 The Chromium OS Authors. All rights reserved. 220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# Use of this source code is governed by a BSD-style license that can be 320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# found in the LICENSE file. 420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# 520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# arc_util.py is supposed to be called from chrome.py for ARC specific logic. 620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat# It should not import arc.py since it will create a import loop. 720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatimport logging 9b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavezimport os 10b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavezimport select 1120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatimport tempfile 12b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavezimport time 1320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 1420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatfrom autotest_lib.client.common_lib import error 1520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatfrom autotest_lib.client.common_lib import file_utils 1620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatfrom autotest_lib.client.common_lib.cros import arc_common 1720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatfrom telemetry.internal.browser import extension_page 1820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 1920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat_ARC_SUPPORT_HOST_URL = 'chrome-extension://cnbgggchhmkkdmeppjobngjoejnihlei/' 20ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld_ARC_SUPPORT_HOST_PAGENAME = '_generated_background_page.html' 21b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez_DUMPSTATE_DEFAULT_TIMEOUT = 20 22b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez_DUMPSTATE_PATH = '/var/log/arc-dumpstate.log' 23b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez_DUMPSTATE_PIPE_PATH = '/var/run/arc/bugreport/pipe' 2420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat_USERNAME = 'powerloadtest@gmail.com' 2520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat_USERNAME_DISPLAY = 'power.loadtest@gmail.com' 2620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat_PLTP_URL = 'https://sites.google.com/a/chromium.org/dev/chromium-os' \ 2720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat '/testing/power-testing/pltp/pltp' 28d33c21d5d384efdb53643bf1168b17628905ac68Ben Cheng_OPT_IN_BEGIN = 'Initializing ARC opt-in flow.' 29d33c21d5d384efdb53643bf1168b17628905ac68Ben Cheng_OPT_IN_FINISH = 'ARC opt-in flow complete.' 3020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 3120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatdef should_start_arc(arc_mode): 32c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 33c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld Determines whether ARC should be started. 34c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 35c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld @param arc_mode: mode as defined in arc_common. 36c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 37c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld @returns: True or False. 38c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 39c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 4020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat logging.debug('ARC is enabled in mode ' + str(arc_mode)) 4120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat assert arc_mode is None or arc_mode in arc_common.ARC_MODES 4220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat return arc_mode in [arc_common.ARC_MODE_ENABLED, 4320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat arc_common.ARC_MODE_ENABLED_ASYNC] 4420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 4520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 4620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatdef get_extra_chrome_flags(): 4720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat """Returns extra Chrome flags for ARC tests to run""" 4820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat return ['--disable-arc-opt-in-verification'] 4920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 5020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 5120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatdef post_processing_after_browser(chrome): 52c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 53c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld Called when a new browser instance has been initialized. 5420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 5520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat Note that this hook function is called regardless of arc_mode. 5620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 5720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat @param chrome: Chrome object. 58c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 5920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat """ 6020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat # Wait for Android container ready if ARC is enabled. 6120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat if chrome.arc_mode == arc_common.ARC_MODE_ENABLED: 6220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat arc_common.wait_for_android_boot() 63b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez # Remove any stale dumpstate files. 64b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez if os.path.isfile(_DUMPSTATE_PATH): 65b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez os.unlink(_DUMPSTATE_PATH) 6620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 6720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 6820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatdef pre_processing_before_close(chrome): 69c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 70c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld Called when the browser instance is being closed. 7120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 7220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat Note that this hook function is called regardless of arc_mode. 7320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 7420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat @param chrome: Chrome object. 75c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 7620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat """ 7720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat if not should_start_arc(chrome.arc_mode): 7820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat return 791565be1acdf46506acf71b67395f4296d94b0a13Junichi Uekawa # TODO(b/29341443): Implement stopping of adb logcat when we start adb 801565be1acdf46506acf71b67395f4296d94b0a13Junichi Uekawa # logcat for all tests 8120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 82b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez # Save dumpstate just before logout. 83b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez try: 84b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez logging.info('Saving Android dumpstate.') 85b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez _save_android_dumpstate() 86b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez logging.info('Android dumpstate successfully saved.') 87b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez except Exception: 88b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez # Dumpstate is nice-to-have stuff. Do not make it as a fatal error. 89b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez logging.exception('Failed to save Android dumpstate.') 90b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez 91b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez 92b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavezdef _save_android_dumpstate(timeout=_DUMPSTATE_DEFAULT_TIMEOUT): 93b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez """ 94b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez Triggers a dumpstate and saves its contents to to /var/log/arc-dumpstate.log 95b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez 96b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez @param timeout: The timeout in seconds. 97b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez """ 98b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez 99b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez with open(_DUMPSTATE_PATH, 'w') as out: 100b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez # _DUMPSTATE_PIPE_PATH is a named pipe, so it permanently blocks if 101b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez # opened normally if the other end has not been opened. In order to 102b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez # avoid that, open the file with O_NONBLOCK and use a select loop to 103b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez # read from the file with a timeout. 104b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez fd = os.open(_DUMPSTATE_PIPE_PATH, os.O_RDONLY | os.O_NONBLOCK) 105b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez with os.fdopen(fd, 'r') as pipe: 106b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez end_time = time.time() + timeout 107b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez while True: 108b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez remaining_time = end_time - time.time() 109b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez if remaining_time <= 0: 110b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez break 111b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez rlist, _, _ = select.select([pipe], [], [], remaining_time) 112b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez if pipe not in rlist: 113b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez break 114b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez buf = os.read(pipe.fileno(), 1024) 115b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez if len(buf) == 0: 116b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez break 117b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez out.write(buf) 118b6168e5d23e8916922564de8823f0cd915260c53Luis Hector Chavez 11920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 12020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichatdef set_browser_options_for_opt_in(b_options): 121c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 122c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld Setup Chrome for gaia login and opt_in. 123c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 124c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld @param b_options: browser options object used by chrome.Chrome. 125c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 126c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 12720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat b_options.username = _USERNAME 12820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat with tempfile.NamedTemporaryFile() as pltp: 12920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat file_utils.download_file(_PLTP_URL, pltp.name) 13020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat b_options.password = pltp.read().rstrip() 13120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat b_options.disable_default_apps = False 13220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat b_options.disable_component_extensions_with_background_pages = False 13320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat b_options.gaia_login = True 13420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 13520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 136ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkelddef enable_arc_setting(browser): 137c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 138ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld Enable ARC++ via the settings page checkbox. 139ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 140ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld Do nothing if the account is managed. 141c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 142c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld @param browser: chrome.Chrome broswer object. 143c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 144ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld @returns: True if the opt-in should continue; else False. 145c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld 146c64d6f280cf6c327f88532e61317eb241840e494Katherine Threlkeld """ 147be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat settings_tab = browser.tabs.New() 14820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 14920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat try: 150be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat settings_tab.Navigate('chrome://settings') 151be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat settings_tab.WaitForDocumentReadyStateToBeComplete() 152be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat 153be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat try: 154be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat settings_tab.ExecuteJavaScript( 155be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat 'assert(document.getElementById("android-apps-enabled"))') 156be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat except Exception, e: 157be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat raise error.TestFail('Could not locate section in chrome://settings' 158be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat ' to enable arc. Make sure ARC is available.') 159be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat 160be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat # Skip enabling for managed users, since value is policy enforced. 161be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat # Return early if a managed user has ArcEnabled set to false. 162be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat is_managed = settings_tab.EvaluateJavaScript( 163be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat 'document.getElementById("android-apps-enabled").disabled') 164be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat if is_managed: 165be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat logging.info('Determined that ARC is managed by user policy.') 166be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat policy_value = settings_tab.EvaluateJavaScript( 167be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat 'document.getElementById("android-apps-enabled").checked') 168be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat if not policy_value: 169be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat logging.info( 170be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat 'Returning early since ARC is policy-enforced off.') 171be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat return False 172be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat else: 173be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat settings_tab.ExecuteJavaScript( 174be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat 'Preferences.setBooleanPref("arc.enabled", true, true)') 175be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat finally: 176be39cd54afe24d6cc346689ab81c03147e7290efDaniel Erat settings_tab.Close() 17720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 178ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld return True 179ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 180ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 181ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkelddef find_opt_in_extension_page(browser): 182ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld """ 183ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld Find and verify the opt-in extension extension page. 184ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 185ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld @param browser: chrome.Chrome broswer object. 186ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 187ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld @returns: the extension page. 188ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 189ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld @raises: error.TestFail if extension is not found or is mal-formed. 190ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 191ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld """ 192ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld opt_in_extension_id = extension_page.UrlToExtensionId(_ARC_SUPPORT_HOST_URL) 193ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld try: 194ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld extension_pages = browser.extensions.GetByExtensionId( 195ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld opt_in_extension_id) 196ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld except Exception, e: 1970c9b8816e646213e740ede2775bf20bfe8a00efeKatherine Threlkeld raise error.TestFail('Could not locate extension for arc opt-in. ' 1980c9b8816e646213e740ede2775bf20bfe8a00efeKatherine Threlkeld 'Make sure disable_default_apps is False. ' 1990c9b8816e646213e740ede2775bf20bfe8a00efeKatherine Threlkeld '"%s".' % e) 200ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 201ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld extension_main_page = None 202ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld for page in extension_pages: 203ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld url = page.EvaluateJavaScript('location.href;') 204ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld if url.endswith(_ARC_SUPPORT_HOST_PAGENAME): 205ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld extension_main_page = page 206ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld break 207ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld if not extension_main_page: 208ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld raise error.TestError('Found opt-in extension but not correct page!') 209ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld extension_main_page.WaitForDocumentReadyStateToBeComplete() 210ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 211dd18afb9a111c8f33e3821af5413cf9ad0497757Chung-yih Wang js_code_did_start_conditions = ['termsPage != null', 212952a041496fbdae50a01268edd01d1635d657f02Chung-yih Wang '(termsPage.isManaged_ || termsPage.state_ == LoadState.LOADED)'] 2130c9b8816e646213e740ede2775bf20bfe8a00efeKatherine Threlkeld try: 2140c9b8816e646213e740ede2775bf20bfe8a00efeKatherine Threlkeld for condition in js_code_did_start_conditions: 215eb5db992b43406802e561e7940866185eb996073Achuith Bhandarkar extension_main_page.WaitForJavaScriptExpression(condition, 216eb5db992b43406802e561e7940866185eb996073Achuith Bhandarkar timeout=60) 2170c9b8816e646213e740ede2775bf20bfe8a00efeKatherine Threlkeld except Exception, e: 2180c9b8816e646213e740ede2775bf20bfe8a00efeKatherine Threlkeld raise error.TestError('Error waiting for "%s": "%s".' % (condition, e)) 21920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 220ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld return extension_main_page 221ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 222ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 223867874a283bc8ae42b70c2df1c344d8b6ab9161eVictor Hsiehdef opt_in_and_wait_for_completion(extension_main_page): 224ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld """ 225867874a283bc8ae42b70c2df1c344d8b6ab9161eVictor Hsieh Step through the user input of the opt-in extension and wait for completion. 226ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 227ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld @param extension_main_page: opt-in extension object. 228ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 229867874a283bc8ae42b70c2df1c344d8b6ab9161eVictor Hsieh @raises error.TestFail if opt-in doesn't complete after timeout. 230ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 231ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld """ 23220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat js_code_click_agree = """ 23320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat doc = appWindow.contentWindow.document; 23420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat agree_button_element = doc.getElementById('button-agree'); 23520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat agree_button_element.click(); 23620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat """ 23720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat extension_main_page.ExecuteJavaScript(js_code_click_agree) 23820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 23920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat SIGN_IN_TIMEOUT = 120 24020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat try: 24120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat extension_main_page.WaitForJavaScriptExpression('!appWindow', 242eb5db992b43406802e561e7940866185eb996073Achuith Bhandarkar timeout=SIGN_IN_TIMEOUT) 24320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat except Exception, e: 24420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat js_read_error_message = """ 24520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat err = appWindow.contentWindow.document.getElementById( 24620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat "error-message"); 24720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat if (err) { 24820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat err.innerText; 24920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat } 25020257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat """ 25120257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat err_msg = extension_main_page.EvaluateJavaScript(js_read_error_message) 25220257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat err_msg = err_msg.strip() 25320257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat logging.error('Error: %s', err_msg.strip()) 25420257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat if err_msg: 25520257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat raise error.TestFail('Opt-in app error: %s' % err_msg) 25620257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat else: 25720257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat raise error.TestFail('Opt-in app did not finish running after %s ' 25820257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 'seconds!' % SIGN_IN_TIMEOUT) 25920257f0b6214b283f4821cde39425dfffba8b3b6Nicolas Boichat 260ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 261ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkelddef opt_in(browser): 262ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld """ 263ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld Step through opt in and wait for it to complete. 264ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 265ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld Return early if the arc_setting cannot be set True. 266ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 267ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld @param browser: chrome.Chrome broswer object. 268ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 269ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld @raises: error.TestFail if opt in fails. 270ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld 271ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld """ 272ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld logging.info(_OPT_IN_BEGIN) 273ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld if not enable_arc_setting(browser): 274ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld return 275ba12a34aa06205a215e7908a9a1c1e3a332177e0Katherine Threlkeld extension_main_page = find_opt_in_extension_page(browser) 276867874a283bc8ae42b70c2df1c344d8b6ab9161eVictor Hsieh opt_in_and_wait_for_completion(extension_main_page) 277d33c21d5d384efdb53643bf1168b17628905ac68Ben Cheng logging.info(_OPT_IN_FINISH) 278