| Index: device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc | 
| diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc | 
| index d5a8eef7a1dfd51872b4b2914aff6d8c8033b0eb..a35480817535e8e5846396a14ca39c7b3e9dc758 100644 | 
| --- a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc | 
| +++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc | 
| @@ -316,9 +316,13 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, ReadRemoteCharacteristic_Empty) { | 
| } | 
| #endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests WriteRemoteCharacteristic with empty value buffer. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, WriteRemoteCharacteristic_Empty) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
|  | 
| @@ -334,7 +338,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, WriteRemoteCharacteristic_Empty) { | 
|  | 
| EXPECT_EQ(empty_vector, last_write_value_); | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| #if defined(OS_ANDROID) || defined(OS_WIN) | 
| // Tests ReadRemoteCharacteristic completing after Chrome objects are deleted. | 
| @@ -369,6 +373,10 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| // delegate is set to nil. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| WriteRemoteCharacteristic_AfterDeleted) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
|  | 
| @@ -413,9 +421,13 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, ReadRemoteCharacteristic) { | 
| } | 
| #endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests WriteRemoteCharacteristic with non-empty value buffer. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, WriteRemoteCharacteristic) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
|  | 
| @@ -430,7 +442,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, WriteRemoteCharacteristic) { | 
| EXPECT_EQ(1, gatt_write_characteristic_attempts_); | 
| EXPECT_EQ(test_vector, last_write_value_); | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| #if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests ReadRemoteCharacteristic and GetValue multiple times. | 
| @@ -470,9 +482,13 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, ReadRemoteCharacteristic_Twice) { | 
| } | 
| #endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests WriteRemoteCharacteristic multiple times. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, WriteRemoteCharacteristic_Twice) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
|  | 
| @@ -501,7 +517,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, WriteRemoteCharacteristic_Twice) { | 
| EXPECT_EQ(0, error_callback_count_); | 
| EXPECT_EQ(empty_vector, last_write_value_); | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| #if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests ReadRemoteCharacteristic on two characteristics. | 
| @@ -541,10 +557,14 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| } | 
| #endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests WriteRemoteCharacteristic on two characteristics. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| WriteRemoteCharacteristic_MultipleCharacteristics) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
|  | 
| @@ -553,7 +573,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| characteristic1_->WriteRemoteCharacteristic( | 
| test_vector1, GetCallback(Call::EXPECTED), | 
| GetGattErrorCallback(Call::NOT_EXPECTED)); | 
| -#ifdef OS_ANDROID | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) | 
| EXPECT_EQ(test_vector1, last_write_value_); | 
| #endif | 
|  | 
| @@ -562,7 +582,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| characteristic2_->WriteRemoteCharacteristic( | 
| test_vector2, GetCallback(Call::EXPECTED), | 
| GetGattErrorCallback(Call::NOT_EXPECTED)); | 
| -#ifdef OS_ANDROID | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) | 
| EXPECT_EQ(test_vector2, last_write_value_); | 
| #endif | 
|  | 
| @@ -570,12 +590,12 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| EXPECT_EQ(0, error_callback_count_); | 
|  | 
| SimulateGattCharacteristicWrite(characteristic1_); | 
| -#ifndef OS_ANDROID | 
| +#if !(defined(OS_ANDROID) || defined(OS_MACOSX)) | 
| EXPECT_EQ(test_vector1, last_write_value_); | 
| #endif | 
|  | 
| SimulateGattCharacteristicWrite(characteristic2_); | 
| -#ifndef OS_ANDROID | 
| +#if !(defined(OS_ANDROID) || defined(OS_MACOSX)) | 
| EXPECT_EQ(test_vector2, last_write_value_); | 
| #endif | 
|  | 
| @@ -585,7 +605,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
|  | 
| // TODO(591740): Remove if define for OS_ANDROID in this test. | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| #if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests ReadRemoteCharacteristic asynchronous error. | 
| @@ -612,9 +632,13 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, ReadError) { | 
| } | 
| #endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests WriteRemoteCharacteristic asynchronous error. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, WriteError) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
|  | 
| @@ -630,7 +654,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, WriteError) { | 
| EXPECT_EQ(BluetoothRemoteGattService::GATT_ERROR_INVALID_LENGTH, | 
| last_gatt_error_code_); | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| #if defined(OS_ANDROID) | 
| // Tests ReadRemoteCharacteristic synchronous error. | 
| @@ -665,6 +689,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, ReadSynchronousError) { | 
|  | 
| #if defined(OS_ANDROID) | 
| // Tests WriteRemoteCharacteristic synchronous error. | 
| +// This test doesn't apply to macOS synchronous API does exist. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, WriteSynchronousError) { | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate()); | 
|  | 
| @@ -726,10 +751,14 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| } | 
| #endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests WriteRemoteCharacteristic error with a pending write operation. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| WriteRemoteCharacteristic_WritePending) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
|  | 
| @@ -754,12 +783,16 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| EXPECT_EQ(1, callback_count_); | 
| EXPECT_EQ(0, error_callback_count_); | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests ReadRemoteCharacteristic error with a pending write operation. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| ReadRemoteCharacteristic_WritePending) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_READ | | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
| @@ -785,12 +818,16 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| EXPECT_EQ(1, callback_count_); | 
| EXPECT_EQ(0, error_callback_count_); | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| -#if defined(OS_ANDROID) || defined(OS_WIN) | 
| +#if defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
| // Tests WriteRemoteCharacteristic error with a pending Read operation. | 
| TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| WriteRemoteCharacteristic_ReadPending) { | 
| +  if (!PlatformSupportsLowEnergy()) { | 
| +    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 
| +    return; | 
| +  } | 
| ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate( | 
| BluetoothRemoteGattCharacteristic::PROPERTY_READ | | 
| BluetoothRemoteGattCharacteristic::PROPERTY_WRITE)); | 
| @@ -815,7 +852,7 @@ TEST_F(BluetoothRemoteGattCharacteristicTest, | 
| EXPECT_EQ(1, callback_count_); | 
| EXPECT_EQ(0, error_callback_count_); | 
| } | 
| -#endif  // defined(OS_ANDROID) || defined(OS_WIN) | 
| +#endif  // defined(OS_ANDROID) || defined(OS_MACOSX) || defined(OS_WIN) | 
|  | 
| #if defined(OS_ANDROID) || defined(OS_WIN) | 
| // StartNotifySession fails if characteristic doesn't have Notify or Indicate | 
|  |