"""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()