Home | History | Annotate | Download | only in test
      1 //
      2 //  Copyright (C) 2015 Google, Inc.
      3 //
      4 //  Licensed under the Apache License, Version 2.0 (the "License");
      5 //  you may not use this file except in compliance with the License.
      6 //  You may obtain a copy of the License at:
      7 //
      8 //  http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 //  Unless required by applicable law or agreed to in writing, software
     11 //  distributed under the License is distributed on an "AS IS" BASIS,
     12 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 //  See the License for the specific language governing permissions and
     14 //  limitations under the License.
     15 //
     16 
     17 #include <gmock/gmock.h>
     18 #include <gtest/gtest.h>
     19 
     20 #include "service/common/bluetooth/util/address_helper.h"
     21 #include "service/gatt_server.h"
     22 #include "service/hal/fake_bluetooth_gatt_interface.h"
     23 #include "service/hal/gatt_helpers.h"
     24 
     25 using ::testing::_;
     26 using ::testing::Return;
     27 
     28 namespace bluetooth {
     29 namespace {
     30 
     31 class MockGattHandler
     32     : public hal::FakeBluetoothGattInterface::TestServerHandler {
     33  public:
     34   MockGattHandler() = default;
     35   ~MockGattHandler() override = default;
     36 
     37   MOCK_METHOD1(RegisterServer, bt_status_t(bt_uuid_t*));
     38   MOCK_METHOD1(UnregisterServer, bt_status_t(int));
     39   MOCK_METHOD3(AddService, bt_status_t(int, btgatt_srvc_id_t*, int));
     40   MOCK_METHOD5(AddCharacteristic, bt_status_t(int, int, bt_uuid_t*, int, int));
     41   MOCK_METHOD4(AddDescriptor, bt_status_t(int, int, bt_uuid_t*, int));
     42   MOCK_METHOD3(StartService, bt_status_t(int, int, int));
     43   MOCK_METHOD2(DeleteService, bt_status_t(int, int));
     44   MOCK_METHOD6(SendIndication, bt_status_t(int, int, int, int, int, char*));
     45   MOCK_METHOD4(SendResponse, bt_status_t(int, int, int, btgatt_response_t*));
     46 
     47  private:
     48   DISALLOW_COPY_AND_ASSIGN(MockGattHandler);
     49 };
     50 
     51 class TestDelegate : public GattServer::Delegate {
     52  public:
     53   TestDelegate() = default;
     54   ~TestDelegate() override = default;
     55 
     56   struct RequestData {
     57     RequestData() : id(-1), offset(-1), is_long(false), is_prep(false),
     58                     need_rsp(false), is_exec(false), count(0) {}
     59     ~RequestData() = default;
     60 
     61     std::string device_address;
     62     int id;
     63     int offset;
     64     bool is_long;
     65     bool is_prep;
     66     bool need_rsp;
     67     bool is_exec;
     68     GattIdentifier gatt_id;
     69     int count;
     70     std::vector<uint8_t> write_value;
     71   };
     72 
     73   void OnCharacteristicReadRequest(
     74       GattServer* gatt_server,
     75       const std::string& device_address,
     76       int request_id, int offset, bool is_long,
     77       const bluetooth::GattIdentifier& characteristic_id) override {
     78     ASSERT_TRUE(gatt_server);
     79     char_read_req_.device_address = device_address;
     80     char_read_req_.id = request_id;
     81     char_read_req_.offset = offset;
     82     char_read_req_.is_long = is_long;
     83     char_read_req_.gatt_id = characteristic_id;
     84     char_read_req_.count++;
     85   }
     86 
     87   void OnDescriptorReadRequest(
     88       GattServer* gatt_server,
     89       const std::string& device_address,
     90       int request_id, int offset, bool is_long,
     91       const bluetooth::GattIdentifier& descriptor_id) override {
     92     ASSERT_TRUE(gatt_server);
     93     desc_read_req_.device_address = device_address;
     94     desc_read_req_.id = request_id;
     95     desc_read_req_.offset = offset;
     96     desc_read_req_.is_long = is_long;
     97     desc_read_req_.gatt_id = descriptor_id;
     98     desc_read_req_.count++;
     99   }
    100 
    101   void OnCharacteristicWriteRequest(
    102       GattServer* gatt_server,
    103       const std::string& device_address,
    104       int request_id, int offset, bool is_prepare_write, bool need_response,
    105       const std::vector<uint8_t>& value,
    106       const bluetooth::GattIdentifier& characteristic_id) override {
    107     ASSERT_TRUE(gatt_server);
    108     char_write_req_.device_address = device_address;
    109     char_write_req_.id = request_id;
    110     char_write_req_.offset = offset;
    111     char_write_req_.is_prep = is_prepare_write;
    112     char_write_req_.need_rsp = need_response;
    113     char_write_req_.gatt_id = characteristic_id;
    114     char_write_req_.count++;
    115     char_write_req_.write_value = value;
    116   }
    117 
    118   void OnDescriptorWriteRequest(
    119       GattServer* gatt_server,
    120       const std::string& device_address,
    121       int request_id, int offset, bool is_prepare_write, bool need_response,
    122       const std::vector<uint8_t>& value,
    123       const bluetooth::GattIdentifier& descriptor_id) override {
    124     ASSERT_TRUE(gatt_server);
    125     desc_write_req_.device_address = device_address;
    126     desc_write_req_.id = request_id;
    127     desc_write_req_.offset = offset;
    128     desc_write_req_.is_prep = is_prepare_write;
    129     desc_write_req_.need_rsp = need_response;
    130     desc_write_req_.gatt_id = descriptor_id;
    131     desc_write_req_.count++;
    132     desc_write_req_.write_value = value;
    133   }
    134 
    135   void OnExecuteWriteRequest(
    136       GattServer* gatt_server,
    137       const std::string& device_address,
    138       int request_id, bool is_execute) override {
    139     ASSERT_TRUE(gatt_server);
    140     exec_req_.device_address = device_address;
    141     exec_req_.id = request_id;
    142     exec_req_.is_exec = is_execute;
    143     exec_req_.count++;
    144   }
    145 
    146   const RequestData& char_read_req() const { return char_read_req_; }
    147   const RequestData& desc_read_req() const { return desc_read_req_; }
    148   const RequestData& char_write_req() const { return char_write_req_; }
    149   const RequestData& desc_write_req() const { return desc_write_req_; }
    150 
    151  private:
    152   RequestData char_read_req_;
    153   RequestData desc_read_req_;
    154   RequestData char_write_req_;
    155   RequestData desc_write_req_;
    156   RequestData exec_req_;
    157 };
    158 
    159 class GattServerTest : public ::testing::Test {
    160  public:
    161   GattServerTest() = default;
    162   ~GattServerTest() override = default;
    163 
    164   void SetUp() override {
    165     mock_handler_.reset(new MockGattHandler());
    166     fake_hal_gatt_iface_ = new hal::FakeBluetoothGattInterface(
    167         nullptr,
    168         std::static_pointer_cast<
    169             hal::FakeBluetoothGattInterface::TestServerHandler>(mock_handler_));
    170 
    171     hal::BluetoothGattInterface::InitializeForTesting(fake_hal_gatt_iface_);
    172     factory_.reset(new GattServerFactory());
    173   }
    174 
    175   void TearDown() override {
    176     factory_.reset();
    177     hal::BluetoothGattInterface::CleanUp();
    178   }
    179 
    180  protected:
    181   hal::FakeBluetoothGattInterface* fake_hal_gatt_iface_;
    182   std::shared_ptr<MockGattHandler> mock_handler_;
    183   std::unique_ptr<GattServerFactory> factory_;
    184 
    185  private:
    186   DISALLOW_COPY_AND_ASSIGN(GattServerTest);
    187 };
    188 
    189 const int kDefaultServerId = 4;
    190 
    191 class GattServerPostRegisterTest : public GattServerTest {
    192  public:
    193   GattServerPostRegisterTest() = default;
    194   ~GattServerPostRegisterTest() override = default;
    195 
    196   void SetUp() override {
    197     GattServerTest::SetUp();
    198     UUID uuid = UUID::GetRandom();
    199     auto callback = [&](BLEStatus status, const UUID& in_uuid,
    200                         std::unique_ptr<BluetoothInstance> in_client) {
    201       CHECK(in_uuid == uuid);
    202       CHECK(in_client.get());
    203       CHECK(status == BLE_STATUS_SUCCESS);
    204 
    205       gatt_server_ = std::unique_ptr<GattServer>(
    206           static_cast<GattServer*>(in_client.release()));
    207     };
    208 
    209     EXPECT_CALL(*mock_handler_, RegisterServer(_))
    210         .Times(1)
    211         .WillOnce(Return(BT_STATUS_SUCCESS));
    212 
    213     factory_->RegisterInstance(uuid, callback);
    214 
    215     bt_uuid_t hal_uuid = uuid.GetBlueDroid();
    216     fake_hal_gatt_iface_->NotifyRegisterServerCallback(
    217         BT_STATUS_SUCCESS,
    218         kDefaultServerId,
    219         hal_uuid);
    220   }
    221 
    222   void TearDown() override {
    223     EXPECT_CALL(*mock_handler_, UnregisterServer(_))
    224         .Times(1)
    225         .WillOnce(Return(BT_STATUS_SUCCESS));
    226     gatt_server_ = nullptr;
    227     GattServerTest::TearDown();
    228   }
    229 
    230   void SetUpTestService() {
    231     EXPECT_CALL(*mock_handler_, AddService(_, _, _))
    232         .Times(1)
    233         .WillOnce(Return(BT_STATUS_SUCCESS));
    234     EXPECT_CALL(*mock_handler_, AddCharacteristic(_, _, _, _, _))
    235         .Times(1)
    236         .WillOnce(Return(BT_STATUS_SUCCESS));
    237     EXPECT_CALL(*mock_handler_, AddDescriptor(_, _, _, _))
    238         .Times(1)
    239         .WillOnce(Return(BT_STATUS_SUCCESS));
    240     EXPECT_CALL(*mock_handler_, StartService(_, _, _))
    241         .Times(1)
    242         .WillOnce(Return(BT_STATUS_SUCCESS));
    243 
    244     UUID uuid0 = UUID::GetRandom();
    245     UUID uuid1 = UUID::GetRandom();
    246     UUID uuid2 = UUID::GetRandom();
    247 
    248     bool register_success = false;
    249 
    250     // Doesn't matter what the permissions/properties are since this is all
    251     // fake.
    252     test_service_id_ = *gatt_server_->BeginServiceDeclaration(uuid0, true);
    253     test_char_id_ = *gatt_server_->AddCharacteristic(uuid1, 0, 0);
    254     test_desc_id_ = *gatt_server_->AddDescriptor(uuid2, 0);
    255     ASSERT_TRUE(gatt_server_->EndServiceDeclaration([&](
    256         BLEStatus status, const GattIdentifier& gatt_id) {
    257       ASSERT_EQ(BLE_STATUS_SUCCESS, status);
    258       ASSERT_TRUE(gatt_id == test_service_id_);
    259       register_success = true;
    260     }));
    261 
    262     btgatt_srvc_id_t hal_srvc_id;
    263     hal::GetHALServiceId(test_service_id_, &hal_srvc_id);
    264     bt_uuid_t hal_uuid1 = uuid1.GetBlueDroid();
    265     bt_uuid_t hal_uuid2 = uuid2.GetBlueDroid();
    266 
    267     srvc_handle_ = 0x0001;
    268     char_handle_ = 0x0003;
    269     desc_handle_ = 0x0004;
    270 
    271     fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    272         BT_STATUS_SUCCESS, kDefaultServerId, hal_srvc_id, srvc_handle_);
    273     fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    274         BT_STATUS_SUCCESS, kDefaultServerId, hal_uuid1,
    275         srvc_handle_, char_handle_);
    276     fake_hal_gatt_iface_->NotifyDescriptorAddedCallback(
    277         BT_STATUS_SUCCESS, kDefaultServerId, hal_uuid2,
    278         srvc_handle_, desc_handle_);
    279     fake_hal_gatt_iface_->NotifyServiceStartedCallback(
    280         BT_STATUS_SUCCESS, kDefaultServerId, srvc_handle_);
    281 
    282     testing::Mock::VerifyAndClearExpectations(mock_handler_.get());
    283 
    284     ASSERT_TRUE(register_success);
    285   }
    286 
    287  protected:
    288   std::unique_ptr<GattServer> gatt_server_;
    289 
    290   GattIdentifier test_service_id_;
    291   GattIdentifier test_char_id_;
    292   GattIdentifier test_desc_id_;
    293   int srvc_handle_;
    294   int char_handle_;
    295   int desc_handle_;
    296 
    297  private:
    298   DISALLOW_COPY_AND_ASSIGN(GattServerPostRegisterTest);
    299 };
    300 
    301 TEST_F(GattServerTest, RegisterServer) {
    302   EXPECT_CALL(*mock_handler_, RegisterServer(_))
    303       .Times(2)
    304       .WillOnce(Return(BT_STATUS_FAIL))
    305       .WillOnce(Return(BT_STATUS_SUCCESS));
    306 
    307   // These will be asynchronously populate with a result when the callback
    308   // executes.
    309   BLEStatus status = BLE_STATUS_SUCCESS;
    310   UUID cb_uuid;
    311   std::unique_ptr<GattServer> server;
    312   int callback_count = 0;
    313 
    314   auto callback = [&](BLEStatus in_status, const UUID& uuid,
    315                       std::unique_ptr<BluetoothInstance> in_server) {
    316     status = in_status;
    317     cb_uuid = uuid;
    318     server = std::unique_ptr<GattServer>(
    319         static_cast<GattServer*>(in_server.release()));
    320     callback_count++;
    321   };
    322 
    323   UUID uuid0 = UUID::GetRandom();
    324 
    325   // HAL returns failure.
    326   EXPECT_FALSE(factory_->RegisterInstance(uuid0, callback));
    327   EXPECT_EQ(0, callback_count);
    328 
    329   // HAL returns success.
    330   EXPECT_TRUE(factory_->RegisterInstance(uuid0, callback));
    331   EXPECT_EQ(0, callback_count);
    332 
    333   // Calling twice with the same UUID should fail with no additional calls into
    334   // the stack.
    335   EXPECT_FALSE(factory_->RegisterInstance(uuid0, callback));
    336 
    337   testing::Mock::VerifyAndClearExpectations(mock_handler_.get());
    338 
    339   // Call with a different UUID while one is pending.
    340   UUID uuid1 = UUID::GetRandom();
    341   EXPECT_CALL(*mock_handler_, RegisterServer(_))
    342       .Times(1)
    343       .WillOnce(Return(BT_STATUS_SUCCESS));
    344   EXPECT_TRUE(factory_->RegisterInstance(uuid1, callback));
    345 
    346   // Trigger callback with an unknown UUID. This should get ignored.
    347   UUID uuid2 = UUID::GetRandom();
    348   bt_uuid_t hal_uuid = uuid2.GetBlueDroid();
    349   fake_hal_gatt_iface_->NotifyRegisterServerCallback(0, 0, hal_uuid);
    350   EXPECT_EQ(0, callback_count);
    351 
    352   // |uuid0| succeeds.
    353   int server_if0 = 2;  // Pick something that's not 0.
    354   hal_uuid = uuid0.GetBlueDroid();
    355   fake_hal_gatt_iface_->NotifyRegisterServerCallback(
    356       BT_STATUS_SUCCESS, server_if0, hal_uuid);
    357 
    358   EXPECT_EQ(1, callback_count);
    359   ASSERT_TRUE(server.get() != nullptr);  // Assert to terminate in case of error
    360   EXPECT_EQ(BLE_STATUS_SUCCESS, status);
    361   EXPECT_EQ(server_if0, server->GetInstanceId());
    362   EXPECT_EQ(uuid0, server->GetAppIdentifier());
    363   EXPECT_EQ(uuid0, cb_uuid);
    364 
    365   // The server should unregister itself when deleted.
    366   EXPECT_CALL(*mock_handler_, UnregisterServer(server_if0))
    367       .Times(1)
    368       .WillOnce(Return(BT_STATUS_SUCCESS));
    369   server.reset();
    370 
    371   testing::Mock::VerifyAndClearExpectations(mock_handler_.get());
    372 
    373   // |uuid1| fails.
    374   int server_if1 = 3;
    375   hal_uuid = uuid1.GetBlueDroid();
    376   fake_hal_gatt_iface_->NotifyRegisterServerCallback(
    377       BT_STATUS_FAIL, server_if1, hal_uuid);
    378 
    379   EXPECT_EQ(2, callback_count);
    380   ASSERT_TRUE(server.get() == nullptr);  // Assert to terminate in case of error
    381   EXPECT_EQ(BLE_STATUS_FAILURE, status);
    382   EXPECT_EQ(uuid1, cb_uuid);
    383 }
    384 
    385 TEST_F(GattServerPostRegisterTest, SimpleServiceTest) {
    386   // Setup a service callback.
    387   GattIdentifier cb_id;
    388   BLEStatus cb_status = BLE_STATUS_SUCCESS;
    389   int cb_count = 0;
    390   auto callback = [&](BLEStatus in_status, const GattIdentifier& in_id) {
    391     cb_id = in_id;
    392     cb_status = in_status;
    393     cb_count++;
    394   };
    395 
    396   // Service declaration not started.
    397   EXPECT_FALSE(gatt_server_->EndServiceDeclaration(callback));
    398 
    399   const UUID uuid = UUID::GetRandom();
    400   auto service_id = gatt_server_->BeginServiceDeclaration(uuid, true);
    401   EXPECT_TRUE(service_id != nullptr);
    402   EXPECT_TRUE(service_id->IsService());
    403 
    404   // Already started.
    405   EXPECT_FALSE(gatt_server_->BeginServiceDeclaration(uuid, false));
    406 
    407   // Callback is NULL.
    408   EXPECT_FALSE(
    409       gatt_server_->EndServiceDeclaration(GattServer::ResultCallback()));
    410 
    411   // We should get a call for a service with one handle.
    412   EXPECT_CALL(*mock_handler_, AddService(gatt_server_->GetInstanceId(), _, 1))
    413       .Times(2)
    414       .WillOnce(Return(BT_STATUS_FAIL))
    415       .WillOnce(Return(BT_STATUS_SUCCESS));
    416 
    417   // Stack returns failure. This will cause the entire service declaration to
    418   // end and needs to be restarted.
    419   EXPECT_FALSE(gatt_server_->EndServiceDeclaration(callback));
    420 
    421   service_id = gatt_server_->BeginServiceDeclaration(uuid, true);
    422   EXPECT_TRUE(service_id != nullptr);
    423   EXPECT_TRUE(service_id->IsService());
    424 
    425   // Stack returns success.
    426   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    427 
    428   // EndServiceDeclaration already in progress.
    429   EXPECT_FALSE(gatt_server_->EndServiceDeclaration(callback));
    430 
    431   EXPECT_EQ(0, cb_count);
    432 
    433   btgatt_srvc_id_t hal_id;
    434   hal::GetHALServiceId(*service_id, &hal_id);
    435   int srvc_handle = 0x0001;
    436 
    437   // Report success for AddService but for wrong server. Should be ignored.
    438   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    439       BT_STATUS_SUCCESS, kDefaultServerId + 1, hal_id, srvc_handle);
    440   EXPECT_EQ(0, cb_count);
    441 
    442   // Report success for AddService.
    443   EXPECT_CALL(*mock_handler_, StartService(kDefaultServerId, srvc_handle, _))
    444       .Times(1)
    445       .WillOnce(Return(BT_STATUS_SUCCESS));
    446 
    447   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    448       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    449   EXPECT_EQ(0, cb_count);
    450 
    451   // Report success for StartService but for wrong server. Should be ignored.
    452   fake_hal_gatt_iface_->NotifyServiceStartedCallback(
    453       BT_STATUS_SUCCESS, kDefaultServerId + 1, srvc_handle);
    454   EXPECT_EQ(0, cb_count);
    455 
    456   // Report success for StartService.
    457   fake_hal_gatt_iface_->NotifyServiceStartedCallback(
    458       BT_STATUS_SUCCESS, kDefaultServerId, srvc_handle);
    459   EXPECT_EQ(1, cb_count);
    460   EXPECT_EQ(BLE_STATUS_SUCCESS, cb_status);
    461   EXPECT_TRUE(cb_id == *service_id);
    462 
    463   // Start new service declaration with same UUID. We should get a different ID.
    464   auto service_id1 = gatt_server_->BeginServiceDeclaration(uuid, true);
    465   EXPECT_TRUE(service_id1 != nullptr);
    466   EXPECT_TRUE(service_id1->IsService());
    467   EXPECT_TRUE(*service_id != *service_id1);
    468 }
    469 
    470 TEST_F(GattServerPostRegisterTest, AddServiceFailures) {
    471   // Setup a service callback.
    472   GattIdentifier cb_id;
    473   BLEStatus cb_status = BLE_STATUS_SUCCESS;
    474   int cb_count = 0;
    475   auto callback = [&](BLEStatus in_status, const GattIdentifier& in_id) {
    476     cb_id = in_id;
    477     cb_status = in_status;
    478     cb_count++;
    479   };
    480 
    481   const UUID uuid = UUID::GetRandom();
    482   auto service_id = gatt_server_->BeginServiceDeclaration(uuid, true);
    483   btgatt_srvc_id_t hal_id;
    484   hal::GetHALServiceId(*service_id, &hal_id);
    485   int srvc_handle = 0x0001;
    486 
    487   EXPECT_CALL(*mock_handler_, AddService(gatt_server_->GetInstanceId(), _, 1))
    488       .Times(3)
    489       .WillRepeatedly(Return(BT_STATUS_SUCCESS));
    490   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    491 
    492   // Report failure for AddService.
    493   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    494       BT_STATUS_FAIL, kDefaultServerId, hal_id, srvc_handle);
    495   EXPECT_EQ(1, cb_count);
    496   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    497   EXPECT_TRUE(cb_id == *service_id);
    498 
    499   // Restart. We should get the same ID back.
    500   auto service_id1 = gatt_server_->BeginServiceDeclaration(uuid, true);
    501   EXPECT_TRUE(*service_id1 == *service_id);
    502   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    503 
    504   // Report success for AddService but return failure from StartService.
    505   EXPECT_CALL(*mock_handler_, StartService(gatt_server_->GetInstanceId(), 1, _))
    506       .Times(2)
    507       .WillOnce(Return(BT_STATUS_FAIL))
    508       .WillOnce(Return(BT_STATUS_SUCCESS));
    509 
    510   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    511       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    512   EXPECT_EQ(2, cb_count);
    513   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    514   EXPECT_TRUE(cb_id == *service_id);
    515 
    516   // Restart.
    517   service_id = gatt_server_->BeginServiceDeclaration(uuid, true);
    518   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    519 
    520   // Report success for AddService, return success from StartService.
    521   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    522       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    523   EXPECT_EQ(2, cb_count);
    524 
    525   // Report failure for StartService. Added service data should get deleted.
    526   EXPECT_CALL(*mock_handler_,
    527               DeleteService(gatt_server_->GetInstanceId(), srvc_handle))
    528       .Times(1)
    529       .WillOnce(Return(BT_STATUS_SUCCESS));
    530   fake_hal_gatt_iface_->NotifyServiceStartedCallback(
    531       BT_STATUS_FAIL, kDefaultServerId, srvc_handle);
    532   EXPECT_EQ(3, cb_count);
    533   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    534   EXPECT_TRUE(cb_id == *service_id);
    535 }
    536 
    537 TEST_F(GattServerPostRegisterTest, AddCharacteristic) {
    538   // Just pick some values.
    539   const int props = bluetooth::kCharacteristicPropertyRead |
    540       bluetooth::kCharacteristicPropertyNotify;
    541   const int perms = kAttributePermissionReadEncrypted;
    542   const UUID char_uuid = UUID::GetRandom();
    543   bt_uuid_t hal_char_uuid = char_uuid.GetBlueDroid();
    544 
    545   // Declaration not started.
    546   EXPECT_EQ(nullptr, gatt_server_->AddCharacteristic(char_uuid, props, perms));
    547 
    548   // Start a service declaration.
    549   const UUID service_uuid = UUID::GetRandom();
    550   auto service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    551   EXPECT_TRUE(service_id != nullptr);
    552   btgatt_srvc_id_t hal_id;
    553   hal::GetHALServiceId(*service_id, &hal_id);
    554 
    555   // Add two characteristics with the same UUID.
    556   auto char_id0 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    557   auto char_id1 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    558 
    559   EXPECT_TRUE(char_id0 != nullptr);
    560   EXPECT_TRUE(char_id1 != nullptr);
    561   EXPECT_TRUE(char_id0 != char_id1);
    562   EXPECT_TRUE(char_id0->IsCharacteristic());
    563   EXPECT_TRUE(char_id1->IsCharacteristic());
    564   EXPECT_TRUE(*char_id0->GetOwningServiceId() == *service_id);
    565   EXPECT_TRUE(*char_id1->GetOwningServiceId() == *service_id);
    566 
    567   // Expect calls for 5 handles in total as we have 2 characteristics.
    568   EXPECT_CALL(*mock_handler_, AddService(kDefaultServerId, _, 5))
    569       .WillRepeatedly(Return(BT_STATUS_SUCCESS));
    570 
    571   GattIdentifier cb_id;
    572   BLEStatus cb_status;
    573   int cb_count = 0;
    574   auto callback = [&](BLEStatus in_status, const GattIdentifier& in_id) {
    575     cb_id = in_id;
    576     cb_status = in_status;
    577     cb_count++;
    578   };
    579 
    580   int srvc_handle = 0x0001;
    581   int char_handle0 = 0x0002;
    582   int char_handle1 = 0x0004;
    583   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    584 
    585   // Cannot add any more characteristics while EndServiceDeclaration is in
    586   // progress.
    587   EXPECT_EQ(nullptr, gatt_server_->AddCharacteristic(char_uuid, props, perms));
    588 
    589   EXPECT_CALL(*mock_handler_, AddCharacteristic(_, _, _, _, _))
    590       .Times(8)
    591       .WillOnce(Return(BT_STATUS_FAIL))      // char_id0 - try 1
    592       .WillOnce(Return(BT_STATUS_SUCCESS))   // char_id0 - try 2
    593       .WillOnce(Return(BT_STATUS_SUCCESS))   // char_id0 - try 3
    594       .WillOnce(Return(BT_STATUS_FAIL))      // char_id1 - try 3
    595       .WillOnce(Return(BT_STATUS_SUCCESS))   // char_id0 - try 4
    596       .WillOnce(Return(BT_STATUS_SUCCESS))   // char_id1 - try 4
    597       .WillOnce(Return(BT_STATUS_SUCCESS))   // char_id0 - try 5
    598       .WillOnce(Return(BT_STATUS_SUCCESS));  // char_id1 - try 5
    599 
    600   // First AddCharacteristic call will fail.
    601   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    602       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    603   EXPECT_EQ(1, cb_count);
    604   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    605   EXPECT_TRUE(cb_id == *service_id);
    606 
    607   // Restart. (try 2)
    608   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    609   char_id0 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    610   char_id1 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    611   hal::GetHALServiceId(*service_id, &hal_id);
    612   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    613 
    614   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    615       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    616   EXPECT_EQ(1, cb_count);
    617 
    618   // Report failure for pending AddCharacteristic.
    619   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    620       BT_STATUS_FAIL, kDefaultServerId, hal_char_uuid,
    621       srvc_handle, char_handle0);
    622   EXPECT_EQ(2, cb_count);
    623   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    624   EXPECT_TRUE(cb_id == *service_id);
    625 
    626   // Restart. (try 3)
    627   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    628   char_id0 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    629   char_id1 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    630   hal::GetHALServiceId(*service_id, &hal_id);
    631   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    632 
    633   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    634       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    635   EXPECT_EQ(2, cb_count);
    636 
    637   // Report success for pending AddCharacteristic we should receive a call for
    638   // the second characteristic which will fail.
    639   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    640       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid,
    641       srvc_handle, char_handle0);
    642   EXPECT_EQ(3, cb_count);
    643   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    644   EXPECT_TRUE(cb_id == *service_id);
    645 
    646   // Restart. (try 4)
    647   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    648   char_id0 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    649   char_id1 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    650   hal::GetHALServiceId(*service_id, &hal_id);
    651   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    652 
    653   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    654       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    655   EXPECT_EQ(3, cb_count);
    656 
    657   // Report success for pending AddCharacteristic. Second characteristic call
    658   // will start normally. We shouldn't receive any new callback.
    659   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    660       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid,
    661       srvc_handle, char_handle0);
    662   EXPECT_EQ(3, cb_count);
    663 
    664   // Report failure for pending AddCharacteristic call for second
    665   // characteristic.
    666   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    667       BT_STATUS_FAIL, kDefaultServerId, hal_char_uuid,
    668       srvc_handle, char_handle1);
    669   EXPECT_EQ(4, cb_count);
    670   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    671   EXPECT_TRUE(cb_id == *service_id);
    672 
    673   // Restart. (try 5)
    674   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    675   char_id0 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    676   char_id1 = gatt_server_->AddCharacteristic(char_uuid, props, perms);
    677   hal::GetHALServiceId(*service_id, &hal_id);
    678   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    679 
    680   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    681       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    682   EXPECT_EQ(4, cb_count);
    683 
    684   // Report success for pending AddCharacteristic. Second characteristic call
    685   // will start normally. We shouldn't receive any new callback.
    686   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    687       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid,
    688       srvc_handle, char_handle0);
    689   EXPECT_EQ(4, cb_count);
    690 
    691   // Report success for pending AddCharacteristic call for second
    692   // characteristic. We shouldn't receive any new callback but we'll get a call
    693   // to StartService.
    694   EXPECT_CALL(*mock_handler_, StartService(kDefaultServerId, srvc_handle, _))
    695       .Times(1)
    696       .WillOnce(Return(BT_STATUS_SUCCESS));
    697   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    698       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid,
    699       srvc_handle, char_handle1);
    700   EXPECT_EQ(4, cb_count);
    701 }
    702 
    703 TEST_F(GattServerPostRegisterTest, AddDescriptor) {
    704   // Set up some values for UUIDs, permissions, and properties.
    705   const UUID service_uuid = UUID::GetRandom();
    706   const UUID char_uuid0 = UUID::GetRandom();
    707   const UUID char_uuid1 = UUID::GetRandom();
    708   const UUID desc_uuid = UUID::GetRandom();
    709   bt_uuid_t hal_char_uuid0 = char_uuid0.GetBlueDroid();
    710   bt_uuid_t hal_char_uuid1 = char_uuid1.GetBlueDroid();
    711   bt_uuid_t hal_desc_uuid = desc_uuid.GetBlueDroid();
    712   const int props = bluetooth::kCharacteristicPropertyRead |
    713       bluetooth::kCharacteristicPropertyNotify;
    714   const int perms = kAttributePermissionReadEncrypted;
    715 
    716   // Service declaration not started.
    717   EXPECT_EQ(nullptr, gatt_server_->AddDescriptor(desc_uuid, perms));
    718 
    719   // Start a service declaration.
    720   auto service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    721   btgatt_srvc_id_t hal_id;
    722   hal::GetHALServiceId(*service_id, &hal_id);
    723 
    724   // No characteristic was inserted.
    725   EXPECT_EQ(nullptr, gatt_server_->AddDescriptor(desc_uuid, perms));
    726 
    727   // Add two characeristics.
    728   auto char_id0 = gatt_server_->AddCharacteristic(char_uuid0, props, perms);
    729   auto char_id1 = gatt_server_->AddCharacteristic(char_uuid1, props, perms);
    730 
    731   // Add a descriptor.
    732   auto desc_id = gatt_server_->AddDescriptor(desc_uuid, perms);
    733   EXPECT_NE(nullptr, desc_id);
    734   EXPECT_TRUE(desc_id->IsDescriptor());
    735   EXPECT_TRUE(*desc_id->GetOwningCharacteristicId() == *char_id1);
    736   EXPECT_TRUE(*desc_id->GetOwningServiceId() == *service_id);
    737 
    738   // Add a second descriptor with the same UUID.
    739   auto desc_id1 = gatt_server_->AddDescriptor(desc_uuid, perms);
    740   EXPECT_NE(nullptr, desc_id1);
    741   EXPECT_TRUE(*desc_id1 != *desc_id);
    742   EXPECT_TRUE(desc_id1->IsDescriptor());
    743   EXPECT_TRUE(*desc_id1->GetOwningCharacteristicId() == *char_id1);
    744   EXPECT_TRUE(*desc_id1->GetOwningServiceId() == *service_id);
    745 
    746   // Expect calls for 7 handles.
    747   EXPECT_CALL(*mock_handler_, AddService(kDefaultServerId, _, 7))
    748       .WillRepeatedly(Return(BT_STATUS_SUCCESS));
    749   EXPECT_CALL(*mock_handler_, AddCharacteristic(_, _, _, _, _))
    750       .WillRepeatedly(Return(BT_STATUS_SUCCESS));
    751 
    752   GattIdentifier cb_id;
    753   BLEStatus cb_status;
    754   int cb_count = 0;
    755   auto callback = [&](BLEStatus in_status, const GattIdentifier& in_id) {
    756     cb_id = in_id;
    757     cb_status = in_status;
    758     cb_count++;
    759   };
    760 
    761   int srvc_handle = 0x0001;
    762   int char_handle0 = 0x0002;
    763   int char_handle1 = 0x0004;
    764   int desc_handle0 = 0x0005;
    765   int desc_handle1 = 0x0006;
    766 
    767   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    768 
    769   // Cannot add any more descriptors while EndServiceDeclaration is in progress.
    770   EXPECT_EQ(nullptr, gatt_server_->AddDescriptor(desc_uuid, perms));
    771 
    772   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    773       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    774   EXPECT_EQ(0, cb_count);
    775 
    776   EXPECT_CALL(*mock_handler_, AddDescriptor(_, _, _, _))
    777       .Times(8)
    778       .WillOnce(Return(BT_STATUS_FAIL))      // desc_id0 - try 1
    779       .WillOnce(Return(BT_STATUS_SUCCESS))   // desc_id0 - try 2
    780       .WillOnce(Return(BT_STATUS_SUCCESS))   // desc_id0 - try 3
    781       .WillOnce(Return(BT_STATUS_FAIL))      // desc_id1 - try 3
    782       .WillOnce(Return(BT_STATUS_SUCCESS))   // desc_id0 - try 4
    783       .WillOnce(Return(BT_STATUS_SUCCESS))   // desc_id1 - try 4
    784       .WillOnce(Return(BT_STATUS_SUCCESS))   // desc_id0 - try 5
    785       .WillOnce(Return(BT_STATUS_SUCCESS));  // desc_id1 - try 5
    786 
    787   // Notify success for both characteristics. First descriptor call will fail.
    788   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    789       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid0,
    790       srvc_handle, char_handle0);
    791   EXPECT_EQ(0, cb_count);
    792   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    793       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid1,
    794       srvc_handle, char_handle1);
    795   EXPECT_EQ(1, cb_count);
    796   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    797   EXPECT_TRUE(cb_id == *service_id);
    798 
    799   // Restart (try 2)
    800   cb_count = 0;
    801   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    802   hal::GetHALServiceId(*service_id, &hal_id);
    803   char_id0 = gatt_server_->AddCharacteristic(char_uuid0, props, perms);
    804   char_id1 = gatt_server_->AddCharacteristic(char_uuid1, props, perms);
    805   desc_id = gatt_server_->AddDescriptor(desc_uuid, perms);
    806   ASSERT_NE(nullptr, desc_id);
    807   desc_id1 = gatt_server_->AddDescriptor(desc_uuid, perms);
    808   ASSERT_NE(nullptr, desc_id1);
    809   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    810 
    811   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    812       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    813   EXPECT_EQ(0, cb_count);
    814   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    815       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid0,
    816       srvc_handle, char_handle0);
    817   EXPECT_EQ(0, cb_count);
    818   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    819       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid1,
    820       srvc_handle, char_handle1);
    821   EXPECT_EQ(0, cb_count);
    822 
    823   // Notify failure for first descriptor.
    824   fake_hal_gatt_iface_->NotifyDescriptorAddedCallback(
    825       BT_STATUS_FAIL, kDefaultServerId, hal_desc_uuid,
    826       srvc_handle, desc_handle0);
    827   EXPECT_EQ(1, cb_count);
    828   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    829   EXPECT_TRUE(cb_id == *service_id);
    830 
    831   // Restart (try 3)
    832   cb_count = 0;
    833   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    834   hal::GetHALServiceId(*service_id, &hal_id);
    835   char_id0 = gatt_server_->AddCharacteristic(char_uuid0, props, perms);
    836   char_id1 = gatt_server_->AddCharacteristic(char_uuid1, props, perms);
    837   desc_id = gatt_server_->AddDescriptor(desc_uuid, perms);
    838   ASSERT_NE(nullptr, desc_id);
    839   desc_id1 = gatt_server_->AddDescriptor(desc_uuid, perms);
    840   ASSERT_NE(nullptr, desc_id1);
    841   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    842 
    843   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    844       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    845   EXPECT_EQ(0, cb_count);
    846   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    847       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid0,
    848       srvc_handle, char_handle0);
    849   EXPECT_EQ(0, cb_count);
    850   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    851       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid1,
    852       srvc_handle, char_handle1);
    853   EXPECT_EQ(0, cb_count);
    854 
    855   // Notify success for first descriptor; the second descriptor will fail
    856   // immediately.
    857   fake_hal_gatt_iface_->NotifyDescriptorAddedCallback(
    858       BT_STATUS_SUCCESS, kDefaultServerId, hal_desc_uuid,
    859       srvc_handle, desc_handle0);
    860   EXPECT_EQ(1, cb_count);
    861   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    862   EXPECT_TRUE(cb_id == *service_id);
    863 
    864   // Restart (try 4)
    865   cb_count = 0;
    866   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    867   hal::GetHALServiceId(*service_id, &hal_id);
    868   char_id0 = gatt_server_->AddCharacteristic(char_uuid0, props, perms);
    869   char_id1 = gatt_server_->AddCharacteristic(char_uuid1, props, perms);
    870   desc_id = gatt_server_->AddDescriptor(desc_uuid, perms);
    871   ASSERT_NE(nullptr, desc_id);
    872   desc_id1 = gatt_server_->AddDescriptor(desc_uuid, perms);
    873   ASSERT_NE(nullptr, desc_id1);
    874   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    875 
    876   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    877       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    878   EXPECT_EQ(0, cb_count);
    879   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    880       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid0,
    881       srvc_handle, char_handle0);
    882   EXPECT_EQ(0, cb_count);
    883   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    884       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid1,
    885       srvc_handle, char_handle1);
    886   EXPECT_EQ(0, cb_count);
    887 
    888   // Notify success for first first descriptor and failure for second
    889   // descriptor.
    890   fake_hal_gatt_iface_->NotifyDescriptorAddedCallback(
    891       BT_STATUS_SUCCESS, kDefaultServerId, hal_desc_uuid,
    892       srvc_handle, desc_handle0);
    893   EXPECT_EQ(0, cb_count);
    894 
    895   fake_hal_gatt_iface_->NotifyDescriptorAddedCallback(
    896       BT_STATUS_FAIL, kDefaultServerId, hal_desc_uuid,
    897       srvc_handle, desc_handle1);
    898   EXPECT_EQ(1, cb_count);
    899   EXPECT_NE(BLE_STATUS_SUCCESS, cb_status);
    900   EXPECT_TRUE(cb_id == *service_id);
    901 
    902   // Restart (try 5)
    903   cb_count = 0;
    904   service_id = gatt_server_->BeginServiceDeclaration(service_uuid, true);
    905   hal::GetHALServiceId(*service_id, &hal_id);
    906   char_id0 = gatt_server_->AddCharacteristic(char_uuid0, props, perms);
    907   char_id1 = gatt_server_->AddCharacteristic(char_uuid1, props, perms);
    908   desc_id = gatt_server_->AddDescriptor(desc_uuid, perms);
    909   ASSERT_NE(nullptr, desc_id);
    910   desc_id1 = gatt_server_->AddDescriptor(desc_uuid, perms);
    911   ASSERT_NE(nullptr, desc_id1);
    912   EXPECT_TRUE(gatt_server_->EndServiceDeclaration(callback));
    913 
    914   fake_hal_gatt_iface_->NotifyServiceAddedCallback(
    915       BT_STATUS_SUCCESS, kDefaultServerId, hal_id, srvc_handle);
    916   EXPECT_EQ(0, cb_count);
    917   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    918       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid0,
    919       srvc_handle, char_handle0);
    920   EXPECT_EQ(0, cb_count);
    921   fake_hal_gatt_iface_->NotifyCharacteristicAddedCallback(
    922       BT_STATUS_SUCCESS, kDefaultServerId, hal_char_uuid1,
    923       srvc_handle, char_handle1);
    924   EXPECT_EQ(0, cb_count);
    925 
    926   // Notify success for both descriptors.
    927   fake_hal_gatt_iface_->NotifyDescriptorAddedCallback(
    928       BT_STATUS_SUCCESS, kDefaultServerId, hal_desc_uuid,
    929       srvc_handle, desc_handle0);
    930   EXPECT_EQ(0, cb_count);
    931 
    932   // The second descriptor callback should trigger the end routine.
    933   EXPECT_CALL(*mock_handler_, StartService(kDefaultServerId, srvc_handle, _))
    934       .Times(1)
    935       .WillOnce(Return(BT_STATUS_SUCCESS));
    936   fake_hal_gatt_iface_->NotifyDescriptorAddedCallback(
    937       BT_STATUS_SUCCESS, kDefaultServerId, hal_desc_uuid,
    938       srvc_handle, desc_handle1);
    939   EXPECT_EQ(0, cb_count);
    940 }
    941 
    942 TEST_F(GattServerPostRegisterTest, RequestRead) {
    943   SetUpTestService();
    944 
    945   TestDelegate test_delegate;
    946   gatt_server_->SetDelegate(&test_delegate);
    947 
    948   const std::vector<uint8_t> kTestValue = { 0x01, 0x02, 0x03 };
    949   const std::vector<uint8_t> kTestValueTooLarge(BTGATT_MAX_ATTR_LEN + 1, 0);
    950   const std::string kTestAddress0 = "01:23:45:67:89:AB";
    951   const std::string kTestAddress1 = "CD:EF:01:23:45:67";
    952   const int kReqId0 = 0;
    953   const int kReqId1 = 1;
    954   const int kConnId0 = 1;
    955 
    956   // No pending request.
    957   EXPECT_FALSE(gatt_server_->SendResponse(
    958       kTestAddress0, kReqId0,
    959       GATT_ERROR_NONE, 0, kTestValue));
    960 
    961   bt_bdaddr_t hal_addr0, hal_addr1;
    962   ASSERT_TRUE(util::BdAddrFromString(kTestAddress0, &hal_addr0));
    963   ASSERT_TRUE(util::BdAddrFromString(kTestAddress1, &hal_addr1));
    964 
    965   // Send a connection callback. The GattServer should store the connection
    966   // information and be able to process the incoming read requests for this
    967   // connection.
    968   fake_hal_gatt_iface_->NotifyServerConnectionCallback(
    969       kConnId0, kDefaultServerId, true, hal_addr0);
    970 
    971   // Unknown connection ID shouldn't trigger anything.
    972   fake_hal_gatt_iface_->NotifyRequestReadCallback(
    973       kConnId0 + 1, kReqId0, hal_addr0, char_handle_, 0, false);
    974   EXPECT_EQ(0, test_delegate.char_read_req().count);
    975   EXPECT_EQ(0, test_delegate.desc_read_req().count);
    976 
    977   // Unknown device address shouldn't trigger anything.
    978   fake_hal_gatt_iface_->NotifyRequestReadCallback(
    979       kConnId0, kReqId0, hal_addr1, char_handle_, 0, false);
    980   EXPECT_EQ(0, test_delegate.char_read_req().count);
    981   EXPECT_EQ(0, test_delegate.desc_read_req().count);
    982 
    983   // Unknown attribute handle shouldn't trigger anything.
    984   fake_hal_gatt_iface_->NotifyRequestReadCallback(
    985       kConnId0, kReqId0, hal_addr0, char_handle_ + 50, 0, false);
    986   EXPECT_EQ(0, test_delegate.char_read_req().count);
    987   EXPECT_EQ(0, test_delegate.desc_read_req().count);
    988 
    989   // Characteristic and descriptor handles should trigger correct callbacks.
    990   fake_hal_gatt_iface_->NotifyRequestReadCallback(
    991       kConnId0, kReqId0, hal_addr0, char_handle_, 0, false);
    992   EXPECT_EQ(1, test_delegate.char_read_req().count);
    993   EXPECT_EQ(kTestAddress0, test_delegate.char_read_req().device_address);
    994   EXPECT_EQ(kReqId0, test_delegate.char_read_req().id);
    995   EXPECT_EQ(0, test_delegate.char_read_req().offset);
    996   EXPECT_FALSE(test_delegate.char_read_req().is_long);
    997   EXPECT_TRUE(test_char_id_ == test_delegate.char_read_req().gatt_id);
    998   EXPECT_EQ(0, test_delegate.desc_read_req().count);
    999 
   1000   fake_hal_gatt_iface_->NotifyRequestReadCallback(
   1001       kConnId0, kReqId1, hal_addr0, desc_handle_, 2, true);
   1002   EXPECT_EQ(1, test_delegate.char_read_req().count);
   1003   EXPECT_EQ(1, test_delegate.desc_read_req().count);
   1004   EXPECT_EQ(kTestAddress0, test_delegate.desc_read_req().device_address);
   1005   EXPECT_EQ(kReqId1, test_delegate.desc_read_req().id);
   1006   EXPECT_EQ(2, test_delegate.desc_read_req().offset);
   1007   EXPECT_TRUE(test_delegate.desc_read_req().is_long);
   1008   EXPECT_TRUE(test_desc_id_ == test_delegate.desc_read_req().gatt_id);
   1009 
   1010   // Callback with a pending request ID will be ignored.
   1011   fake_hal_gatt_iface_->NotifyRequestReadCallback(
   1012       kConnId0, kReqId0, hal_addr0, char_handle_, 0, false);
   1013   fake_hal_gatt_iface_->NotifyRequestReadCallback(
   1014       kConnId0, kReqId1, hal_addr0, char_handle_, 0, false);
   1015   EXPECT_EQ(1, test_delegate.char_read_req().count);
   1016   EXPECT_EQ(1, test_delegate.desc_read_req().count);
   1017 
   1018   // Send response for wrong device address.
   1019   EXPECT_FALSE(gatt_server_->SendResponse(
   1020       kTestAddress1, kReqId0,
   1021       GATT_ERROR_NONE, 0, kTestValue));
   1022 
   1023   // Send response for a value that's too large.
   1024   EXPECT_FALSE(gatt_server_->SendResponse(
   1025       kTestAddress0, kReqId0,
   1026       GATT_ERROR_NONE, 0, kTestValueTooLarge));
   1027 
   1028   EXPECT_CALL(*mock_handler_, SendResponse(kConnId0, kReqId0,
   1029                                            BT_STATUS_SUCCESS, _))
   1030       .Times(2)
   1031       .WillOnce(Return(BT_STATUS_FAIL))
   1032       .WillOnce(Return(BT_STATUS_SUCCESS));
   1033 
   1034   // Stack call fails.
   1035   EXPECT_FALSE(gatt_server_->SendResponse(
   1036       kTestAddress0, kReqId0,
   1037       GATT_ERROR_NONE, 0, kTestValue));
   1038 
   1039   // Successful send response for characteristic.
   1040   EXPECT_TRUE(gatt_server_->SendResponse(
   1041       kTestAddress0, kReqId0,
   1042       GATT_ERROR_NONE, 0, kTestValue));
   1043 
   1044   // Characteristic request ID no longer pending.
   1045   EXPECT_FALSE(gatt_server_->SendResponse(
   1046       kTestAddress0, kReqId0,
   1047       GATT_ERROR_NONE, 0, kTestValue));
   1048 
   1049   EXPECT_CALL(*mock_handler_, SendResponse(kConnId0, kReqId1,
   1050                                            BT_STATUS_SUCCESS, _))
   1051       .Times(1)
   1052       .WillOnce(Return(BT_STATUS_SUCCESS));
   1053 
   1054   // Successful send response for descriptor.
   1055   EXPECT_TRUE(gatt_server_->SendResponse(
   1056       kTestAddress0, kReqId1,
   1057       GATT_ERROR_NONE, 0, kTestValue));
   1058 
   1059   // Descriptor request ID no longer pending.
   1060   EXPECT_FALSE(gatt_server_->SendResponse(
   1061       kTestAddress0, kReqId1,
   1062       GATT_ERROR_NONE, 0, kTestValue));
   1063 
   1064   gatt_server_->SetDelegate(nullptr);
   1065 }
   1066 
   1067 TEST_F(GattServerPostRegisterTest, RequestWrite) {
   1068   SetUpTestService();
   1069 
   1070   TestDelegate test_delegate;
   1071   gatt_server_->SetDelegate(&test_delegate);
   1072 
   1073   const std::vector<uint8_t> kTestValue = { 0x01, 0x02, 0x03 };
   1074   const std::string kTestAddress0 = "01:23:45:67:89:AB";
   1075   const std::string kTestAddress1 = "CD:EF:01:23:45:67";
   1076   const int kReqId0 = 0;
   1077   const int kReqId1 = 1;
   1078   const int kConnId0 = 1;
   1079 
   1080   // No pending request.
   1081   EXPECT_FALSE(gatt_server_->SendResponse(
   1082       kTestAddress0, kReqId0,
   1083       GATT_ERROR_NONE, 0, kTestValue));
   1084 
   1085   bt_bdaddr_t hal_addr0, hal_addr1;
   1086   ASSERT_TRUE(util::BdAddrFromString(kTestAddress0, &hal_addr0));
   1087   ASSERT_TRUE(util::BdAddrFromString(kTestAddress1, &hal_addr1));
   1088 
   1089   // Send a connection callback. The GattServer should store the connection
   1090   // information and be able to process the incoming read requests for this
   1091   // connection.
   1092   fake_hal_gatt_iface_->NotifyServerConnectionCallback(
   1093       kConnId0, kDefaultServerId, true, hal_addr0);
   1094 
   1095   // Unknown connection ID shouldn't trigger anything.
   1096   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1097       kConnId0 + 1, kReqId0, hal_addr0, char_handle_, 0,
   1098       kTestValue.size(), true, false, (uint8_t *)kTestValue.data());
   1099   EXPECT_EQ(0, test_delegate.char_write_req().count);
   1100   EXPECT_EQ(0, test_delegate.desc_write_req().count);
   1101 
   1102   // Unknown device address shouldn't trigger anything.
   1103   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1104       kConnId0, kReqId0, hal_addr1, char_handle_, 0,
   1105       kTestValue.size(), true, false, (uint8_t *)kTestValue.data());
   1106   EXPECT_EQ(0, test_delegate.char_write_req().count);
   1107   EXPECT_EQ(0, test_delegate.desc_write_req().count);
   1108 
   1109   // Unknown attribute handle shouldn't trigger anything.
   1110   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1111       kConnId0, kReqId0, hal_addr0, char_handle_ + 50, 0,
   1112       kTestValue.size(), true, false, (uint8_t *)kTestValue.data());
   1113   EXPECT_EQ(0, test_delegate.char_write_req().count);
   1114   EXPECT_EQ(0, test_delegate.desc_write_req().count);
   1115 
   1116   // Characteristic and descriptor handles should trigger correct callbacks.
   1117   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1118       kConnId0, kReqId0, hal_addr0, char_handle_, 0,
   1119       kTestValue.size(), true, false, (uint8_t *)kTestValue.data());
   1120   EXPECT_EQ(1, test_delegate.char_write_req().count);
   1121   EXPECT_EQ(kTestAddress0, test_delegate.char_write_req().device_address);
   1122   EXPECT_EQ(kReqId0, test_delegate.char_write_req().id);
   1123   EXPECT_EQ(0, test_delegate.char_write_req().offset);
   1124   EXPECT_EQ(true, test_delegate.char_write_req().need_rsp);
   1125   EXPECT_EQ(false, test_delegate.char_write_req().is_exec);
   1126   EXPECT_EQ(kTestValue, test_delegate.char_write_req().write_value);
   1127   EXPECT_TRUE(test_char_id_ == test_delegate.char_write_req().gatt_id);
   1128   EXPECT_EQ(0, test_delegate.desc_write_req().count);
   1129 
   1130   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1131       kConnId0, kReqId1, hal_addr0, desc_handle_, 2,
   1132       kTestValue.size(), true, false, (uint8_t *)kTestValue.data());
   1133   EXPECT_EQ(1, test_delegate.char_write_req().count);
   1134   EXPECT_EQ(1, test_delegate.desc_write_req().count);
   1135   EXPECT_EQ(kTestAddress0, test_delegate.desc_write_req().device_address);
   1136   EXPECT_EQ(kReqId1, test_delegate.desc_write_req().id);
   1137   EXPECT_EQ(2, test_delegate.desc_write_req().offset);
   1138   EXPECT_EQ(true, test_delegate.desc_write_req().need_rsp);
   1139   EXPECT_EQ(false, test_delegate.desc_write_req().is_exec);
   1140   EXPECT_EQ(kTestValue, test_delegate.desc_write_req().write_value);
   1141   EXPECT_TRUE(test_desc_id_ == test_delegate.desc_write_req().gatt_id);
   1142 
   1143   // Callback with a pending request ID will be ignored.
   1144   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1145       kConnId0, kReqId0, hal_addr0, char_handle_, 0,
   1146       kTestValue.size(), true, false, (uint8_t *)kTestValue.data());
   1147   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1148       kConnId0, kReqId1, hal_addr0, char_handle_, 0,
   1149       kTestValue.size(), true, false, (uint8_t *)kTestValue.data());
   1150   EXPECT_EQ(1, test_delegate.char_write_req().count);
   1151   EXPECT_EQ(1, test_delegate.desc_write_req().count);
   1152 
   1153   // Send response for wrong device address.
   1154   EXPECT_FALSE(gatt_server_->SendResponse(
   1155       kTestAddress1, kReqId0,
   1156       GATT_ERROR_NONE, 0, kTestValue));
   1157 
   1158   EXPECT_CALL(*mock_handler_, SendResponse(kConnId0, kReqId0,
   1159                                            BT_STATUS_SUCCESS, _))
   1160       .Times(2)
   1161       .WillOnce(Return(BT_STATUS_FAIL))
   1162       .WillOnce(Return(BT_STATUS_SUCCESS));
   1163 
   1164   // Stack call fails.
   1165   EXPECT_FALSE(gatt_server_->SendResponse(
   1166       kTestAddress0, kReqId0,
   1167       GATT_ERROR_NONE, 0, kTestValue));
   1168 
   1169   // Successful send response for characteristic.
   1170   EXPECT_TRUE(gatt_server_->SendResponse(
   1171       kTestAddress0, kReqId0,
   1172       GATT_ERROR_NONE, 0, kTestValue));
   1173 
   1174   // Characteristic request ID no longer pending.
   1175   EXPECT_FALSE(gatt_server_->SendResponse(
   1176       kTestAddress0, kReqId0,
   1177       GATT_ERROR_NONE, 0, kTestValue));
   1178 
   1179   EXPECT_CALL(*mock_handler_, SendResponse(kConnId0, kReqId1,
   1180                                            BT_STATUS_SUCCESS, _))
   1181       .Times(1)
   1182       .WillOnce(Return(BT_STATUS_SUCCESS));
   1183 
   1184   // Successful send response for descriptor.
   1185   EXPECT_TRUE(gatt_server_->SendResponse(
   1186       kTestAddress0, kReqId1,
   1187       GATT_ERROR_NONE, 0, kTestValue));
   1188 
   1189   // Descriptor request ID no longer pending.
   1190   EXPECT_FALSE(gatt_server_->SendResponse(
   1191       kTestAddress0, kReqId1,
   1192       GATT_ERROR_NONE, 0, kTestValue));
   1193 
   1194   // SendResponse should fail for a "Write Without Response".
   1195   fake_hal_gatt_iface_->NotifyRequestWriteCallback(
   1196       kConnId0, kReqId0, hal_addr0, char_handle_, 0,
   1197       kTestValue.size(), false, false, (uint8_t *)kTestValue.data());
   1198   EXPECT_EQ(false, test_delegate.char_write_req().need_rsp);
   1199   EXPECT_FALSE(gatt_server_->SendResponse(
   1200       kTestAddress0, kReqId0,
   1201       GATT_ERROR_NONE, 0, kTestValue));
   1202 
   1203   gatt_server_->SetDelegate(nullptr);
   1204 }
   1205 
   1206 TEST_F(GattServerPostRegisterTest, SendNotification) {
   1207   SetUpTestService();
   1208 
   1209   const std::string kTestAddress0 = "01:23:45:67:89:AB";
   1210   const std::string kTestAddress1 = "cd:ef:01:23:45:67";
   1211   const std::string kInvalidAddress = "thingamajig blabbidyboop";
   1212   const int kConnId0 = 0;
   1213   const int kConnId1 = 1;
   1214   std::vector<uint8_t> value;
   1215   bt_bdaddr_t hal_addr0;
   1216   ASSERT_TRUE(util::BdAddrFromString(kTestAddress0, &hal_addr0));
   1217 
   1218   // Set up two connections with the same address.
   1219   fake_hal_gatt_iface_->NotifyServerConnectionCallback(
   1220       kConnId0, kDefaultServerId, true, hal_addr0);
   1221   fake_hal_gatt_iface_->NotifyServerConnectionCallback(
   1222       kConnId1, kDefaultServerId, true, hal_addr0);
   1223 
   1224   // Set up a test callback.
   1225   GATTError gatt_error;
   1226   int callback_count = 0;
   1227   auto callback = [&](GATTError in_error) {
   1228     gatt_error = in_error;
   1229     callback_count++;
   1230   };
   1231 
   1232   // Bad device address.
   1233   EXPECT_FALSE(gatt_server_->SendNotification(
   1234       kInvalidAddress,
   1235       test_char_id_, false, value, callback));
   1236 
   1237   // Bad connection.
   1238   EXPECT_FALSE(gatt_server_->SendNotification(
   1239       kTestAddress1,
   1240       test_char_id_, false, value, callback));
   1241 
   1242   // We should get a HAL call for each connection for this address. The calls
   1243   // fail.
   1244   EXPECT_CALL(*mock_handler_,
   1245               SendIndication(kDefaultServerId, char_handle_, kConnId0,
   1246                              value.size(), 0, nullptr))
   1247       .Times(1)
   1248       .WillOnce(Return(BT_STATUS_FAIL));
   1249   EXPECT_CALL(*mock_handler_,
   1250               SendIndication(kDefaultServerId, char_handle_, kConnId1,
   1251                              value.size(), 0, nullptr))
   1252       .Times(1)
   1253       .WillOnce(Return(BT_STATUS_FAIL));
   1254   EXPECT_FALSE(gatt_server_->SendNotification(
   1255       kTestAddress0,
   1256       test_char_id_, false, value, callback));
   1257 
   1258   // One of the calls succeeds.
   1259   EXPECT_CALL(*mock_handler_,
   1260               SendIndication(kDefaultServerId, char_handle_, kConnId0,
   1261                              value.size(), 0, nullptr))
   1262       .Times(1)
   1263       .WillOnce(Return(BT_STATUS_SUCCESS));
   1264   EXPECT_CALL(*mock_handler_,
   1265               SendIndication(kDefaultServerId, char_handle_, kConnId1,
   1266                              value.size(), 0, nullptr))
   1267       .Times(1)
   1268       .WillOnce(Return(BT_STATUS_FAIL));
   1269   EXPECT_TRUE(gatt_server_->SendNotification(
   1270       kTestAddress0,
   1271       test_char_id_, false, value, callback));
   1272 
   1273   // One of the connections is already pending so there should be only one call.
   1274   // This one we send with confirm=true.
   1275   EXPECT_CALL(*mock_handler_,
   1276               SendIndication(kDefaultServerId, char_handle_, kConnId1,
   1277                              value.size(), 1, nullptr))
   1278       .Times(1)
   1279       .WillOnce(Return(BT_STATUS_SUCCESS));
   1280   EXPECT_TRUE(gatt_server_->SendNotification(
   1281       kTestAddress0,
   1282       test_char_id_, true, value, callback));
   1283 
   1284   // Calls are already pending.
   1285   EXPECT_FALSE(gatt_server_->SendNotification(
   1286       kTestAddress0, test_char_id_, true, value, callback));
   1287 
   1288   // Trigger one confirmation callback. We should get calls for two callbacks
   1289   // since we have two separate calls pending.
   1290   fake_hal_gatt_iface_->NotifyIndicationSentCallback(
   1291       kConnId0, BT_STATUS_SUCCESS);
   1292   fake_hal_gatt_iface_->NotifyIndicationSentCallback(
   1293       kConnId1, BT_STATUS_SUCCESS);
   1294   EXPECT_EQ(2, callback_count);
   1295   EXPECT_EQ(GATT_ERROR_NONE, gatt_error);
   1296 
   1297   callback_count = 0;
   1298 
   1299   // Restart. Both calls succeed now.
   1300   EXPECT_CALL(*mock_handler_,
   1301               SendIndication(kDefaultServerId, char_handle_, kConnId0,
   1302                              value.size(), 0, nullptr))
   1303       .Times(1)
   1304       .WillOnce(Return(BT_STATUS_SUCCESS));
   1305   EXPECT_CALL(*mock_handler_,
   1306               SendIndication(kDefaultServerId, char_handle_, kConnId1,
   1307                              value.size(), 0, nullptr))
   1308       .Times(1)
   1309       .WillOnce(Return(BT_STATUS_SUCCESS));
   1310   EXPECT_TRUE(gatt_server_->SendNotification(
   1311       kTestAddress0,
   1312       test_char_id_, false, value, callback));
   1313 
   1314   // Trigger one confirmation callback. The callback we passed should still be
   1315   // pending. The first callback is for the wrong connection ID.
   1316   fake_hal_gatt_iface_->NotifyIndicationSentCallback(
   1317       kConnId0 + 50, BT_STATUS_FAIL);
   1318   fake_hal_gatt_iface_->NotifyIndicationSentCallback(
   1319       kConnId0, BT_STATUS_SUCCESS);
   1320   EXPECT_EQ(0, callback_count);
   1321 
   1322   // This should be ignored since |kConnId0| was already processed.
   1323   fake_hal_gatt_iface_->NotifyIndicationSentCallback(
   1324       kConnId0, BT_STATUS_SUCCESS);
   1325   EXPECT_EQ(0, callback_count);
   1326 
   1327   // Run the callback with failure. Since the previous callback reported
   1328   // success, we should report success.
   1329   fake_hal_gatt_iface_->NotifyIndicationSentCallback(
   1330       kConnId1, BT_STATUS_SUCCESS);
   1331   EXPECT_EQ(1, callback_count);
   1332   EXPECT_EQ(GATT_ERROR_NONE, gatt_error);
   1333 }
   1334 
   1335 }  // namespace
   1336 }  // namespace bluetooth
   1337