Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1324)

Unified Diff: device/bluetooth/bluetooth_gatt_descriptor_unittest.cc

Issue 1712593002: bluetooth: android: Confirm the notify session after the descriptor has been written. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Vincent's comments Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_);
ortuno 2016/03/04 17:39:47 Shouldn't we test that duplicated write reported d
scheib 2016/03/11 03:17:30 Done.
+
+ 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_);
ortuno 2016/03/04 17:39:47 I wonder if we should explicitly delete the descri
scheib 2016/03/11 03:17:31 We don't test deletions of GATT objects yet. Andro
+
+ 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

Powered by Google App Engine
This is Rietveld 408576698