# Copyright (c) 2013 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, time

from autotest_lib.client.cros.bluetooth import bluetooth_semiauto_helper


class bluetooth_RegressionClient(
        bluetooth_semiauto_helper.BluetoothSemiAutoHelper):
    """Implement Bluetooth Regression Tests with some interaction."""
    version = 1

    def _test_init(self, test_type):
        """Init test by collecting intial logs, starting dump, etc.

        @param: test_type: short string label for log files and messages
        """
        self._test_type = test_type
        logging.info('Beginning test of type %s.', test_type)
        self.start_dump()
        self.collect_logs(message=('Before %s.' % test_type))

    def _power_off(self):
        self._test_init('power_off')

    def _os_idle(self):
        self._test_init('os_idle')
        self.ask_user('OS Idle test: after pressing PASS, the OS will idle '
                      'after a short delay.  Do not prevent it from idling.'
                      '<br>After OS has idled for at least 5 seconds, use '
                      'a Bluetooth device to wake machine (or use onboard '
                      'inputs if no Bluetooth device is capable).<br>'
                      'Make sure audio continues to play over Bluetooth.')
        self.os_idle_time_set()
        self.tell_user('Going to sleep now...')
        time.sleep(20)
        self.check_working()
        self.os_idle_time_set(reset=True)
        self.collect_logs(message='After idle.')

    def _suspend(self):
        self._test_init('suspend')
        self.ask_user('OS Suspend test: after pressing PASS, the OS will '
                      'suspend.<br>It will wake on its own after some time.'
                      '<br>Audio will stop playing.')
        self.os_suspend()
        self.check_working()
        self.collect_logs(message='After suspend.')

    def _log_off(self):
        self._test_init('log_off')
        self.close_browser()
        self.login_and_open_browser()
        self.check_working()
        self.collect_logs(message='After login.')

    def _disconnect(self):
        self._test_init('disconnect')
        self.tell_user('Please disconnect all Bluetooth devices using (x).')
        self.wait_for_adapter(adapter_status=True)
        self.wait_for_connections(paired_status=True, connected_status=False)
        self.ask_user('Audio NOT playing through onboard speakers?<br>'
                      'Audio NOT playing through Bluetooth device?')
        self.collect_logs(message='After disconnect.')
        self.check_working()
        self.collect_logs(message='After reconnect.')

    def _device_off(self):
        self._test_init('device_off')
        self.tell_user('Please turn off all Bluetooth devices.<br>'
                       'Disconnect them on the Settings page if needed.')
        self.wait_for_adapter(adapter_status=True)
        self.wait_for_connections(paired_status=True, connected_status=False)
        self.ask_user('Audio NOT playing through onboard speakers?')
        self.collect_logs(message='After device turned off.')
        self.check_working(message='Please turn devices back on and connect.')
        self.collect_logs(message='After device on.')

    def _unpair(self):
        self._test_init('unpair')
        self.tell_user('Please unpair all Bluetooth devices (using (x))')
        self.wait_for_adapter(adapter_status=True)
        self.wait_for_connections(paired_status=False, connected_status=False)
        self.ask_user('No Bluetooth devices work.<br> Audio is NOT playing '
                      'through onboard speakers or wired headphones.')
        self.collect_logs(message='After unpair.')
        self.check_working(message='Please re-pair and connect devices.')
        self.collect_logs(message='After re-pair.')

    def _disable(self):
        self._test_init('disable')
        self.tell_user('Please disable Bluetooth (uncheck Enable Bluetooth).')
        self.wait_for_adapter(adapter_status=False)
        self.collect_logs(message='While disabled')
        self.wait_for_connections(paired_status=True, connected_status=False)
        self.ask_user('No Bluetooth devices work?<br> Audio is NOT playing '
                      'through onboard speakers or wired headphones?')
        self.tell_user('Please enable Bluetooth (check Enable Bluetooth).<br>'
                       'Make sure all devices are still listed after enable.')
        self.wait_for_adapter(adapter_status=True)
        self.check_working()
        self.collect_logs(message='After re-enable.')

    def run_once(self):
        """Runs Regression tests for Bluetooth.

        Two phases: before and after reboot by server. Called by run_test.
        """
        self.check_working()

        if self._test_phase == 'reboot':
            self._disable()
            self._power_off()
        elif self._test_phase == 'client':
            self._power_off()
            self._os_idle()
            self._suspend()
            self._log_off()
            self._disconnect()
            self._device_off()
            self._unpair()

