Chromium Code Reviews| Index: device/bluetooth/bluetooth_device_unittest.cc |
| diff --git a/device/bluetooth/bluetooth_device_unittest.cc b/device/bluetooth/bluetooth_device_unittest.cc |
| index 4cea1b6fa6e48e13990e2564085aae1aad3bb134..fac9c06415091e53de8c9a038558aff7dfffcaf6 100644 |
| --- a/device/bluetooth/bluetooth_device_unittest.cc |
| +++ b/device/bluetooth/bluetooth_device_unittest.cc |
| @@ -125,4 +125,240 @@ TEST_F(BluetoothTest, LowEnergyDeviceNoUUIDs) { |
| // also require build configuration to generate string resources into a .pak |
| // file. |
| +#if defined(OS_ANDROID) |
| +// Basic CreateGattConnection test. |
| +TEST_F(BluetoothTest, CreateGattConnection) { |
| + InitWithFakeAdapter(); |
| + TestBluetoothAdapterObserver observer(adapter_); |
| + |
| + // Get a device. |
| + adapter_->StartDiscoverySession(GetDiscoverySessionCallback(), |
| + GetErrorCallback()); |
| + base::RunLoop().RunUntilIdle(); |
| + DiscoverLowEnergyDevice(3); |
| + base::RunLoop().RunUntilIdle(); |
| + BluetoothDevice* device = observer.last_device(); |
| + |
| + callback_count_ = error_callback_count_ = 0; |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + CompleteGattConnection(device); |
| + EXPECT_EQ(1, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + ASSERT_EQ(1u, gatt_connections_.size()); |
| + EXPECT_TRUE(device->IsGattConnected()); |
| + EXPECT_TRUE(gatt_connections_[0]->IsConnected()); |
| +} |
| +#endif // defined(OS_ANDROID) |
| + |
| +#if defined(OS_ANDROID) |
| +// Creates BluetoothGattConnection instances and tests that the interface |
| +// functions even when some Disconnect and the BluetoothDevice is destroyed. |
| +TEST_F(BluetoothTest, BluetoothGattConnection) { |
| + InitWithFakeAdapter(); |
| + TestBluetoothAdapterObserver observer(adapter_); |
| + |
| + // Get a device. |
| + adapter_->StartDiscoverySession(GetDiscoverySessionCallback(), |
| + GetErrorCallback()); |
| + base::RunLoop().RunUntilIdle(); |
| + DiscoverLowEnergyDevice(3); |
| + base::RunLoop().RunUntilIdle(); |
| + BluetoothDevice* device = observer.last_device(); |
| + std::string device_address = device->GetAddress(); |
| + |
| + // CreateGattConnection |
| + callback_count_ = error_callback_count_ = 0; |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + EXPECT_EQ(1, gatt_connection_attempt_count_); |
| + CompleteGattConnection(device); |
| + EXPECT_EQ(1, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + ASSERT_EQ(1u, gatt_connections_.size()); |
| + EXPECT_TRUE(device->IsGattConnected()); |
| + EXPECT_TRUE(gatt_connections_[0]->IsConnected()); |
| + |
| + // Connect again once already connected. |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + EXPECT_EQ(1, gatt_connection_attempt_count_); |
| + EXPECT_EQ(3, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + ASSERT_EQ(3u, gatt_connections_.size()); |
| + |
| + // Test GetDeviceAddress |
| + EXPECT_EQ(device_address, gatt_connections_[0]->GetDeviceAddress()); |
| + |
| + // Test IsConnected |
| + EXPECT_TRUE(gatt_connections_[0]->IsConnected()); |
| + EXPECT_TRUE(gatt_connections_[1]->IsConnected()); |
| + EXPECT_TRUE(gatt_connections_[2]->IsConnected()); |
| + |
| + // Disconnect & Delete connection objects. Device stays connected. |
| + gatt_connections_[0]->Disconnect(); // Disconnect first. |
| + gatt_connections_.pop_back(); // Delete last. |
| + EXPECT_FALSE(gatt_connections_[0]->IsConnected()); |
| + EXPECT_TRUE(gatt_connections_[1]->IsConnected()); |
| + EXPECT_TRUE(device->IsGattConnected()); |
| + EXPECT_EQ(0, gatt_disconnection_attempt_count_); |
| + |
| + // Delete device, connection objects should all be disconnected. |
| + DeleteDevice(device); |
| + EXPECT_FALSE(gatt_connections_[0]->IsConnected()); |
| + EXPECT_FALSE(gatt_connections_[1]->IsConnected()); |
| + |
| + // Test GetDeviceAddress after device deleted. |
| + EXPECT_EQ(device_address, gatt_connections_[0]->GetDeviceAddress()); |
| + EXPECT_EQ(device_address, gatt_connections_[1]->GetDeviceAddress()); |
| +} |
| +#endif // defined(OS_ANDROID) |
| + |
| +#if defined(OS_ANDROID) |
| +// BluetoothGattConnection with several connect / disconnects. |
| +TEST_F(BluetoothTest, BluetoothGattConnection_ConnectDisconnect) { |
| + InitWithFakeAdapter(); |
| + TestBluetoothAdapterObserver observer(adapter_); |
| + |
| + // Get a device. |
| + adapter_->StartDiscoverySession(GetDiscoverySessionCallback(), |
| + GetErrorCallback()); |
| + base::RunLoop().RunUntilIdle(); |
| + DiscoverLowEnergyDevice(3); |
| + base::RunLoop().RunUntilIdle(); |
| + BluetoothDevice* device = observer.last_device(); |
| + |
| + // CreateGattConnection, & multiple connections from platform only invoke |
| + // callbacks once: |
| + callback_count_ = error_callback_count_ = 0; |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + CompleteGattConnection(device); |
| + CompleteGattConnection(device); |
| + EXPECT_EQ(1, gatt_connection_attempt_count_); |
| + EXPECT_EQ(1, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + EXPECT_TRUE(gatt_connections_[0]->IsConnected()); |
| + |
| + // Become disconnected: |
| + CompleteGattDisconnection(device); |
| + EXPECT_EQ(1, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + EXPECT_FALSE(gatt_connections_[0]->IsConnected()); |
| + |
| + // Be already connected, then CreateGattConnection: |
| + callback_count_ = error_callback_count_ = 0; |
| + CompleteGattConnection(device); |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + EXPECT_EQ(1, gatt_connection_attempt_count_); |
| + EXPECT_EQ(1, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + EXPECT_FALSE(gatt_connections_[0]->IsConnected()) |
| + << "The disconnected connection shouldn't become connected when another " |
| + "connection is created."; |
| + EXPECT_TRUE(gatt_connections_[1]->IsConnected()); |
| + |
| + // Delete all CreateGattConnection objects, observe disconnection: |
| + callback_count_ = error_callback_count_ = 0; |
| + gatt_connections_.clear(); |
| + EXPECT_EQ(1, gatt_disconnection_attempt_count_); |
| + CompleteGattDisconnection(device); |
| + |
| + // Reconnect for following test: |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + CompleteGattConnection(device); |
| + |
| + // Disconnect all CreateGattConnection objects & create a new connection. |
| + // But, don't yet simulate the device disconnecting. |
| + callback_count_ = error_callback_count_ = gatt_connection_attempt_count_ = |
| + gatt_disconnection_attempt_count_ = 0; |
| + for (BluetoothGattConnection* connection : gatt_connections_) |
| + connection->Disconnect(); |
| + EXPECT_EQ(1, gatt_disconnection_attempt_count_); |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + EXPECT_EQ(0, gatt_connection_attempt_count_); // No connection attempt. |
| + EXPECT_EQ(1, callback_count_); // Device is assumed still connected. |
| + EXPECT_EQ(0, error_callback_count_); |
| + callback_count_ = error_callback_count_ = 0; |
| + EXPECT_FALSE(gatt_connections_.front()->IsConnected()); |
| + EXPECT_TRUE(gatt_connections_.back()->IsConnected()); |
| + |
| + // Actually disconnect: |
| + CompleteGattDisconnection(device); |
| + EXPECT_EQ(0, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + for (BluetoothGattConnection* connection : gatt_connections_) |
| + EXPECT_FALSE(connection->IsConnected()); |
| + |
| + // CreateGattConnection, but receive notice that device disconnected before |
| + // it ever connects: |
| + callback_count_ = error_callback_count_ = 0; |
| + last_connect_error_code_ = BluetoothDevice::ERROR_UNKNOWN; |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + EXPECT_EQ(1, gatt_connection_attempt_count_); |
| + CompleteGattDisconnection(device); |
| + EXPECT_EQ(0, callback_count_); |
| + EXPECT_EQ(1, error_callback_count_); |
| + EXPECT_EQ(BluetoothDevice::ERROR_FAILED, last_connect_error_code_); |
| + for (BluetoothGattConnection* connection : gatt_connections_) |
| + EXPECT_FALSE(connection->IsConnected()); |
| + |
| + // CreateGattConnection & DisconnectGatt, then simulate connection. |
|
Jeffrey Yasskin
2015/09/23 00:11:11
This test has gotten very long. Can you split it i
scheib
2015/09/23 03:23:00
Done. I already have a clean up CL, I'll merge thi
|
| + callback_count_ = error_callback_count_ = gatt_connection_attempt_count_ = |
| + gatt_disconnection_attempt_count_ = 0; |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + device->DisconnectGatt(); |
| + EXPECT_EQ(1, gatt_connection_attempt_count_); |
| + EXPECT_EQ(1, gatt_disconnection_attempt_count_); |
| + CompleteGattConnection(device); |
| + EXPECT_EQ(1, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + EXPECT_TRUE(gatt_connections_.back()->IsConnected()); |
| + callback_count_ = error_callback_count_ = gatt_connection_attempt_count_ = |
| + gatt_disconnection_attempt_count_ = 0; |
| + CompleteGattDisconnection(device); |
| + EXPECT_EQ(0, callback_count_); |
| + EXPECT_EQ(0, error_callback_count_); |
| + |
| + // CreateGattConnection & DisconnectGatt, then simulate disconnection. |
| + callback_count_ = error_callback_count_ = gatt_connection_attempt_count_ = |
| + gatt_disconnection_attempt_count_ = 0; |
| + last_connect_error_code_ = BluetoothDevice::ERROR_UNKNOWN; |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + device->DisconnectGatt(); |
| + EXPECT_EQ(1, gatt_connection_attempt_count_); |
| + EXPECT_EQ(1, gatt_disconnection_attempt_count_); |
| + CompleteGattDisconnection(device); |
| + EXPECT_EQ(0, callback_count_); |
| + EXPECT_EQ(1, error_callback_count_); |
| + EXPECT_EQ(BluetoothDevice::ERROR_FAILED, last_connect_error_code_); |
| + for (BluetoothGattConnection* connection : gatt_connections_) |
| + EXPECT_FALSE(connection->IsConnected()); |
| + |
| + // CreateGattConnection, but error connecting. Also, multiple errors only |
| + // invoke callbacks once: |
| + callback_count_ = error_callback_count_ = 0; |
| + device->CreateGattConnection(GetGattConnectionCallback(), |
| + GetConnectErrorCallback()); |
| + EXPECT_EQ(2, gatt_connection_attempt_count_); |
| + FailGattConnection(device, BluetoothDevice::ERROR_AUTH_FAILED); |
| + FailGattConnection(device, BluetoothDevice::ERROR_FAILED); |
| + EXPECT_EQ(0, callback_count_); |
| + EXPECT_EQ(1, error_callback_count_); |
| + EXPECT_EQ(BluetoothDevice::ERROR_AUTH_FAILED, last_connect_error_code_); |
| + for (BluetoothGattConnection* connection : gatt_connections_) |
| + EXPECT_FALSE(connection->IsConnected()); |
| +} |
| +#endif // defined(OS_ANDROID) |
| + |
| } // namespace device |