# 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>After OS has been suspended for several '
                      'seconds, use a Bluetooth device to wake machine (or '
                      'use onboard inputs if no Bluetooth device is capable.)'
                      '<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.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()

