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 <base/macros.h>
     18 #include <gtest/gtest.h>
     19 
     20 #include "service/adapter.h"
     21 #include "service/common/bluetooth/util/address_helper.h"
     22 #include "service/hal/fake_bluetooth_gatt_interface.h"
     23 #include "service/hal/fake_bluetooth_interface.h"
     24 
     25 namespace bluetooth {
     26 namespace {
     27 
     28 class AdapterTest : public ::testing::Test {
     29  public:
     30   AdapterTest() = default;
     31   ~AdapterTest() override = default;
     32 
     33   void SetUp() override {
     34     fake_hal_manager_ = hal::FakeBluetoothInterface::GetManager();
     35     fake_hal_iface_ = new hal::FakeBluetoothInterface();
     36     hal::BluetoothInterface::InitializeForTesting(fake_hal_iface_);
     37 
     38     // Initialize GATT interface with default handlers.
     39     hal::BluetoothGattInterface::InitializeForTesting(
     40         new hal::FakeBluetoothGattInterface(nullptr, nullptr));
     41 
     42     adapter_ = Adapter::Create();
     43   }
     44 
     45   void TearDown() override {
     46     adapter_.reset();
     47     hal::BluetoothGattInterface::CleanUp();
     48     hal::BluetoothInterface::CleanUp();
     49   }
     50 
     51  protected:
     52   hal::FakeBluetoothInterface* fake_hal_iface_;
     53   hal::FakeBluetoothInterface::Manager* fake_hal_manager_;
     54   std::unique_ptr<Adapter> adapter_;
     55 
     56  private:
     57   DISALLOW_COPY_AND_ASSIGN(AdapterTest);
     58 };
     59 
     60 class TestObserver final : public bluetooth::Adapter::Observer {
     61  public:
     62   TestObserver(bluetooth::Adapter* adapter)
     63       : adapter_(adapter),
     64         prev_state_(bluetooth::ADAPTER_STATE_INVALID),
     65         cur_state_(bluetooth::ADAPTER_STATE_INVALID),
     66         last_device_connected_state_(false) {
     67     CHECK(adapter_);
     68     adapter_->AddObserver(this);
     69   }
     70 
     71   ~TestObserver() override {
     72     adapter_->RemoveObserver(this);
     73   }
     74 
     75   bluetooth::AdapterState prev_state() const { return prev_state_; }
     76   bluetooth::AdapterState cur_state() const { return cur_state_; }
     77 
     78   std::string last_connection_state_address() const {
     79     return last_connection_state_address_;
     80   }
     81 
     82   bool last_device_connected_state() const {
     83     return last_device_connected_state_;
     84   }
     85 
     86   // bluetooth::Adapter::Observer override:
     87   void OnAdapterStateChanged(bluetooth::Adapter* adapter,
     88                              bluetooth::AdapterState prev_state,
     89                              bluetooth::AdapterState new_state) override {
     90     ASSERT_EQ(adapter_, adapter);
     91     prev_state_ = prev_state;
     92     cur_state_ = new_state;
     93   }
     94 
     95   void OnDeviceConnectionStateChanged(
     96       Adapter* adapter,
     97       const std::string& device_address,
     98       bool connected) override {
     99     ASSERT_EQ(adapter_, adapter);
    100     last_connection_state_address_ = device_address;
    101     last_device_connected_state_ = connected;
    102   }
    103 
    104  private:
    105   bluetooth::Adapter* adapter_;
    106   bluetooth::AdapterState prev_state_, cur_state_;
    107   std::string last_connection_state_address_;
    108   bool last_device_connected_state_;
    109 
    110   DISALLOW_COPY_AND_ASSIGN(TestObserver);
    111 };
    112 
    113 TEST_F(AdapterTest, IsEnabled) {
    114   EXPECT_FALSE(adapter_->IsEnabled());
    115 
    116   fake_hal_iface_->NotifyAdapterStateChanged(BT_STATE_ON);
    117   EXPECT_TRUE(adapter_->IsEnabled());
    118 
    119   fake_hal_iface_->NotifyAdapterStateChanged(BT_STATE_OFF);
    120   EXPECT_FALSE(adapter_->IsEnabled());
    121 }
    122 
    123 TEST_F(AdapterTest, Enable) {
    124   TestObserver observer(adapter_.get());
    125 
    126   EXPECT_FALSE(adapter_->IsEnabled());
    127   EXPECT_EQ(bluetooth::ADAPTER_STATE_OFF, adapter_->GetState());
    128 
    129   // Enable fails at HAL level
    130   EXPECT_FALSE(adapter_->Enable(false));
    131   EXPECT_EQ(bluetooth::ADAPTER_STATE_OFF, adapter_->GetState());
    132 
    133   // Enable success
    134   fake_hal_manager_->enable_succeed = true;
    135   EXPECT_TRUE(adapter_->Enable(false));
    136 
    137   // Should have received a state update.
    138   EXPECT_EQ(bluetooth::ADAPTER_STATE_OFF, observer.prev_state());
    139   EXPECT_EQ(bluetooth::ADAPTER_STATE_TURNING_ON, observer.cur_state());
    140 
    141   // Enable fails because not disabled
    142   EXPECT_EQ(bluetooth::ADAPTER_STATE_TURNING_ON, adapter_->GetState());
    143   EXPECT_FALSE(adapter_->Enable(false));
    144 
    145   // Adapter state updates properly
    146   fake_hal_iface_->NotifyAdapterStateChanged(BT_STATE_ON);
    147   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, adapter_->GetState());
    148 
    149   // Should have received a state update.
    150   EXPECT_EQ(bluetooth::ADAPTER_STATE_TURNING_ON, observer.prev_state());
    151   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, observer.cur_state());
    152 
    153   // Enable fails because already enabled
    154   EXPECT_FALSE(adapter_->Enable(false));
    155 }
    156 
    157 TEST_F(AdapterTest, Disable) {
    158   TestObserver observer(adapter_.get());
    159 
    160   fake_hal_manager_->disable_succeed = true;
    161   EXPECT_FALSE(adapter_->IsEnabled());
    162   EXPECT_EQ(bluetooth::ADAPTER_STATE_OFF, adapter_->GetState());
    163 
    164   // Disable fails because already disabled
    165   EXPECT_FALSE(adapter_->Disable());
    166   EXPECT_EQ(bluetooth::ADAPTER_STATE_OFF, adapter_->GetState());
    167 
    168   // Disable success
    169   fake_hal_iface_->NotifyAdapterStateChanged(BT_STATE_ON);
    170 
    171   // Should have received a state update.
    172   EXPECT_EQ(bluetooth::ADAPTER_STATE_OFF, observer.prev_state());
    173   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, observer.cur_state());
    174 
    175   EXPECT_TRUE(adapter_->Disable());
    176 
    177   // Should have received a state update.
    178   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, observer.prev_state());
    179   EXPECT_EQ(bluetooth::ADAPTER_STATE_TURNING_OFF, observer.cur_state());
    180 
    181   // Disable fails because not enabled
    182   EXPECT_EQ(bluetooth::ADAPTER_STATE_TURNING_OFF, adapter_->GetState());
    183   EXPECT_FALSE(adapter_->Disable());
    184 
    185   fake_hal_iface_->NotifyAdapterStateChanged(BT_STATE_ON);
    186   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, adapter_->GetState());
    187 
    188   // Should have received a state update.
    189   EXPECT_EQ(bluetooth::ADAPTER_STATE_TURNING_OFF, observer.prev_state());
    190   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, observer.cur_state());
    191 
    192   // Disable fails at HAL level
    193   fake_hal_manager_->disable_succeed = false;
    194   EXPECT_FALSE(adapter_->Disable());
    195 
    196   // Should have received a state update. In this case we will receive two
    197   // updates: one going from OFF to TURNING_OFF, and one going from TURNING_OFF
    198   // back to ON since we failed to initiate the disable operation.
    199   EXPECT_EQ(bluetooth::ADAPTER_STATE_TURNING_OFF, observer.prev_state());
    200   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, observer.cur_state());
    201 
    202   // Update state to OFF. Should receive a state update.
    203   fake_hal_iface_->NotifyAdapterStateChanged(BT_STATE_OFF);
    204   EXPECT_EQ(bluetooth::ADAPTER_STATE_ON, observer.prev_state());
    205   EXPECT_EQ(bluetooth::ADAPTER_STATE_OFF, observer.cur_state());
    206 }
    207 
    208 TEST_F(AdapterTest, GetName) {
    209   EXPECT_EQ(bluetooth::Adapter::kDefaultName, adapter_->GetName());
    210 
    211   const char kTestAdapterName[] = "Test Adapter Name";
    212 
    213   fake_hal_iface_->NotifyAdapterNamePropertyChanged(kTestAdapterName);
    214   EXPECT_EQ(kTestAdapterName, adapter_->GetName());
    215 }
    216 
    217 TEST_F(AdapterTest, SetName) {
    218   bt_bdname_t hal_name;
    219 
    220   // Name too large.
    221   EXPECT_FALSE(adapter_->SetName(std::string(sizeof(hal_name.name), 'a')));
    222 
    223   // Valid length.
    224   EXPECT_FALSE(adapter_->SetName("Test Name"));
    225   fake_hal_manager_->set_property_succeed = true;
    226   EXPECT_TRUE(adapter_->SetName("Test Name"));
    227 }
    228 
    229 TEST_F(AdapterTest, GetAddress) {
    230   EXPECT_EQ(bluetooth::Adapter::kDefaultAddress, adapter_->GetAddress());
    231 
    232   const bt_bdaddr_t kTestAdapterInput = {
    233     { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc }
    234   };
    235   const char kTestAdapterAddressOutput[] = "12:34:56:78:9A:BC";
    236 
    237   fake_hal_iface_->NotifyAdapterAddressPropertyChanged(&kTestAdapterInput);
    238   EXPECT_EQ(kTestAdapterAddressOutput, adapter_->GetAddress());
    239 }
    240 
    241 TEST_F(AdapterTest, IsMultiAdvertisementSupported) {
    242   EXPECT_FALSE(adapter_->IsMultiAdvertisementSupported());
    243 
    244   bt_local_le_features_t features;
    245   memset(&features, 0, sizeof(features));
    246 
    247   features.max_adv_instance = 10;  // Some high number.
    248   fake_hal_iface_->NotifyAdapterLocalLeFeaturesPropertyChanged(&features);
    249   EXPECT_TRUE(adapter_->IsMultiAdvertisementSupported());
    250 
    251   features.max_adv_instance = 0;  // Low number.
    252   fake_hal_iface_->NotifyAdapterLocalLeFeaturesPropertyChanged(&features);
    253   EXPECT_FALSE(adapter_->IsMultiAdvertisementSupported());
    254 }
    255 
    256 TEST_F(AdapterTest, IsDeviceConnected) {
    257   const char kDeviceAddr[] = "12:34:56:78:9A:BC";
    258   TestObserver observer(adapter_.get());
    259 
    260   EXPECT_FALSE(adapter_->IsDeviceConnected(kDeviceAddr));
    261 
    262   bt_bdaddr_t hal_addr;
    263   ASSERT_TRUE(util::BdAddrFromString(kDeviceAddr, &hal_addr));
    264 
    265   // status != BT_STATUS_SUCCESS should be ignored
    266   fake_hal_iface_->NotifyAclStateChangedCallback(
    267       BT_STATUS_FAIL, hal_addr, BT_ACL_STATE_CONNECTED);
    268   EXPECT_FALSE(adapter_->IsDeviceConnected(kDeviceAddr));
    269   EXPECT_TRUE(observer.last_connection_state_address().empty());
    270   EXPECT_FALSE(observer.last_device_connected_state());
    271 
    272   // Connected
    273   fake_hal_iface_->NotifyAclStateChangedCallback(
    274       BT_STATUS_SUCCESS, hal_addr, BT_ACL_STATE_CONNECTED);
    275   EXPECT_TRUE(adapter_->IsDeviceConnected(kDeviceAddr));
    276   EXPECT_EQ(kDeviceAddr, observer.last_connection_state_address());
    277   EXPECT_TRUE(observer.last_device_connected_state());
    278 
    279   // Disconnected
    280   fake_hal_iface_->NotifyAclStateChangedCallback(
    281       BT_STATUS_SUCCESS, hal_addr, BT_ACL_STATE_DISCONNECTED);
    282   EXPECT_FALSE(adapter_->IsDeviceConnected(kDeviceAddr));
    283   EXPECT_EQ(kDeviceAddr, observer.last_connection_state_address());
    284   EXPECT_FALSE(observer.last_device_connected_state());
    285 }
    286 
    287 }  // namespace
    288 }  // namespace bluetooth
    289