Home | History | Annotate | Download | only in bt
      1 #!/usr/bin/env python
      2 #
      3 #   Copyright 2017 - The Android Open Source Project
      4 #
      5 #   Licensed under the Apache License, Version 2.0 (the "License");
      6 #   you may not use this file except in compliance with the License.
      7 #   You may obtain a copy of the License at
      8 #
      9 #       http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 #   Unless required by applicable law or agreed to in writing, software
     12 #   distributed under the License is distributed on an "AS IS" BASIS,
     13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 #   See the License for the specific language governing permissions and
     15 #   limitations under the License.
     16 """
     17 Test pairing of an Android Device to a A&K XB10 Bluetooth speaker
     18 """
     19 import logging
     20 import time
     21 
     22 from acts.controllers.relay_lib.relay import SynchronizeRelays
     23 from acts.test_utils.bt.BluetoothBaseTest import BluetoothBaseTest
     24 
     25 log = logging
     26 
     27 
     28 class AkXB10PairingTest(BluetoothBaseTest):
     29     DISCOVERY_TIME = 5
     30 
     31     def __init__(self, controllers):
     32         BluetoothBaseTest.__init__(self, controllers)
     33         self.dut = self.android_devices[0]
     34         # Do factory reset and then do delay for 3-seconds
     35         self.dut.droid.bluetoothFactoryReset()
     36         time.sleep(3)
     37         self.ak_xb10_speaker = self.relay_devices[0]
     38 
     39     def setup_test(self):
     40         super(BluetoothBaseTest, self).setup_test()
     41         self.ak_xb10_speaker.setup()
     42         self.ak_xb10_speaker.power_on()
     43         # Wait for a moment between pushing buttons
     44         time.sleep(0.25)
     45         self.ak_xb10_speaker.enter_pairing_mode()
     46 
     47     def teardown_test(self):
     48         super(BluetoothBaseTest, self).teardown_test()
     49         self.ak_xb10_speaker.power_off()
     50         self.ak_xb10_speaker.clean_up()
     51 
     52     def _perform_classic_discovery(self, scan_time=DISCOVERY_TIME):
     53         self.dut.droid.bluetoothStartDiscovery()
     54         time.sleep(scan_time)
     55         self.dut.droid.bluetoothCancelDiscovery()
     56         return self.dut.droid.bluetoothGetDiscoveredDevices()
     57 
     58     @BluetoothBaseTest.bt_test_wrap
     59     def test_speaker_on(self):
     60         """Test if the A&K XB10 speaker is powered on.
     61 
     62         Use scanning to determine if the speaker is powered on.
     63 
     64         Steps:
     65         1. Put the speaker into pairing mode. (Hold the button)
     66         2. Perform a scan on the DUT
     67         3. Check the scan list for the device.
     68 
     69         Expected Result:
     70         Speaker is found.
     71 
     72         Returns:
     73           Pass if True
     74           Fail if False
     75 
     76         TAGS: ACTS_Relay
     77         Priority: 1
     78         """
     79 
     80         for device in self._perform_classic_discovery():
     81             if device['address'] == self.ak_xb10_speaker.mac_address:
     82                 self.dut.log.info("Desired device with MAC address %s found!",
     83                                   self.ak_xb10_speaker.mac_address)
     84                 return True
     85         return False
     86 
     87     @BluetoothBaseTest.bt_test_wrap
     88     def test_speaker_off(self):
     89         """Test if the A&K XB10 speaker is powered off.
     90 
     91         Use scanning to determine if the speaker is powered off.
     92 
     93         Steps:
     94         1. Power down the speaker
     95         2. Put the speaker into pairing mode. (Hold the button)
     96         3. Perform a scan on the DUT
     97         4. Check the scan list for the device.
     98 
     99         Expected Result:
    100         Speaker is not found.
    101 
    102         Returns:
    103           Pass if True
    104           Fail if False
    105 
    106         TAGS: ACTS_Relay
    107         Priority: 1
    108         """
    109         # Specific part of the test, turn off the speaker
    110         self.ak_xb10_speaker.power_off()
    111 
    112         device_not_found = True
    113         for device in self._perform_classic_discovery():
    114             if device['address'] == self.ak_xb10_speaker.mac_address:
    115                 self.dut.log.info(
    116                     "Undesired device with MAC address %s found!",
    117                     self.ak_xb10_speaker.mac_address)
    118                 device_not_found = False
    119 
    120         # Set the speaker back to the normal for tear_down()
    121         self.ak_xb10_speaker.power_on()
    122         # Give the relay and speaker some time, before it is turned off.
    123         time.sleep(5)
    124         return device_not_found
    125 
    126     @BluetoothBaseTest.bt_test_wrap
    127     def test_pairing(self):
    128         """Test pairing between a phone and A&K XB10 speaker.
    129 
    130         Test the A&K XB10 speaker can be paired to phone.
    131 
    132         Steps:
    133         1. Find the MAC address of remote controller from relay config file.
    134         2. Start the device paring process.
    135         3. Enable remote controller in pairing mode.
    136         4. Verify the remote is paired.
    137 
    138         Expected Result:
    139         Speaker is paired.
    140 
    141         Returns:
    142           Pass if True
    143           Fail if False
    144 
    145         TAGS: ACTS_Relay
    146         Priority: 1
    147         """
    148 
    149         # BT scan activity
    150         self._perform_classic_discovery()
    151         self.dut.droid.bluetoothDiscoverAndBond(
    152             self.ak_xb10_speaker.mac_address)
    153 
    154         end_time = time.time() + 20
    155         self.dut.log.info("Verifying devices are bonded")
    156         while (time.time() < end_time):
    157             bonded_devices = self.dut.droid.bluetoothGetBondedDevices()
    158             for d in bonded_devices:
    159                 if d['address'] == self.ak_xb10_speaker.mac_address:
    160                     self.dut.log.info("Successfully bonded to device.")
    161                     self.log.info(
    162                         "A&K XB10 Bonded devices:\n{}".format(bonded_devices))
    163                     return True
    164         # Timed out trying to bond.
    165         self.dut.log.info("Failed to bond devices.")
    166 
    167         return False
    168