| Index: device/bluetooth/bluetooth_gatt_characteristic_unittest.cc | 
| diff --git a/device/bluetooth/bluetooth_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_gatt_characteristic_unittest.cc | 
| index 93a0c9ed93b17bdc5216be7b9cd0f35734bb2cb1..3e4db9bcf75245993b205eec846178da69a85b36 100644 | 
| --- a/device/bluetooth/bluetooth_gatt_characteristic_unittest.cc | 
| +++ b/device/bluetooth/bluetooth_gatt_characteristic_unittest.cc | 
| @@ -52,6 +52,7 @@ class BluetoothGattCharacteristicTest : public BluetoothTest { | 
| enum class StartNotifySetupError { | 
| CHARACTERISTIC_PROPERTIES, | 
| CONFIG_DESCRIPTOR_MISSING, | 
| +    CONFIG_DESCRIPTOR_DUPLICATE, | 
| SET_NOTIFY, | 
| WRITE_DESCRIPTOR, | 
| NONE | 
| @@ -69,13 +70,23 @@ class BluetoothGattCharacteristicTest : public BluetoothTest { | 
| } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate(properties)); | 
|  | 
| +    size_t expected_descriptors_count = 0; | 
| if (error != StartNotifySetupError::CONFIG_DESCRIPTOR_MISSING) { | 
| SimulateGattDescriptor( | 
| characteristic1_, | 
| -          /* Client Characteristic Configuration descriptor's standard UUID: */ | 
| -          "00002902-0000-1000-8000-00805F9B34FB"); | 
| -      ASSERT_EQ(1u, characteristic1_->GetDescriptors().size()); | 
| +          BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid() | 
| +              .canonical_value()); | 
| +      expected_descriptors_count++; | 
| } | 
| +    if (error == StartNotifySetupError::CONFIG_DESCRIPTOR_DUPLICATE) { | 
| +      SimulateGattDescriptor( | 
| +          characteristic1_, | 
| +          BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid() | 
| +              .canonical_value()); | 
| +      expected_descriptors_count++; | 
| +    } | 
| +    ASSERT_EQ(expected_descriptors_count, | 
| +              characteristic1_->GetDescriptors().size()); | 
|  | 
| if (error == StartNotifySetupError::SET_NOTIFY) { | 
| SimulateGattCharacteristicSetNotifyWillFailSynchronouslyOnce( | 
| @@ -776,6 +787,28 @@ TEST_F(BluetoothGattCharacteristicTest, StartNotifySession_NoConfigDescriptor) { | 
| EXPECT_EQ(0, error_callback_count_); | 
| base::RunLoop().RunUntilIdle(); | 
| EXPECT_EQ(1, error_callback_count_); | 
| +  EXPECT_EQ(BluetoothGattService::GATT_ERROR_NOT_SUPPORTED, | 
| +            last_gatt_error_code_); | 
| +} | 
| +#endif  // defined(OS_ANDROID) | 
| + | 
| +#if defined(OS_ANDROID) | 
| +// StartNotifySession fails if the characteristic has multiple Client | 
| +// Characteristic Configuration descriptors. | 
| +TEST_F(BluetoothGattCharacteristicTest, | 
| +       StartNotifySession_MultipleConfigDescriptor) { | 
| +  ASSERT_NO_FATAL_FAILURE(StartNotifyBoilerplate( | 
| +      /* properties: NOTIFY */ 0x10, | 
| +      /* expected_config_descriptor_value: NOTIFY */ 1, | 
| +      StartNotifySetupError::CONFIG_DESCRIPTOR_DUPLICATE)); | 
| + | 
| +  EXPECT_EQ(0, gatt_notify_characteristic_attempts_); | 
| + | 
| +  // The expected error callback is asynchronous: | 
| +  EXPECT_EQ(0, error_callback_count_); | 
| +  base::RunLoop().RunUntilIdle(); | 
| +  EXPECT_EQ(1, error_callback_count_); | 
| +  EXPECT_EQ(BluetoothGattService::GATT_ERROR_FAILED, last_gatt_error_code_); | 
| } | 
| #endif  // defined(OS_ANDROID) | 
|  | 
| @@ -855,8 +888,8 @@ TEST_F(BluetoothGattCharacteristicTest, StartNotifySession_Multiple) { | 
| FakeCharacteristicBoilerplate(/* properties: NOTIFY */ 0x10)); | 
| SimulateGattDescriptor( | 
| characteristic1_, | 
| -      /* Client Characteristic Configuration descriptor's standard UUID: */ | 
| -      "00002902-0000-1000-8000-00805F9B34FB"); | 
| +      BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid() | 
| +          .canonical_value()); | 
| ASSERT_EQ(1u, characteristic1_->GetDescriptors().size()); | 
|  | 
| characteristic1_->StartNotifySession( | 
| @@ -977,4 +1010,34 @@ TEST_F(BluetoothGattCharacteristicTest, GetDescriptors_and_GetDescriptor) { | 
| } | 
| #endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
|  | 
| +#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +TEST_F(BluetoothGattCharacteristicTest, GetDescriptorsByUUID) { | 
| +  ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate()); | 
| + | 
| +  // Add several Descriptors: | 
| +  BluetoothUUID id1("11111111-0000-1000-8000-00805f9b34fb"); | 
| +  BluetoothUUID id2("22222222-0000-1000-8000-00805f9b34fb"); | 
| +  BluetoothUUID id3("33333333-0000-1000-8000-00805f9b34fb"); | 
| +  SimulateGattDescriptor(characteristic1_, id1.canonical_value()); | 
| +  SimulateGattDescriptor(characteristic1_, id2.canonical_value()); | 
| +  SimulateGattDescriptor(characteristic2_, id3.canonical_value()); | 
| +  SimulateGattDescriptor(characteristic2_, id3.canonical_value()); | 
| + | 
| +  EXPECT_NE(characteristic2_->GetDescriptorsByUUID(id3).at(0)->GetIdentifier(), | 
| +            characteristic2_->GetDescriptorsByUUID(id3).at(1)->GetIdentifier()); | 
| + | 
| +  EXPECT_EQ(id1, characteristic1_->GetDescriptorsByUUID(id1).at(0)->GetUUID()); | 
| +  EXPECT_EQ(id2, characteristic1_->GetDescriptorsByUUID(id2).at(0)->GetUUID()); | 
| +  EXPECT_EQ(id3, characteristic2_->GetDescriptorsByUUID(id3).at(0)->GetUUID()); | 
| +  EXPECT_EQ(id3, characteristic2_->GetDescriptorsByUUID(id3).at(1)->GetUUID()); | 
| +  EXPECT_EQ(1u, characteristic1_->GetDescriptorsByUUID(id1).size()); | 
| +  EXPECT_EQ(1u, characteristic1_->GetDescriptorsByUUID(id2).size()); | 
| +  EXPECT_EQ(2u, characteristic2_->GetDescriptorsByUUID(id3).size()); | 
| + | 
| +  EXPECT_EQ(0u, characteristic2_->GetDescriptorsByUUID(id1).size()); | 
| +  EXPECT_EQ(0u, characteristic2_->GetDescriptorsByUUID(id2).size()); | 
| +  EXPECT_EQ(0u, characteristic1_->GetDescriptorsByUUID(id3).size()); | 
| +} | 
| +#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| + | 
| }  // namespace device | 
|  |