| """Bluetooth tests.""" |
| |
| |
| |
| from mobly import asserts |
| from mobly import test_runner |
| from mobly import utils |
| from utils import android_base_test |
| |
| # Number of seconds for the target to stay discoverable on Bluetooth. |
| DISCOVERABLE_TIME = 180 |
| # Random DATA to represent device bluetooth name. |
| DEVICE_NAME = utils.rand_ascii_str(8) |
| # UUID value for RfComm connection |
| RFCOMM_UUID = 'fa87c0d0-afac-11de-8a39-0800200c9a66' |
| |
| |
| def DiscoverBluetoothDeviceByName(device, name): |
| """Start a bluetooth scan and find the device that has the bluetooth name. |
| |
| Args: |
| device: AndroidDevice. Device to start bluetooth scan. |
| name: the bluetooth name looking for. |
| |
| Returns: |
| Dict represents a bluetooth device if found. |
| """ |
| discovered_devices = device.android.btDiscoverAndGetResults() |
| for device in discovered_devices: |
| if name == device['Name']: |
| device_discovered = device |
| return device_discovered |
| asserts.fail('Failed to discover the target device %s over Bluetooth.' % name) |
| |
| |
| class BluetoothTest(android_base_test.AndroidBaseTest): |
| """Bluetooth tests.""" |
| |
| def setup_class(self): |
| super(BluetoothTest, self).setup_class() |
| self.initiator = self.dut_a |
| # Sets the tag that represents this device in logs. |
| self.initiator.debug_tag = 'initiator' |
| # The device that is expected to be discovered and receive messages. |
| self.receiver = self.dut_b |
| self.receiver.debug_tag = 'receiver' |
| |
| def setup_test(self): |
| # Make sure bluetooth is on. |
| self.initiator.android.btEnable() |
| self.receiver.android.btEnable() |
| # Set Bluetooth name on target device. |
| self.receiver.android.btSetName(DEVICE_NAME) |
| |
| def test_bluetooth_process(self): |
| """Test for basic bluetooth rfcomm process flow. |
| |
| Steps: |
| 1. Receiver becomes discoverable. |
| 2. Initiator discovers receiver via bluetooth. |
| 3. Initiator connects to receiver via rfcomm profile. |
| 4. Initiator sends a message to receiver and receiver receives the exact |
| message. |
| |
| Verifies: |
| Receiver receives the correct message. |
| """ |
| # Name value for RfComm connection |
| rfcomm_name = utils.rand_ascii_str(8) |
| self.receiver.connection_callback = ( |
| self.receiver.android.btRfcommStartServer(rfcomm_name, RFCOMM_UUID)) |
| self.receiver.log.info('Start Rfcomm server with name: %s uuid: %s' % |
| (rfcomm_name, RFCOMM_UUID)) |
| target_name = self.receiver.android.btGetName() |
| self.receiver.log.info('Become discoverable with name "%s" for %ds.', |
| target_name, DISCOVERABLE_TIME) |
| self.receiver.android.btBecomeDiscoverable(DISCOVERABLE_TIME) |
| self.initiator.log.info('Looking for Bluetooth devices.') |
| discovered_device = DiscoverBluetoothDeviceByName( |
| self.initiator, target_name) |
| self.initiator.log.info('Target device is found. Device: %s' |
| % discovered_device) |
| remote_address = discovered_device['Address'] |
| self.initiator.android.btRfcommConnect(remote_address, RFCOMM_UUID) |
| self.receiver.connection_callback.waitAndGet('onAccepted', 30) |
| # self.initiator.connection_callback.waitAndGet('onConnected', 30) |
| self.initiator.log.info('Connection established') |
| # Random data to be sent through bluetooth rfcomm. |
| data = utils.rand_ascii_str(8) |
| self.receiver.read_callback = self.receiver.android.btRfcommRead() |
| self.initiator.android.btRfcommWrite(data) |
| read_result = self.receiver.read_callback.waitAndGet('onDataAvailable', 30) |
| asserts.assert_equal(read_result.data['Data'], data) |
| self.receiver.log.info('Received correct message from the other side') |
| self.initiator.android.btRfcommDisconnect() |
| self.receiver.android.btRfcommStopServer() |
| |
| def teardown_test(self): |
| # Turn Bluetooth off on both devices after test finishes. |
| self.receiver.android.btDisable() |
| self.initiator.android.btDisable() |
| |
| |
| if __name__ == '__main__': |
| test_runner.main() |