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

Unified Diff: device/bluetooth/bluetooth_gatt_chromeos_unittest.cc

Issue 228643004: device/bluetooth: Add chromeos::BluetoothRemoteGattCharacteristicChromeOS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Removed potentially flaky expectation from unit test. Created 6 years, 8 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
« no previous file with comments | « device/bluetooth/bluetooth_gatt_characteristic.h ('k') | device/bluetooth/bluetooth_gatt_descriptor.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/bluetooth/bluetooth_gatt_chromeos_unittest.cc
diff --git a/device/bluetooth/bluetooth_gatt_chromeos_unittest.cc b/device/bluetooth/bluetooth_gatt_chromeos_unittest.cc
index f93060f8037fa6cf0df73ec3ef976f32517441e3..68c01edebe7c2518e7aac4ffe3bb312164612511 100644
--- a/device/bluetooth/bluetooth_gatt_chromeos_unittest.cc
+++ b/device/bluetooth/bluetooth_gatt_chromeos_unittest.cc
@@ -15,12 +15,14 @@
#include "device/bluetooth/bluetooth_adapter.h"
#include "device/bluetooth/bluetooth_adapter_factory.h"
#include "device/bluetooth/bluetooth_device.h"
+#include "device/bluetooth/bluetooth_gatt_characteristic.h"
#include "device/bluetooth/bluetooth_gatt_service.h"
#include "device/bluetooth/bluetooth_uuid.h"
#include "testing/gtest/include/gtest/gtest.h"
using device::BluetoothAdapter;
using device::BluetoothDevice;
+using device::BluetoothGattCharacteristic;
using device::BluetoothGattService;
using device::BluetoothUUID;
@@ -28,9 +30,28 @@ namespace chromeos {
namespace {
-class TestObserver : public BluetoothDevice::Observer {
+const BluetoothUUID kHeartRateMeasurementUUID(
+ FakeBluetoothGattCharacteristicClient::kHeartRateMeasurementUUID);
+const BluetoothUUID kBodySensorLocationUUID(
+ FakeBluetoothGattCharacteristicClient::kBodySensorLocationUUID);
+const BluetoothUUID kHeartRateControlPointUUID(
+ FakeBluetoothGattCharacteristicClient::kHeartRateControlPointUUID);
+
+// Compares GATT characteristic/descriptor values. Returns true, if the values
+// are equal.
+bool ValuesEqual(const std::vector<uint8>& value0,
+ const std::vector<uint8>& value1) {
+ if (value0.size() != value1.size())
+ return false;
+ for (size_t i = 0; i < value0.size(); ++i)
+ if (value0[i] != value1[i])
+ return false;
+ return true;
+}
+
+class TestDeviceObserver : public BluetoothDevice::Observer {
public:
- TestObserver(scoped_refptr<BluetoothAdapter> adapter,
+ TestDeviceObserver(scoped_refptr<BluetoothAdapter> adapter,
BluetoothDevice* device)
: gatt_service_added_count_(0),
gatt_service_removed_count_(0),
@@ -39,7 +60,7 @@ class TestObserver : public BluetoothDevice::Observer {
device->AddObserver(this);
}
- virtual ~TestObserver() {
+ virtual ~TestDeviceObserver() {
BluetoothDevice* device = adapter_->GetDevice(device_address_);
if (device)
device->RemoveObserver(this);
@@ -49,7 +70,7 @@ class TestObserver : public BluetoothDevice::Observer {
virtual void GattServiceAdded(
BluetoothDevice* device,
BluetoothGattService* service) OVERRIDE {
- EXPECT_EQ(device_address_, device->GetAddress());
+ ASSERT_EQ(device_address_, device->GetAddress());
++gatt_service_added_count_;
last_gatt_service_id_ = service->GetIdentifier();
@@ -58,13 +79,15 @@ class TestObserver : public BluetoothDevice::Observer {
EXPECT_FALSE(service->IsLocal());
EXPECT_TRUE(service->IsPrimary());
+ EXPECT_EQ(device->GetGattService(last_gatt_service_id_), service);
+
QuitMessageLoop();
}
virtual void GattServiceRemoved(
BluetoothDevice* device,
BluetoothGattService* service) OVERRIDE {
- EXPECT_EQ(device_address_, device->GetAddress());
+ ASSERT_EQ(device_address_, device->GetAddress());
++gatt_service_removed_count_;
last_gatt_service_id_ = service->GetIdentifier();
@@ -73,6 +96,9 @@ class TestObserver : public BluetoothDevice::Observer {
EXPECT_FALSE(service->IsLocal());
EXPECT_TRUE(service->IsPrimary());
+ // The device should return NULL for this service.
+ EXPECT_FALSE(device->GetGattService(last_gatt_service_id_));
+
QuitMessageLoop();
}
@@ -94,13 +120,121 @@ class TestObserver : public BluetoothDevice::Observer {
scoped_refptr<BluetoothAdapter> adapter_;
};
+class TestGattServiceObserver : public BluetoothGattService::Observer {
+ public:
+ TestGattServiceObserver(scoped_refptr<BluetoothAdapter> adapter,
+ BluetoothDevice* device,
+ BluetoothGattService* service)
+ : gatt_service_changed_count_(0),
+ gatt_characteristic_added_count_(0),
+ gatt_characteristic_removed_count_(0),
+ gatt_characteristic_value_changed_count_(0),
+ device_address_(device->GetAddress()),
+ gatt_service_id_(service->GetIdentifier()),
+ adapter_(adapter) {
+ service->AddObserver(this);
+ }
+
+ virtual ~TestGattServiceObserver() {
+ // See if either the device or the service even exist.
+ BluetoothDevice* device = adapter_->GetDevice(device_address_);
+ if (!device)
+ return;
+
+ BluetoothGattService* service = device->GetGattService(gatt_service_id_);
+ if (!service)
+ return;
+
+ service->RemoveObserver(this);
+ }
+
+ // BluetoothGattService::Observer overrides.
+ virtual void GattServiceChanged(BluetoothGattService* service) OVERRIDE {
+ ASSERT_EQ(gatt_service_id_, service->GetIdentifier());
+ ++gatt_service_changed_count_;
+
+ QuitMessageLoop();
+ }
+
+ virtual void GattCharacteristicAdded(
+ BluetoothGattService* service,
+ BluetoothGattCharacteristic* characteristic) OVERRIDE {
+ ASSERT_EQ(gatt_service_id_, service->GetIdentifier());
+
+ ++gatt_characteristic_added_count_;
+ last_gatt_characteristic_id_ = characteristic->GetIdentifier();
+ last_gatt_characteristic_uuid_ = characteristic->GetUUID();
+
+ EXPECT_EQ(service->GetCharacteristic(last_gatt_characteristic_id_),
+ characteristic);
+ EXPECT_EQ(service, characteristic->GetService());
+
+ QuitMessageLoop();
+ }
+
+ virtual void GattCharacteristicRemoved(
+ BluetoothGattService* service,
+ BluetoothGattCharacteristic* characteristic) OVERRIDE {
+ ASSERT_EQ(gatt_service_id_, service->GetIdentifier());
+
+ ++gatt_characteristic_removed_count_;
+ last_gatt_characteristic_id_ = characteristic->GetIdentifier();
+ last_gatt_characteristic_uuid_ = characteristic->GetUUID();
+
+ // The service should return NULL for this characteristic.
+ EXPECT_FALSE(service->GetCharacteristic(last_gatt_characteristic_id_));
+ EXPECT_EQ(service, characteristic->GetService());
+
+ QuitMessageLoop();
+ }
+
+ virtual void GattCharacteristicValueChanged(
+ BluetoothGattService* service,
+ BluetoothGattCharacteristic* characteristic,
+ const std::vector<uint8>& value) OVERRIDE {
+ ASSERT_EQ(gatt_service_id_, service->GetIdentifier());
+
+ ++gatt_characteristic_value_changed_count_;
+ last_gatt_characteristic_id_ = characteristic->GetIdentifier();
+ last_gatt_characteristic_uuid_ = characteristic->GetUUID();
+ last_changed_characteristic_value_ = characteristic->GetValue();
+
+ EXPECT_EQ(service->GetCharacteristic(last_gatt_characteristic_id_),
+ characteristic);
+
+ QuitMessageLoop();
+ }
+
+ int gatt_service_changed_count_;
+ int gatt_characteristic_added_count_;
+ int gatt_characteristic_removed_count_;
+ int gatt_characteristic_value_changed_count_;
+ std::string last_gatt_characteristic_id_;
+ BluetoothUUID last_gatt_characteristic_uuid_;
+ std::vector<uint8> last_changed_characteristic_value_;
+
+ private:
+ // Some tests use a message loop since background processing is simulated;
+ // break out of those loops.
+ void QuitMessageLoop() {
+ if (base::MessageLoop::current() &&
+ base::MessageLoop::current()->is_running())
+ base::MessageLoop::current()->Quit();
+ }
+
+ std::string device_address_;
+ std::string gatt_service_id_;
+ scoped_refptr<BluetoothAdapter> adapter_;
+};
+
} // namespace
class BluetoothGattChromeOSTest : public testing::Test {
public:
BluetoothGattChromeOSTest()
: fake_bluetooth_gatt_service_client_(NULL),
- last_gatt_service_(NULL) {
+ success_callback_count_(0),
+ error_callback_count_(0) {
}
virtual void SetUp() {
@@ -108,6 +242,8 @@ class BluetoothGattChromeOSTest : public testing::Test {
fake_bluetooth_device_client_ = new FakeBluetoothDeviceClient;
fake_bluetooth_gatt_service_client_ =
new FakeBluetoothGattServiceClient;
+ fake_bluetooth_gatt_characteristic_client_ =
+ new FakeBluetoothGattCharacteristicClient;
fake_dbus_thread_manager->SetBluetoothDeviceClient(
scoped_ptr<BluetoothDeviceClient>(
fake_bluetooth_device_client_));
@@ -116,7 +252,7 @@ class BluetoothGattChromeOSTest : public testing::Test {
fake_bluetooth_gatt_service_client_));
fake_dbus_thread_manager->SetBluetoothGattCharacteristicClient(
scoped_ptr<BluetoothGattCharacteristicClient>(
- new FakeBluetoothGattCharacteristicClient));
+ fake_bluetooth_gatt_characteristic_client_));
fake_dbus_thread_manager->SetBluetoothGattDescriptorClient(
scoped_ptr<BluetoothGattDescriptorClient>(
new FakeBluetoothGattDescriptorClient));
@@ -152,17 +288,34 @@ class BluetoothGattChromeOSTest : public testing::Test {
adapter_ = adapter;
}
+ void SuccessCallback() {
+ ++success_callback_count_;
+ }
+
+ void ValueCallback(const std::vector<uint8>& value) {
+ ++success_callback_count_;
+ last_read_value_ = value;
+ }
+
+ void ErrorCallback() {
+ ++error_callback_count_;
+ }
+
protected:
base::MessageLoop message_loop_;
FakeBluetoothDeviceClient* fake_bluetooth_device_client_;
FakeBluetoothGattServiceClient* fake_bluetooth_gatt_service_client_;
+ FakeBluetoothGattCharacteristicClient*
+ fake_bluetooth_gatt_characteristic_client_;
scoped_refptr<BluetoothAdapter> adapter_;
- BluetoothGattService* last_gatt_service_;
+ int success_callback_count_;
+ int error_callback_count_;
+ std::vector<uint8> last_read_value_;
};
-TEST_F(BluetoothGattChromeOSTest, GattServiceAdded) {
+TEST_F(BluetoothGattChromeOSTest, GattServiceAddedAndRemoved) {
// Create a fake LE device. We store the device pointer here because this is a
// test. It's unsafe to do this in production as the device might get deleted.
fake_bluetooth_device_client_->CreateDevice(
@@ -172,11 +325,12 @@ TEST_F(BluetoothGattChromeOSTest, GattServiceAdded) {
FakeBluetoothDeviceClient::kLowEnergyAddress);
ASSERT_TRUE(device);
- TestObserver observer(adapter_, device);
+ TestDeviceObserver observer(adapter_, device);
EXPECT_EQ(0, observer.gatt_service_added_count_);
EXPECT_EQ(0, observer.gatt_service_removed_count_);
EXPECT_TRUE(observer.last_gatt_service_id_.empty());
EXPECT_FALSE(observer.last_gatt_service_uuid_.IsValid());
+ EXPECT_TRUE(device->GetGattServices().empty());
// Expose the fake Heart Rate Service.
fake_bluetooth_gatt_service_client_->ExposeHeartRateService(
@@ -193,6 +347,7 @@ TEST_F(BluetoothGattChromeOSTest, GattServiceAdded) {
device->GetGattService(observer.last_gatt_service_id_);
EXPECT_FALSE(service->IsLocal());
EXPECT_TRUE(service->IsPrimary());
+ EXPECT_EQ(service, device->GetGattServices()[0]);
EXPECT_EQ(observer.last_gatt_service_uuid_, service->GetUUID());
@@ -224,7 +379,10 @@ TEST_F(BluetoothGattChromeOSTest, GattServiceAdded) {
BluetoothUUID(FakeBluetoothGattServiceClient::kHeartRateServiceUUID),
observer.last_gatt_service_uuid_);
+ // The object |service| points to should have been deallocated. |device|
+ // should contain a brand new instance.
service = device->GetGattService(observer.last_gatt_service_id_);
+ EXPECT_EQ(service, device->GetGattServices()[0]);
EXPECT_FALSE(service->IsLocal());
EXPECT_TRUE(service->IsPrimary());
@@ -248,4 +406,216 @@ TEST_F(BluetoothGattChromeOSTest, GattServiceAdded) {
NULL, adapter_->GetDevice(FakeBluetoothDeviceClient::kLowEnergyAddress));
}
+TEST_F(BluetoothGattChromeOSTest, GattCharacteristicAddedAndRemoved) {
+ fake_bluetooth_device_client_->CreateDevice(
+ dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath),
+ dbus::ObjectPath(FakeBluetoothDeviceClient::kLowEnergyPath));
+ BluetoothDevice* device = adapter_->GetDevice(
+ FakeBluetoothDeviceClient::kLowEnergyAddress);
+ ASSERT_TRUE(device);
+
+ TestDeviceObserver observer(adapter_, device);
+
+ // Expose the fake Heart Rate service. This will asynchronously expose
+ // characteristics.
+ fake_bluetooth_gatt_service_client_->ExposeHeartRateService(
+ dbus::ObjectPath(FakeBluetoothDeviceClient::kLowEnergyPath));
+ ASSERT_EQ(1, observer.gatt_service_added_count_);
+
+ BluetoothGattService* service =
+ device->GetGattService(observer.last_gatt_service_id_);
+
+ TestGattServiceObserver service_observer(adapter_, device, service);
+ EXPECT_EQ(0, service_observer.gatt_service_changed_count_);
+ EXPECT_EQ(0, service_observer.gatt_characteristic_added_count_);
+ EXPECT_EQ(0, service_observer.gatt_characteristic_removed_count_);
+ EXPECT_EQ(0, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_TRUE(service->GetCharacteristics().empty());
+
+ // Run the message loop so that the characteristics appear.
+ base::MessageLoop::current()->Run();
+
+ // 3 characteristics should appear. Only 1 of the characteristics sends
+ // value changed signals.
+ EXPECT_EQ(3, service_observer.gatt_service_changed_count_);
+ EXPECT_EQ(3, service_observer.gatt_characteristic_added_count_);
+ EXPECT_EQ(0, service_observer.gatt_characteristic_removed_count_);
+ EXPECT_EQ(1, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_EQ(3U, service->GetCharacteristics().size());
+
+ // Hide the characteristics. 3 removed signals should be received.
+ fake_bluetooth_gatt_characteristic_client_->HideHeartRateCharacteristics();
+ EXPECT_EQ(6, service_observer.gatt_service_changed_count_);
+ EXPECT_EQ(3, service_observer.gatt_characteristic_added_count_);
+ EXPECT_EQ(3, service_observer.gatt_characteristic_removed_count_);
+ EXPECT_EQ(1, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_TRUE(service->GetCharacteristics().empty());
+
+ // Re-expose the heart rate characteristics.
+ fake_bluetooth_gatt_characteristic_client_->ExposeHeartRateCharacteristics(
+ fake_bluetooth_gatt_service_client_->GetHeartRateServicePath());
+ EXPECT_EQ(9, service_observer.gatt_service_changed_count_);
+ EXPECT_EQ(6, service_observer.gatt_characteristic_added_count_);
+ EXPECT_EQ(3, service_observer.gatt_characteristic_removed_count_);
+ EXPECT_EQ(2, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_EQ(3U, service->GetCharacteristics().size());
+
+ // Hide the service. All characteristics should disappear.
+ fake_bluetooth_gatt_service_client_->HideHeartRateService();
+ EXPECT_EQ(12, service_observer.gatt_service_changed_count_);
+ EXPECT_EQ(6, service_observer.gatt_characteristic_added_count_);
+ EXPECT_EQ(6, service_observer.gatt_characteristic_removed_count_);
+ EXPECT_EQ(2, service_observer.gatt_characteristic_value_changed_count_);
+}
+
+TEST_F(BluetoothGattChromeOSTest, GattCharacteristicValue) {
+ fake_bluetooth_device_client_->CreateDevice(
+ dbus::ObjectPath(FakeBluetoothAdapterClient::kAdapterPath),
+ dbus::ObjectPath(FakeBluetoothDeviceClient::kLowEnergyPath));
+ BluetoothDevice* device = adapter_->GetDevice(
+ FakeBluetoothDeviceClient::kLowEnergyAddress);
+ ASSERT_TRUE(device);
+
+ TestDeviceObserver observer(adapter_, device);
+
+ // Expose the fake Heart Rate service. This will asynchronously expose
+ // characteristics.
+ fake_bluetooth_gatt_service_client_->ExposeHeartRateService(
+ dbus::ObjectPath(FakeBluetoothDeviceClient::kLowEnergyPath));
+ ASSERT_EQ(1, observer.gatt_service_added_count_);
+
+ BluetoothGattService* service =
+ device->GetGattService(observer.last_gatt_service_id_);
+
+ TestGattServiceObserver service_observer(adapter_, device, service);
+ EXPECT_EQ(0, service_observer.gatt_characteristic_value_changed_count_);
+
+ // Run the message loop so that the characteristics appear.
+ base::MessageLoop::current()->Run();
+
+ // We should get an initial value changed signal from the Heart Rate
+ // Measurement characteristic when it getsadded.
+ EXPECT_EQ(1, service_observer.gatt_characteristic_value_changed_count_);
+
+ // The Heart Rate Measurement characteristic should send regular
+ // notifications.
+ base::MessageLoop::current()->Run();
+ EXPECT_EQ(2, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_EQ(kHeartRateMeasurementUUID,
+ service_observer.last_gatt_characteristic_uuid_);
+ EXPECT_EQ(fake_bluetooth_gatt_characteristic_client_->
+ GetHeartRateMeasurementPath().value(),
+ service_observer.last_gatt_characteristic_id_);
+
+ // Receive another notification.
+ service_observer.last_gatt_characteristic_id_.clear();
+ service_observer.last_gatt_characteristic_uuid_ = BluetoothUUID();
+ base::MessageLoop::current()->Run();
+ EXPECT_EQ(3, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_EQ(kHeartRateMeasurementUUID,
+ service_observer.last_gatt_characteristic_uuid_);
+ EXPECT_EQ(fake_bluetooth_gatt_characteristic_client_->
+ GetHeartRateMeasurementPath().value(),
+ service_observer.last_gatt_characteristic_id_);
+
+ // Issue write request to non-writeable characteristics.
+ service_observer.last_gatt_characteristic_id_.clear();
+ service_observer.last_gatt_characteristic_uuid_ = BluetoothUUID();
+
+ std::vector<uint8> write_value;
+ write_value.push_back(0x01);
+ BluetoothGattCharacteristic* characteristic =
+ service->GetCharacteristic(fake_bluetooth_gatt_characteristic_client_->
+ GetHeartRateMeasurementPath().value());
+ ASSERT_TRUE(characteristic);
+ EXPECT_EQ(fake_bluetooth_gatt_characteristic_client_->
+ GetHeartRateMeasurementPath().value(),
+ characteristic->GetIdentifier());
+ EXPECT_EQ(kHeartRateMeasurementUUID, characteristic->GetUUID());
+ characteristic->WriteRemoteCharacteristic(
+ write_value,
+ base::Bind(&BluetoothGattChromeOSTest::SuccessCallback,
+ base::Unretained(this)),
+ base::Bind(&BluetoothGattChromeOSTest::ErrorCallback,
+ base::Unretained(this)));
+ EXPECT_TRUE(service_observer.last_gatt_characteristic_id_.empty());
+ EXPECT_FALSE(service_observer.last_gatt_characteristic_uuid_.IsValid());
+ EXPECT_EQ(0, success_callback_count_);
+ EXPECT_EQ(1, error_callback_count_);
+ EXPECT_EQ(3, service_observer.gatt_characteristic_value_changed_count_);
+
+ characteristic = service->GetCharacteristic(
+ fake_bluetooth_gatt_characteristic_client_->
+ GetBodySensorLocationPath().value());
+ ASSERT_TRUE(characteristic);
+ EXPECT_EQ(fake_bluetooth_gatt_characteristic_client_->
+ GetBodySensorLocationPath().value(),
+ characteristic->GetIdentifier());
+ EXPECT_EQ(kBodySensorLocationUUID, characteristic->GetUUID());
+ characteristic->WriteRemoteCharacteristic(
+ write_value,
+ base::Bind(&BluetoothGattChromeOSTest::SuccessCallback,
+ base::Unretained(this)),
+ base::Bind(&BluetoothGattChromeOSTest::ErrorCallback,
+ base::Unretained(this)));
+ EXPECT_TRUE(service_observer.last_gatt_characteristic_id_.empty());
+ EXPECT_FALSE(service_observer.last_gatt_characteristic_uuid_.IsValid());
+ EXPECT_EQ(0, success_callback_count_);
+ EXPECT_EQ(2, error_callback_count_);
+ EXPECT_EQ(3, service_observer.gatt_characteristic_value_changed_count_);
+
+ // Issue write request to writeable characteristic. Writing "1" to the control
+ // point characteristic will immediately change its value back to "0", hence
+ // sending "ValueChanged" events twice.
+ characteristic = service->GetCharacteristic(
+ fake_bluetooth_gatt_characteristic_client_->
+ GetHeartRateControlPointPath().value());
+ ASSERT_TRUE(characteristic);
+ EXPECT_EQ(fake_bluetooth_gatt_characteristic_client_->
+ GetHeartRateControlPointPath().value(),
+ characteristic->GetIdentifier());
+ EXPECT_EQ(kHeartRateControlPointUUID, characteristic->GetUUID());
+ characteristic->WriteRemoteCharacteristic(
+ write_value,
+ base::Bind(&BluetoothGattChromeOSTest::SuccessCallback,
+ base::Unretained(this)),
+ base::Bind(&BluetoothGattChromeOSTest::ErrorCallback,
+ base::Unretained(this)));
+ EXPECT_EQ(characteristic->GetIdentifier(),
+ service_observer.last_gatt_characteristic_id_);
+ EXPECT_EQ(characteristic->GetUUID(),
+ service_observer.last_gatt_characteristic_uuid_);
+ EXPECT_EQ(1, success_callback_count_);
+ EXPECT_EQ(2, error_callback_count_);
+ EXPECT_EQ(5, service_observer.gatt_characteristic_value_changed_count_);
+
+ // Issue a read request.
+ characteristic = service->GetCharacteristic(
+ fake_bluetooth_gatt_characteristic_client_->
+ GetBodySensorLocationPath().value());
+ ASSERT_TRUE(characteristic);
+ EXPECT_EQ(fake_bluetooth_gatt_characteristic_client_->
+ GetBodySensorLocationPath().value(),
+ characteristic->GetIdentifier());
+ EXPECT_EQ(kBodySensorLocationUUID, characteristic->GetUUID());
+ characteristic->ReadRemoteCharacteristic(
+ base::Bind(&BluetoothGattChromeOSTest::ValueCallback,
+ base::Unretained(this)),
+ base::Bind(&BluetoothGattChromeOSTest::ErrorCallback,
+ base::Unretained(this)));
+ EXPECT_EQ(2, success_callback_count_);
+ EXPECT_EQ(2, error_callback_count_);
+ EXPECT_EQ(5, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_TRUE(ValuesEqual(characteristic->GetValue(), last_read_value_));
+
+ // One last value changed notification.
+ base::MessageLoop::current()->Run();
+ EXPECT_EQ(6, service_observer.gatt_characteristic_value_changed_count_);
+ EXPECT_EQ(kHeartRateMeasurementUUID,
+ service_observer.last_gatt_characteristic_uuid_);
+ EXPECT_EQ(fake_bluetooth_gatt_characteristic_client_->
+ GetHeartRateMeasurementPath().value(),
+ service_observer.last_gatt_characteristic_id_);
+}
+
} // namespace chromeos
« no previous file with comments | « device/bluetooth/bluetooth_gatt_characteristic.h ('k') | device/bluetooth/bluetooth_gatt_descriptor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698