# Copyright 2018 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. import logging import time from autotest_lib.client.common_lib import error from autotest_lib.client.common_lib import ui_utils from autotest_lib.client.common_lib.cros import chrome from autotest_lib.client.cros.graphics import graphics_utils from autotest_lib.client.cros.bluetooth import bluetooth_device_xmlrpc_server class bluetooth_TurnOnOffUI(graphics_utils.GraphicsTest): """Go to Status Tray and turn BT On/Off""" version = 1 # Node roles BUTTON_ROLE = "button" SWITCH_ROLE = "switch" # Node names STATUS_TRAY_REGEXP = "/Status tray, /i" SHOW_BLUETOOTH_SETTINGS = "/Show Bluetooth settings./i" BLUETOOTH = "Bluetooth" DELAY_BW_TOGGLE_ON_OFF = 5 def initialize(self): """Autotest initialize function""" self.xmlrpc_delegate = \ bluetooth_device_xmlrpc_server.BluetoothDeviceXmlRpcDelegate() super(bluetooth_TurnOnOffUI, self).initialize(raise_error_on_hang=True) def cleanup(self): """Autotest cleanup function""" if self._GSC: keyvals = self._GSC.get_memory_difference_keyvals() for key, val in keyvals.iteritems(): self.output_perf_value( description=key, value=val, units='bytes', higher_is_better=False) self.write_perf_keyval(keyvals) super(bluetooth_TurnOnOffUI, self).cleanup() def open_status_tray(self, ui): """Open status tray @param ui: ui object """ logging.info("Opening status tray") ui.doDefault_on_obj(self.STATUS_TRAY_REGEXP, True, self.BUTTON_ROLE) ui.wait_for_ui_obj(self.SHOW_BLUETOOTH_SETTINGS, True, role=self.BUTTON_ROLE) def open_bluetooth_page(self, ui): """Opens bluetooth settings in tray @param ui: ui object """ logging.info("Opening bluetooth settings in tray") ui.doDefault_on_obj(self.SHOW_BLUETOOTH_SETTINGS, True, self.BUTTON_ROLE) ui.wait_for_ui_obj(self.BLUETOOTH, False, role=self.SWITCH_ROLE) def is_bluetooth_enabled(self): """Returns True if bluetoothd is powered on, otherwise False""" return self.xmlrpc_delegate._is_powered_on() def turn_on_bluetooth(self, ui): """Turn on BT in status tray @param ui: ui object """ if self.is_bluetooth_enabled(): logging.info('Bluetooth is turned on already..') else: logging.info("Turning on bluetooth") ui.doDefault_on_obj(self.BLUETOOTH, False, self.SWITCH_ROLE) time.sleep(self.DELAY_BW_TOGGLE_ON_OFF) if self.is_bluetooth_enabled(): logging.info('Turned on BT successfully..') else: raise error.TestFail('BT is not turned on..') def turn_off_bluetooth(self, ui): """Turn off BT in status tray @param ui: ui object """ if not self.is_bluetooth_enabled(): logging.info('Bluetooth is turned off already') else: logging.info("Turning off bluetooth") ui.doDefault_on_obj(self.BLUETOOTH, False, self.SWITCH_ROLE) time.sleep(self.DELAY_BW_TOGGLE_ON_OFF) if not self.is_bluetooth_enabled(): logging.info('Turned off BT successfully..') else: raise error.TestFail('Bluetooth is not turned off within time') def run_once(self, iteration_count=3): """Turn on/off bluetooth in status tray @param iteration_count: Number of iterations to toggle on/off """ try: with chrome.Chrome(autotest_ext=True) as cr: ui = ui_utils.UI_Handler() ui.start_ui_root(cr) self.open_status_tray(ui) self.open_bluetooth_page(ui) logging.info("Turning off bluetooth before start test") self.turn_off_bluetooth(ui) for iteration in range(1, iteration_count + 1): logging.info("Iteration: %d", iteration) self.turn_on_bluetooth(ui) self.turn_off_bluetooth(ui) except error.TestFail: raise except Exception as e: logging.error('Exception "%s" seen during test', e) raise error.TestFail('Exception "%s" seen during test' % e) finally: self.xmlrpc_delegate.reset_on()