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 <functional> 18 #include <memory> 19 #include <string> 20 #include <vector> 21 22 #include <android/hardware/wifi/offload/1.0/IOffload.h> 23 #include <gtest/gtest.h> 24 25 #include "wificond/tests/mock_offload.h" 26 #include "wificond/tests/mock_offload_scan_callback_interface.h" 27 #include "wificond/tests/mock_offload_service_utils.h" 28 #include "wificond/tests/offload_hal_test_constants.h" 29 #include "wificond/tests/offload_test_utils.h" 30 31 #include "wificond/scanning/offload/offload_callback.h" 32 #include "wificond/scanning/offload/offload_callback_handlers.h" 33 #include "wificond/scanning/offload/offload_scan_manager.h" 34 #include "wificond/scanning/scan_result.h" 35 36 using android::hardware::Return; 37 using android::hardware::Void; 38 using android::hardware::wifi::offload::V1_0::IOffload; 39 using android::hardware::wifi::offload::V1_0::ScanResult; 40 using android::hardware::wifi::offload::V1_0::OffloadStatus; 41 using android::hardware::wifi::offload::V1_0::OffloadStatusCode; 42 using android::hardware::wifi::offload::V1_0::ScanParam; 43 using android::hardware::wifi::offload::V1_0::ScanFilter; 44 using android::hardware::wifi::offload::V1_0::ScanStats; 45 using android::sp; 46 using com::android::server::wifi::wificond::NativeScanResult; 47 using com::android::server::wifi::wificond::NativeScanStats; 48 using testing::NiceMock; 49 using testing::_; 50 using testing::Invoke; 51 using std::shared_ptr; 52 using std::unique_ptr; 53 using std::vector; 54 using std::bind; 55 56 using namespace std::placeholders; 57 using namespace android::wificond::offload_hal_test_constants; 58 59 namespace android { 60 namespace wificond { 61 62 sp<OffloadCallback> CaptureCallback(OffloadCallbackHandlers* handler, 63 sp<OffloadCallback>* offload_callback) { 64 *offload_callback = sp<OffloadCallback>(new OffloadCallback(handler)); 65 return *offload_callback; 66 } 67 68 OffloadDeathRecipient* CaptureDeathRecipient( 69 OffloadDeathRecipientHandler handler, 70 sp<OffloadDeathRecipient>* death_recipient_) { 71 OffloadDeathRecipient* death_recipient = new OffloadDeathRecipient(handler); 72 *death_recipient_ = sp<OffloadDeathRecipient>(death_recipient); 73 return death_recipient; 74 } 75 76 Return<void> HidlStatusReturn(android::wificond::StatusCallback cb, 77 OffloadStatus* status) { 78 cb(*status); 79 return Void(); 80 } 81 82 Return<void> ScanStatusReturn(android::wificond::OnScanStatsCallback cb, 83 OffloadStatus* status) { 84 ScanStats stats; 85 cb(*status, stats); 86 return Void(); 87 } 88 89 class OffloadScanManagerTest : public ::testing::Test { 90 protected: 91 virtual void SetUp() { 92 ON_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)) 93 .WillByDefault(Invoke(bind(CaptureCallback, _1, &offload_callback_))); 94 ON_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)) 95 .WillByDefault( 96 Invoke(bind(CaptureDeathRecipient, _1, &death_recipient_))); 97 status = OffloadTestUtils::createOffloadStatus(OffloadStatusCode::OK); 98 ON_CALL(*mock_offload_, configureScans(_, _, _)) 99 .WillByDefault(Invoke(bind(HidlStatusReturn, _3, &status))); 100 ON_CALL(*mock_offload_, subscribeScanResults(_, _)) 101 .WillByDefault(Invoke(bind(HidlStatusReturn, _2, &status))); 102 ON_CALL(*mock_offload_, getScanStats(_)) 103 .WillByDefault(Invoke(bind(ScanStatusReturn, _1, &status))); 104 } 105 106 void TearDown() override { 107 offload_callback_.clear(); 108 death_recipient_.clear(); 109 } 110 111 sp<NiceMock<MockOffload>> mock_offload_{new NiceMock<MockOffload>()}; 112 sp<OffloadCallback> offload_callback_; 113 sp<OffloadDeathRecipient> death_recipient_; 114 shared_ptr<NiceMock<MockOffloadServiceUtils>> mock_offload_service_utils_{ 115 new NiceMock<MockOffloadServiceUtils>()}; 116 shared_ptr<NiceMock<MockOffloadScanCallbackInterface>> 117 mock_offload_scan_callback_interface_{ 118 new NiceMock<MockOffloadScanCallbackInterface>()}; 119 unique_ptr<OffloadScanManager> offload_scan_manager_; 120 OffloadStatus status; 121 vector<vector<uint8_t>> scan_ssids{kSsid1, kSsid2}; 122 vector<vector<uint8_t>> match_ssids{kSsid1, kSsid2}; 123 vector<uint8_t> security_flags{kNetworkFlags, kNetworkFlags}; 124 vector<uint32_t> frequencies{kFrequency1, kFrequency2}; 125 uint64_t cookie_ = reinterpret_cast<uint64_t>(mock_offload_.get()); 126 }; 127 128 /** 129 * Testing OffloadScanManager for binder death with registered cookie 130 */ 131 TEST_F(OffloadScanManagerTest, BinderDeathRegisteredCookieAndService) { 132 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 133 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 134 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 135 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 136 .WillByDefault(testing::Return(mock_offload_)); 137 offload_scan_manager_.reset(new OffloadScanManager( 138 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 139 EXPECT_CALL(*mock_offload_scan_callback_interface_, OnOffloadError(_)); 140 death_recipient_->serviceDied(cookie_, mock_offload_); 141 EXPECT_EQ(OffloadScanManager::kNoService, 142 offload_scan_manager_->getOffloadStatus()); 143 } 144 145 /** 146 * Testing OffloadScanManager for binder death with invalid cookie 147 */ 148 TEST_F(OffloadScanManagerTest, BinderDeathUnregisteredCookie) { 149 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 150 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 151 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 152 .WillByDefault(testing::Return(mock_offload_)); 153 offload_scan_manager_.reset(new OffloadScanManager( 154 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 155 death_recipient_->serviceDied(kDeathCode, mock_offload_); 156 EXPECT_FALSE(OffloadScanManager::kNoService == 157 offload_scan_manager_->getOffloadStatus()); 158 } 159 160 /** 161 * Testing OffloadScanManager with no handle on Offloal HAL service 162 * and no registered handler for Offload Scan results 163 */ 164 TEST_F(OffloadScanManagerTest, ServiceNotAvailableTest) { 165 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 166 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 167 .WillByDefault(testing::Return(nullptr)); 168 offload_scan_manager_.reset(new OffloadScanManager( 169 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 170 EXPECT_EQ(OffloadScanManager::kNoService, 171 offload_scan_manager_->getOffloadStatus()); 172 } 173 174 /** 175 * Testing OffloadScanManager when service is available and valid handler 176 * registered for Offload Scan results 177 */ 178 TEST_F(OffloadScanManagerTest, ServiceAvailableTest) { 179 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 180 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 181 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 182 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 183 .WillByDefault(testing::Return(mock_offload_)); 184 offload_scan_manager_.reset(new OffloadScanManager( 185 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 186 EXPECT_EQ(OffloadScanManager::kNoError, 187 offload_scan_manager_->getOffloadStatus()); 188 } 189 190 /** 191 * Testing OffloadScanManager when service is available and valid handler 192 * is registered, test to ensure that registered handler is invoked when 193 * scan results are available 194 */ 195 TEST_F(OffloadScanManagerTest, CallbackInvokedTest) { 196 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 197 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 198 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 199 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 200 .WillByDefault(testing::Return(mock_offload_)); 201 EXPECT_CALL(*mock_offload_scan_callback_interface_, OnOffloadScanResult()); 202 offload_scan_manager_.reset(new OffloadScanManager( 203 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 204 vector<ScanResult> dummy_scan_results_ = 205 OffloadTestUtils::createOffloadScanResults(); 206 offload_callback_->onScanResult(dummy_scan_results_); 207 } 208 209 /** 210 * Testing OffloadScanManager when service is available and valid handler 211 * is registered, ensure that error callback is invoked 212 */ 213 TEST_F(OffloadScanManagerTest, ErrorCallbackInvokedTest) { 214 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 215 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 216 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 217 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 218 .WillByDefault(testing::Return(mock_offload_)); 219 offload_scan_manager_.reset(new OffloadScanManager( 220 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 221 OffloadStatus status = 222 OffloadTestUtils::createOffloadStatus(OffloadStatusCode::ERROR); 223 EXPECT_CALL(*mock_offload_scan_callback_interface_, OnOffloadError(_)); 224 offload_callback_->onError(status); 225 EXPECT_EQ(offload_scan_manager_->getOffloadStatus(), 226 OffloadScanManager::kError); 227 } 228 229 /** 230 * Testing OffloadScanManager for subscribing to the scan results from 231 * Offload HAL when service is running without errors 232 */ 233 TEST_F(OffloadScanManagerTest, StartScanTestWhenServiceIsOk) { 234 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 235 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 236 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 237 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 238 .WillByDefault(testing::Return(mock_offload_)); 239 offload_scan_manager_.reset(new OffloadScanManager( 240 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 241 EXPECT_CALL(*mock_offload_, subscribeScanResults(_, _)); 242 EXPECT_CALL(*mock_offload_, configureScans(_, _, _)); 243 OffloadScanManager::ReasonCode reason_code = OffloadScanManager::kNone; 244 bool result = offload_scan_manager_->startScan( 245 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 246 security_flags, frequencies, &reason_code); 247 EXPECT_EQ(result, true); 248 } 249 250 /** 251 * Testing OffloadScanManager for subscribing to the scan results from 252 * Offload HAL when service is not available 253 */ 254 TEST_F(OffloadScanManagerTest, StartScanTestWhenServiceIsNotAvailable) { 255 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()).Times(2); 256 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 257 .WillByDefault(testing::Return(nullptr)); 258 offload_scan_manager_.reset(new OffloadScanManager( 259 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 260 OffloadScanManager::ReasonCode reason_code = OffloadScanManager::kNone; 261 bool result = offload_scan_manager_->startScan( 262 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 263 security_flags, frequencies, &reason_code); 264 EXPECT_EQ(result, false); 265 EXPECT_EQ(reason_code, OffloadScanManager::kNotAvailable); 266 } 267 268 /** 269 * Testing OffloadScanManager for subscribing to the scan results from 270 * Offload HAL when service is not working correctly 271 */ 272 TEST_F(OffloadScanManagerTest, StartScanTestWhenServiceIsNotConnected) { 273 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 274 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 275 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 276 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 277 .WillByDefault(testing::Return(mock_offload_)); 278 offload_scan_manager_.reset(new OffloadScanManager( 279 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 280 OffloadStatus status = 281 OffloadTestUtils::createOffloadStatus(OffloadStatusCode::NO_CONNECTION); 282 offload_callback_->onError(status); 283 OffloadScanManager::ReasonCode reason_code = OffloadScanManager::kNone; 284 bool result = offload_scan_manager_->startScan( 285 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 286 security_flags, frequencies, &reason_code); 287 EXPECT_EQ(result, false); 288 EXPECT_EQ(reason_code, OffloadScanManager::kNotAvailable); 289 } 290 291 /** 292 * Testing OffloadScanManager for subscribing to the scan results from 293 * Offload HAL twice when service is okay 294 */ 295 TEST_F(OffloadScanManagerTest, StartScanTwiceTestWhenServiceIsOk) { 296 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 297 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 298 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 299 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 300 .WillByDefault(testing::Return(mock_offload_)); 301 offload_scan_manager_.reset(new OffloadScanManager( 302 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 303 EXPECT_CALL(*mock_offload_, subscribeScanResults(_, _)).Times(2); 304 EXPECT_CALL(*mock_offload_, configureScans(_, _, _)).Times(2); 305 OffloadScanManager::ReasonCode reason_code = OffloadScanManager::kNone; 306 bool result = offload_scan_manager_->startScan( 307 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 308 security_flags, frequencies, &reason_code); 309 EXPECT_EQ(result, true); 310 result = offload_scan_manager_->startScan( 311 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 312 security_flags, frequencies, &reason_code); 313 EXPECT_EQ(result, true); 314 } 315 316 /** 317 * Testing OffloadScanManager for unsubscribing to the scan results from 318 * Offload HAL when service is ok 319 */ 320 TEST_F(OffloadScanManagerTest, StopScanTestWhenServiceIsOk) { 321 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 322 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 323 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 324 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 325 .WillByDefault(testing::Return(mock_offload_)); 326 offload_scan_manager_.reset(new OffloadScanManager( 327 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 328 EXPECT_CALL(*mock_offload_, subscribeScanResults(_, _)); 329 EXPECT_CALL(*mock_offload_, configureScans(_, _, _)); 330 EXPECT_CALL(*mock_offload_, unsubscribeScanResults()); 331 OffloadScanManager::ReasonCode reason_code = OffloadScanManager::kNone; 332 bool result = offload_scan_manager_->startScan( 333 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 334 security_flags, frequencies, &reason_code); 335 EXPECT_EQ(result, true); 336 result = offload_scan_manager_->stopScan(&reason_code); 337 EXPECT_EQ(result, true); 338 } 339 340 /** 341 * Testing OffloadScanManager for unsubscribing to the scan results from 342 * when service is not connected to the hardware 343 */ 344 TEST_F(OffloadScanManagerTest, StopScanTestWhenServiceIsNotConnectedAnymore) { 345 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 346 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 347 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 348 .WillByDefault(testing::Return(mock_offload_)); 349 offload_scan_manager_.reset(new OffloadScanManager( 350 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 351 EXPECT_CALL(*mock_offload_, subscribeScanResults(_, _)); 352 EXPECT_CALL(*mock_offload_, configureScans(_, _, _)); 353 OffloadScanManager::ReasonCode reason_code = OffloadScanManager::kNone; 354 bool result = offload_scan_manager_->startScan( 355 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 356 security_flags, frequencies, &reason_code); 357 EXPECT_EQ(result, true); 358 OffloadStatus status = 359 OffloadTestUtils::createOffloadStatus(OffloadStatusCode::NO_CONNECTION); 360 offload_callback_->onError(status); 361 result = offload_scan_manager_->stopScan(&reason_code); 362 EXPECT_EQ(result, false); 363 } 364 365 /** 366 * Testing OffloadScanManager for getting scan statistics when the 367 * Offload HAL service is running without errors 368 */ 369 TEST_F(OffloadScanManagerTest, getScanStatsTestWhenServiceIsOk) { 370 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 371 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 372 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 373 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 374 .WillByDefault(testing::Return(mock_offload_)); 375 offload_scan_manager_.reset(new OffloadScanManager( 376 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 377 EXPECT_CALL(*mock_offload_, getScanStats(_)); 378 NativeScanStats stats; 379 bool result = offload_scan_manager_->getScanStats(&stats); 380 EXPECT_EQ(result, true); 381 } 382 383 /** 384 * Testing OffloadScanManager for getting scan statistics when the 385 * Offload HAL service is not connected 386 */ 387 TEST_F(OffloadScanManagerTest, getScanStatsTestWhenServiceIsNotOk) { 388 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 389 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 390 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 391 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 392 .WillByDefault(testing::Return(mock_offload_)); 393 offload_scan_manager_.reset(new OffloadScanManager( 394 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 395 OffloadStatus status = 396 OffloadTestUtils::createOffloadStatus(OffloadStatusCode::NO_CONNECTION); 397 offload_callback_->onError(status); 398 EXPECT_CALL(*mock_offload_, getScanStats(_)).Times(0); 399 NativeScanStats stats; 400 bool result = offload_scan_manager_->getScanStats(&stats); 401 EXPECT_EQ(result, false); 402 } 403 404 /** 405 * Testing OffloadScanManager for subscribing to the scan results from 406 * Offload HAL when service is running without errors, operation failure 407 */ 408 TEST_F(OffloadScanManagerTest, StartScanFailedTest) { 409 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 410 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 411 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 412 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 413 .WillByDefault(testing::Return(mock_offload_)); 414 offload_scan_manager_.reset(new OffloadScanManager( 415 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 416 EXPECT_CALL(*mock_offload_, subscribeScanResults(_, _)).Times(0); 417 EXPECT_CALL(*mock_offload_, configureScans(_, _, _)).Times(1); 418 status = OffloadTestUtils::createOffloadStatus(OffloadStatusCode::ERROR); 419 OffloadScanManager::ReasonCode reason_code = OffloadScanManager::kNone; 420 bool result = offload_scan_manager_->startScan( 421 kDisconnectedModeScanIntervalMs, kRssiThreshold, scan_ssids, match_ssids, 422 security_flags, frequencies, &reason_code); 423 EXPECT_EQ(result, false); 424 EXPECT_EQ(reason_code, OffloadScanManager::kOperationFailed); 425 } 426 427 /** 428 * Testing OffloadScanManager for getting scan statistics when the 429 * Offload HAL service is running without errors, getting scan stats failure 430 */ 431 TEST_F(OffloadScanManagerTest, getScanStatsFailedTest) { 432 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadService()); 433 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadCallback(_)); 434 EXPECT_CALL(*mock_offload_service_utils_, GetOffloadDeathRecipient(_)); 435 ON_CALL(*mock_offload_service_utils_, GetOffloadService()) 436 .WillByDefault(testing::Return(mock_offload_)); 437 offload_scan_manager_.reset(new OffloadScanManager( 438 mock_offload_service_utils_, mock_offload_scan_callback_interface_)); 439 status = OffloadTestUtils::createOffloadStatus(OffloadStatusCode::TIMEOUT); 440 EXPECT_CALL(*mock_offload_, getScanStats(_)); 441 NativeScanStats stats; 442 bool result = offload_scan_manager_->getScanStats(&stats); 443 EXPECT_EQ(result, false); 444 } 445 446 } // namespace wificond 447 } // namespace android 448