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