| Index: device/bluetooth/bluetooth_gatt_descriptor_unittest.cc
|
| diff --git a/device/bluetooth/bluetooth_gatt_descriptor_unittest.cc b/device/bluetooth/bluetooth_gatt_descriptor_unittest.cc
|
| index a2c0bd97ad53323f58e14c7cc0a6c1db9eff321a..190de7dbc645ed2a8f7ad6a362cec889351f922d 100644
|
| --- a/device/bluetooth/bluetooth_gatt_descriptor_unittest.cc
|
| +++ b/device/bluetooth/bluetooth_gatt_descriptor_unittest.cc
|
| @@ -16,7 +16,42 @@
|
| namespace device {
|
|
|
| #if defined(OS_ANDROID) || defined(OS_MACOSX)
|
| -class BluetoothGattDescriptorTest : public BluetoothTest {};
|
| +class BluetoothGattDescriptorTest : public BluetoothTest {
|
| + public:
|
| + // Creates adapter_, device_, service_, characteristic_,
|
| + // descriptor1_, & descriptor2_.
|
| + void FakeDescriptorBoilerplate() {
|
| + InitWithFakeAdapter();
|
| + StartLowEnergyDiscoverySession();
|
| + device_ = DiscoverLowEnergyDevice(3);
|
| + device_->CreateGattConnection(GetGattConnectionCallback(Call::EXPECTED),
|
| + GetConnectErrorCallback(Call::NOT_EXPECTED));
|
| + SimulateGattConnection(device_);
|
| + std::vector<std::string> services;
|
| + std::string uuid("00000000-0000-1000-8000-00805f9b34fb");
|
| + services.push_back(uuid);
|
| + SimulateGattServicesDiscovered(device_, services);
|
| + ASSERT_EQ(1u, device_->GetGattServices().size());
|
| + service_ = device_->GetGattServices()[0];
|
| + SimulateGattCharacteristic(service_, uuid, 0);
|
| + ASSERT_EQ(1u, service_->GetCharacteristics().size());
|
| + characteristic_ = service_->GetCharacteristics()[0];
|
| + SimulateGattDescriptor(characteristic_,
|
| + "00000001-0000-1000-8000-00805f9b34fb");
|
| + SimulateGattDescriptor(characteristic_,
|
| + "00000002-0000-1000-8000-00805f9b34fb");
|
| + ASSERT_EQ(2u, characteristic_->GetDescriptors().size());
|
| + descriptor1_ = characteristic_->GetDescriptors()[0];
|
| + descriptor2_ = characteristic_->GetDescriptors()[1];
|
| + ResetEventCounts();
|
| + }
|
| +
|
| + BluetoothDevice* device_ = nullptr;
|
| + BluetoothGattService* service_ = nullptr;
|
| + BluetoothGattCharacteristic* characteristic_ = nullptr;
|
| + BluetoothGattDescriptor* descriptor1_ = nullptr;
|
| + BluetoothGattDescriptor* descriptor2_ = nullptr;
|
| +};
|
| #endif
|
|
|
| #if defined(OS_ANDROID)
|
| @@ -137,4 +172,425 @@ TEST_F(BluetoothGattDescriptorTest, GetUUID) {
|
| }
|
| #endif // defined(OS_ANDROID)
|
|
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor and GetValue with empty value buffer.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadRemoteDescriptor_Empty) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_read_descriptor_attempts_);
|
| + std::vector<uint8_t> empty_vector;
|
| + SimulateGattDescriptorRead(descriptor1_, empty_vector);
|
| +
|
| + // Duplicate read reported from OS shouldn't cause a problem:
|
| + SimulateGattDescriptorRead(descriptor1_, empty_vector);
|
| +
|
| + EXPECT_EQ(empty_vector, last_read_value_);
|
| + EXPECT_EQ(empty_vector, descriptor1_->GetValue());
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor with empty value buffer.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteRemoteDescriptor_Empty) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_write_descriptor_attempts_);
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| +
|
| + EXPECT_EQ(empty_vector, last_write_value_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor completing after Chrome objects are deleted.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadRemoteDescriptor_AfterDeleted) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| +
|
| + RememberDescriptorForSubsequentAction(descriptor1_);
|
| + DeleteDevice(device_);
|
| +
|
| + std::vector<uint8_t> empty_vector;
|
| + SimulateGattDescriptorRead(/* use remembered descriptor */ nullptr,
|
| + empty_vector);
|
| + EXPECT_TRUE("Did not crash!");
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor completing after Chrome objects are deleted.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteRemoteDescriptor_AfterDeleted) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector,
|
| + GetCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| +
|
| + RememberDescriptorForSubsequentAction(descriptor1_);
|
| + DeleteDevice(device_);
|
| +
|
| + SimulateGattDescriptorWrite(/* use remembered descriptor */ nullptr);
|
| + EXPECT_TRUE("Did not crash!");
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor and GetValue with non-empty value buffer.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadRemoteDescriptor) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_read_descriptor_attempts_);
|
| +
|
| + uint8_t values[] = {0, 1, 2, 3, 4, 0xf, 0xf0, 0xff};
|
| + std::vector<uint8_t> test_vector(values, values + arraysize(values));
|
| + SimulateGattDescriptorRead(descriptor1_, test_vector);
|
| +
|
| + // Duplicate read reported from OS shouldn't cause a problem:
|
| + std::vector<uint8_t> empty_vector;
|
| + SimulateGattDescriptorRead(descriptor1_, empty_vector);
|
| +
|
| + EXPECT_EQ(test_vector, last_read_value_);
|
| + EXPECT_EQ(test_vector, descriptor1_->GetValue());
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor with non-empty value buffer.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteRemoteDescriptor) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + uint8_t values[] = {0, 1, 2, 3, 4, 0xf, 0xf0, 0xff};
|
| + std::vector<uint8_t> test_vector(values, values + arraysize(values));
|
| + descriptor1_->WriteRemoteDescriptor(test_vector, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_write_descriptor_attempts_);
|
| +
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| +
|
| + EXPECT_EQ(test_vector, last_write_value_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor and GetValue multiple times.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadRemoteDescriptor_Twice) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_read_descriptor_attempts_);
|
| +
|
| + uint8_t values[] = {0, 1, 2, 3, 4, 0xf, 0xf0, 0xff};
|
| + std::vector<uint8_t> test_vector(values, values + arraysize(values));
|
| + SimulateGattDescriptorRead(descriptor1_, test_vector);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| + EXPECT_EQ(test_vector, last_read_value_);
|
| + EXPECT_EQ(test_vector, descriptor1_->GetValue());
|
| +
|
| + // Read again, with different value:
|
| + ResetEventCounts();
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_read_descriptor_attempts_);
|
| + std::vector<uint8_t> empty_vector;
|
| + SimulateGattDescriptorRead(descriptor1_, empty_vector);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| + EXPECT_EQ(empty_vector, last_read_value_);
|
| + EXPECT_EQ(empty_vector, descriptor1_->GetValue());
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor multiple times.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteRemoteDescriptor_Twice) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + uint8_t values[] = {0, 1, 2, 3, 4, 0xf, 0xf0, 0xff};
|
| + std::vector<uint8_t> test_vector(values, values + arraysize(values));
|
| + descriptor1_->WriteRemoteDescriptor(test_vector, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_write_descriptor_attempts_);
|
| +
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| + EXPECT_EQ(test_vector, last_write_value_);
|
| +
|
| + // Write again, with different value:
|
| + ResetEventCounts();
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_write_descriptor_attempts_);
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| + EXPECT_EQ(empty_vector, last_write_value_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor on two descriptors.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadRemoteDescriptor_MultipleDescriptors) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + descriptor2_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(2, gatt_read_descriptor_attempts_);
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +
|
| + std::vector<uint8_t> test_vector1;
|
| + test_vector1.push_back(111);
|
| + SimulateGattDescriptorRead(descriptor1_, test_vector1);
|
| + EXPECT_EQ(test_vector1, last_read_value_);
|
| +
|
| + std::vector<uint8_t> test_vector2;
|
| + test_vector2.push_back(222);
|
| + SimulateGattDescriptorRead(descriptor2_, test_vector2);
|
| + EXPECT_EQ(test_vector2, last_read_value_);
|
| +
|
| + EXPECT_EQ(2, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| + EXPECT_EQ(test_vector1, descriptor1_->GetValue());
|
| + EXPECT_EQ(test_vector2, descriptor2_->GetValue());
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor on two descriptors.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteRemoteDescriptor_MultipleDescriptors) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + std::vector<uint8_t> test_vector1;
|
| + test_vector1.push_back(111);
|
| + descriptor1_->WriteRemoteDescriptor(test_vector1, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(test_vector1, last_write_value_);
|
| +
|
| + std::vector<uint8_t> test_vector2;
|
| + test_vector2.push_back(222);
|
| + descriptor2_->WriteRemoteDescriptor(test_vector2, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(test_vector2, last_write_value_);
|
| +
|
| + EXPECT_EQ(2, gatt_write_descriptor_attempts_);
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| + SimulateGattDescriptorWrite(descriptor2_);
|
| +
|
| + EXPECT_EQ(2, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor asynchronous error.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadError) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| + SimulateGattDescriptorReadError(
|
| + descriptor1_, BluetoothGattService::GATT_ERROR_INVALID_LENGTH);
|
| + SimulateGattDescriptorReadError(descriptor1_,
|
| + BluetoothGattService::GATT_ERROR_FAILED);
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_INVALID_LENGTH,
|
| + last_gatt_error_code_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor asynchronous error.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteError) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector,
|
| + GetCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| + SimulateGattDescriptorWriteError(
|
| + descriptor1_, BluetoothGattService::GATT_ERROR_INVALID_LENGTH);
|
| + SimulateGattDescriptorWriteError(descriptor1_,
|
| + BluetoothGattService::GATT_ERROR_FAILED);
|
| +
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_INVALID_LENGTH,
|
| + last_gatt_error_code_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor synchronous error.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadSynchronousError) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + SimulateGattDescriptorReadWillFailSynchronouslyOnce(descriptor1_);
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| + EXPECT_EQ(0, gatt_read_descriptor_attempts_);
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(1, error_callback_count_);
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_FAILED, last_gatt_error_code_);
|
| +
|
| + // After failing once, can succeed:
|
| + ResetEventCounts();
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_read_descriptor_attempts_);
|
| + std::vector<uint8_t> empty_vector;
|
| + SimulateGattDescriptorRead(descriptor1_, empty_vector);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor synchronous error.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteSynchronousError) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + SimulateGattDescriptorWriteWillFailSynchronouslyOnce(descriptor1_);
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector,
|
| + GetCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| + EXPECT_EQ(0, gatt_write_descriptor_attempts_);
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(1, error_callback_count_);
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_FAILED, last_gatt_error_code_);
|
| +
|
| + // After failing once, can succeed:
|
| + ResetEventCounts();
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + EXPECT_EQ(1, gatt_write_descriptor_attempts_);
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor error with a pending read operation.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadRemoteDescriptor_ReadPending) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(1, error_callback_count_);
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_IN_PROGRESS,
|
| + last_gatt_error_code_);
|
| +
|
| + // Initial read should still succeed:
|
| + ResetEventCounts();
|
| + std::vector<uint8_t> empty_vector;
|
| + SimulateGattDescriptorRead(descriptor1_, empty_vector);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor error with a pending write operation.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteRemoteDescriptor_WritePending) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector,
|
| + GetCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(1, error_callback_count_);
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_IN_PROGRESS,
|
| + last_gatt_error_code_);
|
| +
|
| + // Initial write should still succeed:
|
| + ResetEventCounts();
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests ReadRemoteDescriptor error with a pending write operation.
|
| +TEST_F(BluetoothGattDescriptorTest, ReadRemoteDescriptor_WritePending) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector, GetCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(1, error_callback_count_);
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_IN_PROGRESS,
|
| + last_gatt_error_code_);
|
| +
|
| + // Initial write should still succeed:
|
| + ResetEventCounts();
|
| + SimulateGattDescriptorWrite(descriptor1_);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| +#if defined(OS_ANDROID)
|
| +// Tests WriteRemoteDescriptor error with a pending Read operation.
|
| +TEST_F(BluetoothGattDescriptorTest, WriteRemoteDescriptor_ReadPending) {
|
| + ASSERT_NO_FATAL_FAILURE(FakeDescriptorBoilerplate());
|
| +
|
| + std::vector<uint8_t> empty_vector;
|
| + descriptor1_->ReadRemoteDescriptor(GetReadValueCallback(Call::EXPECTED),
|
| + GetGattErrorCallback(Call::NOT_EXPECTED));
|
| + descriptor1_->WriteRemoteDescriptor(empty_vector,
|
| + GetCallback(Call::NOT_EXPECTED),
|
| + GetGattErrorCallback(Call::EXPECTED));
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_EQ(0, callback_count_);
|
| + EXPECT_EQ(1, error_callback_count_);
|
| + EXPECT_EQ(BluetoothGattService::GATT_ERROR_IN_PROGRESS,
|
| + last_gatt_error_code_);
|
| +
|
| + // Initial read should still succeed:
|
| + ResetEventCounts();
|
| + SimulateGattDescriptorRead(descriptor1_, empty_vector);
|
| + EXPECT_EQ(1, callback_count_);
|
| + EXPECT_EQ(0, error_callback_count_);
|
| +}
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| } // namespace device
|
|
|