Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright (C) 2016, The Android Open Source Project
      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 <memory>
     18 #include <vector>
     19 
     20 #include <gmock/gmock.h>
     21 #include <gtest/gtest.h>
     22 #include <wifi_system_test/mock_hostapd_manager.h>
     23 #include <wifi_system_test/mock_interface_tool.h>
     24 
     25 #include "wificond/tests/mock_ap_interface_event_callback.h"
     26 #include "wificond/tests/mock_netlink_manager.h"
     27 #include "wificond/tests/mock_netlink_utils.h"
     28 
     29 #include "wificond/ap_interface_impl.h"
     30 
     31 using android::wifi_system::HostapdManager;
     32 using android::wifi_system::MockHostapdManager;
     33 using android::wifi_system::MockInterfaceTool;
     34 using std::placeholders::_1;
     35 using std::placeholders::_2;
     36 using std::unique_ptr;
     37 using std::vector;
     38 using testing::NiceMock;
     39 using testing::Invoke;
     40 using testing::Return;
     41 using testing::Sequence;
     42 using testing::StrEq;
     43 using testing::_;
     44 
     45 namespace android {
     46 namespace wificond {
     47 namespace {
     48 
     49 const char kTestInterfaceName[] = "testwifi0";
     50 const uint32_t kTestInterfaceIndex = 42;
     51 const uint8_t kFakeMacAddress[] = {0x45, 0x54, 0xad, 0x67, 0x98, 0xf6};
     52 
     53 void CaptureStationEventHandler(
     54     OnStationEventHandler* out_handler,
     55     uint32_t interface_index,
     56     OnStationEventHandler handler) {
     57   *out_handler = handler;
     58 }
     59 
     60 void CaptureChannelSwitchEventHandler(
     61     OnChannelSwitchEventHandler* out_handler,
     62     uint32_t interface_index,
     63     OnChannelSwitchEventHandler handler) {
     64   *out_handler = handler;
     65 }
     66 
     67 class ApInterfaceImplTest : public ::testing::Test {
     68  protected:
     69   unique_ptr<NiceMock<MockInterfaceTool>> if_tool_{
     70       new NiceMock<MockInterfaceTool>};
     71   unique_ptr<NiceMock<MockHostapdManager>> hostapd_manager_{
     72       new NiceMock<MockHostapdManager>};
     73   unique_ptr<NiceMock<MockNetlinkManager>> netlink_manager_{
     74       new NiceMock<MockNetlinkManager>()};
     75   unique_ptr<NiceMock<MockNetlinkUtils>> netlink_utils_{
     76       new NiceMock<MockNetlinkUtils>(netlink_manager_.get())};
     77 
     78   unique_ptr<ApInterfaceImpl> ap_interface_;
     79 
     80   void SetUp() override {
     81     ap_interface_.reset(new ApInterfaceImpl(
     82         kTestInterfaceName,
     83         kTestInterfaceIndex,
     84         netlink_utils_.get(),
     85         if_tool_.get(),
     86         hostapd_manager_.get()));
     87   }
     88 };  // class ApInterfaceImplTest
     89 
     90 }  // namespace
     91 
     92 TEST_F(ApInterfaceImplTest, ShouldReportStartFailure) {
     93   EXPECT_CALL(*hostapd_manager_, StartHostapd())
     94       .WillOnce(Return(false));
     95   EXPECT_FALSE(ap_interface_->StartHostapd());
     96 }
     97 
     98 TEST_F(ApInterfaceImplTest, ShouldReportStartSuccess) {
     99   EXPECT_CALL(*hostapd_manager_, StartHostapd())
    100       .WillOnce(Return(true));
    101   EXPECT_TRUE(ap_interface_->StartHostapd());
    102 }
    103 
    104 TEST_F(ApInterfaceImplTest, ShouldReportStopFailure) {
    105   EXPECT_CALL(*hostapd_manager_, StopHostapd())
    106       .WillOnce(Return(false));
    107   EXPECT_FALSE(ap_interface_->StopHostapd());
    108 }
    109 
    110 TEST_F(ApInterfaceImplTest, ShouldReportStopSuccess) {
    111   EXPECT_CALL(*hostapd_manager_, StopHostapd())
    112       .WillOnce(Return(true));
    113   EXPECT_CALL(*if_tool_, SetUpState(StrEq(kTestInterfaceName), false))
    114       .WillOnce(Return(true));
    115   EXPECT_CALL(*netlink_utils_, SetInterfaceMode(
    116       kTestInterfaceIndex,
    117       NetlinkUtils::STATION_MODE)).WillOnce(Return(true));
    118   EXPECT_TRUE(ap_interface_->StopHostapd());
    119   testing::Mock::VerifyAndClearExpectations(if_tool_.get());
    120 }
    121 
    122 TEST_F(ApInterfaceImplTest, CanGetNumberOfAssociatedStations) {
    123   OnStationEventHandler handler;
    124   EXPECT_CALL(*netlink_utils_,
    125       SubscribeStationEvent(kTestInterfaceIndex, _)).
    126           WillOnce(Invoke(bind(CaptureStationEventHandler, &handler, _1, _2)));
    127 
    128   ap_interface_.reset(new ApInterfaceImpl(
    129         kTestInterfaceName,
    130         kTestInterfaceIndex,
    131         netlink_utils_.get(),
    132         if_tool_.get(),
    133         hostapd_manager_.get()));
    134 
    135   vector<uint8_t> fake_mac_address(kFakeMacAddress,
    136                                    kFakeMacAddress + sizeof(kFakeMacAddress));
    137   EXPECT_EQ(0, ap_interface_->GetNumberOfAssociatedStations());
    138   handler(NEW_STATION, fake_mac_address);
    139   EXPECT_EQ(1, ap_interface_->GetNumberOfAssociatedStations());
    140   handler(NEW_STATION, fake_mac_address);
    141   EXPECT_EQ(2, ap_interface_->GetNumberOfAssociatedStations());
    142   handler(DEL_STATION, fake_mac_address);
    143   EXPECT_EQ(1, ap_interface_->GetNumberOfAssociatedStations());
    144 }
    145 
    146 TEST_F(ApInterfaceImplTest, CallbackIsCalledOnNumAssociatedStationsChanged) {
    147   OnStationEventHandler handler;
    148   EXPECT_CALL(*netlink_utils_, SubscribeStationEvent(kTestInterfaceIndex, _))
    149       .WillOnce(Invoke(bind(CaptureStationEventHandler, &handler, _1, _2)));
    150   ap_interface_.reset(new ApInterfaceImpl(
    151       kTestInterfaceName, kTestInterfaceIndex, netlink_utils_.get(),
    152       if_tool_.get(), hostapd_manager_.get()));
    153 
    154   EXPECT_CALL(*hostapd_manager_, StartHostapd()).WillOnce(Return(true));
    155   auto binder = ap_interface_->GetBinder();
    156   sp<MockApInterfaceEventCallback> callback(new MockApInterfaceEventCallback());
    157   bool out_success = false;
    158   EXPECT_TRUE(binder->startHostapd(callback, &out_success).isOk());
    159   EXPECT_TRUE(out_success);
    160 
    161   vector<uint8_t> fake_mac_address(kFakeMacAddress,
    162                                    kFakeMacAddress + sizeof(kFakeMacAddress));
    163   EXPECT_CALL(*callback, onNumAssociatedStationsChanged(1));
    164   handler(NEW_STATION, fake_mac_address);
    165   EXPECT_CALL(*callback, onNumAssociatedStationsChanged(2));
    166   handler(NEW_STATION, fake_mac_address);
    167   EXPECT_CALL(*callback, onNumAssociatedStationsChanged(1));
    168   handler(DEL_STATION, fake_mac_address);
    169 }
    170 
    171 TEST_F(ApInterfaceImplTest, CallbackIsCalledOnSoftApChannelSwitched) {
    172   OnChannelSwitchEventHandler handler;
    173   EXPECT_CALL(*netlink_utils_, SubscribeChannelSwitchEvent(kTestInterfaceIndex, _))
    174       .WillOnce(Invoke(bind(CaptureChannelSwitchEventHandler, &handler, _1, _2)));
    175   ap_interface_.reset(new ApInterfaceImpl(
    176       kTestInterfaceName, kTestInterfaceIndex, netlink_utils_.get(),
    177       if_tool_.get(), hostapd_manager_.get()));
    178 
    179   EXPECT_CALL(*hostapd_manager_, StartHostapd()).WillOnce(Return(true));
    180   auto binder = ap_interface_->GetBinder();
    181   sp<MockApInterfaceEventCallback> callback(new MockApInterfaceEventCallback());
    182   bool out_success = false;
    183   EXPECT_TRUE(binder->startHostapd(callback, &out_success).isOk());
    184   EXPECT_TRUE(out_success);
    185 
    186   const uint32_t kTestChannelFrequency = 2437;
    187   const ChannelBandwidth kTestChannelBandwidth = ChannelBandwidth::BW_20;
    188   EXPECT_CALL(*callback, onSoftApChannelSwitched(kTestChannelFrequency,
    189                                                  kTestChannelBandwidth));
    190   handler(kTestChannelFrequency, kTestChannelBandwidth);
    191 }
    192 
    193 }  // namespace wificond
    194 }  // namespace android
    195