# Lint as: python2, python3
# Copyright 2019 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.

"""A Batch of Bluetooth stand alone health tests"""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import logging

from autotest_lib.server.cros.bluetooth.bluetooth_adapter_quick_tests import (
        BluetoothAdapterQuickTests)
from autotest_lib.server.cros.bluetooth import bluetooth_dbus_api_tests
from autotest_lib.server.cros.bluetooth import bluetooth_default_state_test
from autotest_lib.server.cros.bluetooth import bluetooth_valid_address_test
from six.moves import range


class bluetooth_AdapterSAHealth(BluetoothAdapterQuickTests,
        bluetooth_default_state_test.bluetooth_Health_DefaultStateTest,
        bluetooth_valid_address_test.bluetooth_Health_ValidAddressTest,
        bluetooth_dbus_api_tests.BluetoothDBusAPITests):

    """A Batch of Bluetooth stand alone health tests. This test is written as
       a batch of tests in order to reduce test time, since auto-test ramp up
       time is costy. The batch is using BluetoothAdapterQuickTests wrapper
       methods to start and end a test and a batch of tests.

       This class can be called to run the entire test batch or to run a
       specific test only
    """

    test_wrapper = BluetoothAdapterQuickTests.quick_test_test_decorator
    batch_wrapper = BluetoothAdapterQuickTests.quick_test_batch_decorator


    @test_wrapper('Stand Alone basic test')
    def sa_basic_test(self):
        """Set of basic stand alone test"""

        # The bluetoothd must be running in the beginning.
        self.test_bluetoothd_running()

        # It is possible that the adapter is not powered on yet.
        # Power it on anyway and verify that it is actually powered on.
        self.test_power_on_adapter()

        # Verify that the adapter could be powered off and powered on,
        # and that it is in the correct working state.
        self.test_power_off_adapter()
        self.test_power_on_adapter()
        self.test_adapter_work_state()

        # Verify that the bluetoothd could be simply stopped and then
        # be started again, and that it is in the correct working state.
        self.test_stop_bluetoothd()
        self.test_start_bluetoothd()
        self.test_adapter_work_state()

        # Verify that the adapter could be reset off and on which includes
        # removing all cached information.
        self.test_reset_off_adapter()
        self.test_reset_on_adapter()
        self.test_adapter_work_state()

        # Verify that the adapter supports basic profiles.
        self.test_UUIDs()

        # Verify that the adapter could start and stop discovery.
        self.test_start_discovery()
        self.test_stop_discovery()
        self.test_start_discovery()

        # Verify that the adapter could set both discoverable and
        # non-discoverable successfully.
        self.test_discoverable()
        self.test_nondiscoverable()
        self.test_discoverable()

        # Verify that the adapter could set pairable and non-pairable.
        self.test_pairable()
        self.test_nonpairable()
        self.test_pairable()


    @test_wrapper('Adapter suspend resume test')
    def sa_adapter_suspend_resume_test(self):
        """Test dapter power states is perserved through suspend resume."""
        def adapter_on_SR_test():
            """Test Case: Power on - SR"""
            self.test_power_on_adapter()
            self.test_bluetoothd_running()
            self.suspend_resume()
            self.test_bluetoothd_running()
            self.test_adapter_work_state()
            self.test_power_on_adapter()


        def adapter_off_SR_test():
            """Test Case: Power off - SR"""
            self.test_power_off_adapter()
            self.test_bluetoothd_running()
            self.suspend_resume()
            self.test_power_off_adapter()
            self.test_bluetoothd_running()

        adapter_on_SR_test()
        adapter_off_SR_test()


    @test_wrapper('Adapter present test')
    def sa_adapter_present_test(self):
        """Verify that the client has a Bluetooth adapter."""

        # Reset the adapter (if any) to the powered off state.
        self.test_reset_off_adapter()

        # Verify that there is an adapter. This will only return True if both
        # the kernel and bluetooth daemon see the adapter.
        self.test_has_adapter()

    @test_wrapper('Adapter reboot test')
    def sa_adapter_reboot_test(self):
        """Verify that adapter power setting persist over reboot

        Test whether power setting persist after a reboot and whether
        adapter can be turned on after reboot
        """

        def test_case_adapter_on_reboot():
            """Test Case: Power on - reboot"""
            self.test_power_on_adapter()
            self.test_bluetoothd_running()
            self.reboot()
            self.test_bluetoothd_running()
            self.test_adapter_work_state()

        def test_case_adapter_off_reboot():
            """Test Case: Power on - reboot"""
            self.test_power_off_adapter()
            self.test_bluetoothd_running()
            self.reboot()
            self.test_has_adapter()
            self.test_is_powered_off()
            self.test_power_on_adapter()
            self.test_bluetoothd_running()

        NUM_ITERATIONS = 3
        for i in range(NUM_ITERATIONS):
            logging.debug('Starting reboot test loop number #%d', i)
            test_case_adapter_on_reboot()
            test_case_adapter_off_reboot()



    # TODO(b/145302986): Silencing known firmware issue with AC7260 (WP2)
    @test_wrapper('Adapter DiscoverableTimeout test',
                  skip_chipsets=['Intel-AC7260'])
    def sa_adapter_discoverable_timeout_test(self):
        """Verify that DiscoverableTimout Property works."""
        result = self.test_discoverable_timeout(timeout_values=[0, 7, 15])
        logging.info("Result is %s", result)

    @test_wrapper('Adapter PairableTimeout test')
    def sa_adapter_pairable_timeout_test(self):
        """Verify that PairableTimout Property works."""
        result = self.test_pairable_timeout(timeout_values=[0, 7, 15])
        logging.info("Result is %s", result)


    @test_wrapper('Default state test')
    def sa_default_state_test(self):
        """Verify that the Bluetooth adapter has correct state."""
        self.default_state_test()


    @test_wrapper('Valid address test')
    def sa_valid_address_test(self):
        """Verify that the client Bluetooth adapter has a valid address."""
        self.valid_address_test()


    @test_wrapper('Valid adapter ID test')
    def sa_valid_id_test(self):
        """Verify that the adapter has a correctly-formatted ID"""
        self.test_check_valid_adapter_id()


    @test_wrapper('Valid adapter alias test')
    def sa_valid_alias_test(self):
        """Verify that the adapter has a correctly-formatted alias"""
        self.test_check_valid_alias()


    @test_wrapper('DBUS API tests')
    def sa_dbus_api_tests(self):
        """ Verify that the Bluetooth DBus API calls work."""
        self.test_dbus_start_discovery_success()
        self.test_dbus_start_discovery_fail_discovery_in_progress()
        self.test_dbus_start_discovery_fail_power_off()

        self.test_dbus_stop_discovery_success()
        self.test_dbus_stop_discovery_fail_discovery_not_in_progress()
        self.test_dbus_stop_discovery_fail_power_off()

        self.test_dbus_pause_discovery_success()
        self.test_dbus_pause_discovery_success_no_discovery_in_progress()
        self.test_dbus_pause_discovery_fail_already_paused()
        self.test_dbus_pause_discovery_fail_power_off()

        self.test_dbus_unpause_discovery_success()
        self.test_dbus_unpause_discovery_fail_without_pause()
        self.test_dbus_unpause_discovery_fail_power_off()
        self.test_dbus_unpause_discovery_fail_already_unpaused()

        self.test_dbus_get_supported_capabilities_success()
        self.test_dbus_get_supported_capabilities_success_power_off()

    @test_wrapper('EIR Max Alias Size test')
    def sa_eir_max_name_size_test(self):
        """ Verify that the non-default max eir name size is used """
        EIR_80_char_name = ('1234567890123456789012345678901234567890'
                            '1234567890123456789012345678901234567890')

        self.test_set_adapter_alias(EIR_80_char_name)


    @batch_wrapper('Stand Alone Health')
    def sa_health_batch_run(self, num_iterations=1, test_name=None):
        """Run the stand alone health test batch or a specific given test.
           The wrapper of this method is implemented in batch_decorator.
           Using the decorator a test batch method can implement the only its
           core tests invocations and let the decorator handle the wrapper,
           which is taking care for whether to run a specific test or the
           batch as a whole, and running the batch in iterations

           @param num_iterations: how many interations to run
           @param test_name: specifc test to run otherwise None to run the
                             whole batch
        """
        self.sa_basic_test()
        self.sa_adapter_suspend_resume_test()
        self.sa_adapter_present_test()
        # self.sa_adapter_reboot_test() disabled since the test is not stable
        self.sa_adapter_discoverable_timeout_test()
        self.sa_default_state_test()
        self.sa_valid_address_test()
        self.sa_dbus_api_tests()


    def run_once(self, host, num_iterations=1, test_name=None,
                 flag='Quick Health'):
        """Run the batch of Bluetooth stand health tests

        @param host: the DUT, usually a chromebook
        @param num_iterations: the number of rounds to execute the test
        """
        # Initialize and run the test batch or the requested specific test
        self.quick_test_init(host, use_btpeer=False, flag=flag,
                             start_browser=False)
        self.sa_health_batch_run(num_iterations, test_name)
        self.quick_test_cleanup()
