#!/usr/bin/env python3
#
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""
Test script to test the integrity of LE scan results upon resetting the
Bluetooth stack.
"""

import concurrent
import os
import time

from queue import Empty
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
from acts_contrib.test_utils.bt.bt_constants import ble_advertise_settings_modes
from acts_contrib.test_utils.bt.bt_constants import ble_scan_settings_callback_types
from acts_contrib.test_utils.bt.bt_constants import ble_scan_settings_modes
from acts_contrib.test_utils.bt.bt_constants import adv_succ
from acts_contrib.test_utils.bt.bt_constants import scan_result
from acts_contrib.test_utils.bt.bt_test_utils import BtTestUtilsError
from acts_contrib.test_utils.bt.bt_test_utils import generate_ble_advertise_objects
from acts_contrib.test_utils.bt.bt_test_utils import generate_ble_scan_objects
from acts_contrib.test_utils.bt.bt_test_utils import get_advanced_droid_list
from acts_contrib.test_utils.bt.bt_test_utils import reset_bluetooth
from acts_contrib.test_utils.bt.bt_test_utils import setup_n_advertisements
from acts_contrib.test_utils.bt.bt_test_utils import take_btsnoop_logs
from acts_contrib.test_utils.bt.bt_test_utils import teardown_n_advertisements
from acts_contrib.test_utils.bt.bt_test_utils import scan_and_verify_n_advertisements


class ConcurrentBleAdvertisementDiscoveryTest(BluetoothBaseTest):
    default_timeout = 10
    droid_list = []
    max_advertisements = -1
    advertise_callback_list = []

    def setup_class(self):
        super().setup_class()
        self.scn_ad = self.android_devices[0]
        self.adv_ad = self.android_devices[1]
        self.droid_list = get_advanced_droid_list(self.android_devices)
        self.max_advertisements = self.droid_list[1]['max_advertisements']

    def setup_test(self):
        super().setup_test()
        self.log.info("Setting up advertisements")
        reset_bluetooth(self.android_devices)
        try:
            self.advertise_callback_list = setup_n_advertisements(
                self.adv_ad, self.max_advertisements)
        except BtTestUtilsError:
            return False
        return True

    def teardown_test(self):
        super(BluetoothBaseTest, self).teardown_test()
        self.log.info("Tearing down advertisements")
        teardown_n_advertisements(self.adv_ad,
                                  len(self.advertise_callback_list),
                                  self.advertise_callback_list)
        return True

    @BluetoothBaseTest.bt_test_wrap
    @test_tracker_info(uuid='e02d6ca6-4db3-4a1d-adaf-98db7c7c2c7a')
    def test_max_advertisements_defaults(self):
        """Test scan integrity after BT state is reset

        This test is to verify that LE devices are found
        successfully after the Bluetooth stack is
        reset. This is repeated multiple times in order
        to verify that LE devices are not lost in scanning
        when the stack is brought back up.

        Steps:
        1. Pre-Condition: Max advertisements are active
        2. With the DUT android device, scan for all advertisements
        and verify that all expected advertisements are found.
        3. Reset Bluetooth on DUT.
        4. Repeat steps 2-3 for defined iterations

        Expected Result:
        All expected advertisements should be found on all iterations.

        Returns:
          Pass if True
          Fail if False

        TAGS: LE, Advertising, Concurrency, Scanning
        Priority: 2
        """
        filter_list = self.scn_ad.droid.bleGenFilterList()
        self.scn_ad.droid.bleBuildScanFilter(filter_list)
        self.scn_ad.droid.bleSetScanSettingsCallbackType(
            ble_scan_settings_callback_types['all_matches'])
        self.scn_ad.droid.bleSetScanSettingsScanMode(ble_scan_settings_modes[
            'low_latency'])
        iterations = 20
        for _ in range(iterations):
            self.log.info("Verify all advertisements found")
            try:
                if not scan_and_verify_n_advertisements(
                        self.scn_ad, self.max_advertisements):
                    self.log.error("Failed to find all advertisements")
                    return False
            except BtTestUtilsError:
                return False
            if not reset_bluetooth([self.scn_ad]):
                self.log.error("Failed to reset Bluetooth state")
                return False
        return True
