1 // 2 // Copyright (C) 2012 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 "shill/manager.h" 18 19 #include <map> 20 #include <memory> 21 #include <set> 22 23 #include <base/files/file_util.h> 24 #include <base/files/scoped_temp_dir.h> 25 #include <base/stl_util.h> 26 #include <base/strings/stringprintf.h> 27 #if defined(__ANDROID__) 28 #include <dbus/service_constants.h> 29 #else 30 #include <chromeos/dbus/service_constants.h> 31 #endif // __ANDROID__ 32 #include <gmock/gmock.h> 33 #include <gtest/gtest.h> 34 35 #include "shill/adaptor_interfaces.h" 36 #include "shill/ephemeral_profile.h" 37 #include "shill/error.h" 38 #include "shill/fake_store.h" 39 #include "shill/geolocation_info.h" 40 #include "shill/key_value_store.h" 41 #include "shill/link_monitor.h" 42 #include "shill/logging.h" 43 #include "shill/mock_adaptors.h" 44 #include "shill/mock_connection.h" 45 #include "shill/mock_control.h" 46 #include "shill/mock_crypto_util_proxy.h" 47 #include "shill/mock_device.h" 48 #include "shill/mock_device_claimer.h" 49 #include "shill/mock_device_info.h" 50 #include "shill/mock_log.h" 51 #include "shill/mock_metrics.h" 52 #include "shill/mock_power_manager.h" 53 #include "shill/mock_profile.h" 54 #include "shill/mock_resolver.h" 55 #include "shill/mock_service.h" 56 #include "shill/mock_store.h" 57 #include "shill/portal_detector.h" 58 #include "shill/property_store_unittest.h" 59 #include "shill/resolver.h" 60 #include "shill/service_under_test.h" 61 #include "shill/store_factory.h" 62 #include "shill/testing.h" 63 #include "shill/upstart/mock_upstart.h" 64 #include "shill/wimax/wimax_service.h" 65 66 #if !defined(DISABLE_WIFI) 67 #include "shill/wifi/mock_wifi_provider.h" 68 #include "shill/wifi/mock_wifi_service.h" 69 #include "shill/wifi/wifi_service.h" 70 #if defined(__BRILLO__) 71 #include "shill/wifi/mock_wifi_driver_hal.h" 72 #endif // __BRILLO__ 73 #endif // DISABLE_WIFI 74 75 #if !defined(DISABLE_WIRED_8021X) 76 #include "shill/ethernet/mock_ethernet_eap_provider.h" 77 #endif // DISABLE_WIRED_8021X 78 79 using base::Bind; 80 using base::FilePath; 81 using base::ScopedTempDir; 82 using base::Unretained; 83 using std::map; 84 using std::set; 85 using std::string; 86 using std::vector; 87 88 namespace shill { 89 using ::testing::_; 90 using ::testing::AnyNumber; 91 using ::testing::AtLeast; 92 using ::testing::ContainerEq; 93 using ::testing::DoAll; 94 using ::testing::ElementsAre; 95 using ::testing::HasSubstr; 96 using ::testing::InSequence; 97 using ::testing::Invoke; 98 using ::testing::Mock; 99 using ::testing::Ne; 100 using ::testing::NiceMock; 101 using ::testing::Ref; 102 using ::testing::Return; 103 using ::testing::ReturnNull; 104 using ::testing::ReturnRef; 105 using ::testing::SaveArg; 106 using ::testing::SetArgumentPointee; 107 using ::testing::StrEq; 108 using ::testing::StrictMock; 109 using ::testing::Test; 110 using ::testing::WithArg; 111 112 class ManagerTest : public PropertyStoreTest { 113 public: 114 ManagerTest() 115 : power_manager_(new MockPowerManager(nullptr, control_interface())), 116 device_info_(new NiceMock<MockDeviceInfo>(control_interface(), 117 nullptr, 118 nullptr, 119 nullptr)), 120 manager_adaptor_(new NiceMock<ManagerMockAdaptor>()), 121 #if !defined(DISABLE_WIRED_8021X) 122 ethernet_eap_provider_(new NiceMock<MockEthernetEapProvider>()), 123 #endif // DISABLE_WIRED_8021X 124 #if !defined(DISABLE_WIFI) 125 wifi_provider_(new NiceMock<MockWiFiProvider>()), 126 #endif // DISABLE_WIFI 127 crypto_util_proxy_( 128 new NiceMock<MockCryptoUtilProxy>(dispatcher())), 129 upstart_(new NiceMock<MockUpstart>(control_interface())) { 130 ON_CALL(*control_interface(), CreatePowerManagerProxy(_, _, _)) 131 .WillByDefault(ReturnNull()); 132 133 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 134 dispatcher(), 135 metrics(), 136 manager(), 137 "null0", 138 "addr0", 139 0)); 140 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 141 dispatcher(), 142 metrics(), 143 manager(), 144 "null1", 145 "addr1", 146 1)); 147 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 148 dispatcher(), 149 metrics(), 150 manager(), 151 "null2", 152 "addr2", 153 2)); 154 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 155 dispatcher(), 156 metrics(), 157 manager(), 158 "null3", 159 "addr3", 160 3)); 161 manager()->connect_profiles_to_rpc_ = false; 162 SetRunning(true); 163 164 // Replace the manager's adaptor with a quieter one, and one 165 // we can do EXPECT*() against. Passes ownership. 166 manager()->adaptor_.reset(manager_adaptor_); 167 168 #if !defined(DISABLE_WIRED_8021X) 169 // Replace the manager's Ethernet EAP provider with our mock. 170 // Passes ownership. 171 manager()->ethernet_eap_provider_.reset(ethernet_eap_provider_); 172 #endif // DISABLE_WIRED_8021X 173 174 #if !defined(DISABLE_WIFI) 175 // Replace the manager's WiFi provider with our mock. Passes 176 // ownership. 177 manager()->wifi_provider_.reset(wifi_provider_); 178 #if defined(__BRILLO__) 179 manager()->wifi_driver_hal_ = &wifi_driver_hal_; 180 #endif // __BRILLO__ 181 #endif // DISABLE_WIFI 182 183 // Update the manager's map from technology to provider. 184 manager()->UpdateProviderMapping(); 185 186 // Replace the manager's crypto util proxy with our mock. Passes 187 // ownership. 188 manager()->crypto_util_proxy_.reset(crypto_util_proxy_); 189 190 // Replace the manager's upstart instance with our mock. Passes 191 // ownership. 192 manager()->upstart_.reset(upstart_); 193 } 194 virtual ~ManagerTest() {} 195 196 void SetMetrics(Metrics* metrics) { 197 manager()->set_metrics(metrics); 198 } 199 200 bool IsDeviceRegistered(const DeviceRefPtr& device, 201 Technology::Identifier tech) { 202 auto devices = manager()->FilterByTechnology(tech); 203 return (devices.size() == 1 && devices[0].get() == device.get()); 204 } 205 bool ServiceOrderIs(ServiceRefPtr svc1, ServiceRefPtr svc2); 206 207 void AdoptProfile(Manager* manager, ProfileRefPtr profile) { 208 manager->profiles_.push_back(profile); 209 } 210 211 void SetRunning(bool running) { 212 manager()->running_ = running; 213 } 214 215 ProfileRefPtr GetEphemeralProfile(Manager* manager) { 216 return manager->ephemeral_profile_; 217 } 218 219 vector<ProfileRefPtr>& GetProfiles(Manager* manager) { 220 return manager->profiles_; 221 } 222 223 Profile* CreateProfileForManager(Manager* manager) { 224 Profile::Identifier id("rather", "irrelevant"); 225 std::unique_ptr<FakeStore> storage(new FakeStore()); 226 if (!storage->Open()) 227 return nullptr; 228 Profile* profile(new Profile( 229 control_interface(), metrics(), manager, id, FilePath(), false)); 230 profile->set_storage(storage.release()); // Passes ownership of "storage". 231 return profile; // Passes ownership of "profile". 232 } 233 234 bool CreateBackingStoreForService(ScopedTempDir* temp_dir, 235 const string& user_identifier, 236 const string& profile_identifier, 237 const string& service_name) { 238 std::unique_ptr<StoreInterface> store( 239 StoreFactory::GetInstance()->CreateStore( 240 Profile::GetFinalStoragePath( 241 temp_dir->path(), 242 Profile::Identifier(user_identifier, 243 profile_identifier)))); 244 return store->Open() && 245 store->SetString(service_name, "rather", "irrelevant") && 246 store->Close(); 247 } 248 249 Error::Type TestCreateProfile(Manager* manager, const string& name) { 250 Error error; 251 string path; 252 manager->CreateProfile(name, &path, &error); 253 return error.type(); 254 } 255 256 Error::Type TestPopAnyProfile(Manager* manager) { 257 Error error; 258 manager->PopAnyProfile(&error); 259 return error.type(); 260 } 261 262 Error::Type TestPopAllUserProfiles(Manager* manager) { 263 Error error; 264 manager->PopAllUserProfiles(&error); 265 return error.type(); 266 } 267 268 Error::Type TestPopProfile(Manager* manager, const string& name) { 269 Error error; 270 manager->PopProfile(name, &error); 271 return error.type(); 272 } 273 274 Error::Type TestPushProfile(Manager* manager, const string& name) { 275 Error error; 276 string path; 277 manager->PushProfile(name, &path, &error); 278 return error.type(); 279 } 280 281 Error::Type TestInsertUserProfile(Manager* manager, 282 const string& name, 283 const string& user_hash) { 284 Error error; 285 string path; 286 manager->InsertUserProfile(name, user_hash, &path, &error); 287 return error.type(); 288 } 289 290 scoped_refptr<MockProfile> AddNamedMockProfileToManager( 291 Manager* manager, const string& name) { 292 scoped_refptr<MockProfile> profile( 293 new MockProfile(control_interface(), metrics(), manager, "")); 294 EXPECT_CALL(*profile, GetRpcIdentifier()).WillRepeatedly(Return(name)); 295 EXPECT_CALL(*profile, UpdateDevice(_)).WillRepeatedly(Return(false)); 296 AdoptProfile(manager, profile); 297 return profile; 298 } 299 300 void AddMockProfileToManager(Manager* manager) { 301 AddNamedMockProfileToManager(manager, "/"); 302 } 303 304 void CompleteServiceSort() { 305 EXPECT_TRUE(IsSortServicesTaskPending()); 306 dispatcher()->DispatchPendingEvents(); 307 EXPECT_FALSE(IsSortServicesTaskPending()); 308 } 309 310 bool IsSortServicesTaskPending() { 311 return !manager()->sort_services_task_.IsCancelled(); 312 } 313 314 void RefreshConnectionState() { 315 manager()->RefreshConnectionState(); 316 } 317 318 RpcIdentifier GetDefaultServiceRpcIdentifier() { 319 return manager()->GetDefaultServiceRpcIdentifier(nullptr); 320 } 321 322 void SetResolver(Resolver* resolver) { 323 manager()->resolver_ = resolver; 324 } 325 326 bool SetIgnoredDNSSearchPaths(const string& search_paths, Error* error) { 327 return manager()->SetIgnoredDNSSearchPaths(search_paths, error); 328 } 329 330 bool SetCheckPortalList(const string& check_portal_list, Error* error) { 331 return manager()->SetCheckPortalList(check_portal_list, error); 332 } 333 334 const string& GetIgnoredDNSSearchPaths() { 335 return manager()->props_.ignored_dns_search_paths; 336 } 337 338 #if !defined(DISABLE_WIFI) 339 WiFiServiceRefPtr ReleaseTempMockService() { 340 // Take a reference to hold during this function. 341 WiFiServiceRefPtr temp_service = temp_mock_service_; 342 temp_mock_service_ = nullptr; 343 return temp_service; 344 } 345 #endif // DISABLE_WIFI 346 347 void SetDeviceClaimer(DeviceClaimer* device_claimer) { 348 manager()->device_claimer_.reset(device_claimer); 349 } 350 351 void VerifyPassiveMode() { 352 EXPECT_NE(nullptr, manager()->device_claimer_.get()); 353 EXPECT_TRUE(manager()->device_claimer_->default_claimer()); 354 } 355 356 protected: 357 typedef scoped_refptr<MockService> MockServiceRefPtr; 358 359 class ServiceWatcher : public base::SupportsWeakPtr<ServiceWatcher> { 360 public: 361 ServiceWatcher() {} 362 virtual ~ServiceWatcher() {} 363 364 MOCK_METHOD1(OnDefaultServiceChanged, void(const ServiceRefPtr& service)); 365 366 private: 367 DISALLOW_COPY_AND_ASSIGN(ServiceWatcher); 368 }; 369 370 class TerminationActionTest : 371 public base::SupportsWeakPtr<TerminationActionTest> { 372 public: 373 static const char kActionName[]; 374 375 TerminationActionTest() : manager_(nullptr) {} 376 virtual ~TerminationActionTest() {} 377 378 MOCK_METHOD1(Done, void(const Error& error)); 379 380 void Action() { 381 manager_->TerminationActionComplete("action"); 382 } 383 384 void set_manager(Manager* manager) { manager_ = manager; } 385 386 private: 387 Manager* manager_; 388 DISALLOW_COPY_AND_ASSIGN(TerminationActionTest); 389 }; 390 391 class DestinationVerificationTest : 392 public base::SupportsWeakPtr<DestinationVerificationTest> { 393 public: 394 DestinationVerificationTest() {} 395 virtual ~DestinationVerificationTest() {} 396 397 MOCK_METHOD2(ResultBoolCallbackStub, void(const Error& result, bool flag)); 398 MOCK_METHOD2(ResultStringCallbackStub, void(const Error& result, 399 const string& value)); 400 private: 401 DISALLOW_COPY_AND_ASSIGN(DestinationVerificationTest); 402 }; 403 404 class DisableTechnologyReplyHandler : 405 public base::SupportsWeakPtr<DisableTechnologyReplyHandler> { 406 public: 407 DisableTechnologyReplyHandler() {} 408 virtual ~DisableTechnologyReplyHandler() {} 409 410 MOCK_METHOD1(ReportResult, void(const Error&)); 411 412 private: 413 DISALLOW_COPY_AND_ASSIGN(DisableTechnologyReplyHandler); 414 }; 415 416 class ResultCallbackObserver { 417 public: 418 ResultCallbackObserver() 419 : result_callback_( 420 Bind(&ResultCallbackObserver::OnResultCallback, 421 Unretained(this))) {} 422 virtual ~ResultCallbackObserver() {} 423 424 MOCK_METHOD1(OnResultCallback, void(const Error& error)); 425 426 const ResultCallback& result_callback() const { 427 return result_callback_; 428 } 429 430 private: 431 ResultCallback result_callback_; 432 433 DISALLOW_COPY_AND_ASSIGN(ResultCallbackObserver); 434 }; 435 436 void SetSuspending(bool suspending) { 437 power_manager_->suspending_ = suspending; 438 } 439 440 void SetPowerManager() { 441 manager()->set_power_manager(power_manager_.release()); 442 } 443 444 HookTable* GetTerminationActions() { 445 return &manager()->termination_actions_; 446 } 447 448 void OnSuspendImminent() { 449 manager()->OnSuspendImminent(); 450 } 451 452 void OnDarkSuspendImminent() { 453 manager()->OnDarkSuspendImminent(); 454 } 455 456 void OnSuspendDone() { 457 manager()->OnSuspendDone(); 458 } 459 460 void OnSuspendActionsComplete(const Error& error) { 461 manager()->OnSuspendActionsComplete(error); 462 } 463 464 vector<string> EnumerateAvailableServices() { 465 return manager()->EnumerateAvailableServices(nullptr); 466 } 467 468 vector<string> EnumerateWatchedServices() { 469 return manager()->EnumerateWatchedServices(nullptr); 470 } 471 472 MockServiceRefPtr MakeAutoConnectableService() { 473 MockServiceRefPtr service = new NiceMock<MockService>(control_interface(), 474 dispatcher(), 475 metrics(), 476 manager()); 477 service->SetAutoConnect(true); 478 service->SetConnectable(true); 479 return service; 480 } 481 482 #if !defined(DISABLE_WIRED_8021X) 483 void SetEapProviderService(const ServiceRefPtr& service) { 484 ethernet_eap_provider_->set_service(service); 485 } 486 #endif // DISABLE_WIRED_8021X 487 488 const std::vector<Technology::Identifier>& GetTechnologyOrder() { 489 return manager()->technology_order_; 490 } 491 492 std::unique_ptr<MockPowerManager> power_manager_; 493 vector<scoped_refptr<MockDevice>> mock_devices_; 494 std::unique_ptr<MockDeviceInfo> device_info_; 495 496 #if !defined(DISABLE_WIFI) 497 // This service is held for the manager, and given ownership in a mock 498 // function. This ensures that when the Manager takes ownership, there 499 // is only one reference left. 500 scoped_refptr<MockWiFiService> temp_mock_service_; 501 #endif // DISABLE_WIFI 502 503 // These pointers are owned by the manager, and only tracked here for 504 // EXPECT*() 505 ManagerMockAdaptor* manager_adaptor_; 506 #if !defined(DISABLE_WIRED_8021X) 507 MockEthernetEapProvider* ethernet_eap_provider_; 508 #endif // DISABLE_WIRED_8021X 509 #if !defined(DISABLE_WIFI) 510 MockWiFiProvider* wifi_provider_; 511 #if defined(__BRILLO__) 512 MockWiFiDriverHal wifi_driver_hal_; 513 #endif // __BRILLO__ 514 #endif // DISABLE_WIFI 515 MockCryptoUtilProxy* crypto_util_proxy_; 516 MockUpstart* upstart_; 517 }; 518 519 const char ManagerTest::TerminationActionTest::kActionName[] = "action"; 520 521 bool ManagerTest::ServiceOrderIs(ServiceRefPtr svc0, ServiceRefPtr svc1) { 522 if (!manager()->sort_services_task_.IsCancelled()) { 523 manager()->SortServicesTask(); 524 } 525 return (svc0.get() == manager()->services_[0].get() && 526 svc1.get() == manager()->services_[1].get()); 527 } 528 529 void SetErrorPermissionDenied(Error* error) { 530 error->Populate(Error::kPermissionDenied); 531 } 532 533 void SetErrorSuccess(Error* error) { 534 error->Reset(); 535 } 536 537 MATCHER_P(IsError, error, "") { 538 return arg.type() == error->type() && 539 arg.message() == error->message(); 540 } 541 542 TEST_F(ManagerTest, Contains) { 543 EXPECT_TRUE(manager()->store().Contains(kStateProperty)); 544 EXPECT_FALSE(manager()->store().Contains("")); 545 } 546 547 TEST_F(ManagerTest, PassiveModeDeviceRegistration) { 548 manager()->SetPassiveMode(); 549 VerifyPassiveMode(); 550 551 // Setup mock device claimer. 552 MockDeviceClaimer* device_claimer = new MockDeviceClaimer(""); 553 SetDeviceClaimer(device_claimer); 554 EXPECT_CALL(*device_claimer, default_claimer()).WillRepeatedly(Return(true)); 555 556 ON_CALL(*mock_devices_[0].get(), technology()) 557 .WillByDefault(Return(Technology::kEthernet)); 558 ON_CALL(*mock_devices_[1].get(), technology()) 559 .WillByDefault(Return(Technology::kWifi)); 560 561 // Device not released, should not be registered. 562 EXPECT_CALL(*device_claimer, IsDeviceReleased(mock_devices_[0]->link_name())) 563 .WillOnce(Return(false)); 564 EXPECT_CALL(*device_claimer, Claim(mock_devices_[0]->link_name(), _)) 565 .Times(1); 566 manager()->RegisterDevice(mock_devices_[0]); 567 EXPECT_FALSE(IsDeviceRegistered(mock_devices_[0], Technology::kEthernet)); 568 569 // Device is released, should be registered. 570 EXPECT_CALL(*device_claimer, IsDeviceReleased(mock_devices_[1]->link_name())) 571 .WillOnce(Return(true)); 572 EXPECT_CALL(*device_claimer, Claim(mock_devices_[1]->link_name(), _)) 573 .Times(0); 574 manager()->RegisterDevice(mock_devices_[1]); 575 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[1], Technology::kWifi)); 576 } 577 578 TEST_F(ManagerTest, DeviceRegistration) { 579 ON_CALL(*mock_devices_[0].get(), technology()) 580 .WillByDefault(Return(Technology::kEthernet)); 581 ON_CALL(*mock_devices_[1].get(), technology()) 582 .WillByDefault(Return(Technology::kWifi)); 583 ON_CALL(*mock_devices_[2].get(), technology()) 584 .WillByDefault(Return(Technology::kCellular)); 585 586 manager()->RegisterDevice(mock_devices_[0]); 587 manager()->RegisterDevice(mock_devices_[1]); 588 manager()->RegisterDevice(mock_devices_[2]); 589 590 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[0], Technology::kEthernet)); 591 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[1], Technology::kWifi)); 592 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[2], Technology::kCellular)); 593 } 594 595 TEST_F(ManagerTest, DeviceRegistrationAndStart) { 596 manager()->running_ = true; 597 mock_devices_[0]->enabled_persistent_ = true; 598 mock_devices_[1]->enabled_persistent_ = false; 599 EXPECT_CALL(*mock_devices_[0].get(), SetEnabled(true)) 600 .Times(1); 601 EXPECT_CALL(*mock_devices_[1].get(), SetEnabled(_)) 602 .Times(0); 603 manager()->RegisterDevice(mock_devices_[0]); 604 manager()->RegisterDevice(mock_devices_[1]); 605 } 606 607 TEST_F(ManagerTest, DeviceRegistrationWithProfile) { 608 MockProfile* profile = 609 new MockProfile(control_interface(), metrics(), manager(), ""); 610 DeviceRefPtr device_ref(mock_devices_[0].get()); 611 AdoptProfile(manager(), profile); // Passes ownership. 612 EXPECT_CALL(*profile, ConfigureDevice(device_ref)); 613 EXPECT_CALL(*profile, UpdateDevice(device_ref)); 614 manager()->RegisterDevice(mock_devices_[0]); 615 } 616 617 TEST_F(ManagerTest, DeviceDeregistration) { 618 ON_CALL(*mock_devices_[0].get(), technology()) 619 .WillByDefault(Return(Technology::kEthernet)); 620 ON_CALL(*mock_devices_[1].get(), technology()) 621 .WillByDefault(Return(Technology::kWifi)); 622 623 manager()->RegisterDevice(mock_devices_[0]); 624 manager()->RegisterDevice(mock_devices_[1]); 625 626 ASSERT_TRUE(IsDeviceRegistered(mock_devices_[0], Technology::kEthernet)); 627 ASSERT_TRUE(IsDeviceRegistered(mock_devices_[1], Technology::kWifi)); 628 629 MockProfile* profile = 630 new MockProfile(control_interface(), metrics(), manager(), ""); 631 AdoptProfile(manager(), profile); // Passes ownership. 632 633 EXPECT_CALL(*mock_devices_[0].get(), SetEnabled(false)); 634 EXPECT_CALL(*profile, UpdateDevice(DeviceRefPtr(mock_devices_[0]))); 635 manager()->DeregisterDevice(mock_devices_[0]); 636 EXPECT_FALSE(IsDeviceRegistered(mock_devices_[0], Technology::kEthernet)); 637 638 EXPECT_CALL(*mock_devices_[1].get(), SetEnabled(false)); 639 EXPECT_CALL(*profile, UpdateDevice(DeviceRefPtr(mock_devices_[1]))); 640 manager()->DeregisterDevice(mock_devices_[1]); 641 EXPECT_FALSE(IsDeviceRegistered(mock_devices_[1], Technology::kWifi)); 642 } 643 644 TEST_F(ManagerTest, ServiceRegistration) { 645 Manager manager(control_interface(), 646 dispatcher(), 647 metrics(), 648 run_path(), 649 storage_path(), 650 string()); 651 ProfileRefPtr profile(CreateProfileForManager(&manager)); 652 ASSERT_TRUE(profile.get()); 653 AdoptProfile(&manager, profile); 654 655 scoped_refptr<MockService> mock_service( 656 new NiceMock<MockService>(control_interface(), 657 dispatcher(), 658 metrics(), 659 &manager)); 660 scoped_refptr<MockService> mock_service2( 661 new NiceMock<MockService>(control_interface(), 662 dispatcher(), 663 metrics(), 664 &manager)); 665 666 string service1_name(mock_service->unique_name()); 667 string service2_name(mock_service2->unique_name()); 668 669 EXPECT_CALL(*mock_service.get(), GetRpcIdentifier()) 670 .WillRepeatedly(Return(service1_name)); 671 EXPECT_CALL(*mock_service2.get(), GetRpcIdentifier()) 672 .WillRepeatedly(Return(service2_name)); 673 // TODO(quiche): make this EXPECT_CALL work (crbug.com/203247) 674 // EXPECT_CALL(*static_cast<ManagerMockAdaptor*>(manager.adaptor_.get()), 675 // EmitRpcIdentifierArrayChanged(kServicesProperty, _)); 676 677 manager.RegisterService(mock_service); 678 manager.RegisterService(mock_service2); 679 680 Error error; 681 vector<string> rpc_ids = manager.EnumerateAvailableServices(&error); 682 set<string> ids(rpc_ids.begin(), rpc_ids.end()); 683 EXPECT_EQ(2, ids.size()); 684 EXPECT_TRUE(ContainsKey(ids, mock_service->GetRpcIdentifier())); 685 EXPECT_TRUE(ContainsKey(ids, mock_service2->GetRpcIdentifier())); 686 687 EXPECT_NE(nullptr, manager.FindService(service1_name).get()); 688 EXPECT_NE(nullptr, manager.FindService(service2_name).get()); 689 690 manager.set_power_manager(power_manager_.release()); 691 manager.Stop(); 692 } 693 694 TEST_F(ManagerTest, RegisterKnownService) { 695 Manager manager(control_interface(), 696 dispatcher(), 697 metrics(), 698 run_path(), 699 storage_path(), 700 string()); 701 ProfileRefPtr profile(CreateProfileForManager(&manager)); 702 ASSERT_TRUE(profile.get()); 703 AdoptProfile(&manager, profile); 704 { 705 ServiceRefPtr service1(new ServiceUnderTest(control_interface(), 706 dispatcher(), 707 metrics(), 708 &manager)); 709 ASSERT_TRUE(profile->AdoptService(service1)); 710 ASSERT_TRUE(profile->ContainsService(service1)); 711 } // Force destruction of service1. 712 713 ServiceRefPtr service2(new ServiceUnderTest(control_interface(), 714 dispatcher(), 715 metrics(), 716 &manager)); 717 manager.RegisterService(service2); 718 EXPECT_EQ(service2->profile().get(), profile.get()); 719 720 manager.set_power_manager(power_manager_.release()); 721 manager.Stop(); 722 } 723 724 TEST_F(ManagerTest, RegisterUnknownService) { 725 Manager manager(control_interface(), 726 dispatcher(), 727 metrics(), 728 run_path(), 729 storage_path(), 730 string()); 731 ProfileRefPtr profile(CreateProfileForManager(&manager)); 732 ASSERT_TRUE(profile.get()); 733 AdoptProfile(&manager, profile); 734 { 735 ServiceRefPtr service1(new ServiceUnderTest(control_interface(), 736 dispatcher(), 737 metrics(), 738 &manager)); 739 ASSERT_TRUE(profile->AdoptService(service1)); 740 ASSERT_TRUE(profile->ContainsService(service1)); 741 } // Force destruction of service1. 742 scoped_refptr<MockService> mock_service2( 743 new NiceMock<MockService>(control_interface(), 744 dispatcher(), 745 metrics(), 746 &manager)); 747 EXPECT_CALL(*mock_service2.get(), GetStorageIdentifier()) 748 .WillRepeatedly(Return(mock_service2->unique_name())); 749 manager.RegisterService(mock_service2); 750 EXPECT_NE(mock_service2->profile().get(), profile.get()); 751 752 manager.set_power_manager(power_manager_.release()); 753 manager.Stop(); 754 } 755 756 TEST_F(ManagerTest, DeregisterUnregisteredService) { 757 // WiFi assumes that it can deregister a service that is not 758 // registered. (E.g. a hidden service can be deregistered when it 759 // loses its last endpoint, and again when WiFi is Stop()-ed.) 760 // 761 // So test that doing so doesn't cause a crash. 762 MockServiceRefPtr service = new NiceMock<MockService>(control_interface(), 763 dispatcher(), 764 metrics(), 765 manager()); 766 manager()->DeregisterService(service); 767 } 768 769 TEST_F(ManagerTest, GetProperties) { 770 AddMockProfileToManager(manager()); 771 { 772 brillo::VariantDictionary props; 773 Error error; 774 string expected("portal_list"); 775 manager()->mutable_store()->SetStringProperty( 776 kCheckPortalListProperty, 777 expected, 778 &error); 779 manager()->store().GetProperties(&props, &error); 780 ASSERT_FALSE(props.find(kCheckPortalListProperty) == props.end()); 781 EXPECT_TRUE(props[kCheckPortalListProperty].IsTypeCompatible<string>()); 782 EXPECT_EQ(props[kCheckPortalListProperty].Get<string>(), expected); 783 } 784 { 785 brillo::VariantDictionary props; 786 Error error; 787 bool expected = true; 788 manager()->mutable_store()->SetBoolProperty(kOfflineModeProperty, 789 expected, 790 &error); 791 manager()->store().GetProperties(&props, &error); 792 ASSERT_FALSE(props.find(kOfflineModeProperty) == props.end()); 793 EXPECT_TRUE(props[kOfflineModeProperty].IsTypeCompatible<bool>()); 794 EXPECT_EQ(props[kOfflineModeProperty].Get<bool>(), expected); 795 } 796 } 797 798 TEST_F(ManagerTest, GetDevicesProperty) { 799 AddMockProfileToManager(manager()); 800 manager()->RegisterDevice(mock_devices_[0]); 801 manager()->RegisterDevice(mock_devices_[1]); 802 { 803 brillo::VariantDictionary props; 804 Error error; 805 manager()->store().GetProperties(&props, &error); 806 ASSERT_FALSE(props.find(kDevicesProperty) == props.end()); 807 EXPECT_TRUE( 808 props[kDevicesProperty].IsTypeCompatible<vector<dbus::ObjectPath>>()); 809 vector <dbus::ObjectPath> devices = 810 props[kDevicesProperty].Get<vector<dbus::ObjectPath>>(); 811 EXPECT_EQ(2, devices.size()); 812 } 813 } 814 815 TEST_F(ManagerTest, GetServicesProperty) { 816 AddMockProfileToManager(manager()); 817 brillo::VariantDictionary props; 818 Error error; 819 manager()->store().GetProperties(&props, &error); 820 ASSERT_FALSE(props.find(kServicesProperty) == props.end()); 821 EXPECT_TRUE( 822 props[kServicesProperty].IsTypeCompatible<vector<dbus::ObjectPath>>()); 823 } 824 825 TEST_F(ManagerTest, MoveService) { 826 Manager manager(control_interface(), 827 dispatcher(), 828 metrics(), 829 run_path(), 830 storage_path(), 831 string()); 832 scoped_refptr<MockService> s2(new MockService(control_interface(), 833 dispatcher(), 834 metrics(), 835 &manager)); 836 // Inject an actual profile, backed by a fake StoreInterface 837 { 838 Profile::Identifier id("irrelevant"); 839 ProfileRefPtr profile(new Profile( 840 control_interface(), metrics(), &manager, id, FilePath(), false)); 841 MockStore* storage = new MockStore; 842 EXPECT_CALL(*storage, ContainsGroup(s2->GetStorageIdentifier())) 843 .WillRepeatedly(Return(true)); 844 EXPECT_CALL(*storage, Flush()) 845 .Times(AnyNumber()) 846 .WillRepeatedly(Return(true)); 847 profile->set_storage(storage); 848 AdoptProfile(&manager, profile); 849 } 850 // Create a profile that already has |s2| in it. 851 ProfileRefPtr profile( 852 new EphemeralProfile(control_interface(), metrics(), &manager)); 853 EXPECT_TRUE(profile->AdoptService(s2)); 854 855 // Now, move the Service |s2| to another profile. 856 EXPECT_CALL(*s2.get(), Save(_)).WillOnce(Return(true)); 857 ASSERT_TRUE(manager.MoveServiceToProfile(s2, manager.ActiveProfile())); 858 859 // Force destruction of the original Profile, to ensure that the Service 860 // is kept alive and populated with data. 861 profile = nullptr; 862 ASSERT_TRUE(manager.ActiveProfile()->ContainsService(s2)); 863 manager.set_power_manager(power_manager_.release()); 864 manager.Stop(); 865 } 866 867 TEST_F(ManagerTest, LookupProfileByRpcIdentifier) { 868 scoped_refptr<MockProfile> mock_profile( 869 new MockProfile(control_interface(), metrics(), manager(), "")); 870 const string kProfileName("profile0"); 871 EXPECT_CALL(*mock_profile, GetRpcIdentifier()) 872 .WillRepeatedly(Return(kProfileName)); 873 AdoptProfile(manager(), mock_profile); 874 875 EXPECT_FALSE(manager()->LookupProfileByRpcIdentifier("foo")); 876 ProfileRefPtr profile = manager()->LookupProfileByRpcIdentifier(kProfileName); 877 EXPECT_EQ(mock_profile.get(), profile.get()); 878 } 879 880 TEST_F(ManagerTest, SetProfileForService) { 881 scoped_refptr<MockProfile> profile0( 882 new MockProfile(control_interface(), metrics(), manager(), "")); 883 string profile_name0("profile0"); 884 EXPECT_CALL(*profile0, GetRpcIdentifier()) 885 .WillRepeatedly(Return(profile_name0)); 886 AdoptProfile(manager(), profile0); 887 scoped_refptr<MockService> service(new MockService(control_interface(), 888 dispatcher(), 889 metrics(), 890 manager())); 891 EXPECT_FALSE(manager()->HasService(service)); 892 { 893 Error error; 894 EXPECT_CALL(*profile0, AdoptService(_)) 895 .WillOnce(Return(true)); 896 // Expect that setting the profile of a service that does not already 897 // have one assigned does not cause a crash. 898 manager()->SetProfileForService(service, "profile0", &error); 899 EXPECT_TRUE(error.IsSuccess()); 900 } 901 902 // The service should be registered as a side-effect of the profile being 903 // set for this service. 904 EXPECT_TRUE(manager()->HasService(service)); 905 906 // Since we have mocked Profile::AdoptServie() above, the service's 907 // profile was not actually changed. Do so explicitly now. 908 service->set_profile(profile0); 909 910 { 911 Error error; 912 manager()->SetProfileForService(service, "foo", &error); 913 EXPECT_EQ(Error::kInvalidArguments, error.type()); 914 EXPECT_EQ("Unknown Profile foo requested for Service", error.message()); 915 } 916 917 { 918 Error error; 919 manager()->SetProfileForService(service, profile_name0, &error); 920 EXPECT_EQ(Error::kInvalidArguments, error.type()); 921 EXPECT_EQ("Service is already connected to this profile", error.message()); 922 } 923 924 scoped_refptr<MockProfile> profile1( 925 new MockProfile(control_interface(), metrics(), manager(), "")); 926 string profile_name1("profile1"); 927 EXPECT_CALL(*profile1, GetRpcIdentifier()) 928 .WillRepeatedly(Return(profile_name1)); 929 AdoptProfile(manager(), profile1); 930 931 { 932 Error error; 933 EXPECT_CALL(*profile1, AdoptService(_)) 934 .WillOnce(Return(true)); 935 EXPECT_CALL(*profile0, AbandonService(_)) 936 .WillOnce(Return(true)); 937 manager()->SetProfileForService(service, profile_name1, &error); 938 EXPECT_TRUE(error.IsSuccess()); 939 } 940 } 941 942 TEST_F(ManagerTest, CreateProfile) { 943 ScopedTempDir temp_dir; 944 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 945 946 Manager manager(control_interface(), 947 dispatcher(), 948 metrics(), 949 run_path(), 950 storage_path(), 951 temp_dir.path().value()); 952 953 // Invalid name should be rejected. 954 EXPECT_EQ(Error::kInvalidArguments, TestCreateProfile(&manager, "")); 955 956 // A profile with invalid characters in it should similarly be rejected. 957 EXPECT_EQ(Error::kInvalidArguments, 958 TestCreateProfile(&manager, "valid_profile")); 959 960 // We should be able to create a machine profile. 961 EXPECT_EQ(Error::kSuccess, TestCreateProfile(&manager, "valid")); 962 963 // We should succeed in creating a valid user profile. Verify the returned 964 // path. 965 const char kProfile[] = "~user/profile"; 966 { 967 Error error; 968 string path; 969 ASSERT_TRUE(base::CreateDirectory(temp_dir.path().Append("user"))); 970 manager.CreateProfile(kProfile, &path, &error); 971 EXPECT_EQ(Error::kSuccess, error.type()); 972 EXPECT_EQ("/profile_rpc", path); 973 } 974 975 // We should fail in creating it a second time (already exists). 976 EXPECT_EQ(Error::kAlreadyExists, TestCreateProfile(&manager, kProfile)); 977 } 978 979 TEST_F(ManagerTest, PushPopProfile) { 980 ScopedTempDir temp_dir; 981 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 982 Manager manager(control_interface(), 983 dispatcher(), 984 metrics(), 985 run_path(), 986 storage_path(), 987 temp_dir.path().value()); 988 vector<ProfileRefPtr>& profiles = GetProfiles(&manager); 989 990 // Pushing an invalid profile should fail. 991 EXPECT_EQ(Error::kInvalidArguments, TestPushProfile(&manager, "")); 992 993 // Create and push a default profile. Should succeed. 994 const char kDefaultProfile0[] = "default"; 995 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kDefaultProfile0)); 996 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kDefaultProfile0)); 997 EXPECT_EQ(Error::kSuccess, TestPopProfile(&manager, kDefaultProfile0)); 998 999 // Pushing a default profile that does not exist on disk will _not_ 1000 // fail, because we'll use temporary storage for it. 1001 const char kMissingDefaultProfile[] = "missingdefault"; 1002 EXPECT_EQ(Error::kSuccess, 1003 TestPushProfile(&manager, kMissingDefaultProfile)); 1004 EXPECT_EQ(1, profiles.size()); 1005 EXPECT_EQ(Error::kSuccess, 1006 TestPopProfile(&manager, kMissingDefaultProfile)); 1007 EXPECT_EQ(0, profiles.size()); 1008 1009 const char kProfile0[] = "~user/profile0"; 1010 const char kProfile1[] = "~user/profile1"; 1011 ASSERT_TRUE(base::CreateDirectory(temp_dir.path().Append("user"))); 1012 1013 // Create a couple of profiles. 1014 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kProfile0)); 1015 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kProfile1)); 1016 1017 // Push these profiles on the stack. 1018 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile0)); 1019 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile1)); 1020 1021 // Pushing a profile a second time should fail. 1022 EXPECT_EQ(Error::kAlreadyExists, TestPushProfile(&manager, kProfile0)); 1023 EXPECT_EQ(Error::kAlreadyExists, TestPushProfile(&manager, kProfile1)); 1024 1025 Error error; 1026 // Active profile should be the last one we pushed. 1027 EXPECT_EQ(kProfile1, "~" + manager.ActiveProfile()->GetFriendlyName()); 1028 1029 // Make sure a profile name that doesn't exist fails. 1030 const char kProfile2Id[] = "profile2"; 1031 const string kProfile2 = base::StringPrintf("~user/%s", kProfile2Id); 1032 EXPECT_EQ(Error::kNotFound, TestPushProfile(&manager, kProfile2)); 1033 1034 // Create a new service, with a specific storage name. 1035 scoped_refptr<MockService> service( 1036 new NiceMock<MockService>(control_interface(), 1037 dispatcher(), 1038 metrics(), 1039 &manager)); 1040 const char kServiceName[] = "service_storage_name"; 1041 EXPECT_CALL(*service.get(), GetStorageIdentifier()) 1042 .WillRepeatedly(Return(kServiceName)); 1043 EXPECT_CALL(*service.get(), Load(_)) 1044 .WillRepeatedly(Return(true)); 1045 1046 // Add this service to the manager -- it should end up in the ephemeral 1047 // profile. 1048 manager.RegisterService(service); 1049 ASSERT_EQ(GetEphemeralProfile(&manager), service->profile()); 1050 1051 // Create storage for a profile that contains the service storage name. 1052 ASSERT_TRUE(CreateBackingStoreForService(&temp_dir, "user", kProfile2Id, 1053 kServiceName)); 1054 1055 // When we push the profile, the service should move away from the 1056 // ephemeral profile to this new profile since it has an entry for 1057 // this service. 1058 EXPECT_CALL(*service, ClearExplicitlyDisconnected()); 1059 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile2)); 1060 EXPECT_NE(GetEphemeralProfile(&manager), service->profile()); 1061 EXPECT_EQ(kProfile2, "~" + service->profile()->GetFriendlyName()); 1062 1063 // Insert another profile that should supersede ownership of the service. 1064 const char kProfile3Id[] = "profile3"; 1065 const string kProfile3 = base::StringPrintf("~user/%s", kProfile3Id); 1066 ASSERT_TRUE(CreateBackingStoreForService(&temp_dir, "user", kProfile3Id, 1067 kServiceName)); 1068 // We don't verify this expectation inline, since this would clear other 1069 // recurring expectations on the service. 1070 EXPECT_CALL(*service, ClearExplicitlyDisconnected()); 1071 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile3)); 1072 EXPECT_EQ(kProfile3, "~" + service->profile()->GetFriendlyName()); 1073 1074 // Popping an invalid profile name should fail. 1075 EXPECT_EQ(Error::kInvalidArguments, TestPopProfile(&manager, "~")); 1076 1077 // Popping an profile that is not at the top of the stack should fail. 1078 EXPECT_EQ(Error::kNotSupported, TestPopProfile(&manager, kProfile0)); 1079 1080 // Popping the top profile should succeed. 1081 EXPECT_CALL(*service, ClearExplicitlyDisconnected()); 1082 EXPECT_EQ(Error::kSuccess, TestPopProfile(&manager, kProfile3)); 1083 1084 // Moreover the service should have switched profiles to profile 2. 1085 EXPECT_EQ(kProfile2, "~" + service->profile()->GetFriendlyName()); 1086 1087 // Popping the top profile should succeed. 1088 EXPECT_CALL(*service, ClearExplicitlyDisconnected()); 1089 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager)); 1090 1091 // The service should now revert to the ephemeral profile. 1092 EXPECT_EQ(GetEphemeralProfile(&manager), service->profile()); 1093 1094 // Pop the remaining two profiles off the stack. 1095 EXPECT_CALL(*service, ClearExplicitlyDisconnected()).Times(2); 1096 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager)); 1097 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager)); 1098 Mock::VerifyAndClearExpectations(service.get()); 1099 1100 // Next pop should fail with "stack is empty". 1101 EXPECT_EQ(Error::kNotFound, TestPopAnyProfile(&manager)); 1102 1103 const char kMachineProfile0[] = "machineprofile0"; 1104 const char kMachineProfile1[] = "machineprofile1"; 1105 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kMachineProfile0)); 1106 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kMachineProfile1)); 1107 1108 // Should be able to push a machine profile. 1109 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kMachineProfile0)); 1110 1111 // Should be able to push a user profile atop a machine profile. 1112 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile0)); 1113 1114 // Pushing a system-wide profile on top of a user profile should fail. 1115 EXPECT_EQ(Error::kInvalidArguments, 1116 TestPushProfile(&manager, kMachineProfile1)); 1117 1118 // However if we pop the user profile, we should be able stack another 1119 // machine profile on. 1120 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager)); 1121 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kMachineProfile1)); 1122 1123 // Add two user profiles to the top of the stack. 1124 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile0)); 1125 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile1)); 1126 EXPECT_EQ(4, profiles.size()); 1127 1128 // PopAllUserProfiles should remove both user profiles, leaving the two 1129 // machine profiles. 1130 EXPECT_EQ(Error::kSuccess, TestPopAllUserProfiles(&manager)); 1131 EXPECT_EQ(2, profiles.size()); 1132 EXPECT_TRUE(profiles[0]->GetUser().empty()); 1133 EXPECT_TRUE(profiles[1]->GetUser().empty()); 1134 1135 // Use InsertUserProfile() instead. Although a machine profile is valid 1136 // in this state, it cannot be added via InsertUserProfile. 1137 EXPECT_EQ(Error::kSuccess, TestPopProfile(&manager, kMachineProfile1)); 1138 EXPECT_EQ(Error::kInvalidArguments, 1139 TestInsertUserProfile(&manager, kMachineProfile1, "machinehash1")); 1140 const char kUserHash0[] = "userhash0"; 1141 const char kUserHash1[] = "userhash1"; 1142 EXPECT_EQ(Error::kSuccess, 1143 TestInsertUserProfile(&manager, kProfile0, kUserHash0)); 1144 EXPECT_EQ(Error::kSuccess, 1145 TestInsertUserProfile(&manager, kProfile1, kUserHash1)); 1146 EXPECT_EQ(3, profiles.size()); 1147 EXPECT_EQ(kUserHash0, profiles[1]->GetUserHash()); 1148 EXPECT_EQ(kUserHash1, profiles[2]->GetUserHash()); 1149 } 1150 1151 TEST_F(ManagerTest, RemoveProfile) { 1152 ScopedTempDir temp_dir; 1153 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1154 Manager manager(control_interface(), 1155 dispatcher(), 1156 metrics(), 1157 run_path(), 1158 storage_path(), 1159 temp_dir.path().value()); 1160 1161 const char kProfile0[] = "profile0"; 1162 FilePath profile_path( 1163 Profile::GetFinalStoragePath( 1164 FilePath(storage_path()), Profile::Identifier(kProfile0))); 1165 1166 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kProfile0)); 1167 ASSERT_TRUE(base::PathExists(profile_path)); 1168 1169 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile0)); 1170 1171 // Remove should fail since the profile is still on the stack. 1172 { 1173 Error error; 1174 manager.RemoveProfile(kProfile0, &error); 1175 EXPECT_EQ(Error::kInvalidArguments, error.type()); 1176 } 1177 1178 // Profile path should still exist. 1179 EXPECT_TRUE(base::PathExists(profile_path)); 1180 1181 EXPECT_EQ(Error::kSuccess, TestPopAnyProfile(&manager)); 1182 1183 // This should succeed now that the profile is off the stack. 1184 { 1185 Error error; 1186 manager.RemoveProfile(kProfile0, &error); 1187 EXPECT_EQ(Error::kSuccess, error.type()); 1188 } 1189 1190 // Profile path should no longer exist. 1191 EXPECT_FALSE(base::PathExists(profile_path)); 1192 1193 // Another remove succeeds, due to a foible in base::DeleteFile -- 1194 // it is not an error to delete a file that does not exist. 1195 { 1196 Error error; 1197 manager.RemoveProfile(kProfile0, &error); 1198 EXPECT_EQ(Error::kSuccess, error.type()); 1199 } 1200 1201 // Let's create an error case that will "work". Create a non-empty 1202 // directory in the place of the profile pathname. 1203 ASSERT_TRUE(base::CreateDirectory(profile_path.Append("foo"))); 1204 { 1205 Error error; 1206 manager.RemoveProfile(kProfile0, &error); 1207 EXPECT_EQ(Error::kOperationFailed, error.type()); 1208 } 1209 } 1210 1211 TEST_F(ManagerTest, RemoveService) { 1212 MockServiceRefPtr mock_service( 1213 new NiceMock<MockService>(control_interface(), 1214 dispatcher(), 1215 metrics(), 1216 manager())); 1217 1218 // Used in expectations which cannot accept a mock refptr. 1219 const ServiceRefPtr& service = mock_service; 1220 1221 manager()->RegisterService(service); 1222 EXPECT_EQ(GetEphemeralProfile(manager()), service->profile().get()); 1223 1224 scoped_refptr<MockProfile> profile( 1225 new StrictMock<MockProfile>( 1226 control_interface(), metrics(), manager(), "")); 1227 AdoptProfile(manager(), profile); 1228 1229 // If service is ephemeral, it should be unloaded and left ephemeral. 1230 EXPECT_CALL(*profile, AbandonService(service)).Times(0); 1231 EXPECT_CALL(*profile, ConfigureService(service)).Times(0); 1232 EXPECT_CALL(*mock_service, Unload()).WillOnce(Return(false)); 1233 manager()->RemoveService(service); 1234 Mock::VerifyAndClearExpectations(mock_service.get()); 1235 Mock::VerifyAndClearExpectations(profile.get()); 1236 EXPECT_EQ(GetEphemeralProfile(manager()), service->profile().get()); 1237 EXPECT_TRUE(manager()->HasService(service)); // Since Unload() was false. 1238 1239 // If service is not ephemeral and the Manager finds a profile to assign 1240 // the service to, the service should be re-parented. Note that since we 1241 // are using a MockProfile, ConfigureService() never actually changes the 1242 // Service's profile. 1243 service->set_profile(profile); 1244 EXPECT_CALL(*profile, AbandonService(service)); 1245 EXPECT_CALL(*profile, ConfigureService(service)).WillOnce(Return(true)); 1246 EXPECT_CALL(*mock_service, Unload()).Times(0); 1247 manager()->RemoveService(service); 1248 Mock::VerifyAndClearExpectations(mock_service.get()); 1249 Mock::VerifyAndClearExpectations(profile.get()); 1250 EXPECT_TRUE(manager()->HasService(service)); 1251 EXPECT_EQ(profile.get(), service->profile().get()); 1252 1253 // If service becomes ephemeral since there is no profile to support it, 1254 // it should be unloaded. 1255 EXPECT_CALL(*profile, AbandonService(service)); 1256 EXPECT_CALL(*profile, ConfigureService(service)).WillOnce(Return(false)); 1257 EXPECT_CALL(*mock_service, Unload()).WillOnce(Return(true)); 1258 manager()->RemoveService(service); 1259 EXPECT_FALSE(manager()->HasService(service)); 1260 } 1261 1262 TEST_F(ManagerTest, CreateDuplicateProfileWithMissingKeyfile) { 1263 ScopedTempDir temp_dir; 1264 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1265 Manager manager(control_interface(), 1266 dispatcher(), 1267 metrics(), 1268 run_path(), 1269 storage_path(), 1270 temp_dir.path().value()); 1271 1272 const char kProfile0[] = "profile0"; 1273 FilePath profile_path( 1274 Profile::GetFinalStoragePath( 1275 FilePath(storage_path()), Profile::Identifier(kProfile0))); 1276 ASSERT_EQ(Error::kSuccess, TestCreateProfile(&manager, kProfile0)); 1277 ASSERT_TRUE(base::PathExists(profile_path)); 1278 EXPECT_EQ(Error::kSuccess, TestPushProfile(&manager, kProfile0)); 1279 1280 // Ensure that even if the backing filestore is removed, we still can't 1281 // create a profile twice. 1282 ASSERT_TRUE(base::DeleteFile(profile_path, false)); 1283 EXPECT_EQ(Error::kAlreadyExists, TestCreateProfile(&manager, kProfile0)); 1284 } 1285 1286 TEST_F(ManagerTest, HandleProfileEntryDeletion) { 1287 MockServiceRefPtr s_not_in_profile( 1288 new NiceMock<MockService>(control_interface(), 1289 dispatcher(), 1290 metrics(), 1291 manager())); 1292 MockServiceRefPtr s_not_in_group( 1293 new NiceMock<MockService>(control_interface(), 1294 dispatcher(), 1295 metrics(), 1296 manager())); 1297 MockServiceRefPtr s_configure_fail( 1298 new NiceMock<MockService>(control_interface(), 1299 dispatcher(), 1300 metrics(), 1301 manager())); 1302 MockServiceRefPtr s_configure_succeed( 1303 new NiceMock<MockService>(control_interface(), 1304 dispatcher(), 1305 metrics(), 1306 manager())); 1307 1308 string entry_name("entry_name"); 1309 EXPECT_CALL(*s_not_in_profile.get(), GetStorageIdentifier()).Times(0); 1310 EXPECT_CALL(*s_not_in_group.get(), GetStorageIdentifier()) 1311 .WillRepeatedly(Return("not_entry_name")); 1312 EXPECT_CALL(*s_configure_fail.get(), GetStorageIdentifier()) 1313 .WillRepeatedly(Return(entry_name)); 1314 EXPECT_CALL(*s_configure_succeed.get(), GetStorageIdentifier()) 1315 .WillRepeatedly(Return(entry_name)); 1316 1317 manager()->RegisterService(s_not_in_profile); 1318 manager()->RegisterService(s_not_in_group); 1319 manager()->RegisterService(s_configure_fail); 1320 manager()->RegisterService(s_configure_succeed); 1321 1322 scoped_refptr<MockProfile> profile0( 1323 new StrictMock<MockProfile>( 1324 control_interface(), metrics(), manager(), "")); 1325 scoped_refptr<MockProfile> profile1( 1326 new StrictMock<MockProfile>( 1327 control_interface(), metrics(), manager(), "")); 1328 1329 s_not_in_group->set_profile(profile1); 1330 s_configure_fail->set_profile(profile1); 1331 s_configure_succeed->set_profile(profile1); 1332 1333 AdoptProfile(manager(), profile0); 1334 AdoptProfile(manager(), profile1); 1335 1336 CompleteServiceSort(); 1337 1338 // No services are a member of this profile. 1339 EXPECT_FALSE(manager()->HandleProfileEntryDeletion(profile0, entry_name)); 1340 EXPECT_FALSE(IsSortServicesTaskPending()); 1341 1342 // No services that are members of this profile have this entry name. 1343 EXPECT_FALSE(manager()->HandleProfileEntryDeletion(profile1, "")); 1344 EXPECT_FALSE(IsSortServicesTaskPending()); 1345 1346 // Only services that are members of the profile and group will be abandoned. 1347 EXPECT_CALL(*profile1.get(), 1348 AbandonService(IsRefPtrTo(s_not_in_profile.get()))).Times(0); 1349 EXPECT_CALL(*profile1.get(), 1350 AbandonService(IsRefPtrTo(s_not_in_group.get()))).Times(0); 1351 EXPECT_CALL(*profile1.get(), 1352 AbandonService(IsRefPtrTo(s_configure_fail.get()))) 1353 .WillOnce(Return(true)); 1354 EXPECT_CALL(*profile1.get(), 1355 AbandonService(IsRefPtrTo(s_configure_succeed.get()))) 1356 .WillOnce(Return(true)); 1357 1358 // Never allow services to re-join profile1. 1359 EXPECT_CALL(*profile1.get(), ConfigureService(_)) 1360 .WillRepeatedly(Return(false)); 1361 1362 // Only allow one of the members of the profile and group to successfully 1363 // join profile0. 1364 EXPECT_CALL(*profile0.get(), 1365 ConfigureService(IsRefPtrTo(s_not_in_profile.get()))).Times(0); 1366 EXPECT_CALL(*profile0.get(), 1367 ConfigureService(IsRefPtrTo(s_not_in_group.get()))).Times(0); 1368 EXPECT_CALL(*profile0.get(), 1369 ConfigureService(IsRefPtrTo(s_configure_fail.get()))) 1370 .WillOnce(Return(false)); 1371 EXPECT_CALL(*profile0.get(), 1372 ConfigureService(IsRefPtrTo(s_configure_succeed.get()))) 1373 .WillOnce(Return(true)); 1374 1375 // Expect the failed-to-configure service to have Unload() called on it. 1376 EXPECT_CALL(*s_not_in_profile.get(), Unload()).Times(0); 1377 EXPECT_CALL(*s_not_in_group.get(), Unload()).Times(0); 1378 EXPECT_CALL(*s_configure_fail.get(), Unload()).Times(1); 1379 EXPECT_CALL(*s_configure_succeed.get(), Unload()).Times(0); 1380 1381 EXPECT_TRUE(manager()->HandleProfileEntryDeletion(profile1, entry_name)); 1382 EXPECT_TRUE(IsSortServicesTaskPending()); 1383 1384 EXPECT_EQ(GetEphemeralProfile(manager()), s_not_in_profile->profile().get()); 1385 EXPECT_EQ(profile1, s_not_in_group->profile()); 1386 EXPECT_EQ(GetEphemeralProfile(manager()), s_configure_fail->profile()); 1387 1388 // Since we are using a MockProfile, the profile does not actually change, 1389 // since ConfigureService was not actually called on the service. 1390 EXPECT_EQ(profile1, s_configure_succeed->profile()); 1391 } 1392 1393 TEST_F(ManagerTest, HandleProfileEntryDeletionWithUnload) { 1394 MockServiceRefPtr s_will_remove0( 1395 new NiceMock<MockService>(control_interface(), 1396 dispatcher(), 1397 metrics(), 1398 manager())); 1399 MockServiceRefPtr s_will_remove1( 1400 new NiceMock<MockService>(control_interface(), 1401 dispatcher(), 1402 metrics(), 1403 manager())); 1404 MockServiceRefPtr s_will_not_remove0( 1405 new NiceMock<MockService>(control_interface(), 1406 dispatcher(), 1407 metrics(), 1408 manager())); 1409 MockServiceRefPtr s_will_not_remove1( 1410 new NiceMock<MockService>(control_interface(), 1411 dispatcher(), 1412 metrics(), 1413 manager())); 1414 1415 EXPECT_CALL(*metrics(), NotifyDefaultServiceChanged(nullptr)) 1416 .Times(4); // Once for each registration. 1417 1418 string entry_name("entry_name"); 1419 EXPECT_CALL(*s_will_remove0.get(), GetStorageIdentifier()) 1420 .WillRepeatedly(Return(entry_name)); 1421 EXPECT_CALL(*s_will_remove1.get(), GetStorageIdentifier()) 1422 .WillRepeatedly(Return(entry_name)); 1423 EXPECT_CALL(*s_will_not_remove0.get(), GetStorageIdentifier()) 1424 .WillRepeatedly(Return(entry_name)); 1425 EXPECT_CALL(*s_will_not_remove1.get(), GetStorageIdentifier()) 1426 .WillRepeatedly(Return(entry_name)); 1427 1428 manager()->RegisterService(s_will_remove0); 1429 CompleteServiceSort(); 1430 manager()->RegisterService(s_will_not_remove0); 1431 CompleteServiceSort(); 1432 manager()->RegisterService(s_will_remove1); 1433 CompleteServiceSort(); 1434 manager()->RegisterService(s_will_not_remove1); 1435 CompleteServiceSort(); 1436 1437 // One for each service added above. 1438 ASSERT_EQ(4, manager()->services_.size()); 1439 1440 scoped_refptr<MockProfile> profile( 1441 new StrictMock<MockProfile>( 1442 control_interface(), metrics(), manager(), "")); 1443 1444 s_will_remove0->set_profile(profile); 1445 s_will_remove1->set_profile(profile); 1446 s_will_not_remove0->set_profile(profile); 1447 s_will_not_remove1->set_profile(profile); 1448 1449 AdoptProfile(manager(), profile); 1450 1451 // Deny any of the services re-entry to the profile. 1452 EXPECT_CALL(*profile, ConfigureService(_)) 1453 .WillRepeatedly(Return(false)); 1454 1455 EXPECT_CALL(*profile, AbandonService(ServiceRefPtr(s_will_remove0))) 1456 .WillOnce(Return(true)); 1457 EXPECT_CALL(*profile, AbandonService(ServiceRefPtr(s_will_remove1))) 1458 .WillOnce(Return(true)); 1459 EXPECT_CALL(*profile, AbandonService(ServiceRefPtr(s_will_not_remove0))) 1460 .WillOnce(Return(true)); 1461 EXPECT_CALL(*profile, AbandonService(ServiceRefPtr(s_will_not_remove1))) 1462 .WillOnce(Return(true)); 1463 1464 EXPECT_CALL(*s_will_remove0, Unload()) 1465 .WillOnce(Return(true)); 1466 EXPECT_CALL(*s_will_remove1, Unload()) 1467 .WillOnce(Return(true)); 1468 EXPECT_CALL(*s_will_not_remove0, Unload()) 1469 .WillOnce(Return(false)); 1470 EXPECT_CALL(*s_will_not_remove1, Unload()) 1471 .WillOnce(Return(false)); 1472 1473 1474 // This will cause all the profiles to be unloaded. 1475 EXPECT_FALSE(IsSortServicesTaskPending()); 1476 EXPECT_TRUE(manager()->HandleProfileEntryDeletion(profile, entry_name)); 1477 EXPECT_TRUE(IsSortServicesTaskPending()); 1478 1479 // 2 of the 4 services added above should have been unregistered and 1480 // removed, leaving 2. 1481 EXPECT_EQ(2, manager()->services_.size()); 1482 EXPECT_EQ(s_will_not_remove0.get(), manager()->services_[0].get()); 1483 EXPECT_EQ(s_will_not_remove1.get(), manager()->services_[1].get()); 1484 } 1485 1486 TEST_F(ManagerTest, PopProfileWithUnload) { 1487 MockServiceRefPtr s_will_remove0( 1488 new NiceMock<MockService>(control_interface(), 1489 dispatcher(), 1490 metrics(), 1491 manager())); 1492 MockServiceRefPtr s_will_remove1( 1493 new NiceMock<MockService>(control_interface(), 1494 dispatcher(), 1495 metrics(), 1496 manager())); 1497 MockServiceRefPtr s_will_not_remove0( 1498 new NiceMock<MockService>(control_interface(), 1499 dispatcher(), 1500 metrics(), 1501 manager())); 1502 MockServiceRefPtr s_will_not_remove1( 1503 new NiceMock<MockService>(control_interface(), 1504 dispatcher(), 1505 metrics(), 1506 manager())); 1507 1508 EXPECT_CALL(*metrics(), NotifyDefaultServiceChanged(nullptr)) 1509 .Times(5); // Once for each registration, and one after profile pop. 1510 1511 manager()->RegisterService(s_will_remove0); 1512 CompleteServiceSort(); 1513 manager()->RegisterService(s_will_not_remove0); 1514 CompleteServiceSort(); 1515 manager()->RegisterService(s_will_remove1); 1516 CompleteServiceSort(); 1517 manager()->RegisterService(s_will_not_remove1); 1518 CompleteServiceSort(); 1519 1520 // One for each service added above. 1521 ASSERT_EQ(4, manager()->services_.size()); 1522 1523 scoped_refptr<MockProfile> profile0( 1524 new StrictMock<MockProfile>( 1525 control_interface(), metrics(), manager(), "")); 1526 scoped_refptr<MockProfile> profile1( 1527 new StrictMock<MockProfile>( 1528 control_interface(), metrics(), manager(), "")); 1529 1530 s_will_remove0->set_profile(profile1); 1531 s_will_remove1->set_profile(profile1); 1532 s_will_not_remove0->set_profile(profile1); 1533 s_will_not_remove1->set_profile(profile1); 1534 1535 AdoptProfile(manager(), profile0); 1536 AdoptProfile(manager(), profile1); 1537 1538 // Deny any of the services entry to profile0, so they will all be unloaded. 1539 EXPECT_CALL(*profile0, ConfigureService(_)) 1540 .WillRepeatedly(Return(false)); 1541 1542 EXPECT_CALL(*s_will_remove0, Unload()) 1543 .WillOnce(Return(true)); 1544 EXPECT_CALL(*s_will_remove1, Unload()) 1545 .WillOnce(Return(true)); 1546 EXPECT_CALL(*s_will_not_remove0, Unload()) 1547 .WillRepeatedly(Return(false)); 1548 EXPECT_CALL(*s_will_not_remove1, Unload()) 1549 .WillOnce(Return(false)); 1550 1551 // Ignore calls to Profile::GetRpcIdentifier because of emitted changes of the 1552 // profile list. 1553 EXPECT_CALL(*profile0, GetRpcIdentifier()).Times(AnyNumber()); 1554 EXPECT_CALL(*profile1, GetRpcIdentifier()).Times(AnyNumber()); 1555 1556 // This will pop profile1, which should cause all our profiles to unload. 1557 manager()->PopProfileInternal(); 1558 CompleteServiceSort(); 1559 1560 // 2 of the 4 services added above should have been unregistered and 1561 // removed, leaving 2. 1562 EXPECT_EQ(2, manager()->services_.size()); 1563 EXPECT_EQ(s_will_not_remove0.get(), manager()->services_[0].get()); 1564 EXPECT_EQ(s_will_not_remove1.get(), manager()->services_[1].get()); 1565 1566 // Expect the unloaded services to lose their profile reference. 1567 EXPECT_FALSE(s_will_remove0->profile()); 1568 EXPECT_FALSE(s_will_remove1->profile()); 1569 1570 // If we explicitly deregister a service, the effect should be the same 1571 // with respect to the profile reference. 1572 ASSERT_TRUE(s_will_not_remove0->profile()); 1573 manager()->DeregisterService(s_will_not_remove0); 1574 EXPECT_FALSE(s_will_not_remove0->profile()); 1575 } 1576 1577 TEST_F(ManagerTest, SetProperty) { 1578 { 1579 Error error; 1580 const bool offline_mode = true; 1581 EXPECT_TRUE(manager()->mutable_store()->SetAnyProperty( 1582 kOfflineModeProperty, brillo::Any(offline_mode), &error)); 1583 } 1584 { 1585 Error error; 1586 const string country("a_country"); 1587 EXPECT_TRUE(manager()->mutable_store()->SetAnyProperty( 1588 kCountryProperty, brillo::Any(country), &error)); 1589 } 1590 // Attempt to write with value of wrong type should return InvalidArgs. 1591 { 1592 Error error; 1593 EXPECT_FALSE(manager()->mutable_store()->SetAnyProperty( 1594 kCountryProperty, PropertyStoreTest::kBoolV, &error)); 1595 EXPECT_EQ(Error::kInvalidArguments, error.type()); 1596 } 1597 { 1598 Error error; 1599 EXPECT_FALSE(manager()->mutable_store()->SetAnyProperty( 1600 kOfflineModeProperty, PropertyStoreTest::kStringV, &error)); 1601 EXPECT_EQ(Error::kInvalidArguments, error.type()); 1602 } 1603 // Attempt to write R/O property should return InvalidArgs. 1604 { 1605 Error error; 1606 EXPECT_FALSE(manager()->mutable_store()->SetAnyProperty( 1607 kEnabledTechnologiesProperty, PropertyStoreTest::kStringsV, &error)); 1608 EXPECT_EQ(Error::kInvalidArguments, error.type()); 1609 } 1610 } 1611 1612 TEST_F(ManagerTest, RequestScan) { 1613 { 1614 Error error; 1615 manager()->RegisterDevice(mock_devices_[0].get()); 1616 manager()->RegisterDevice(mock_devices_[1].get()); 1617 EXPECT_CALL(*mock_devices_[0], technology()) 1618 .WillRepeatedly(Return(Technology::kWifi)); 1619 EXPECT_CALL(*mock_devices_[0], Scan(Device::kFullScan, _, _)); 1620 EXPECT_CALL(*mock_devices_[1], technology()) 1621 .WillRepeatedly(Return(Technology::kUnknown)); 1622 EXPECT_CALL(*mock_devices_[1], Scan(_, _, _)).Times(0); 1623 EXPECT_CALL(*metrics(), NotifyUserInitiatedEvent( 1624 Metrics::kUserInitiatedEventWifiScan)).Times(1); 1625 manager()->RequestScan(Device::kFullScan, kTypeWifi, &error); 1626 manager()->DeregisterDevice(mock_devices_[0].get()); 1627 manager()->DeregisterDevice(mock_devices_[1].get()); 1628 Mock::VerifyAndClearExpectations(mock_devices_[0].get()); 1629 Mock::VerifyAndClearExpectations(mock_devices_[1].get()); 1630 1631 manager()->RegisterDevice(mock_devices_[0].get()); 1632 EXPECT_CALL(*mock_devices_[0], technology()) 1633 .WillRepeatedly(Return(Technology::kWifi)); 1634 EXPECT_CALL(*metrics(), NotifyUserInitiatedEvent( 1635 Metrics::kUserInitiatedEventWifiScan)).Times(1); 1636 EXPECT_CALL(*mock_devices_[0], Scan(Device::kFullScan, _, _)); 1637 manager()->RequestScan(Device::kFullScan, kTypeWifi, &error); 1638 manager()->DeregisterDevice(mock_devices_[0].get()); 1639 Mock::VerifyAndClearExpectations(mock_devices_[0].get()); 1640 1641 manager()->RegisterDevice(mock_devices_[0].get()); 1642 EXPECT_CALL(*mock_devices_[0], technology()) 1643 .WillRepeatedly(Return(Technology::kUnknown)); 1644 EXPECT_CALL(*metrics(), NotifyUserInitiatedEvent( 1645 Metrics::kUserInitiatedEventWifiScan)).Times(0); 1646 EXPECT_CALL(*mock_devices_[0], Scan(_, _, _)).Times(0); 1647 manager()->RequestScan(Device::kFullScan, kTypeWifi, &error); 1648 manager()->DeregisterDevice(mock_devices_[0].get()); 1649 Mock::VerifyAndClearExpectations(mock_devices_[0].get()); 1650 } 1651 1652 { 1653 Error error; 1654 manager()->RequestScan(Device::kFullScan, "bogus_device_type", &error); 1655 EXPECT_EQ(Error::kInvalidArguments, error.type()); 1656 } 1657 } 1658 1659 TEST_F(ManagerTest, GetServiceNoType) { 1660 KeyValueStore args; 1661 Error e; 1662 manager()->GetService(args, &e); 1663 EXPECT_EQ(Error::kInvalidArguments, e.type()); 1664 EXPECT_EQ("must specify service type", e.message()); 1665 } 1666 1667 TEST_F(ManagerTest, GetServiceUnknownType) { 1668 KeyValueStore args; 1669 Error e; 1670 args.SetString(kTypeProperty, kTypeEthernet); 1671 manager()->GetService(args, &e); 1672 EXPECT_EQ(Error::kNotSupported, e.type()); 1673 EXPECT_EQ("service type is unsupported", e.message()); 1674 } 1675 1676 #if !defined(DISABLE_WIRED_8021X) 1677 TEST_F(ManagerTest, GetServiceEthernetEap) { 1678 KeyValueStore args; 1679 Error e; 1680 ServiceRefPtr service = new NiceMock<MockService>(control_interface(), 1681 dispatcher(), 1682 metrics(), 1683 manager()); 1684 args.SetString(kTypeProperty, kTypeEthernetEap); 1685 SetEapProviderService(service); 1686 EXPECT_EQ(service, manager()->GetService(args, &e)); 1687 EXPECT_TRUE(e.IsSuccess()); 1688 } 1689 #endif // DISABLE_WIRED_8021X 1690 1691 #if !defined(DISABLE_WIFI) 1692 TEST_F(ManagerTest, GetServiceWifi) { 1693 KeyValueStore args; 1694 Error e; 1695 WiFiServiceRefPtr wifi_service; 1696 args.SetString(kTypeProperty, kTypeWifi); 1697 EXPECT_CALL(*wifi_provider_, GetService(_, _)) 1698 .WillRepeatedly(Return(wifi_service)); 1699 manager()->GetService(args, &e); 1700 EXPECT_TRUE(e.IsSuccess()); 1701 } 1702 #endif // DISABLE_WIFI 1703 1704 TEST_F(ManagerTest, GetServiceVPNUnknownType) { 1705 KeyValueStore args; 1706 Error e; 1707 args.SetString(kTypeProperty, kTypeVPN); 1708 scoped_refptr<MockProfile> profile( 1709 new StrictMock<MockProfile>( 1710 control_interface(), metrics(), manager(), "")); 1711 AdoptProfile(manager(), profile); 1712 ServiceRefPtr service = manager()->GetService(args, &e); 1713 EXPECT_EQ(Error::kNotSupported, e.type()); 1714 EXPECT_FALSE(service); 1715 } 1716 1717 TEST_F(ManagerTest, GetServiceVPN) { 1718 KeyValueStore args; 1719 Error e; 1720 args.SetString(kTypeProperty, kTypeVPN); 1721 args.SetString(kProviderTypeProperty, kProviderOpenVpn); 1722 args.SetString(kProviderHostProperty, "10.8.0.1"); 1723 args.SetString(kNameProperty, "vpn-name"); 1724 scoped_refptr<MockProfile> profile( 1725 new StrictMock<MockProfile>( 1726 control_interface(), metrics(), manager(), "")); 1727 AdoptProfile(manager(), profile); 1728 1729 #if defined(DISABLE_VPN) 1730 1731 ServiceRefPtr service = manager()->GetService(args, &e); 1732 EXPECT_EQ(Error::kNotSupported, e.type()); 1733 EXPECT_FALSE(service); 1734 1735 #else 1736 1737 ServiceRefPtr updated_service; 1738 EXPECT_CALL(*profile, UpdateService(_)) 1739 .WillOnce(DoAll(SaveArg<0>(&updated_service), Return(true))); 1740 ServiceRefPtr configured_service; 1741 EXPECT_CALL(*profile, LoadService(_)) 1742 .WillOnce(Return(false)); 1743 EXPECT_CALL(*profile, ConfigureService(_)) 1744 .WillOnce(DoAll(SaveArg<0>(&configured_service), Return(true))); 1745 ServiceRefPtr service = manager()->GetService(args, &e); 1746 EXPECT_TRUE(e.IsSuccess()); 1747 EXPECT_TRUE(service); 1748 EXPECT_EQ(service, updated_service); 1749 EXPECT_EQ(service, configured_service); 1750 1751 #endif // DISABLE_VPN 1752 } 1753 1754 #if !defined(DISABLE_WIMAX) 1755 1756 TEST_F(ManagerTest, GetServiceWiMaxNoNetworkId) { 1757 KeyValueStore args; 1758 Error e; 1759 args.SetString(kTypeProperty, kTypeWimax); 1760 ServiceRefPtr service = manager()->GetService(args, &e); 1761 EXPECT_EQ(Error::kInvalidArguments, e.type()); 1762 EXPECT_EQ("Missing WiMAX network id.", e.message()); 1763 EXPECT_FALSE(service); 1764 } 1765 1766 TEST_F(ManagerTest, GetServiceWiMax) { 1767 KeyValueStore args; 1768 Error e; 1769 args.SetString(kTypeProperty, kTypeWimax); 1770 args.SetString(WiMaxService::kNetworkIdProperty, "01234567"); 1771 args.SetString(kNameProperty, "WiMAX Network"); 1772 ServiceRefPtr service = manager()->GetService(args, &e); 1773 EXPECT_TRUE(e.IsSuccess()); 1774 EXPECT_TRUE(service); 1775 } 1776 1777 #endif // DISABLE_WIMAX 1778 1779 TEST_F(ManagerTest, ConfigureServiceWithInvalidProfile) { 1780 // Manager calls ActiveProfile() so we need at least one profile installed. 1781 scoped_refptr<MockProfile> profile( 1782 new NiceMock<MockProfile>( 1783 control_interface(), metrics(), manager(), "")); 1784 AdoptProfile(manager(), profile); 1785 1786 KeyValueStore args; 1787 args.SetString(kProfileProperty, "xxx"); 1788 Error error; 1789 manager()->ConfigureService(args, &error); 1790 EXPECT_EQ(Error::kInvalidArguments, error.type()); 1791 EXPECT_EQ("Invalid profile name xxx", error.message()); 1792 } 1793 1794 TEST_F(ManagerTest, ConfigureServiceWithGetServiceFailure) { 1795 // Manager calls ActiveProfile() so we need at least one profile installed. 1796 scoped_refptr<MockProfile> profile( 1797 new NiceMock<MockProfile>( 1798 control_interface(), metrics(), manager(), "")); 1799 AdoptProfile(manager(), profile); 1800 1801 KeyValueStore args; 1802 Error error; 1803 manager()->ConfigureService(args, &error); 1804 EXPECT_EQ(Error::kInvalidArguments, error.type()); 1805 EXPECT_EQ("must specify service type", error.message()); 1806 } 1807 1808 #if !defined(DISABLE_WIFI) 1809 // TODO(zqiu): Consider creating a TestProvider to provide generic services, 1810 // (MockService) instead of using technology specific (wifi) services. This 1811 // will remove the dependency for wifi from ConfigureXXX tests. 1812 // 1813 // A registered service in the ephemeral profile should be moved to the 1814 // active profile as a part of configuration if no profile was explicitly 1815 // specified. 1816 TEST_F(ManagerTest, ConfigureRegisteredServiceWithoutProfile) { 1817 scoped_refptr<MockProfile> profile( 1818 new NiceMock<MockProfile>( 1819 control_interface(), metrics(), manager(), "")); 1820 1821 AdoptProfile(manager(), profile); // This is now the active profile. 1822 1823 const vector<uint8_t> ssid; 1824 scoped_refptr<MockWiFiService> service( 1825 new NiceMock<MockWiFiService>(control_interface(), 1826 dispatcher(), 1827 metrics(), 1828 manager(), 1829 wifi_provider_, 1830 ssid, 1831 "", 1832 "", 1833 false)); 1834 1835 manager()->RegisterService(service); 1836 service->set_profile(GetEphemeralProfile(manager())); 1837 1838 EXPECT_CALL(*wifi_provider_, GetService(_, _)) 1839 .WillOnce(Return(service)); 1840 EXPECT_CALL(*profile, UpdateService(ServiceRefPtr(service.get()))) 1841 .WillOnce(Return(true)); 1842 EXPECT_CALL(*profile, AdoptService(ServiceRefPtr(service.get()))) 1843 .WillOnce(Return(true)); 1844 1845 KeyValueStore args; 1846 args.SetString(kTypeProperty, kTypeWifi); 1847 Error error; 1848 manager()->ConfigureService(args, &error); 1849 EXPECT_TRUE(error.IsSuccess()); 1850 } 1851 1852 // If we configure a service that was already registered and explicitly 1853 // specify a profile, it should be moved from the profile it was previously 1854 // in to the specified profile if one was requested. 1855 TEST_F(ManagerTest, ConfigureRegisteredServiceWithProfile) { 1856 scoped_refptr<MockProfile> profile0( 1857 new NiceMock<MockProfile>( 1858 control_interface(), metrics(), manager(), "")); 1859 scoped_refptr<MockProfile> profile1( 1860 new NiceMock<MockProfile>( 1861 control_interface(), metrics(), manager(), "")); 1862 1863 const string kProfileName0 = "profile0"; 1864 const string kProfileName1 = "profile1"; 1865 1866 EXPECT_CALL(*profile0, GetRpcIdentifier()) 1867 .WillRepeatedly(Return(kProfileName0)); 1868 EXPECT_CALL(*profile1, GetRpcIdentifier()) 1869 .WillRepeatedly(Return(kProfileName1)); 1870 1871 AdoptProfile(manager(), profile0); 1872 AdoptProfile(manager(), profile1); // profile1 is now the ActiveProfile. 1873 1874 const vector<uint8_t> ssid; 1875 scoped_refptr<MockWiFiService> service( 1876 new NiceMock<MockWiFiService>(control_interface(), 1877 dispatcher(), 1878 metrics(), 1879 manager(), 1880 wifi_provider_, 1881 ssid, 1882 "", 1883 "", 1884 false)); 1885 1886 manager()->RegisterService(service); 1887 service->set_profile(profile1); 1888 1889 EXPECT_CALL(*wifi_provider_, GetService(_, _)) 1890 .WillOnce(Return(service)); 1891 EXPECT_CALL(*profile0, LoadService(ServiceRefPtr(service.get()))) 1892 .WillOnce(Return(true)); 1893 EXPECT_CALL(*profile0, UpdateService(ServiceRefPtr(service.get()))) 1894 .WillOnce(Return(true)); 1895 EXPECT_CALL(*profile0, AdoptService(ServiceRefPtr(service.get()))) 1896 .WillOnce(Return(true)); 1897 EXPECT_CALL(*profile1, AbandonService(ServiceRefPtr(service.get()))) 1898 .WillOnce(Return(true)); 1899 1900 KeyValueStore args; 1901 args.SetString(kTypeProperty, kTypeWifi); 1902 args.SetString(kProfileProperty, kProfileName0); 1903 Error error; 1904 manager()->ConfigureService(args, &error); 1905 EXPECT_TRUE(error.IsSuccess()); 1906 service->set_profile(nullptr); // Breaks refcounting loop. 1907 } 1908 1909 // If we configure a service that is already a member of the specified 1910 // profile, the Manager should not call LoadService or AdoptService again 1911 // on this service. 1912 TEST_F(ManagerTest, ConfigureRegisteredServiceWithSameProfile) { 1913 scoped_refptr<MockProfile> profile0( 1914 new NiceMock<MockProfile>( 1915 control_interface(), metrics(), manager(), "")); 1916 1917 const string kProfileName0 = "profile0"; 1918 1919 EXPECT_CALL(*profile0, GetRpcIdentifier()) 1920 .WillRepeatedly(Return(kProfileName0)); 1921 1922 AdoptProfile(manager(), profile0); // profile0 is now the ActiveProfile. 1923 1924 const vector<uint8_t> ssid; 1925 scoped_refptr<MockWiFiService> service( 1926 new NiceMock<MockWiFiService>(control_interface(), 1927 dispatcher(), 1928 metrics(), 1929 manager(), 1930 wifi_provider_, 1931 ssid, 1932 "", 1933 "", 1934 false)); 1935 1936 manager()->RegisterService(service); 1937 service->set_profile(profile0); 1938 1939 EXPECT_CALL(*wifi_provider_, GetService(_, _)) 1940 .WillOnce(Return(service)); 1941 EXPECT_CALL(*profile0, LoadService(ServiceRefPtr(service.get()))) 1942 .Times(0); 1943 EXPECT_CALL(*profile0, UpdateService(ServiceRefPtr(service.get()))) 1944 .WillOnce(Return(true)); 1945 EXPECT_CALL(*profile0, AdoptService(ServiceRefPtr(service.get()))) 1946 .Times(0); 1947 1948 KeyValueStore args; 1949 args.SetString(kTypeProperty, kTypeWifi); 1950 args.SetString(kProfileProperty, kProfileName0); 1951 Error error; 1952 manager()->ConfigureService(args, &error); 1953 EXPECT_TRUE(error.IsSuccess()); 1954 service->set_profile(nullptr); // Breaks refcounting loop. 1955 } 1956 1957 // An unregistered service should remain unregistered, but its contents should 1958 // be saved to the specified profile nonetheless. 1959 TEST_F(ManagerTest, ConfigureUnregisteredServiceWithProfile) { 1960 scoped_refptr<MockProfile> profile0( 1961 new NiceMock<MockProfile>( 1962 control_interface(), metrics(), manager(), "")); 1963 scoped_refptr<MockProfile> profile1( 1964 new NiceMock<MockProfile>( 1965 control_interface(), metrics(), manager(), "")); 1966 1967 const string kProfileName0 = "profile0"; 1968 const string kProfileName1 = "profile1"; 1969 1970 EXPECT_CALL(*profile0, GetRpcIdentifier()) 1971 .WillRepeatedly(Return(kProfileName0)); 1972 EXPECT_CALL(*profile1, GetRpcIdentifier()) 1973 .WillRepeatedly(Return(kProfileName1)); 1974 1975 AdoptProfile(manager(), profile0); 1976 AdoptProfile(manager(), profile1); // profile1 is now the ActiveProfile. 1977 1978 const vector<uint8_t> ssid; 1979 scoped_refptr<MockWiFiService> service( 1980 new NiceMock<MockWiFiService>(control_interface(), 1981 dispatcher(), 1982 metrics(), 1983 manager(), 1984 wifi_provider_, 1985 ssid, 1986 "", 1987 "", 1988 false)); 1989 1990 service->set_profile(profile1); 1991 1992 EXPECT_CALL(*wifi_provider_, GetService(_, _)) 1993 .WillOnce(Return(service)); 1994 EXPECT_CALL(*profile0, UpdateService(ServiceRefPtr(service.get()))) 1995 .WillOnce(Return(true)); 1996 EXPECT_CALL(*profile0, AdoptService(_)) 1997 .Times(0); 1998 EXPECT_CALL(*profile1, AdoptService(_)) 1999 .Times(0); 2000 2001 KeyValueStore args; 2002 args.SetString(kTypeProperty, kTypeWifi); 2003 args.SetString(kProfileProperty, kProfileName0); 2004 Error error; 2005 manager()->ConfigureService(args, &error); 2006 EXPECT_TRUE(error.IsSuccess()); 2007 } 2008 2009 TEST_F(ManagerTest, ConfigureServiceForProfileWithNoType) { 2010 KeyValueStore args; 2011 Error error; 2012 ServiceRefPtr service = 2013 manager()->ConfigureServiceForProfile("", args, &error); 2014 EXPECT_EQ(Error::kInvalidArguments, error.type()); 2015 EXPECT_EQ("must specify service type", error.message()); 2016 EXPECT_EQ(nullptr, service.get()); 2017 } 2018 2019 TEST_F(ManagerTest, ConfigureServiceForProfileWithWrongType) { 2020 KeyValueStore args; 2021 args.SetString(kTypeProperty, kTypeCellular); 2022 Error error; 2023 ServiceRefPtr service = 2024 manager()->ConfigureServiceForProfile("", args, &error); 2025 EXPECT_EQ(Error::kNotSupported, error.type()); 2026 EXPECT_EQ("service type is unsupported", error.message()); 2027 EXPECT_EQ(nullptr, service.get()); 2028 } 2029 2030 TEST_F(ManagerTest, ConfigureServiceForProfileWithMissingProfile) { 2031 KeyValueStore args; 2032 args.SetString(kTypeProperty, kTypeWifi); 2033 Error error; 2034 ServiceRefPtr service = 2035 manager()->ConfigureServiceForProfile("/profile/foo", args, &error); 2036 EXPECT_EQ(Error::kNotFound, error.type()); 2037 EXPECT_EQ("Profile specified was not found", error.message()); 2038 EXPECT_EQ(nullptr, service.get()); 2039 } 2040 2041 TEST_F(ManagerTest, ConfigureServiceForProfileWithProfileMismatch) { 2042 const string kProfileName0 = "profile0"; 2043 const string kProfileName1 = "profile1"; 2044 scoped_refptr<MockProfile> profile0( 2045 AddNamedMockProfileToManager(manager(), kProfileName0)); 2046 2047 KeyValueStore args; 2048 args.SetString(kTypeProperty, kTypeWifi); 2049 args.SetString(kProfileProperty, kProfileName1); 2050 Error error; 2051 ServiceRefPtr service = 2052 manager()->ConfigureServiceForProfile(kProfileName0, args, &error); 2053 EXPECT_EQ(Error::kInvalidArguments, error.type()); 2054 EXPECT_EQ("Profile argument does not match that in " 2055 "the configuration arguments", error.message()); 2056 EXPECT_EQ(nullptr, service.get()); 2057 } 2058 2059 TEST_F(ManagerTest, 2060 ConfigureServiceForProfileWithNoMatchingServiceFailGetService) { 2061 const string kProfileName0 = "profile0"; 2062 scoped_refptr<MockProfile> profile0( 2063 AddNamedMockProfileToManager(manager(), kProfileName0)); 2064 KeyValueStore args; 2065 args.SetString(kTypeProperty, kTypeWifi); 2066 args.SetString(kProfileProperty, kProfileName0); 2067 2068 EXPECT_CALL(*wifi_provider_, FindSimilarService(_, _)) 2069 .WillOnce(Return(WiFiServiceRefPtr())); 2070 EXPECT_CALL(*wifi_provider_, GetService(_, _)) 2071 .WillOnce(Return(WiFiServiceRefPtr())); 2072 Error error; 2073 ServiceRefPtr service = 2074 manager()->ConfigureServiceForProfile(kProfileName0, args, &error); 2075 // Since we didn't set the error in the GetService expectation above... 2076 EXPECT_TRUE(error.IsSuccess()); 2077 EXPECT_EQ(nullptr, service.get()); 2078 } 2079 2080 TEST_F(ManagerTest, ConfigureServiceForProfileCreateNewService) { 2081 const string kProfileName0 = "profile0"; 2082 scoped_refptr<MockProfile> profile0( 2083 AddNamedMockProfileToManager(manager(), kProfileName0)); 2084 2085 KeyValueStore args; 2086 args.SetString(kTypeProperty, kTypeWifi); 2087 2088 scoped_refptr<MockWiFiService> mock_service( 2089 new NiceMock<MockWiFiService>(control_interface(), 2090 dispatcher(), 2091 metrics(), 2092 manager(), 2093 wifi_provider_, 2094 vector<uint8_t>(), 2095 kModeManaged, 2096 kSecurityNone, 2097 false)); 2098 ServiceRefPtr mock_service_generic(mock_service.get()); 2099 mock_service->set_profile(profile0); 2100 EXPECT_CALL(*wifi_provider_, FindSimilarService(_, _)) 2101 .WillOnce(Return(WiFiServiceRefPtr())); 2102 EXPECT_CALL(*wifi_provider_, GetService(_, _)).WillOnce(Return(mock_service)); 2103 EXPECT_CALL(*profile0, UpdateService(mock_service_generic)) 2104 .WillOnce(Return(true)); 2105 Error error; 2106 ServiceRefPtr service = 2107 manager()->ConfigureServiceForProfile(kProfileName0, args, &error); 2108 EXPECT_TRUE(error.IsSuccess()); 2109 EXPECT_EQ(mock_service.get(), service.get()); 2110 mock_service->set_profile(nullptr); // Breaks reference cycle. 2111 } 2112 2113 TEST_F(ManagerTest, ConfigureServiceForProfileMatchingServiceByGUID) { 2114 scoped_refptr<MockService> mock_service( 2115 new NiceMock<MockService>(control_interface(), 2116 dispatcher(), 2117 metrics(), 2118 manager())); 2119 const string kGUID = "a guid"; 2120 mock_service->SetGuid(kGUID, nullptr); 2121 manager()->RegisterService(mock_service); 2122 ServiceRefPtr mock_service_generic(mock_service.get()); 2123 2124 const string kProfileName = "profile"; 2125 scoped_refptr<MockProfile> profile( 2126 AddNamedMockProfileToManager(manager(), kProfileName)); 2127 mock_service->set_profile(profile); 2128 2129 EXPECT_CALL(*mock_service, technology()) 2130 .WillOnce(Return(Technology::kCellular)) 2131 .WillOnce(Return(Technology::kWifi)); 2132 2133 EXPECT_CALL(*wifi_provider_, FindSimilarService(_, _)).Times(0); 2134 EXPECT_CALL(*wifi_provider_, GetService(_, _)).Times(0); 2135 EXPECT_CALL(*profile, AdoptService(mock_service_generic)).Times(0); 2136 2137 KeyValueStore args; 2138 args.SetString(kTypeProperty, kTypeWifi); 2139 args.SetString(kGuidProperty, kGUID); 2140 2141 // The first attempt should fail because the service reports a technology 2142 // other than "WiFi". 2143 { 2144 Error error; 2145 ServiceRefPtr service = 2146 manager()->ConfigureServiceForProfile(kProfileName, args, &error); 2147 EXPECT_EQ(nullptr, service.get()); 2148 EXPECT_EQ(Error::kNotSupported, error.type()); 2149 EXPECT_EQ("This GUID matches a non-wifi service", error.message()); 2150 } 2151 2152 EXPECT_CALL(*mock_service, Configure(_, _)).Times(1); 2153 EXPECT_CALL(*profile, UpdateService(mock_service_generic)).Times(1); 2154 2155 { 2156 Error error; 2157 ServiceRefPtr service = 2158 manager()->ConfigureServiceForProfile(kProfileName, args, &error); 2159 EXPECT_TRUE(error.IsSuccess()); 2160 EXPECT_EQ(mock_service.get(), service.get()); 2161 EXPECT_EQ(profile.get(), service->profile().get()); 2162 } 2163 mock_service->set_profile(nullptr); // Breaks reference cycle. 2164 } 2165 2166 TEST_F(ManagerTest, ConfigureServiceForProfileMatchingServiceAndProfile) { 2167 const string kProfileName = "profile"; 2168 scoped_refptr<MockProfile> profile( 2169 AddNamedMockProfileToManager(manager(), kProfileName)); 2170 2171 scoped_refptr<MockWiFiService> mock_service( 2172 new NiceMock<MockWiFiService>(control_interface(), 2173 dispatcher(), 2174 metrics(), 2175 manager(), 2176 wifi_provider_, 2177 vector<uint8_t>(), 2178 kModeManaged, 2179 kSecurityNone, 2180 false)); 2181 mock_service->set_profile(profile); 2182 ServiceRefPtr mock_service_generic(mock_service.get()); 2183 2184 KeyValueStore args; 2185 args.SetString(kTypeProperty, kTypeWifi); 2186 EXPECT_CALL(*wifi_provider_, FindSimilarService(_, _)) 2187 .WillOnce(Return(mock_service)); 2188 EXPECT_CALL(*wifi_provider_, GetService(_, _)).Times(0); 2189 EXPECT_CALL(*profile, AdoptService(mock_service_generic)).Times(0); 2190 EXPECT_CALL(*mock_service, Configure(_, _)).Times(1); 2191 EXPECT_CALL(*profile, UpdateService(mock_service_generic)).Times(1); 2192 2193 Error error; 2194 ServiceRefPtr service = 2195 manager()->ConfigureServiceForProfile(kProfileName, args, &error); 2196 EXPECT_TRUE(error.IsSuccess()); 2197 EXPECT_EQ(mock_service.get(), service.get()); 2198 EXPECT_EQ(profile.get(), service->profile().get()); 2199 mock_service->set_profile(nullptr); // Breaks reference cycle. 2200 } 2201 2202 TEST_F(ManagerTest, ConfigureServiceForProfileMatchingServiceEphemeralProfile) { 2203 const string kProfileName = "profile"; 2204 scoped_refptr<MockProfile> profile( 2205 AddNamedMockProfileToManager(manager(), kProfileName)); 2206 2207 scoped_refptr<MockWiFiService> mock_service( 2208 new NiceMock<MockWiFiService>(control_interface(), 2209 dispatcher(), 2210 metrics(), 2211 manager(), 2212 wifi_provider_, 2213 vector<uint8_t>(), 2214 kModeManaged, 2215 kSecurityNone, 2216 false)); 2217 mock_service->set_profile(GetEphemeralProfile(manager())); 2218 ServiceRefPtr mock_service_generic(mock_service.get()); 2219 2220 KeyValueStore args; 2221 args.SetString(kTypeProperty, kTypeWifi); 2222 EXPECT_CALL(*wifi_provider_, FindSimilarService(_, _)) 2223 .WillOnce(Return(mock_service)); 2224 EXPECT_CALL(*wifi_provider_, GetService(_, _)).Times(0); 2225 EXPECT_CALL(*mock_service, Configure(_, _)).Times(1); 2226 EXPECT_CALL(*profile, UpdateService(mock_service_generic)).Times(1); 2227 2228 Error error; 2229 ServiceRefPtr service = 2230 manager()->ConfigureServiceForProfile(kProfileName, args, &error); 2231 EXPECT_TRUE(error.IsSuccess()); 2232 EXPECT_EQ(mock_service.get(), service.get()); 2233 EXPECT_EQ(profile.get(), service->profile().get()); 2234 mock_service->set_profile(nullptr); // Breaks reference cycle. 2235 } 2236 2237 TEST_F(ManagerTest, ConfigureServiceForProfileMatchingServicePrecedingProfile) { 2238 const string kProfileName0 = "profile0"; 2239 scoped_refptr<MockProfile> profile0( 2240 AddNamedMockProfileToManager(manager(), kProfileName0)); 2241 const string kProfileName1 = "profile1"; 2242 scoped_refptr<MockProfile> profile1( 2243 AddNamedMockProfileToManager(manager(), kProfileName1)); 2244 2245 scoped_refptr<MockWiFiService> mock_service( 2246 new NiceMock<MockWiFiService>(control_interface(), 2247 dispatcher(), 2248 metrics(), 2249 manager(), 2250 wifi_provider_, 2251 vector<uint8_t>(), 2252 kModeManaged, 2253 kSecurityNone, 2254 false)); 2255 manager()->RegisterService(mock_service); 2256 mock_service->set_profile(profile0); 2257 ServiceRefPtr mock_service_generic(mock_service.get()); 2258 2259 KeyValueStore args; 2260 args.SetString(kTypeProperty, kTypeWifi); 2261 EXPECT_CALL(*wifi_provider_, FindSimilarService(_, _)) 2262 .WillOnce(Return(mock_service)); 2263 EXPECT_CALL(*wifi_provider_, GetService(_, _)).Times(0); 2264 EXPECT_CALL(*profile0, AbandonService(_)).Times(0); 2265 EXPECT_CALL(*profile1, AdoptService(_)).Times(0); 2266 // This happens once to make the service loadable for the ConfigureService 2267 // below, and a second time after the service is modified. 2268 EXPECT_CALL(*profile1, ConfigureService(mock_service_generic)).Times(0); 2269 EXPECT_CALL(*wifi_provider_, CreateTemporaryService(_, _)).Times(0); 2270 EXPECT_CALL(*mock_service, Configure(_, _)).Times(1); 2271 EXPECT_CALL(*profile1, UpdateService(mock_service_generic)).Times(1); 2272 2273 Error error; 2274 ServiceRefPtr service = 2275 manager()->ConfigureServiceForProfile(kProfileName1, args, &error); 2276 EXPECT_TRUE(error.IsSuccess()); 2277 EXPECT_EQ(mock_service.get(), service.get()); 2278 mock_service->set_profile(nullptr); // Breaks reference cycle. 2279 } 2280 2281 TEST_F(ManagerTest, 2282 ConfigureServiceForProfileMatchingServiceProceedingProfile) { 2283 const string kProfileName0 = "profile0"; 2284 scoped_refptr<MockProfile> profile0( 2285 AddNamedMockProfileToManager(manager(), kProfileName0)); 2286 const string kProfileName1 = "profile1"; 2287 scoped_refptr<MockProfile> profile1( 2288 AddNamedMockProfileToManager(manager(), kProfileName1)); 2289 2290 scoped_refptr<MockWiFiService> matching_service( 2291 new StrictMock<MockWiFiService>(control_interface(), 2292 dispatcher(), 2293 metrics(), 2294 manager(), 2295 wifi_provider_, 2296 vector<uint8_t>(), 2297 kModeManaged, 2298 kSecurityNone, 2299 false)); 2300 matching_service->set_profile(profile1); 2301 2302 // We need to get rid of our reference to this mock service as soon 2303 // as Manager::ConfigureServiceForProfile() takes a reference in its 2304 // call to WiFiProvider::CreateTemporaryService(). This way the 2305 // latter function can keep a DCHECK(service->HasOneRef() even in 2306 // unit tests. 2307 temp_mock_service_ = 2308 new NiceMock<MockWiFiService>(control_interface(), 2309 dispatcher(), 2310 metrics(), 2311 manager(), 2312 wifi_provider_, 2313 vector<uint8_t>(), 2314 kModeManaged, 2315 kSecurityNone, 2316 false); 2317 2318 // Only hold a pointer here so we don't affect the refcount. 2319 MockWiFiService* mock_service_ptr = temp_mock_service_.get(); 2320 2321 KeyValueStore args; 2322 args.SetString(kTypeProperty, kTypeWifi); 2323 EXPECT_CALL(*wifi_provider_, FindSimilarService(_, _)) 2324 .WillOnce(Return(matching_service)); 2325 EXPECT_CALL(*wifi_provider_, GetService(_, _)).Times(0); 2326 EXPECT_CALL(*profile1, AbandonService(_)).Times(0); 2327 EXPECT_CALL(*profile0, AdoptService(_)).Times(0); 2328 EXPECT_CALL(*wifi_provider_, CreateTemporaryService(_, _)) 2329 .WillOnce(InvokeWithoutArgs(this, &ManagerTest::ReleaseTempMockService)); 2330 EXPECT_CALL(*profile0, ConfigureService(IsRefPtrTo(mock_service_ptr))) 2331 .Times(1); 2332 EXPECT_CALL(*mock_service_ptr, Configure(_, _)).Times(1); 2333 EXPECT_CALL(*profile0, UpdateService(IsRefPtrTo(mock_service_ptr))).Times(1); 2334 2335 Error error; 2336 ServiceRefPtr service = 2337 manager()->ConfigureServiceForProfile(kProfileName0, args, &error); 2338 EXPECT_TRUE(error.IsSuccess()); 2339 EXPECT_EQ(nullptr, service.get()); 2340 EXPECT_EQ(profile1.get(), matching_service->profile().get()); 2341 } 2342 2343 #if defined(__BRILLO__) 2344 TEST_F(ManagerTest, SetupApModeInterface) { 2345 const string kApInterfaceName = "Test-Interface"; 2346 string ap_interface; 2347 Error error; 2348 2349 // Failed to setup AP mode interface. 2350 EXPECT_CALL(wifi_driver_hal_, SetupApModeInterface()).WillOnce(Return("")); 2351 EXPECT_FALSE( 2352 manager()->SetupApModeInterface(&ap_interface, &error)); 2353 Mock::VerifyAndClearExpectations(&wifi_driver_hal_); 2354 EXPECT_TRUE(error.IsFailure()); 2355 EXPECT_EQ("Failed to setup AP mode interface", error.message()); 2356 2357 // AP mode interface setup succeed. 2358 error.Reset(); 2359 EXPECT_CALL(wifi_driver_hal_, SetupApModeInterface()) 2360 .WillOnce(Return(kApInterfaceName)); 2361 EXPECT_TRUE( 2362 manager()->SetupApModeInterface(&ap_interface, &error)); 2363 Mock::VerifyAndClearExpectations(&wifi_driver_hal_); 2364 Mock::VerifyAndClearExpectations(control_interface()); 2365 EXPECT_TRUE(error.IsSuccess()); 2366 EXPECT_EQ(kApInterfaceName, ap_interface); 2367 } 2368 2369 TEST_F(ManagerTest, SetupStationModeInterface) { 2370 const string kStationInterfaceName = "Test-Interface"; 2371 string station_interface; 2372 Error error; 2373 2374 // Failed to setup station mode interface. 2375 EXPECT_CALL(wifi_driver_hal_, SetupStationModeInterface()) 2376 .WillOnce(Return("")); 2377 EXPECT_FALSE( 2378 manager()->SetupStationModeInterface(&station_interface, &error)); 2379 Mock::VerifyAndClearExpectations(&wifi_driver_hal_); 2380 EXPECT_TRUE(error.IsFailure()); 2381 EXPECT_EQ("Failed to setup station mode interface", error.message()); 2382 2383 // Station mode interface setup succeed. 2384 error.Reset(); 2385 EXPECT_CALL(wifi_driver_hal_, SetupStationModeInterface()) 2386 .WillOnce(Return(kStationInterfaceName)); 2387 EXPECT_TRUE( 2388 manager()->SetupStationModeInterface(&station_interface, &error)); 2389 Mock::VerifyAndClearExpectations(&wifi_driver_hal_); 2390 EXPECT_TRUE(error.IsSuccess()); 2391 EXPECT_EQ(kStationInterfaceName, station_interface); 2392 } 2393 2394 TEST_F(ManagerTest, OnApModeSetterVanished) { 2395 const string kStationInterfaceName = "Test-Interface"; 2396 2397 EXPECT_CALL(wifi_driver_hal_, SetupStationModeInterface()) 2398 .WillOnce(Return(kStationInterfaceName)); 2399 manager()->OnApModeSetterVanished(); 2400 Mock::VerifyAndClearExpectations(&wifi_driver_hal_); 2401 } 2402 #endif // __BRILLO__ 2403 #endif // DISABLE_WIFI 2404 2405 TEST_F(ManagerTest, FindMatchingService) { 2406 KeyValueStore args; 2407 { 2408 Error error; 2409 ServiceRefPtr service = manager()->FindMatchingService(args, &error); 2410 EXPECT_EQ(Error::kNotFound, error.type()); 2411 } 2412 2413 scoped_refptr<MockService> mock_service0( 2414 new NiceMock<MockService>(control_interface(), 2415 dispatcher(), 2416 metrics(), 2417 manager())); 2418 scoped_refptr<MockService> mock_service1( 2419 new NiceMock<MockService>(control_interface(), 2420 dispatcher(), 2421 metrics(), 2422 manager())); 2423 manager()->RegisterService(mock_service0); 2424 manager()->RegisterService(mock_service1); 2425 EXPECT_CALL(*mock_service0, DoPropertiesMatch(_)) 2426 .WillOnce(Return(true)) 2427 .WillRepeatedly(Return(false)); 2428 { 2429 Error error; 2430 EXPECT_EQ(mock_service0, manager()->FindMatchingService(args, &error)); 2431 EXPECT_TRUE(error.IsSuccess()); 2432 } 2433 EXPECT_CALL(*mock_service1, DoPropertiesMatch(_)) 2434 .WillOnce(Return(true)) 2435 .WillRepeatedly(Return(false)); 2436 { 2437 Error error; 2438 EXPECT_EQ(mock_service1, manager()->FindMatchingService(args, &error)); 2439 EXPECT_TRUE(error.IsSuccess()); 2440 } 2441 { 2442 Error error; 2443 EXPECT_FALSE(manager()->FindMatchingService(args, &error)); 2444 EXPECT_EQ(Error::kNotFound, error.type()); 2445 } 2446 } 2447 2448 TEST_F(ManagerTest, TechnologyOrder) { 2449 // If the Manager is not running, setting the technology order should not 2450 // lauch a service sorting task. 2451 SetRunning(false); 2452 Error error; 2453 manager()->SetTechnologyOrder("vpn,ethernet,wifi,wimax,cellular", &error); 2454 ASSERT_TRUE(error.IsSuccess()); 2455 EXPECT_FALSE(IsSortServicesTaskPending()); 2456 EXPECT_THAT(GetTechnologyOrder(), ElementsAre(Technology::kVPN, 2457 Technology::kEthernet, 2458 Technology::kWifi, 2459 Technology::kWiMax, 2460 Technology::kCellular)); 2461 2462 SetRunning(true); 2463 manager()->SetTechnologyOrder(string(kTypeEthernet) + "," + string(kTypeWifi), 2464 &error); 2465 EXPECT_TRUE(IsSortServicesTaskPending()); 2466 ASSERT_TRUE(error.IsSuccess()); 2467 EXPECT_EQ(manager()->GetTechnologyOrder(), 2468 string(kTypeEthernet) + "," + string(kTypeWifi)); 2469 2470 manager()->SetTechnologyOrder(string(kTypeEthernet) + "x," + 2471 string(kTypeWifi), &error); 2472 ASSERT_FALSE(error.IsSuccess()); 2473 EXPECT_EQ(Error::kInvalidArguments, error.type()); 2474 EXPECT_EQ(string(kTypeEthernet) + "," + string(kTypeWifi), 2475 manager()->GetTechnologyOrder()); 2476 } 2477 2478 TEST_F(ManagerTest, ConnectionStatusCheck) { 2479 // Setup mock metrics and service. 2480 MockMetrics mock_metrics(dispatcher()); 2481 SetMetrics(&mock_metrics); 2482 scoped_refptr<MockService> mock_service = new NiceMock<MockService>( 2483 control_interface(), dispatcher(), metrics(), manager()); 2484 manager()->RegisterService(mock_service); 2485 2486 // Device not connected. 2487 EXPECT_CALL(*mock_service.get(), IsConnected()) 2488 .WillOnce(Return(false)); 2489 EXPECT_CALL(mock_metrics, 2490 NotifyDeviceConnectionStatus(Metrics::kConnectionStatusOffline)); 2491 manager()->ConnectionStatusCheck(); 2492 2493 // Device connected, but not online. 2494 EXPECT_CALL(*mock_service.get(), IsConnected()) 2495 .WillOnce(Return(true)); 2496 EXPECT_CALL(*mock_service.get(), IsOnline()) 2497 .WillOnce(Return(false)); 2498 EXPECT_CALL(mock_metrics, 2499 NotifyDeviceConnectionStatus(Metrics::kConnectionStatusOnline)).Times(0); 2500 EXPECT_CALL(mock_metrics, 2501 NotifyDeviceConnectionStatus(Metrics::kConnectionStatusConnected)); 2502 manager()->ConnectionStatusCheck(); 2503 2504 // Device connected and online. 2505 EXPECT_CALL(*mock_service.get(), IsConnected()) 2506 .WillOnce(Return(true)); 2507 EXPECT_CALL(*mock_service.get(), IsOnline()) 2508 .WillOnce(Return(true)); 2509 EXPECT_CALL(mock_metrics, 2510 NotifyDeviceConnectionStatus(Metrics::kConnectionStatusOnline)); 2511 EXPECT_CALL(mock_metrics, 2512 NotifyDeviceConnectionStatus(Metrics::kConnectionStatusConnected)); 2513 manager()->ConnectionStatusCheck(); 2514 } 2515 2516 TEST_F(ManagerTest, DevicePresenceStatusCheck) { 2517 // Setup mock metrics and service. 2518 MockMetrics mock_metrics(dispatcher()); 2519 SetMetrics(&mock_metrics); 2520 2521 manager()->RegisterDevice(mock_devices_[0]); 2522 manager()->RegisterDevice(mock_devices_[1]); 2523 manager()->RegisterDevice(mock_devices_[2]); 2524 manager()->RegisterDevice(mock_devices_[3]); 2525 2526 ON_CALL(*mock_devices_[0].get(), technology()) 2527 .WillByDefault(Return(Technology::kEthernet)); 2528 ON_CALL(*mock_devices_[1].get(), technology()) 2529 .WillByDefault(Return(Technology::kWifi)); 2530 ON_CALL(*mock_devices_[2].get(), technology()) 2531 .WillByDefault(Return(Technology::kCellular)); 2532 ON_CALL(*mock_devices_[3].get(), technology()) 2533 .WillByDefault(Return(Technology::kWifi)); 2534 2535 EXPECT_CALL(mock_metrics, 2536 NotifyDevicePresenceStatus(Technology::kEthernet, true)); 2537 EXPECT_CALL(mock_metrics, 2538 NotifyDevicePresenceStatus(Technology::kWifi, true)); 2539 EXPECT_CALL(mock_metrics, 2540 NotifyDevicePresenceStatus(Technology::kWiMax, false)); 2541 EXPECT_CALL(mock_metrics, 2542 NotifyDevicePresenceStatus(Technology::kCellular, true)); 2543 manager()->DevicePresenceStatusCheck(); 2544 } 2545 2546 TEST_F(ManagerTest, SortServicesWithConnection) { 2547 MockMetrics mock_metrics(dispatcher()); 2548 SetMetrics(&mock_metrics); 2549 2550 scoped_refptr<MockService> mock_service0( 2551 new NiceMock<MockService>(control_interface(), 2552 dispatcher(), 2553 metrics(), 2554 manager())); 2555 scoped_refptr<MockService> mock_service1( 2556 new NiceMock<MockService>(control_interface(), 2557 dispatcher(), 2558 metrics(), 2559 manager())); 2560 2561 scoped_refptr<MockConnection> mock_connection0( 2562 new NiceMock<MockConnection>(device_info_.get())); 2563 scoped_refptr<MockConnection> mock_connection1( 2564 new NiceMock<MockConnection>(device_info_.get())); 2565 2566 // A single registered Service, without a connection. The 2567 // DefaultService should be nullptr. If a change notification is 2568 // generated, it should reference kNullPath. 2569 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2570 EXPECT_CALL(*manager_adaptor_, 2571 EmitRpcIdentifierChanged( 2572 kDefaultServiceProperty, 2573 control_interface()->NullRPCIdentifier())) 2574 .Times(AnyNumber()); 2575 manager()->RegisterService(mock_service0); 2576 CompleteServiceSort(); 2577 2578 // Adding another Service, also without a connection, does not 2579 // change DefaultService. Furthermore, we do not send a change 2580 // notification for DefaultService. 2581 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2582 EXPECT_CALL(*manager_adaptor_, 2583 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)) 2584 .Times(0); 2585 manager()->RegisterService(mock_service1); 2586 CompleteServiceSort(); 2587 2588 // An explicit sort doesn't change anything, and does not emit a 2589 // change notification for DefaultService. 2590 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2591 EXPECT_CALL(*manager_adaptor_, 2592 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)) 2593 .Times(0); 2594 manager()->SortServicesTask(); 2595 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1)); 2596 2597 // Re-ordering the unconnected Services doesn't change 2598 // DefaultService, and (hence) does not emit a change notification 2599 // for DefaultService. 2600 mock_service1->SetPriority(1, nullptr); 2601 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2602 EXPECT_CALL(*manager_adaptor_, 2603 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)) 2604 .Times(0); 2605 manager()->SortServicesTask(); 2606 EXPECT_TRUE(ServiceOrderIs(mock_service1, mock_service0)); 2607 2608 // Re-ordering the unconnected Services doesn't change 2609 // DefaultService, and (hence) does not emit a change notification 2610 // for DefaultService. 2611 mock_service1->SetPriority(0, nullptr); 2612 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2613 EXPECT_CALL(*manager_adaptor_, 2614 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)) 2615 .Times(0); 2616 manager()->SortServicesTask(); 2617 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1)); 2618 2619 mock_service0->set_mock_connection(mock_connection0); 2620 mock_service1->set_mock_connection(mock_connection1); 2621 2622 // If both Services have Connections, the DefaultService follows 2623 // from ServiceOrderIs. We notify others of the change in 2624 // DefaultService. 2625 EXPECT_CALL(*mock_connection0.get(), SetIsDefault(true)); 2626 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(mock_service0.get())); 2627 EXPECT_CALL(*manager_adaptor_, 2628 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)); 2629 manager()->SortServicesTask(); 2630 EXPECT_TRUE(ServiceOrderIs(mock_service0, mock_service1)); 2631 2632 ServiceWatcher service_watcher; 2633 int tag = 2634 manager()->RegisterDefaultServiceCallback( 2635 Bind(&ServiceWatcher::OnDefaultServiceChanged, 2636 service_watcher.AsWeakPtr())); 2637 EXPECT_EQ(1, tag); 2638 2639 // Changing the ordering causes the DefaultService to change, and 2640 // appropriate notifications are sent. 2641 mock_service1->SetPriority(1, nullptr); 2642 EXPECT_CALL(*mock_connection0.get(), SetIsDefault(false)); 2643 EXPECT_CALL(*mock_connection1.get(), SetIsDefault(true)); 2644 EXPECT_CALL(service_watcher, OnDefaultServiceChanged(_)); 2645 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(mock_service1.get())); 2646 EXPECT_CALL(*manager_adaptor_, 2647 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)); 2648 manager()->SortServicesTask(); 2649 EXPECT_TRUE(ServiceOrderIs(mock_service1, mock_service0)); 2650 2651 // Deregistering a DefaultServiceCallback works as expected. (Later 2652 // code causes DefaultService changes, but we see no further calls 2653 // to |service_watcher|.) 2654 manager()->DeregisterDefaultServiceCallback(tag); 2655 EXPECT_CALL(service_watcher, OnDefaultServiceChanged(_)).Times(0); 2656 2657 // Deregistering the current DefaultService causes the other Service 2658 // to become default. Appropriate notifications are sent. 2659 EXPECT_CALL(*mock_connection0.get(), SetIsDefault(true)); 2660 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(mock_service0.get())); 2661 EXPECT_CALL(*manager_adaptor_, 2662 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)); 2663 mock_service1->set_mock_connection(nullptr); // So DeregisterService works. 2664 manager()->DeregisterService(mock_service1); 2665 CompleteServiceSort(); 2666 2667 // Deregistering the only Service causes the DefaultService to become 2668 // nullptr. Appropriate notifications are sent. 2669 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2670 EXPECT_CALL(*manager_adaptor_, 2671 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)); 2672 mock_service0->set_mock_connection(nullptr); // So DeregisterService works. 2673 manager()->DeregisterService(mock_service0); 2674 CompleteServiceSort(); 2675 2676 // An explicit sort doesn't change anything, and does not generate 2677 // an external notification. 2678 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2679 EXPECT_CALL(*manager_adaptor_, 2680 EmitRpcIdentifierChanged(kDefaultServiceProperty, _)).Times(0); 2681 manager()->SortServicesTask(); 2682 } 2683 2684 TEST_F(ManagerTest, NotifyDefaultServiceChanged) { 2685 EXPECT_EQ(0, manager()->default_service_callback_tag_); 2686 EXPECT_TRUE(manager()->default_service_callbacks_.empty()); 2687 2688 MockMetrics mock_metrics(dispatcher()); 2689 SetMetrics(&mock_metrics); 2690 2691 scoped_refptr<MockService> mock_service( 2692 new NiceMock<MockService>( 2693 control_interface(), dispatcher(), metrics(), manager())); 2694 ServiceRefPtr service = mock_service; 2695 ServiceRefPtr null_service; 2696 2697 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2698 manager()->NotifyDefaultServiceChanged(null_service); 2699 2700 ServiceWatcher service_watcher1; 2701 ServiceWatcher service_watcher2; 2702 int tag1 = 2703 manager()->RegisterDefaultServiceCallback( 2704 Bind(&ServiceWatcher::OnDefaultServiceChanged, 2705 service_watcher1.AsWeakPtr())); 2706 EXPECT_EQ(1, tag1); 2707 int tag2 = 2708 manager()->RegisterDefaultServiceCallback( 2709 Bind(&ServiceWatcher::OnDefaultServiceChanged, 2710 service_watcher2.AsWeakPtr())); 2711 EXPECT_EQ(2, tag2); 2712 2713 EXPECT_CALL(service_watcher1, OnDefaultServiceChanged(null_service)); 2714 EXPECT_CALL(service_watcher2, OnDefaultServiceChanged(null_service)); 2715 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(nullptr)); 2716 manager()->NotifyDefaultServiceChanged(null_service); 2717 2718 EXPECT_CALL(service_watcher1, OnDefaultServiceChanged(service)); 2719 EXPECT_CALL(service_watcher2, OnDefaultServiceChanged(service)); 2720 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(service.get())); 2721 manager()->NotifyDefaultServiceChanged(mock_service); 2722 2723 manager()->DeregisterDefaultServiceCallback(tag1); 2724 EXPECT_CALL(service_watcher1, OnDefaultServiceChanged(_)).Times(0); 2725 EXPECT_CALL(service_watcher2, OnDefaultServiceChanged(service)); 2726 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(service.get())); 2727 manager()->NotifyDefaultServiceChanged(mock_service); 2728 EXPECT_EQ(1, manager()->default_service_callbacks_.size()); 2729 2730 manager()->DeregisterDefaultServiceCallback(tag2); 2731 EXPECT_CALL(service_watcher2, OnDefaultServiceChanged(_)).Times(0); 2732 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(service.get())); 2733 manager()->NotifyDefaultServiceChanged(mock_service); 2734 2735 EXPECT_EQ(2, manager()->default_service_callback_tag_); 2736 EXPECT_TRUE(manager()->default_service_callbacks_.empty()); 2737 } 2738 2739 TEST_F(ManagerTest, ReportServicesOnSameNetwork) { 2740 int connection_id1 = 100; 2741 int connection_id2 = 200; 2742 scoped_refptr<MockService> mock_service1 = 2743 new NiceMock<MockService>(control_interface(), dispatcher(), 2744 metrics(), manager()); 2745 mock_service1->set_connection_id(connection_id1); 2746 scoped_refptr<MockService> mock_service2 = 2747 new NiceMock<MockService>(control_interface(), dispatcher(), 2748 metrics(), manager()); 2749 mock_service2->set_connection_id(connection_id1); 2750 scoped_refptr<MockService> mock_service3 = 2751 new NiceMock<MockService>(control_interface(), dispatcher(), 2752 metrics(), manager()); 2753 mock_service3->set_connection_id(connection_id2); 2754 2755 manager()->RegisterService(mock_service1); 2756 manager()->RegisterService(mock_service2); 2757 manager()->RegisterService(mock_service3); 2758 2759 EXPECT_CALL(*metrics(), NotifyServicesOnSameNetwork(2)); 2760 manager()->ReportServicesOnSameNetwork(connection_id1); 2761 2762 EXPECT_CALL(*metrics(), NotifyServicesOnSameNetwork(1)); 2763 manager()->ReportServicesOnSameNetwork(connection_id2); 2764 } 2765 2766 TEST_F(ManagerTest, AvailableTechnologies) { 2767 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 2768 dispatcher(), 2769 metrics(), 2770 manager(), 2771 "null4", 2772 "addr4", 2773 0)); 2774 manager()->RegisterDevice(mock_devices_[0]); 2775 manager()->RegisterDevice(mock_devices_[1]); 2776 manager()->RegisterDevice(mock_devices_[2]); 2777 manager()->RegisterDevice(mock_devices_[3]); 2778 2779 ON_CALL(*mock_devices_[0].get(), technology()) 2780 .WillByDefault(Return(Technology::kEthernet)); 2781 ON_CALL(*mock_devices_[1].get(), technology()) 2782 .WillByDefault(Return(Technology::kWifi)); 2783 ON_CALL(*mock_devices_[2].get(), technology()) 2784 .WillByDefault(Return(Technology::kCellular)); 2785 ON_CALL(*mock_devices_[3].get(), technology()) 2786 .WillByDefault(Return(Technology::kWifi)); 2787 2788 set<string> expected_technologies; 2789 expected_technologies.insert(Technology::NameFromIdentifier( 2790 Technology::kEthernet)); 2791 expected_technologies.insert(Technology::NameFromIdentifier( 2792 Technology::kWifi)); 2793 expected_technologies.insert(Technology::NameFromIdentifier( 2794 Technology::kCellular)); 2795 Error error; 2796 vector<string> technologies = manager()->AvailableTechnologies(&error); 2797 2798 EXPECT_THAT(set<string>(technologies.begin(), technologies.end()), 2799 ContainerEq(expected_technologies)); 2800 } 2801 2802 TEST_F(ManagerTest, ConnectedTechnologies) { 2803 scoped_refptr<MockService> connected_service1( 2804 new NiceMock<MockService>(control_interface(), 2805 dispatcher(), 2806 metrics(), 2807 manager())); 2808 scoped_refptr<MockService> connected_service2( 2809 new NiceMock<MockService>(control_interface(), 2810 dispatcher(), 2811 metrics(), 2812 manager())); 2813 scoped_refptr<MockService> disconnected_service1( 2814 new NiceMock<MockService>(control_interface(), 2815 dispatcher(), 2816 metrics(), 2817 manager())); 2818 scoped_refptr<MockService> disconnected_service2( 2819 new NiceMock<MockService>(control_interface(), 2820 dispatcher(), 2821 metrics(), 2822 manager())); 2823 2824 ON_CALL(*connected_service1.get(), IsConnected()) 2825 .WillByDefault(Return(true)); 2826 ON_CALL(*connected_service2.get(), IsConnected()) 2827 .WillByDefault(Return(true)); 2828 2829 manager()->RegisterService(connected_service1); 2830 manager()->RegisterService(connected_service2); 2831 manager()->RegisterService(disconnected_service1); 2832 manager()->RegisterService(disconnected_service2); 2833 2834 manager()->RegisterDevice(mock_devices_[0]); 2835 manager()->RegisterDevice(mock_devices_[1]); 2836 manager()->RegisterDevice(mock_devices_[2]); 2837 manager()->RegisterDevice(mock_devices_[3]); 2838 2839 ON_CALL(*mock_devices_[0].get(), technology()) 2840 .WillByDefault(Return(Technology::kEthernet)); 2841 ON_CALL(*mock_devices_[1].get(), technology()) 2842 .WillByDefault(Return(Technology::kWifi)); 2843 ON_CALL(*mock_devices_[2].get(), technology()) 2844 .WillByDefault(Return(Technology::kCellular)); 2845 ON_CALL(*mock_devices_[3].get(), technology()) 2846 .WillByDefault(Return(Technology::kWifi)); 2847 2848 mock_devices_[0]->SelectService(connected_service1); 2849 mock_devices_[1]->SelectService(disconnected_service1); 2850 mock_devices_[2]->SelectService(disconnected_service2); 2851 mock_devices_[3]->SelectService(connected_service2); 2852 2853 set<string> expected_technologies; 2854 expected_technologies.insert(Technology::NameFromIdentifier( 2855 Technology::kEthernet)); 2856 expected_technologies.insert(Technology::NameFromIdentifier( 2857 Technology::kWifi)); 2858 Error error; 2859 2860 vector<string> technologies = manager()->ConnectedTechnologies(&error); 2861 EXPECT_THAT(set<string>(technologies.begin(), technologies.end()), 2862 ContainerEq(expected_technologies)); 2863 } 2864 2865 TEST_F(ManagerTest, DefaultTechnology) { 2866 scoped_refptr<MockService> connected_service( 2867 new NiceMock<MockService>(control_interface(), 2868 dispatcher(), 2869 metrics(), 2870 manager())); 2871 scoped_refptr<MockService> disconnected_service( 2872 new NiceMock<MockService>(control_interface(), 2873 dispatcher(), 2874 metrics(), 2875 manager())); 2876 2877 // Connected. WiFi. 2878 ON_CALL(*connected_service.get(), IsConnected()) 2879 .WillByDefault(Return(true)); 2880 ON_CALL(*connected_service.get(), state()) 2881 .WillByDefault(Return(Service::kStateConnected)); 2882 ON_CALL(*connected_service.get(), technology()) 2883 .WillByDefault(Return(Technology::kWifi)); 2884 2885 // Disconnected. Ethernet. 2886 ON_CALL(*disconnected_service.get(), technology()) 2887 .WillByDefault(Return(Technology::kEthernet)); 2888 2889 manager()->RegisterService(disconnected_service); 2890 CompleteServiceSort(); 2891 Error error; 2892 EXPECT_THAT(manager()->DefaultTechnology(&error), StrEq("")); 2893 2894 2895 manager()->RegisterService(connected_service); 2896 CompleteServiceSort(); 2897 // Connected service should be brought to the front now. 2898 string expected_technology = 2899 Technology::NameFromIdentifier(Technology::kWifi); 2900 EXPECT_THAT(manager()->DefaultTechnology(&error), StrEq(expected_technology)); 2901 } 2902 2903 TEST_F(ManagerTest, Stop) { 2904 scoped_refptr<MockProfile> profile( 2905 new NiceMock<MockProfile>( 2906 control_interface(), metrics(), manager(), "")); 2907 AdoptProfile(manager(), profile); 2908 scoped_refptr<MockService> service( 2909 new NiceMock<MockService>(control_interface(), 2910 dispatcher(), 2911 metrics(), 2912 manager())); 2913 manager()->RegisterService(service); 2914 manager()->RegisterDevice(mock_devices_[0]); 2915 SetPowerManager(); 2916 EXPECT_TRUE(manager()->power_manager()); 2917 EXPECT_CALL(*profile.get(), 2918 UpdateDevice(DeviceRefPtr(mock_devices_[0].get()))) 2919 .WillOnce(Return(true)); 2920 EXPECT_CALL(*mock_devices_[0].get(), SetEnabled(false)); 2921 #if !defined(DISABLE_WIFI) 2922 EXPECT_CALL(*profile.get(), UpdateWiFiProvider(_)).WillOnce(Return(true)); 2923 #endif // DISABLE_WIFI 2924 EXPECT_CALL(*profile.get(), Save()).WillOnce(Return(true)); 2925 EXPECT_CALL(*service.get(), Disconnect(_, HasSubstr("Stop"))).Times(1); 2926 manager()->Stop(); 2927 EXPECT_FALSE(manager()->power_manager()); 2928 } 2929 2930 TEST_F(ManagerTest, UpdateServiceConnected) { 2931 scoped_refptr<MockService> mock_service( 2932 new NiceMock<MockService>(control_interface(), 2933 dispatcher(), 2934 metrics(), 2935 manager())); 2936 manager()->RegisterService(mock_service); 2937 EXPECT_FALSE(mock_service->retain_auto_connect()); 2938 EXPECT_FALSE(mock_service->auto_connect()); 2939 2940 EXPECT_CALL(*mock_service.get(), IsConnected()) 2941 .WillRepeatedly(Return(true)); 2942 EXPECT_CALL(*mock_service.get(), EnableAndRetainAutoConnect()); 2943 manager()->UpdateService(mock_service); 2944 } 2945 2946 TEST_F(ManagerTest, UpdateServiceConnectedPersistAutoConnect) { 2947 // This tests the case where the user connects to a service that is 2948 // currently associated with a profile. We want to make sure that the 2949 // auto_connect flag is set and that the is saved to the current profile. 2950 scoped_refptr<MockService> mock_service( 2951 new NiceMock<MockService>(control_interface(), 2952 dispatcher(), 2953 metrics(), 2954 manager())); 2955 manager()->RegisterService(mock_service); 2956 EXPECT_FALSE(mock_service->retain_auto_connect()); 2957 EXPECT_FALSE(mock_service->auto_connect()); 2958 2959 scoped_refptr<MockProfile> profile( 2960 new MockProfile( 2961 control_interface(), metrics(), manager(), "")); 2962 2963 mock_service->set_profile(profile); 2964 EXPECT_CALL(*mock_service, IsConnected()) 2965 .WillRepeatedly(Return(true)); 2966 EXPECT_CALL(*profile, 2967 UpdateService(static_cast<ServiceRefPtr>(mock_service))); 2968 EXPECT_CALL(*mock_service.get(), EnableAndRetainAutoConnect()); 2969 manager()->UpdateService(mock_service); 2970 // This releases the ref on the mock profile. 2971 mock_service->set_profile(nullptr); 2972 } 2973 2974 TEST_F(ManagerTest, UpdateServiceLogging) { 2975 ScopedMockLog log; 2976 MockServiceRefPtr mock_service( 2977 new NiceMock<MockService>(control_interface(), 2978 dispatcher(), 2979 metrics(), 2980 manager())); 2981 string updated_message = base::StringPrintf( 2982 "Service %s updated;", mock_service->unique_name().c_str()); 2983 2984 // An idle service should not create a log message by default. 2985 EXPECT_CALL(*mock_service.get(), state()) 2986 .WillRepeatedly(Return(Service::kStateIdle)); 2987 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr(updated_message))) 2988 .Times(0); 2989 manager()->RegisterService(mock_service); 2990 CompleteServiceSort(); 2991 manager()->UpdateService(mock_service); 2992 CompleteServiceSort(); 2993 Mock::VerifyAndClearExpectations(mock_service.get()); 2994 Mock::VerifyAndClearExpectations(&log); 2995 2996 // A service leaving the idle state should create a log message. 2997 EXPECT_CALL(*mock_service.get(), state()) 2998 .WillRepeatedly(Return(Service::kStateAssociating)); 2999 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr(updated_message))) 3000 .Times(1); 3001 manager()->UpdateService(mock_service.get()); 3002 CompleteServiceSort(); 3003 Mock::VerifyAndClearExpectations(&log); 3004 3005 // A service in a non-idle state should not create a log message if its 3006 // state did not change. 3007 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr(updated_message))) 3008 .Times(0); 3009 manager()->UpdateService(mock_service); 3010 CompleteServiceSort(); 3011 Mock::VerifyAndClearExpectations(mock_service.get()); 3012 Mock::VerifyAndClearExpectations(&log); 3013 3014 // A service transitioning between two non-idle states should create 3015 // a log message. 3016 EXPECT_CALL(*mock_service.get(), state()) 3017 .WillRepeatedly(Return(Service::kStateConnected)); 3018 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr(updated_message))) 3019 .Times(1); 3020 manager()->UpdateService(mock_service.get()); 3021 CompleteServiceSort(); 3022 Mock::VerifyAndClearExpectations(mock_service.get()); 3023 Mock::VerifyAndClearExpectations(&log); 3024 3025 // A service transitioning from a non-idle state to idle should create 3026 // a log message. 3027 EXPECT_CALL(*mock_service.get(), state()) 3028 .WillRepeatedly(Return(Service::kStateIdle)); 3029 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr(updated_message))) 3030 .Times(1); 3031 manager()->UpdateService(mock_service.get()); 3032 CompleteServiceSort(); 3033 } 3034 3035 TEST_F(ManagerTest, SaveSuccessfulService) { 3036 scoped_refptr<MockProfile> profile( 3037 new StrictMock<MockProfile>( 3038 control_interface(), metrics(), manager(), "")); 3039 AdoptProfile(manager(), profile); 3040 scoped_refptr<MockService> service( 3041 new NiceMock<MockService>(control_interface(), 3042 dispatcher(), 3043 metrics(), 3044 manager())); 3045 3046 // Re-cast this back to a ServiceRefPtr, so EXPECT arguments work correctly. 3047 ServiceRefPtr expect_service(service.get()); 3048 3049 EXPECT_CALL(*profile.get(), ConfigureService(expect_service)) 3050 .WillOnce(Return(false)); 3051 manager()->RegisterService(service); 3052 3053 EXPECT_CALL(*service.get(), state()) 3054 .WillRepeatedly(Return(Service::kStateConnected)); 3055 EXPECT_CALL(*service.get(), IsConnected()) 3056 .WillRepeatedly(Return(true)); 3057 EXPECT_CALL(*profile.get(), AdoptService(expect_service)) 3058 .WillOnce(Return(true)); 3059 manager()->UpdateService(service); 3060 } 3061 3062 TEST_F(ManagerTest, UpdateDevice) { 3063 MockProfile* profile0 = 3064 new MockProfile(control_interface(), metrics(), manager(), ""); 3065 MockProfile* profile1 = 3066 new MockProfile(control_interface(), metrics(), manager(), ""); 3067 MockProfile* profile2 = 3068 new MockProfile(control_interface(), metrics(), manager(), ""); 3069 AdoptProfile(manager(), profile0); // Passes ownership. 3070 AdoptProfile(manager(), profile1); // Passes ownership. 3071 AdoptProfile(manager(), profile2); // Passes ownership. 3072 DeviceRefPtr device_ref(mock_devices_[0].get()); 3073 EXPECT_CALL(*profile0, UpdateDevice(device_ref)).Times(0); 3074 EXPECT_CALL(*profile1, UpdateDevice(device_ref)).WillOnce(Return(true)); 3075 EXPECT_CALL(*profile2, UpdateDevice(device_ref)).WillOnce(Return(false)); 3076 manager()->UpdateDevice(mock_devices_[0]); 3077 } 3078 3079 TEST_F(ManagerTest, EnumerateProfiles) { 3080 vector<string> profile_paths; 3081 for (size_t i = 0; i < 10; i++) { 3082 scoped_refptr<MockProfile> profile( 3083 new StrictMock<MockProfile>( 3084 control_interface(), metrics(), manager(), "")); 3085 profile_paths.push_back(base::StringPrintf("/profile/%zd", i)); 3086 EXPECT_CALL(*profile.get(), GetRpcIdentifier()) 3087 .WillOnce(Return(profile_paths.back())); 3088 AdoptProfile(manager(), profile); 3089 } 3090 3091 Error error; 3092 vector<string> returned_paths = manager()->EnumerateProfiles(&error); 3093 EXPECT_TRUE(error.IsSuccess()); 3094 EXPECT_EQ(profile_paths.size(), returned_paths.size()); 3095 for (size_t i = 0; i < profile_paths.size(); i++) { 3096 EXPECT_EQ(profile_paths[i], returned_paths[i]); 3097 } 3098 } 3099 3100 TEST_F(ManagerTest, EnumerateServiceInnerDevices) { 3101 MockServiceRefPtr service1 = new NiceMock<MockService>(control_interface(), 3102 dispatcher(), 3103 metrics(), 3104 manager()); 3105 MockServiceRefPtr service2 = new NiceMock<MockService>(control_interface(), 3106 dispatcher(), 3107 metrics(), 3108 manager()); 3109 const string kDeviceRpcID = "/rpc/"; 3110 manager()->RegisterService(service1); 3111 manager()->RegisterService(service2); 3112 EXPECT_CALL(*service1.get(), GetInnerDeviceRpcIdentifier()) 3113 .WillRepeatedly(Return(kDeviceRpcID)); 3114 EXPECT_CALL(*service2.get(), GetInnerDeviceRpcIdentifier()) 3115 .WillRepeatedly(Return("")); 3116 Error error; 3117 EXPECT_EQ(vector<string>{kDeviceRpcID}, manager()->EnumerateDevices(&error)); 3118 EXPECT_TRUE(error.IsSuccess()); 3119 } 3120 3121 TEST_F(ManagerTest, AutoConnectOnRegister) { 3122 MockServiceRefPtr service = MakeAutoConnectableService(); 3123 EXPECT_CALL(*service.get(), AutoConnect()); 3124 manager()->RegisterService(service); 3125 dispatcher()->DispatchPendingEvents(); 3126 } 3127 3128 TEST_F(ManagerTest, AutoConnectOnUpdate) { 3129 MockServiceRefPtr service1 = MakeAutoConnectableService(); 3130 service1->SetPriority(1, nullptr); 3131 MockServiceRefPtr service2 = MakeAutoConnectableService(); 3132 service2->SetPriority(2, nullptr); 3133 manager()->RegisterService(service1); 3134 manager()->RegisterService(service2); 3135 dispatcher()->DispatchPendingEvents(); 3136 3137 EXPECT_CALL(*service1.get(), AutoConnect()); 3138 EXPECT_CALL(*service2.get(), state()) 3139 .WillRepeatedly(Return(Service::kStateFailure)); 3140 EXPECT_CALL(*service2.get(), IsFailed()) 3141 .WillRepeatedly(Return(true)); 3142 EXPECT_CALL(*service2.get(), IsConnected()) 3143 .WillRepeatedly(Return(false)); 3144 manager()->UpdateService(service2); 3145 dispatcher()->DispatchPendingEvents(); 3146 } 3147 3148 TEST_F(ManagerTest, AutoConnectOnDeregister) { 3149 MockServiceRefPtr service1 = MakeAutoConnectableService(); 3150 service1->SetPriority(1, nullptr); 3151 MockServiceRefPtr service2 = MakeAutoConnectableService(); 3152 service2->SetPriority(2, nullptr); 3153 manager()->RegisterService(service1); 3154 manager()->RegisterService(service2); 3155 dispatcher()->DispatchPendingEvents(); 3156 3157 EXPECT_CALL(*service1.get(), AutoConnect()); 3158 manager()->DeregisterService(service2); 3159 dispatcher()->DispatchPendingEvents(); 3160 } 3161 3162 TEST_F(ManagerTest, AutoConnectOnSuspending) { 3163 MockServiceRefPtr service = MakeAutoConnectableService(); 3164 SetSuspending(true); 3165 SetPowerManager(); 3166 EXPECT_CALL(*service, AutoConnect()).Times(0); 3167 manager()->RegisterService(service); 3168 dispatcher()->DispatchPendingEvents(); 3169 } 3170 3171 TEST_F(ManagerTest, AutoConnectOnNotSuspending) { 3172 MockServiceRefPtr service = MakeAutoConnectableService(); 3173 SetSuspending(false); 3174 SetPowerManager(); 3175 EXPECT_CALL(*service, AutoConnect()); 3176 manager()->RegisterService(service); 3177 dispatcher()->DispatchPendingEvents(); 3178 } 3179 3180 TEST_F(ManagerTest, AutoConnectWhileNotRunning) { 3181 SetRunning(false); 3182 MockServiceRefPtr service = MakeAutoConnectableService(); 3183 EXPECT_CALL(*service, AutoConnect()).Times(0); 3184 manager()->RegisterService(service); 3185 dispatcher()->DispatchPendingEvents(); 3186 } 3187 3188 TEST_F(ManagerTest, Suspend) { 3189 MockServiceRefPtr service = MakeAutoConnectableService(); 3190 SetPowerManager(); 3191 EXPECT_CALL(*service, AutoConnect()); 3192 manager()->RegisterService(service); 3193 manager()->RegisterDevice(mock_devices_[0]); 3194 dispatcher()->DispatchPendingEvents(); 3195 3196 EXPECT_CALL(*mock_devices_[0], OnBeforeSuspend(_)); 3197 OnSuspendImminent(); 3198 EXPECT_CALL(*service, AutoConnect()).Times(0); 3199 dispatcher()->DispatchPendingEvents(); 3200 Mock::VerifyAndClearExpectations(mock_devices_[0].get()); 3201 3202 EXPECT_CALL(*mock_devices_[0], OnAfterResume()); 3203 OnSuspendDone(); 3204 EXPECT_CALL(*service, AutoConnect()); 3205 dispatcher()->DispatchPendingEvents(); 3206 Mock::VerifyAndClearExpectations(mock_devices_[0].get()); 3207 } 3208 3209 TEST_F(ManagerTest, AddTerminationAction) { 3210 EXPECT_TRUE(GetTerminationActions()->IsEmpty()); 3211 manager()->AddTerminationAction("action1", base::Closure()); 3212 EXPECT_FALSE(GetTerminationActions()->IsEmpty()); 3213 manager()->AddTerminationAction("action2", base::Closure()); 3214 } 3215 3216 TEST_F(ManagerTest, RemoveTerminationAction) { 3217 const char kKey1[] = "action1"; 3218 const char kKey2[] = "action2"; 3219 3220 // Removing an action when the hook table is empty. 3221 EXPECT_TRUE(GetTerminationActions()->IsEmpty()); 3222 manager()->RemoveTerminationAction("unknown"); 3223 3224 // Fill hook table with two items. 3225 manager()->AddTerminationAction(kKey1, base::Closure()); 3226 EXPECT_FALSE(GetTerminationActions()->IsEmpty()); 3227 manager()->AddTerminationAction(kKey2, base::Closure()); 3228 3229 // Removing an action that ends up with a non-empty hook table. 3230 manager()->RemoveTerminationAction(kKey1); 3231 EXPECT_FALSE(GetTerminationActions()->IsEmpty()); 3232 3233 // Removing the last action. 3234 manager()->RemoveTerminationAction(kKey2); 3235 EXPECT_TRUE(GetTerminationActions()->IsEmpty()); 3236 } 3237 3238 TEST_F(ManagerTest, RunTerminationActions) { 3239 TerminationActionTest test_action; 3240 const string kActionName = "action"; 3241 3242 EXPECT_CALL(test_action, Done(_)); 3243 manager()->RunTerminationActions(Bind(&TerminationActionTest::Done, 3244 test_action.AsWeakPtr())); 3245 3246 manager()->AddTerminationAction(TerminationActionTest::kActionName, 3247 Bind(&TerminationActionTest::Action, 3248 test_action.AsWeakPtr())); 3249 test_action.set_manager(manager()); 3250 EXPECT_CALL(test_action, Done(_)); 3251 manager()->RunTerminationActions(Bind(&TerminationActionTest::Done, 3252 test_action.AsWeakPtr())); 3253 } 3254 3255 TEST_F(ManagerTest, OnSuspendImminentDevicesPresent) { 3256 EXPECT_CALL(*mock_devices_[0].get(), OnBeforeSuspend(_)); 3257 EXPECT_CALL(*mock_devices_[1].get(), OnBeforeSuspend(_)); 3258 EXPECT_CALL(*mock_devices_[2].get(), OnBeforeSuspend(_)); 3259 manager()->RegisterDevice(mock_devices_[0]); 3260 manager()->RegisterDevice(mock_devices_[1]); 3261 manager()->RegisterDevice(mock_devices_[2]); 3262 SetPowerManager(); 3263 OnSuspendImminent(); 3264 } 3265 3266 TEST_F(ManagerTest, OnSuspendImminentNoDevicesPresent) { 3267 EXPECT_CALL(*power_manager_, ReportSuspendReadiness()); 3268 SetPowerManager(); 3269 OnSuspendImminent(); 3270 } 3271 3272 TEST_F(ManagerTest, OnDarkSuspendImminentDevicesPresent) { 3273 EXPECT_CALL(*mock_devices_[0].get(), OnDarkResume(_)); 3274 EXPECT_CALL(*mock_devices_[1].get(), OnDarkResume(_)); 3275 EXPECT_CALL(*mock_devices_[2].get(), OnDarkResume(_)); 3276 manager()->RegisterDevice(mock_devices_[0]); 3277 manager()->RegisterDevice(mock_devices_[1]); 3278 manager()->RegisterDevice(mock_devices_[2]); 3279 SetPowerManager(); 3280 OnDarkSuspendImminent(); 3281 } 3282 3283 TEST_F(ManagerTest, OnDarkSuspendImminentNoDevicesPresent) { 3284 EXPECT_CALL(*power_manager_, ReportDarkSuspendReadiness()); 3285 SetPowerManager(); 3286 OnDarkSuspendImminent(); 3287 } 3288 3289 TEST_F(ManagerTest, OnSuspendActionsComplete) { 3290 Error error; 3291 EXPECT_CALL(*power_manager_, ReportSuspendReadiness()); 3292 SetPowerManager(); 3293 OnSuspendActionsComplete(error); 3294 } 3295 3296 TEST_F(ManagerTest, RecheckPortal) { 3297 EXPECT_CALL(*mock_devices_[0].get(), RequestPortalDetection()) 3298 .WillOnce(Return(false)); 3299 EXPECT_CALL(*mock_devices_[1].get(), RequestPortalDetection()) 3300 .WillOnce(Return(true)); 3301 EXPECT_CALL(*mock_devices_[2].get(), RequestPortalDetection()) 3302 .Times(0); 3303 3304 manager()->RegisterDevice(mock_devices_[0]); 3305 manager()->RegisterDevice(mock_devices_[1]); 3306 manager()->RegisterDevice(mock_devices_[2]); 3307 3308 manager()->RecheckPortal(nullptr); 3309 } 3310 3311 TEST_F(ManagerTest, RecheckPortalOnService) { 3312 MockServiceRefPtr service = new NiceMock<MockService>(control_interface(), 3313 dispatcher(), 3314 metrics(), 3315 manager()); 3316 EXPECT_CALL(*mock_devices_[0].get(), 3317 IsConnectedToService(IsRefPtrTo(service))) 3318 .WillOnce(Return(false)); 3319 EXPECT_CALL(*mock_devices_[1].get(), 3320 IsConnectedToService(IsRefPtrTo(service))) 3321 .WillOnce(Return(true)); 3322 EXPECT_CALL(*mock_devices_[1].get(), RestartPortalDetection()) 3323 .WillOnce(Return(true)); 3324 EXPECT_CALL(*mock_devices_[2].get(), IsConnectedToService(_)) 3325 .Times(0); 3326 3327 manager()->RegisterDevice(mock_devices_[0]); 3328 manager()->RegisterDevice(mock_devices_[1]); 3329 manager()->RegisterDevice(mock_devices_[2]); 3330 3331 manager()->RecheckPortalOnService(service); 3332 } 3333 3334 TEST_F(ManagerTest, GetDefaultService) { 3335 EXPECT_FALSE(manager()->GetDefaultService().get()); 3336 EXPECT_EQ(control_interface()->NullRPCIdentifier(), 3337 GetDefaultServiceRpcIdentifier()); 3338 3339 scoped_refptr<MockService> mock_service( 3340 new NiceMock<MockService>(control_interface(), 3341 dispatcher(), 3342 metrics(), 3343 manager())); 3344 3345 manager()->RegisterService(mock_service); 3346 EXPECT_FALSE(manager()->GetDefaultService().get()); 3347 EXPECT_EQ(control_interface()->NullRPCIdentifier(), 3348 GetDefaultServiceRpcIdentifier()); 3349 3350 scoped_refptr<MockConnection> mock_connection( 3351 new NiceMock<MockConnection>(device_info_.get())); 3352 mock_service->set_mock_connection(mock_connection); 3353 EXPECT_EQ(mock_service.get(), manager()->GetDefaultService().get()); 3354 EXPECT_EQ(mock_service->GetRpcIdentifier(), GetDefaultServiceRpcIdentifier()); 3355 3356 mock_service->set_mock_connection(nullptr); 3357 manager()->DeregisterService(mock_service); 3358 } 3359 3360 TEST_F(ManagerTest, GetServiceWithGUID) { 3361 scoped_refptr<MockService> mock_service0( 3362 new NiceMock<MockService>(control_interface(), 3363 dispatcher(), 3364 metrics(), 3365 manager())); 3366 3367 scoped_refptr<MockService> mock_service1( 3368 new NiceMock<MockService>(control_interface(), 3369 dispatcher(), 3370 metrics(), 3371 manager())); 3372 3373 EXPECT_CALL(*mock_service0.get(), Configure(_, _)) 3374 .Times(0); 3375 EXPECT_CALL(*mock_service1.get(), Configure(_, _)) 3376 .Times(0); 3377 3378 manager()->RegisterService(mock_service0); 3379 manager()->RegisterService(mock_service1); 3380 3381 const string kGUID0 = "GUID0"; 3382 const string kGUID1 = "GUID1"; 3383 3384 { 3385 Error error; 3386 ServiceRefPtr service = manager()->GetServiceWithGUID(kGUID0, &error); 3387 EXPECT_FALSE(error.IsSuccess()); 3388 EXPECT_FALSE(service); 3389 } 3390 3391 KeyValueStore args; 3392 args.SetString(kGuidProperty, kGUID1); 3393 3394 { 3395 Error error; 3396 ServiceRefPtr service = manager()->GetService(args, &error); 3397 EXPECT_EQ(Error::kInvalidArguments, error.type()); 3398 EXPECT_FALSE(service); 3399 } 3400 3401 mock_service0->SetGuid(kGUID0, nullptr); 3402 mock_service1->SetGuid(kGUID1, nullptr); 3403 3404 { 3405 Error error; 3406 ServiceRefPtr service = manager()->GetServiceWithGUID(kGUID0, &error); 3407 EXPECT_TRUE(error.IsSuccess()); 3408 EXPECT_EQ(mock_service0.get(), service.get()); 3409 } 3410 3411 { 3412 Error error; 3413 EXPECT_CALL(*mock_service1.get(), Configure(_, &error)) 3414 .Times(1); 3415 ServiceRefPtr service = manager()->GetService(args, &error); 3416 EXPECT_TRUE(error.IsSuccess()); 3417 EXPECT_EQ(mock_service1.get(), service.get()); 3418 } 3419 3420 manager()->DeregisterService(mock_service0); 3421 manager()->DeregisterService(mock_service1); 3422 } 3423 3424 3425 TEST_F(ManagerTest, CalculateStateOffline) { 3426 EXPECT_FALSE(manager()->IsConnected()); 3427 EXPECT_EQ("offline", manager()->CalculateState(nullptr)); 3428 3429 MockMetrics mock_metrics(dispatcher()); 3430 SetMetrics(&mock_metrics); 3431 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(_)) 3432 .Times(AnyNumber()); 3433 scoped_refptr<MockService> mock_service0( 3434 new NiceMock<MockService>(control_interface(), 3435 dispatcher(), 3436 metrics(), 3437 manager())); 3438 3439 scoped_refptr<MockService> mock_service1( 3440 new NiceMock<MockService>(control_interface(), 3441 dispatcher(), 3442 metrics(), 3443 manager())); 3444 3445 EXPECT_CALL(*mock_service0.get(), IsConnected()) 3446 .WillRepeatedly(Return(false)); 3447 EXPECT_CALL(*mock_service1.get(), IsConnected()) 3448 .WillRepeatedly(Return(false)); 3449 3450 manager()->RegisterService(mock_service0); 3451 manager()->RegisterService(mock_service1); 3452 3453 EXPECT_FALSE(manager()->IsConnected()); 3454 EXPECT_EQ("offline", manager()->CalculateState(nullptr)); 3455 3456 manager()->DeregisterService(mock_service0); 3457 manager()->DeregisterService(mock_service1); 3458 } 3459 3460 TEST_F(ManagerTest, CalculateStateOnline) { 3461 MockMetrics mock_metrics(dispatcher()); 3462 SetMetrics(&mock_metrics); 3463 EXPECT_CALL(mock_metrics, NotifyDefaultServiceChanged(_)) 3464 .Times(AnyNumber()); 3465 scoped_refptr<MockService> mock_service0( 3466 new NiceMock<MockService>(control_interface(), 3467 dispatcher(), 3468 metrics(), 3469 manager())); 3470 3471 scoped_refptr<MockService> mock_service1( 3472 new NiceMock<MockService>(control_interface(), 3473 dispatcher(), 3474 metrics(), 3475 manager())); 3476 3477 EXPECT_CALL(*mock_service0.get(), IsConnected()) 3478 .WillRepeatedly(Return(false)); 3479 EXPECT_CALL(*mock_service1.get(), IsConnected()) 3480 .WillRepeatedly(Return(true)); 3481 EXPECT_CALL(*mock_service0.get(), state()) 3482 .WillRepeatedly(Return(Service::kStateIdle)); 3483 EXPECT_CALL(*mock_service1.get(), state()) 3484 .WillRepeatedly(Return(Service::kStateConnected)); 3485 3486 manager()->RegisterService(mock_service0); 3487 manager()->RegisterService(mock_service1); 3488 CompleteServiceSort(); 3489 3490 EXPECT_TRUE(manager()->IsConnected()); 3491 EXPECT_EQ("online", manager()->CalculateState(nullptr)); 3492 3493 manager()->DeregisterService(mock_service0); 3494 manager()->DeregisterService(mock_service1); 3495 } 3496 3497 TEST_F(ManagerTest, RefreshConnectionState) { 3498 EXPECT_CALL(*manager_adaptor_, 3499 EmitStringChanged(kConnectionStateProperty, kStateIdle)); 3500 EXPECT_CALL(*upstart_, NotifyDisconnected()); 3501 EXPECT_CALL(*upstart_, NotifyConnected()).Times(0); 3502 RefreshConnectionState(); 3503 Mock::VerifyAndClearExpectations(manager_adaptor_); 3504 Mock::VerifyAndClearExpectations(upstart_); 3505 3506 scoped_refptr<MockService> mock_service( 3507 new NiceMock<MockService>(control_interface(), 3508 dispatcher(), 3509 metrics(), 3510 manager())); 3511 EXPECT_CALL(*manager_adaptor_, 3512 EmitStringChanged(kConnectionStateProperty, _)).Times(0); 3513 EXPECT_CALL(*upstart_, NotifyDisconnected()).Times(0); 3514 EXPECT_CALL(*upstart_, NotifyConnected()); 3515 manager()->RegisterService(mock_service); 3516 RefreshConnectionState(); 3517 3518 scoped_refptr<MockConnection> mock_connection( 3519 new NiceMock<MockConnection>(device_info_.get())); 3520 mock_service->set_mock_connection(mock_connection); 3521 EXPECT_CALL(*mock_service, state()) 3522 .WillOnce(Return(Service::kStateIdle)); 3523 RefreshConnectionState(); 3524 3525 Mock::VerifyAndClearExpectations(manager_adaptor_); 3526 EXPECT_CALL(*mock_service, state()) 3527 .WillOnce(Return(Service::kStatePortal)); 3528 EXPECT_CALL(*mock_service, IsConnected()) 3529 .WillOnce(Return(true)); 3530 EXPECT_CALL(*manager_adaptor_, 3531 EmitStringChanged(kConnectionStateProperty, kStatePortal)); 3532 RefreshConnectionState(); 3533 Mock::VerifyAndClearExpectations(manager_adaptor_); 3534 Mock::VerifyAndClearExpectations(upstart_); 3535 3536 mock_service->set_mock_connection(nullptr); 3537 manager()->DeregisterService(mock_service); 3538 3539 EXPECT_CALL(*manager_adaptor_, 3540 EmitStringChanged(kConnectionStateProperty, kStateIdle)); 3541 EXPECT_CALL(*upstart_, NotifyDisconnected()); 3542 EXPECT_CALL(*upstart_, NotifyConnected()).Times(0); 3543 RefreshConnectionState(); 3544 } 3545 3546 TEST_F(ManagerTest, StartupPortalList) { 3547 // Simulate loading value from the default profile. 3548 const string kProfileValue("wifi,vpn"); 3549 manager()->props_.check_portal_list = kProfileValue; 3550 3551 EXPECT_EQ(kProfileValue, manager()->GetCheckPortalList(nullptr)); 3552 EXPECT_TRUE(manager()->IsPortalDetectionEnabled(Technology::kWifi)); 3553 EXPECT_FALSE(manager()->IsPortalDetectionEnabled(Technology::kCellular)); 3554 3555 const string kStartupValue("cellular,ethernet"); 3556 manager()->SetStartupPortalList(kStartupValue); 3557 // Ensure profile value is not overwritten, so when we save the default 3558 // profile, the correct value will still be written. 3559 EXPECT_EQ(kProfileValue, manager()->props_.check_portal_list); 3560 3561 // However we should read back a different list. 3562 EXPECT_EQ(kStartupValue, manager()->GetCheckPortalList(nullptr)); 3563 EXPECT_FALSE(manager()->IsPortalDetectionEnabled(Technology::kWifi)); 3564 EXPECT_TRUE(manager()->IsPortalDetectionEnabled(Technology::kCellular)); 3565 3566 const string kRuntimeValue("ppp"); 3567 // Setting a runtime value over the control API should overwrite both 3568 // the profile value and what we read back. 3569 Error error; 3570 manager()->mutable_store()->SetStringProperty( 3571 kCheckPortalListProperty, 3572 kRuntimeValue, 3573 &error); 3574 ASSERT_TRUE(error.IsSuccess()); 3575 EXPECT_EQ(kRuntimeValue, manager()->GetCheckPortalList(nullptr)); 3576 EXPECT_EQ(kRuntimeValue, manager()->props_.check_portal_list); 3577 EXPECT_FALSE(manager()->IsPortalDetectionEnabled(Technology::kCellular)); 3578 EXPECT_TRUE(manager()->IsPortalDetectionEnabled(Technology::kPPP)); 3579 } 3580 3581 TEST_F(ManagerTest, LinkMonitorEnabled) { 3582 const string kEnabledTechnologies("wifi,vpn"); 3583 manager()->props_.link_monitor_technologies = kEnabledTechnologies; 3584 EXPECT_TRUE(manager()->IsTechnologyLinkMonitorEnabled(Technology::kWifi)); 3585 EXPECT_FALSE( 3586 manager()->IsTechnologyLinkMonitorEnabled(Technology::kCellular)); 3587 } 3588 3589 TEST_F(ManagerTest, IsTechnologyAutoConnectDisabled) { 3590 const string kNoAutoConnectTechnologies("wifi,cellular"); 3591 manager()->props_.no_auto_connect_technologies = kNoAutoConnectTechnologies; 3592 EXPECT_TRUE(manager()->IsTechnologyAutoConnectDisabled(Technology::kWifi)); 3593 EXPECT_TRUE( 3594 manager()->IsTechnologyAutoConnectDisabled(Technology::kCellular)); 3595 EXPECT_FALSE( 3596 manager()->IsTechnologyAutoConnectDisabled(Technology::kEthernet)); 3597 } 3598 3599 TEST_F(ManagerTest, SetEnabledStateForTechnologyPersistentCheck) { 3600 Error error(Error::kOperationInitiated); 3601 DisableTechnologyReplyHandler disable_technology_reply_handler; 3602 ResultCallback disable_technology_callback( 3603 Bind(&DisableTechnologyReplyHandler::ReportResult, 3604 disable_technology_reply_handler.AsWeakPtr())); 3605 EXPECT_CALL(disable_technology_reply_handler, ReportResult(_)).Times(0); 3606 EXPECT_CALL(*mock_devices_[0], SetEnabledPersistent(false, _, _)); 3607 3608 ON_CALL(*mock_devices_[0], technology()) 3609 .WillByDefault(Return(Technology::kEthernet)); 3610 manager()->RegisterDevice(mock_devices_[0]); 3611 manager()->SetEnabledStateForTechnology(kTypeEthernet, false, true, 3612 &error, disable_technology_callback); 3613 3614 EXPECT_CALL(*mock_devices_[0], SetEnabledNonPersistent(false, _, _)); 3615 manager()->SetEnabledStateForTechnology(kTypeEthernet, false, false, 3616 &error, disable_technology_callback); 3617 } 3618 3619 TEST_F(ManagerTest, SetEnabledStateForTechnology) { 3620 Error error(Error::kOperationInitiated); 3621 DisableTechnologyReplyHandler disable_technology_reply_handler; 3622 ResultCallback disable_technology_callback( 3623 Bind(&DisableTechnologyReplyHandler::ReportResult, 3624 disable_technology_reply_handler.AsWeakPtr())); 3625 EXPECT_CALL(disable_technology_reply_handler, ReportResult(_)).Times(0); 3626 3627 manager()->SetEnabledStateForTechnology(kTypeEthernet, false, true, 3628 &error, disable_technology_callback); 3629 EXPECT_TRUE(error.IsSuccess()); 3630 3631 ON_CALL(*mock_devices_[0], technology()) 3632 .WillByDefault(Return(Technology::kEthernet)); 3633 ON_CALL(*mock_devices_[1], technology()) 3634 .WillByDefault(Return(Technology::kCellular)); 3635 ON_CALL(*mock_devices_[2], technology()) 3636 .WillByDefault(Return(Technology::kCellular)); 3637 3638 manager()->RegisterDevice(mock_devices_[0]); 3639 manager()->RegisterDevice(mock_devices_[1]); 3640 3641 // Ethernet Device is disabled, so disable succeeds immediately. 3642 EXPECT_CALL(*mock_devices_[0], SetEnabledPersistent(false, _, _)) 3643 .WillOnce(WithArg<1>(Invoke(SetErrorSuccess))); 3644 error.Populate(Error::kOperationInitiated); 3645 manager()->SetEnabledStateForTechnology(kTypeEthernet, false, true, 3646 &error, disable_technology_callback); 3647 EXPECT_TRUE(error.IsSuccess()); 3648 3649 // Ethernet Device is enabled, and mock doesn't change error from 3650 // kOperationInitiated, so expect disable to say operation in progress. 3651 EXPECT_CALL(*mock_devices_[0], SetEnabledPersistent(false, _, _)); 3652 mock_devices_[0]->enabled_ = true; 3653 error.Populate(Error::kOperationInitiated); 3654 manager()->SetEnabledStateForTechnology(kTypeEthernet, false, true, 3655 &error, disable_technology_callback); 3656 EXPECT_TRUE(error.IsOngoing()); 3657 3658 // Ethernet Device is disabled, and mock doesn't change error from 3659 // kOperationInitiated, so expect enable to say operation in progress. 3660 EXPECT_CALL(*mock_devices_[0], SetEnabledPersistent(true, _, _)); 3661 mock_devices_[0]->enabled_ = false; 3662 error.Populate(Error::kOperationInitiated); 3663 manager()->SetEnabledStateForTechnology(kTypeEthernet, true, true, 3664 &error, disable_technology_callback); 3665 EXPECT_TRUE(error.IsOngoing()); 3666 3667 // Cellular Device is enabled, but disable failed. 3668 EXPECT_CALL(*mock_devices_[1], SetEnabledPersistent(false, _, _)) 3669 .WillOnce(WithArg<1>(Invoke(SetErrorPermissionDenied))); 3670 mock_devices_[1]->enabled_ = true; 3671 error.Populate(Error::kOperationInitiated); 3672 manager()->SetEnabledStateForTechnology(kTypeCellular, false, true, 3673 &error, disable_technology_callback); 3674 EXPECT_EQ(Error::kPermissionDenied, error.type()); 3675 3676 // Multiple Cellular Devices in enabled state. Should indicate IsOngoing 3677 // if one is in progress (even if the other completed immediately). 3678 manager()->RegisterDevice(mock_devices_[2]); 3679 EXPECT_CALL(*mock_devices_[1], SetEnabledPersistent(false, _, _)) 3680 .WillOnce(WithArg<1>(Invoke(SetErrorPermissionDenied))); 3681 EXPECT_CALL(*mock_devices_[2], SetEnabledPersistent(false, _, _)); 3682 mock_devices_[1]->enabled_ = true; 3683 mock_devices_[2]->enabled_ = true; 3684 error.Populate(Error::kOperationInitiated); 3685 manager()->SetEnabledStateForTechnology(kTypeCellular, false, true, 3686 &error, disable_technology_callback); 3687 EXPECT_TRUE(error.IsOngoing()); 3688 3689 // ...and order doesn't matter. 3690 EXPECT_CALL(*mock_devices_[1], SetEnabledPersistent(false, _, _)); 3691 EXPECT_CALL(*mock_devices_[2], SetEnabledPersistent(false, _, _)) 3692 .WillOnce(WithArg<1>(Invoke(SetErrorPermissionDenied))); 3693 mock_devices_[1]->enabled_ = true; 3694 mock_devices_[2]->enabled_ = true; 3695 error.Populate(Error::kOperationInitiated); 3696 manager()->SetEnabledStateForTechnology(kTypeCellular, false, true, 3697 &error, disable_technology_callback); 3698 EXPECT_TRUE(error.IsOngoing()); 3699 Mock::VerifyAndClearExpectations(&disable_technology_reply_handler); 3700 3701 // Multiple Cellular Devices in enabled state. Even if all disable 3702 // operations complete asynchronously, we only get one call to the 3703 // DisableTechnologyReplyHandler::ReportResult. 3704 ResultCallback device1_result_callback; 3705 ResultCallback device2_result_callback; 3706 EXPECT_CALL(*mock_devices_[1], SetEnabledPersistent(false, _, _)) 3707 .WillOnce(SaveArg<2>(&device1_result_callback)); 3708 EXPECT_CALL(*mock_devices_[2], SetEnabledPersistent(false, _, _)) 3709 .WillOnce(DoAll(WithArg<1>(Invoke(SetErrorPermissionDenied)), 3710 SaveArg<2>(&device2_result_callback))); 3711 EXPECT_CALL(disable_technology_reply_handler, ReportResult(_)); 3712 mock_devices_[1]->enabled_ = true; 3713 mock_devices_[2]->enabled_ = true; 3714 error.Populate(Error::kOperationInitiated); 3715 manager()->SetEnabledStateForTechnology(kTypeCellular, false, true, 3716 &error, disable_technology_callback); 3717 EXPECT_TRUE(error.IsOngoing()); 3718 device1_result_callback.Run(Error(Error::kSuccess)); 3719 device2_result_callback.Run(Error(Error::kSuccess)); 3720 } 3721 3722 TEST_F(ManagerTest, IgnoredSearchList) { 3723 std::unique_ptr<MockResolver> resolver(new StrictMock<MockResolver>()); 3724 vector<string> ignored_paths; 3725 SetResolver(resolver.get()); 3726 3727 const string kIgnored0 = "chromium.org"; 3728 ignored_paths.push_back(kIgnored0); 3729 EXPECT_CALL(*resolver.get(), set_ignored_search_list(ignored_paths)); 3730 SetIgnoredDNSSearchPaths(kIgnored0, nullptr); 3731 EXPECT_EQ(kIgnored0, GetIgnoredDNSSearchPaths()); 3732 3733 const string kIgnored1 = "google.com"; 3734 const string kIgnoredSum = kIgnored0 + "," + kIgnored1; 3735 ignored_paths.push_back(kIgnored1); 3736 EXPECT_CALL(*resolver.get(), set_ignored_search_list(ignored_paths)); 3737 SetIgnoredDNSSearchPaths(kIgnoredSum, nullptr); 3738 EXPECT_EQ(kIgnoredSum, GetIgnoredDNSSearchPaths()); 3739 3740 ignored_paths.clear(); 3741 EXPECT_CALL(*resolver.get(), set_ignored_search_list(ignored_paths)); 3742 SetIgnoredDNSSearchPaths("", nullptr); 3743 EXPECT_EQ("", GetIgnoredDNSSearchPaths()); 3744 3745 SetResolver(Resolver::GetInstance()); 3746 } 3747 3748 TEST_F(ManagerTest, ServiceStateChangeEmitsServices) { 3749 // Test to make sure that every service state-change causes the 3750 // Manager to emit a new service list. 3751 scoped_refptr<MockService> mock_service( 3752 new NiceMock<MockService>(control_interface(), 3753 dispatcher(), 3754 metrics(), 3755 manager())); 3756 EXPECT_CALL(*mock_service, state()) 3757 .WillRepeatedly(Return(Service::kStateIdle)); 3758 3759 manager()->RegisterService(mock_service); 3760 EXPECT_CALL( 3761 *manager_adaptor_, EmitRpcIdentifierArrayChanged( 3762 kServiceCompleteListProperty, _)).Times(1); 3763 EXPECT_CALL( 3764 *manager_adaptor_, EmitRpcIdentifierArrayChanged( 3765 kServicesProperty, _)).Times(1); 3766 EXPECT_CALL( 3767 *manager_adaptor_, EmitRpcIdentifierArrayChanged( 3768 kServiceWatchListProperty, _)).Times(1); 3769 CompleteServiceSort(); 3770 3771 Mock::VerifyAndClearExpectations(manager_adaptor_); 3772 EXPECT_CALL( 3773 *manager_adaptor_, EmitRpcIdentifierArrayChanged( 3774 kServiceCompleteListProperty, _)).Times(1); 3775 EXPECT_CALL( 3776 *manager_adaptor_, EmitRpcIdentifierArrayChanged( 3777 kServicesProperty, _)).Times(1); 3778 EXPECT_CALL( 3779 *manager_adaptor_, EmitRpcIdentifierArrayChanged( 3780 kServiceWatchListProperty, _)).Times(1); 3781 manager()->UpdateService(mock_service.get()); 3782 CompleteServiceSort(); 3783 3784 manager()->DeregisterService(mock_service); 3785 } 3786 3787 TEST_F(ManagerTest, EnumerateServices) { 3788 scoped_refptr<MockService> mock_service( 3789 new NiceMock<MockService>(control_interface(), 3790 dispatcher(), 3791 metrics(), 3792 manager())); 3793 manager()->RegisterService(mock_service); 3794 3795 EXPECT_CALL(*mock_service, state()) 3796 .WillRepeatedly(Return(Service::kStateConnected)); 3797 EXPECT_CALL(*mock_service, IsVisible()) 3798 .WillRepeatedly(Return(false)); 3799 EXPECT_TRUE(EnumerateAvailableServices().empty()); 3800 EXPECT_TRUE(EnumerateWatchedServices().empty()); 3801 3802 EXPECT_CALL(*mock_service, state()) 3803 .WillRepeatedly(Return(Service::kStateIdle)); 3804 EXPECT_TRUE(EnumerateAvailableServices().empty()); 3805 EXPECT_TRUE(EnumerateWatchedServices().empty()); 3806 3807 EXPECT_CALL(*mock_service, IsVisible()) 3808 .WillRepeatedly(Return(true)); 3809 Service::ConnectState unwatched_states[] = { 3810 Service::kStateUnknown, 3811 Service::kStateIdle, 3812 Service::kStateFailure 3813 }; 3814 for (size_t i = 0; i < arraysize(unwatched_states); ++i) { 3815 EXPECT_CALL(*mock_service, state()) 3816 .WillRepeatedly(Return(unwatched_states[i])); 3817 EXPECT_FALSE(EnumerateAvailableServices().empty()); 3818 EXPECT_TRUE(EnumerateWatchedServices().empty()); 3819 } 3820 3821 Service::ConnectState watched_states[] = { 3822 Service::kStateAssociating, 3823 Service::kStateConfiguring, 3824 Service::kStateConnected, 3825 Service::kStatePortal, 3826 Service::kStateOnline 3827 }; 3828 for (size_t i = 0; i < arraysize(watched_states); ++i) { 3829 EXPECT_CALL(*mock_service, state()) 3830 .WillRepeatedly(Return(watched_states[i])); 3831 EXPECT_FALSE(EnumerateAvailableServices().empty()); 3832 EXPECT_FALSE(EnumerateWatchedServices().empty()); 3833 } 3834 3835 manager()->DeregisterService(mock_service); 3836 } 3837 3838 TEST_F(ManagerTest, ConnectToBestServices) { 3839 scoped_refptr<MockService> wifi_service0( 3840 new NiceMock<MockService>(control_interface(), 3841 dispatcher(), 3842 metrics(), 3843 manager())); 3844 EXPECT_CALL(*wifi_service0.get(), state()) 3845 .WillRepeatedly(Return(Service::kStateIdle)); 3846 EXPECT_CALL(*wifi_service0.get(), IsConnected()) 3847 .WillRepeatedly(Return(false)); 3848 wifi_service0->SetConnectable(true); 3849 wifi_service0->SetAutoConnect(true); 3850 wifi_service0->SetSecurity(Service::kCryptoAes, true, true); 3851 EXPECT_CALL(*wifi_service0.get(), technology()) 3852 .WillRepeatedly(Return(Technology::kWifi)); 3853 EXPECT_CALL(*wifi_service0.get(), IsVisible()) 3854 .WillRepeatedly(Return(false)); 3855 EXPECT_CALL(*wifi_service0.get(), explicitly_disconnected()) 3856 .WillRepeatedly(Return(false)); 3857 3858 scoped_refptr<MockService> wifi_service1( 3859 new NiceMock<MockService>(control_interface(), 3860 dispatcher(), 3861 metrics(), 3862 manager())); 3863 EXPECT_CALL(*wifi_service1.get(), state()) 3864 .WillRepeatedly(Return(Service::kStateIdle)); 3865 EXPECT_CALL(*wifi_service1.get(), IsVisible()) 3866 .WillRepeatedly(Return(true)); 3867 EXPECT_CALL(*wifi_service1.get(), IsConnected()) 3868 .WillRepeatedly(Return(false)); 3869 wifi_service1->SetAutoConnect(true); 3870 wifi_service1->SetConnectable(true); 3871 wifi_service1->SetSecurity(Service::kCryptoRc4, true, true); 3872 EXPECT_CALL(*wifi_service1.get(), technology()) 3873 .WillRepeatedly(Return(Technology::kWifi)); 3874 EXPECT_CALL(*wifi_service1.get(), explicitly_disconnected()) 3875 .WillRepeatedly(Return(false)); 3876 3877 scoped_refptr<MockService> wifi_service2( 3878 new NiceMock<MockService>(control_interface(), 3879 dispatcher(), 3880 metrics(), 3881 manager())); 3882 EXPECT_CALL(*wifi_service2.get(), state()) 3883 .WillRepeatedly(Return(Service::kStateConnected)); 3884 EXPECT_CALL(*wifi_service2.get(), IsConnected()) 3885 .WillRepeatedly(Return(true)); 3886 EXPECT_CALL(*wifi_service2.get(), IsVisible()) 3887 .WillRepeatedly(Return(true)); 3888 wifi_service2->SetAutoConnect(true); 3889 wifi_service2->SetConnectable(true); 3890 wifi_service2->SetSecurity(Service::kCryptoNone, false, false); 3891 EXPECT_CALL(*wifi_service2.get(), technology()) 3892 .WillRepeatedly(Return(Technology::kWifi)); 3893 EXPECT_CALL(*wifi_service2.get(), explicitly_disconnected()) 3894 .WillRepeatedly(Return(false)); 3895 3896 manager()->RegisterService(wifi_service0); 3897 manager()->RegisterService(wifi_service1); 3898 manager()->RegisterService(wifi_service2); 3899 3900 CompleteServiceSort(); 3901 EXPECT_TRUE(ServiceOrderIs(wifi_service2, wifi_service0)); 3902 3903 scoped_refptr<MockService> cell_service( 3904 new NiceMock<MockService>(control_interface(), 3905 dispatcher(), 3906 metrics(), 3907 manager())); 3908 3909 EXPECT_CALL(*cell_service.get(), state()) 3910 .WillRepeatedly(Return(Service::kStateIdle)); 3911 EXPECT_CALL(*cell_service.get(), IsConnected()) 3912 .WillRepeatedly(Return(false)); 3913 EXPECT_CALL(*cell_service.get(), IsVisible()) 3914 .WillRepeatedly(Return(true)); 3915 cell_service->SetAutoConnect(true); 3916 cell_service->SetConnectable(true); 3917 EXPECT_CALL(*cell_service.get(), technology()) 3918 .WillRepeatedly(Return(Technology::kCellular)); 3919 EXPECT_CALL(*cell_service.get(), explicitly_disconnected()) 3920 .WillRepeatedly(Return(true)); 3921 manager()->RegisterService(cell_service); 3922 3923 scoped_refptr<MockService> wimax_service( 3924 new NiceMock<MockService>(control_interface(), 3925 dispatcher(), 3926 metrics(), 3927 manager())); 3928 3929 EXPECT_CALL(*wimax_service.get(), state()) 3930 .WillRepeatedly(Return(Service::kStateConnected)); 3931 EXPECT_CALL(*wimax_service.get(), IsConnected()) 3932 .WillRepeatedly(Return(true)); 3933 EXPECT_CALL(*wimax_service.get(), IsVisible()) 3934 .WillRepeatedly(Return(true)); 3935 wimax_service->SetAutoConnect(true); 3936 wimax_service->SetConnectable(true); 3937 EXPECT_CALL(*wimax_service.get(), technology()) 3938 .WillRepeatedly(Return(Technology::kWiMax)); 3939 EXPECT_CALL(*wimax_service.get(), explicitly_disconnected()) 3940 .WillRepeatedly(Return(false)); 3941 manager()->RegisterService(wimax_service); 3942 3943 scoped_refptr<MockService> vpn_service( 3944 new NiceMock<MockService>(control_interface(), 3945 dispatcher(), 3946 metrics(), 3947 manager())); 3948 3949 EXPECT_CALL(*vpn_service.get(), state()) 3950 .WillRepeatedly(Return(Service::kStateIdle)); 3951 EXPECT_CALL(*vpn_service.get(), IsConnected()) 3952 .WillRepeatedly(Return(false)); 3953 EXPECT_CALL(*vpn_service.get(), IsVisible()) 3954 .WillRepeatedly(Return(true)); 3955 wifi_service2->SetAutoConnect(false); 3956 vpn_service->SetConnectable(true); 3957 EXPECT_CALL(*vpn_service.get(), technology()) 3958 .WillRepeatedly(Return(Technology::kVPN)); 3959 manager()->RegisterService(vpn_service); 3960 3961 // The connected services should be at the top. 3962 EXPECT_TRUE(ServiceOrderIs(wifi_service2, wimax_service)); 3963 3964 EXPECT_CALL(*wifi_service0.get(), Connect(_, _)).Times(0); // Not visible. 3965 EXPECT_CALL(*wifi_service1.get(), Connect(_, _)); 3966 EXPECT_CALL(*wifi_service2.get(), Connect(_, _)).Times(0); // Lower prio. 3967 EXPECT_CALL(*cell_service.get(), Connect(_, _)) 3968 .Times(0); // Explicitly disconnected. 3969 EXPECT_CALL(*wimax_service.get(), Connect(_, _)).Times(0); // Is connected. 3970 EXPECT_CALL(*vpn_service.get(), Connect(_, _)).Times(0); // Not autoconnect. 3971 3972 manager()->ConnectToBestServices(nullptr); 3973 dispatcher()->DispatchPendingEvents(); 3974 3975 // After this operation, since the Connect calls above are mocked and 3976 // no actual state changes have occurred, we should expect that the 3977 // service sorting order will not have changed. 3978 EXPECT_TRUE(ServiceOrderIs(wifi_service2, wimax_service)); 3979 } 3980 3981 TEST_F(ManagerTest, CreateConnectivityReport) { 3982 // Add devices 3983 // WiFi 3984 auto wifi_device = make_scoped_refptr( 3985 new NiceMock<MockDevice>(control_interface(), 3986 dispatcher(), 3987 metrics(), 3988 manager(), 3989 "null", 3990 "addr", 3991 0)); 3992 manager()->RegisterDevice(wifi_device); 3993 // Cell 3994 auto cell_device = make_scoped_refptr( 3995 new NiceMock<MockDevice>(control_interface(), 3996 dispatcher(), 3997 metrics(), 3998 manager(), 3999 "null", 4000 "addr", 4001 1)); 4002 manager()->RegisterDevice(cell_device); 4003 // WiMax 4004 auto wimax_device = make_scoped_refptr( 4005 new NiceMock<MockDevice>(control_interface(), 4006 dispatcher(), 4007 metrics(), 4008 manager(), 4009 "null", 4010 "addr", 4011 2)); 4012 manager()->RegisterDevice(wimax_device); 4013 // Ethernet 4014 auto eth_device = make_scoped_refptr( 4015 new NiceMock<MockDevice>(control_interface(), 4016 dispatcher(), 4017 metrics(), 4018 manager(), 4019 "null", 4020 "addr", 4021 3)); 4022 manager()->RegisterDevice(eth_device); 4023 // VPN Device -- base device for a service that will not be connected 4024 auto vpn_device = make_scoped_refptr( 4025 new NiceMock<MockDevice>(control_interface(), 4026 dispatcher(), 4027 metrics(), 4028 manager(), 4029 "null", 4030 "addr", 4031 4)); 4032 manager()->RegisterDevice(vpn_device); 4033 4034 // Add service for multiple devices 4035 // WiFi 4036 MockServiceRefPtr wifi_service = 4037 new NiceMock<MockService>(control_interface(), 4038 dispatcher(), 4039 metrics(), 4040 manager()); 4041 manager()->RegisterService(wifi_service); 4042 EXPECT_CALL(*wifi_service.get(), state()) 4043 .WillRepeatedly(Return(Service::kStateConnected)); 4044 EXPECT_CALL(*wifi_service.get(), IsConnected()) 4045 .WillRepeatedly(Return(true)); 4046 EXPECT_CALL(*wifi_device.get(), 4047 IsConnectedToService(_)).WillRepeatedly(Return(false)); 4048 EXPECT_CALL(*wifi_device.get(), 4049 IsConnectedToService(IsRefPtrTo(wifi_service))) 4050 .WillRepeatedly(Return(true)); 4051 4052 // Cell 4053 MockServiceRefPtr cell_service = 4054 new NiceMock<MockService>(control_interface(), 4055 dispatcher(), 4056 metrics(), 4057 manager()); 4058 manager()->RegisterService(cell_service); 4059 EXPECT_CALL(*cell_service.get(), state()) 4060 .WillRepeatedly(Return(Service::kStateConnected)); 4061 EXPECT_CALL(*cell_service.get(), IsConnected()) 4062 .WillRepeatedly(Return(true)); 4063 EXPECT_CALL(*cell_device.get(), 4064 IsConnectedToService(_)).WillRepeatedly(Return(false)); 4065 EXPECT_CALL(*cell_device.get(), 4066 IsConnectedToService(IsRefPtrTo(cell_service))) 4067 .WillRepeatedly(Return(true)); 4068 4069 // WiMax 4070 MockServiceRefPtr wimax_service = 4071 new NiceMock<MockService>(control_interface(), 4072 dispatcher(), 4073 metrics(), 4074 manager()); 4075 manager()->RegisterService(wimax_service); 4076 EXPECT_CALL(*wimax_service.get(), state()) 4077 .WillRepeatedly(Return(Service::kStateConnected)); 4078 EXPECT_CALL(*wimax_service.get(), IsConnected()) 4079 .WillRepeatedly(Return(true)); 4080 4081 EXPECT_CALL(*wimax_device.get(), 4082 IsConnectedToService(_)).WillRepeatedly(Return(false)); 4083 EXPECT_CALL(*wimax_device.get(), 4084 IsConnectedToService(IsRefPtrTo(wimax_service))) 4085 .WillRepeatedly(Return(true)); 4086 4087 // Ethernet 4088 MockServiceRefPtr eth_service = 4089 new NiceMock<MockService>(control_interface(), 4090 dispatcher(), 4091 metrics(), 4092 manager()); 4093 manager()->RegisterService(eth_service); 4094 EXPECT_CALL(*eth_service.get(), state()) 4095 .WillRepeatedly(Return(Service::kStateConnected)); 4096 EXPECT_CALL(*eth_service.get(), IsConnected()) 4097 .WillRepeatedly(Return(true)); 4098 EXPECT_CALL(*eth_device.get(), 4099 IsConnectedToService(_)).WillRepeatedly(Return(false)); 4100 EXPECT_CALL(*eth_device.get(), 4101 IsConnectedToService(IsRefPtrTo(eth_service))) 4102 .WillRepeatedly(Return(true)); 4103 4104 // VPN: Service exists but is not connected and will not trigger a 4105 // connectivity report. 4106 MockServiceRefPtr vpn_service = 4107 new NiceMock<MockService>(control_interface(), 4108 dispatcher(), 4109 metrics(), 4110 manager()); 4111 manager()->RegisterService(vpn_service); 4112 EXPECT_CALL(*vpn_service.get(), state()) 4113 .WillRepeatedly(Return(Service::kStateIdle)); 4114 EXPECT_CALL(*vpn_service.get(), IsConnected()) 4115 .WillRepeatedly(Return(false)); 4116 4117 EXPECT_CALL(*wifi_device.get(), StartConnectivityTest()) 4118 .WillOnce(Return(true)); 4119 EXPECT_CALL(*cell_device.get(), StartConnectivityTest()) 4120 .WillOnce(Return(true)); 4121 EXPECT_CALL(*wimax_device.get(), StartConnectivityTest()) 4122 .WillOnce(Return(true)); 4123 EXPECT_CALL(*eth_device.get(), StartConnectivityTest()) 4124 .WillOnce(Return(true)); 4125 EXPECT_CALL(*vpn_device.get(), StartConnectivityTest()).Times(0); 4126 manager()->CreateConnectivityReport(nullptr); 4127 dispatcher()->DispatchPendingEvents(); 4128 } 4129 4130 #if !defined(DISABLE_WIFI) 4131 TEST_F(ManagerTest, VerifyWhenNotConnected) { 4132 const string kFakeCertificate("fake cert"); 4133 const string kFakePublicKey("fake public key"); 4134 const string kFakeNonce("fake public key"); 4135 const string kFakeSignedData("fake signed data"); 4136 const string kFakeUdn("fake udn"); 4137 const vector<uint8_t> kSSID(10, 87); 4138 const string kConfiguredSSID("AConfiguredDestination"); 4139 const vector<uint8_t> kConfiguredSSIDVector(kConfiguredSSID.begin(), 4140 kConfiguredSSID.end()); 4141 const string kConfiguredBSSID("aa:bb:aa:bb:aa:bb"); 4142 scoped_refptr<MockWiFiService> mock_destination( 4143 new NiceMock<MockWiFiService>(control_interface(), dispatcher(), 4144 metrics(), manager(), wifi_provider_, 4145 kSSID, "", "none", false)); 4146 // Register this service, but don't mark it as connected. 4147 manager()->RegisterService(mock_destination); 4148 // Verify that if we're not connected to anything, verification fails. 4149 { 4150 LOG(INFO) << "Can't verify if not connected."; 4151 EXPECT_CALL(*crypto_util_proxy_, 4152 VerifyDestination(_, _, _, _, _, _, _, _, _)).Times(0); 4153 Error error(Error::kOperationInitiated); 4154 manager()->VerifyDestination(kFakeCertificate, kFakePublicKey, kFakeNonce, 4155 kFakeSignedData, kFakeUdn, "", "", 4156 ResultBoolCallback(), &error); 4157 EXPECT_TRUE(error.IsFailure()); 4158 Mock::VerifyAndClearExpectations(crypto_util_proxy_); 4159 } 4160 { 4161 // However, if the destination is already configured, we might be 4162 // connected to it via something other than WiFi, and we shouldn't 4163 // enforce the WiFi check. 4164 EXPECT_CALL(*crypto_util_proxy_, 4165 VerifyDestination(kFakeCertificate, kFakePublicKey, kFakeNonce, 4166 kFakeSignedData, kFakeUdn, 4167 kConfiguredSSIDVector, kConfiguredBSSID, 4168 _, _)).Times(1).WillOnce(Return(true)); 4169 Error error(Error::kOperationInitiated); 4170 manager()->VerifyDestination(kFakeCertificate, kFakePublicKey, kFakeNonce, 4171 kFakeSignedData, kFakeUdn, kConfiguredSSID, 4172 kConfiguredBSSID, ResultBoolCallback(), 4173 &error); 4174 EXPECT_FALSE(error.IsFailure()); 4175 Mock::VerifyAndClearExpectations(crypto_util_proxy_); 4176 } 4177 } 4178 4179 TEST_F(ManagerTest, VerifyDestination) { 4180 const string kFakeCertificate("fake cert"); 4181 const string kFakePublicKey("fake public key"); 4182 const string kFakeNonce("fake public key"); 4183 const string kFakeSignedData("fake signed data"); 4184 const string kFakeUdn("fake udn"); 4185 const char kSSIDStr[] = "fake ssid"; 4186 const vector<uint8_t> kSSID(kSSIDStr, kSSIDStr + arraysize(kSSIDStr)); 4187 const string kConfiguredSSID("AConfiguredDestination"); 4188 const vector<uint8_t> kConfiguredSSIDVector(kConfiguredSSID.begin(), 4189 kConfiguredSSID.end()); 4190 const string kConfiguredBSSID("aa:bb:aa:bb:aa:bb"); 4191 const string kFakeData("muffin man"); 4192 scoped_refptr<MockWiFiService> mock_destination( 4193 new NiceMock<MockWiFiService>(control_interface(), 4194 dispatcher(), 4195 metrics(), 4196 manager(), 4197 wifi_provider_, 4198 kSSID, 4199 "", 4200 "none", 4201 false)); 4202 manager()->RegisterService(mock_destination); 4203 // Making the service look online will let service lookup in 4204 // VerifyDestinatoin succeed. 4205 EXPECT_CALL(*mock_destination.get(), IsConnected()) 4206 .WillRepeatedly(Return(true)); 4207 StrictMock<DestinationVerificationTest> dv_test; 4208 4209 // Lead off by verifying that the basic VerifyDestination flow works. 4210 { 4211 LOG(INFO) << "Basic VerifyDestination flow."; 4212 ResultBoolCallback passed_down_callback; 4213 EXPECT_CALL(*crypto_util_proxy_, VerifyDestination(kFakeCertificate, 4214 kFakePublicKey, 4215 kFakeNonce, 4216 kFakeSignedData, 4217 kFakeUdn, 4218 kSSID, 4219 _, 4220 _, 4221 _)) 4222 .Times(1) 4223 .WillOnce(DoAll(SaveArg<7>(&passed_down_callback), Return(true))); 4224 // Ask the manager to verify the current destination. This should look 4225 // up our previously registered service, and pass some metadata about 4226 // that service down to the CryptoUtilProxy to verify. 4227 Error error(Error::kOperationInitiated); 4228 ResultBoolCallback cb = Bind( 4229 &DestinationVerificationTest::ResultBoolCallbackStub, 4230 dv_test.AsWeakPtr()); 4231 manager()->VerifyDestination(kFakeCertificate, 4232 kFakePublicKey, 4233 kFakeNonce, 4234 kFakeSignedData, 4235 kFakeUdn, 4236 // Ask to be verified against that service. 4237 "", "", 4238 cb, 4239 &error); 4240 // We assert here, because if the operation is not ongoing, it is 4241 // inconsistent with shim behavior to call the callback anyway. 4242 ASSERT_TRUE(error.IsOngoing()); 4243 Mock::VerifyAndClearExpectations(crypto_util_proxy_); 4244 EXPECT_CALL(dv_test, ResultBoolCallbackStub(_, true)).Times(1); 4245 // Call the callback passed into the CryptoUtilProxy, which 4246 // should find its way into the callback passed into the manager. 4247 // In real code, that callback passed into the manager is from the 4248 // DBus adaptor. 4249 Error e; 4250 passed_down_callback.Run(e, true); 4251 Mock::VerifyAndClearExpectations(&dv_test); 4252 } 4253 4254 // Now for a slightly more complex variant. When we encrypt data, 4255 // we do the same verification step but monkey with the callback to 4256 // link ourselves to an encrypt step afterward. 4257 { 4258 LOG(INFO) << "Basic VerifyAndEncryptData"; 4259 ResultBoolCallback passed_down_callback; 4260 EXPECT_CALL(*crypto_util_proxy_, VerifyDestination(kFakeCertificate, 4261 kFakePublicKey, 4262 kFakeNonce, 4263 kFakeSignedData, 4264 kFakeUdn, 4265 kSSID, 4266 _, 4267 _, 4268 _)) 4269 .WillOnce(DoAll(SaveArg<7>(&passed_down_callback), Return(true))); 4270 4271 Error error(Error::kOperationInitiated); 4272 ResultStringCallback cb = Bind( 4273 &DestinationVerificationTest::ResultStringCallbackStub, 4274 dv_test.AsWeakPtr()); 4275 manager()->VerifyAndEncryptData(kFakeCertificate, 4276 kFakePublicKey, 4277 kFakeNonce, 4278 kFakeSignedData, 4279 kFakeUdn, 4280 "", "", 4281 kFakeData, 4282 cb, 4283 &error); 4284 ASSERT_TRUE(error.IsOngoing()); 4285 Mock::VerifyAndClearExpectations(crypto_util_proxy_); 4286 // Now, if we call that passed down callback, we should see encrypt being 4287 // called. 4288 ResultStringCallback second_passed_down_callback; 4289 EXPECT_CALL(*crypto_util_proxy_, EncryptData(kFakePublicKey, 4290 kFakeData, 4291 _, 4292 _)) 4293 .Times(1) 4294 .WillOnce(DoAll(SaveArg<2>(&second_passed_down_callback), 4295 Return(true))); 4296 Error e; 4297 passed_down_callback.Run(e, true); 4298 Mock::VerifyAndClearExpectations(crypto_util_proxy_); 4299 EXPECT_CALL(dv_test, ResultStringCallbackStub(_, _)).Times(1); 4300 // And if we call the second passed down callback, we should see the 4301 // original function we passed down to VerifyDestination getting called. 4302 e.Reset(); 4303 second_passed_down_callback.Run(e, ""); 4304 Mock::VerifyAndClearExpectations(&dv_test); 4305 } 4306 4307 // If verification fails on the way to trying to encrypt, we should ditch 4308 // without calling encrypt at all. 4309 { 4310 LOG(INFO) << "Failed VerifyAndEncryptData"; 4311 ResultBoolCallback passed_down_callback; 4312 EXPECT_CALL(*crypto_util_proxy_, VerifyDestination(kFakeCertificate, 4313 kFakePublicKey, 4314 kFakeNonce, 4315 kFakeSignedData, 4316 kFakeUdn, 4317 kSSID, 4318 _, 4319 _, 4320 _)) 4321 .WillOnce(DoAll(SaveArg<7>(&passed_down_callback), Return(true))); 4322 4323 Error error(Error::kOperationInitiated); 4324 ResultStringCallback cb = Bind( 4325 &DestinationVerificationTest::ResultStringCallbackStub, 4326 dv_test.AsWeakPtr()); 4327 manager()->VerifyAndEncryptData(kFakeCertificate, 4328 kFakePublicKey, 4329 kFakeNonce, 4330 kFakeSignedData, 4331 kFakeUdn, 4332 "", "", 4333 kFakeData, 4334 cb, 4335 &error); 4336 ASSERT_TRUE(error.IsOngoing()); 4337 Mock::VerifyAndClearExpectations(crypto_util_proxy_); 4338 Error e(Error::kOperationFailed); 4339 EXPECT_CALL(*crypto_util_proxy_, EncryptData(_, _, _, _)).Times(0); 4340 // Although we're ditching, this callback is what cleans up the pending 4341 // DBus call. 4342 EXPECT_CALL(dv_test, ResultStringCallbackStub(_, string(""))).Times(1); 4343 passed_down_callback.Run(e, false); 4344 Mock::VerifyAndClearExpectations(&dv_test); 4345 } 4346 } 4347 #endif // DISABLE_WIFI 4348 4349 TEST_F(ManagerTest, IsProfileBefore) { 4350 scoped_refptr<MockProfile> profile0( 4351 new NiceMock<MockProfile>( 4352 control_interface(), metrics(), manager(), "")); 4353 scoped_refptr<MockProfile> profile1( 4354 new NiceMock<MockProfile>( 4355 control_interface(), metrics(), manager(), "")); 4356 4357 AdoptProfile(manager(), profile0); 4358 AdoptProfile(manager(), profile1); // profile1 is after profile0. 4359 EXPECT_TRUE(manager()->IsProfileBefore(profile0, profile1)); 4360 EXPECT_FALSE(manager()->IsProfileBefore(profile1, profile0)); 4361 4362 // A few abnormal cases, but it's good to track their behavior. 4363 scoped_refptr<MockProfile> profile2( 4364 new NiceMock<MockProfile>( 4365 control_interface(), metrics(), manager(), "")); 4366 EXPECT_TRUE(manager()->IsProfileBefore(profile0, profile2)); 4367 EXPECT_TRUE(manager()->IsProfileBefore(profile1, profile2)); 4368 EXPECT_FALSE(manager()->IsProfileBefore(profile2, profile0)); 4369 EXPECT_FALSE(manager()->IsProfileBefore(profile2, profile1)); 4370 } 4371 4372 TEST_F(ManagerTest, GetLoadableProfileEntriesForService) { 4373 MockStore storage0; 4374 MockStore storage1; 4375 MockStore storage2; 4376 4377 scoped_refptr<MockProfile> profile0( 4378 new NiceMock<MockProfile>( 4379 control_interface(), metrics(), manager(), "")); 4380 scoped_refptr<MockProfile> profile1( 4381 new NiceMock<MockProfile>( 4382 control_interface(), metrics(), manager(), "")); 4383 scoped_refptr<MockProfile> profile2( 4384 new NiceMock<MockProfile>( 4385 control_interface(), metrics(), manager(), "")); 4386 4387 AdoptProfile(manager(), profile0); 4388 AdoptProfile(manager(), profile1); 4389 AdoptProfile(manager(), profile2); 4390 4391 scoped_refptr<MockService> service( 4392 new NiceMock<MockService>(control_interface(), 4393 dispatcher(), 4394 metrics(), 4395 manager())); 4396 4397 EXPECT_CALL(*profile0, GetConstStorage()).WillOnce(Return(&storage0)); 4398 EXPECT_CALL(*profile1, GetConstStorage()).WillOnce(Return(&storage1)); 4399 EXPECT_CALL(*profile2, GetConstStorage()).WillOnce(Return(&storage2)); 4400 4401 const string kEntry0("aluminum_crutch"); 4402 const string kEntry2("rehashed_faces"); 4403 4404 EXPECT_CALL(*service, GetLoadableStorageIdentifier(Ref(storage0))) 4405 .WillOnce(Return(kEntry0)); 4406 EXPECT_CALL(*service, GetLoadableStorageIdentifier(Ref(storage1))) 4407 .WillOnce(Return("")); 4408 EXPECT_CALL(*service, GetLoadableStorageIdentifier(Ref(storage2))) 4409 .WillOnce(Return(kEntry2)); 4410 4411 const string kProfileRpc0("service_station"); 4412 const string kProfileRpc2("crystal_tiaras"); 4413 4414 EXPECT_CALL(*profile0, GetRpcIdentifier()).WillOnce(Return(kProfileRpc0)); 4415 EXPECT_CALL(*profile1, GetRpcIdentifier()).Times(0); 4416 EXPECT_CALL(*profile2, GetRpcIdentifier()).WillOnce(Return(kProfileRpc2)); 4417 4418 map<string, string> entries = 4419 manager()->GetLoadableProfileEntriesForService(service); 4420 EXPECT_EQ(2, entries.size()); 4421 EXPECT_TRUE(ContainsKey(entries, kProfileRpc0)); 4422 EXPECT_TRUE(ContainsKey(entries, kProfileRpc2)); 4423 EXPECT_EQ(kEntry0, entries[kProfileRpc0]); 4424 EXPECT_EQ(kEntry2, entries[kProfileRpc2]); 4425 } 4426 4427 #if !defined(DISABLE_WIFI) 4428 TEST_F(ManagerTest, InitializeProfilesInformsProviders) { 4429 ScopedTempDir temp_dir; 4430 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 4431 Manager manager(control_interface(), 4432 dispatcher(), 4433 metrics(), 4434 run_path(), 4435 storage_path(), 4436 temp_dir.path().value()); 4437 // Can't use |wifi_provider_|, because it's owned by the Manager 4438 // object in the fixture. 4439 MockWiFiProvider* wifi_provider = new NiceMock<MockWiFiProvider>(); 4440 manager.wifi_provider_.reset(wifi_provider); // pass ownership 4441 manager.UpdateProviderMapping(); 4442 // Give manager a valid place to write the user profile list. 4443 manager.user_profile_list_path_ = temp_dir.path().Append("user_profile_list"); 4444 4445 // With no user profiles, the WiFiProvider should be called once 4446 // (for the default profile). 4447 EXPECT_CALL(*wifi_provider, CreateServicesFromProfile(_)); 4448 manager.InitializeProfiles(); 4449 Mock::VerifyAndClearExpectations(wifi_provider); 4450 4451 // With |n| user profiles, the WiFiProvider should be called |n+1| 4452 // times. First, create 2 user profiles... 4453 const char kProfile0[] = "~user/profile0"; 4454 const char kProfile1[] = "~user/profile1"; 4455 string profile_rpc_path; 4456 Error error; 4457 ASSERT_TRUE(base::CreateDirectory(temp_dir.path().Append("user"))); 4458 manager.CreateProfile(kProfile0, &profile_rpc_path, &error); 4459 manager.PushProfile(kProfile0, &profile_rpc_path, &error); 4460 manager.CreateProfile(kProfile1, &profile_rpc_path, &error); 4461 manager.PushProfile(kProfile1, &profile_rpc_path, &error); 4462 4463 // ... then reset manager state ... 4464 manager.profiles_.clear(); 4465 4466 // ...then check that the WiFiProvider is notified about all three 4467 // profiles (one default, two user). 4468 EXPECT_CALL(*wifi_provider, CreateServicesFromProfile(_)).Times(3); 4469 manager.InitializeProfiles(); 4470 Mock::VerifyAndClearExpectations(wifi_provider); 4471 } 4472 #endif // DISABLE_WIFI 4473 4474 TEST_F(ManagerTest, InitializeProfilesHandlesDefaults) { 4475 ScopedTempDir temp_dir; 4476 std::unique_ptr<Manager> manager; 4477 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 4478 4479 // Instantiate a Manager with empty persistent storage. Check that 4480 // defaults are set. 4481 // 4482 // Note that we use the same directory for default and user profiles. 4483 // This doesn't affect the test results, because we don't push a 4484 // user profile. 4485 manager.reset(new Manager(control_interface(), 4486 dispatcher(), 4487 metrics(), 4488 run_path(), 4489 temp_dir.path().value(), 4490 temp_dir.path().value())); 4491 manager->InitializeProfiles(); 4492 EXPECT_EQ(PortalDetector::kDefaultCheckPortalList, 4493 manager->props_.check_portal_list); 4494 EXPECT_EQ(Resolver::kDefaultIgnoredSearchList, 4495 manager->props_.ignored_dns_search_paths); 4496 EXPECT_EQ(LinkMonitor::kDefaultLinkMonitorTechnologies, 4497 manager->props_.link_monitor_technologies); 4498 EXPECT_EQ(ConnectivityTrial::kDefaultURL, 4499 manager->props_.portal_url); 4500 EXPECT_EQ(PortalDetector::kDefaultCheckIntervalSeconds, 4501 manager->props_.portal_check_interval_seconds); 4502 4503 // Change one of the settings. 4504 static const string kCustomCheckPortalList = "fiber0"; 4505 Error error; 4506 manager->SetCheckPortalList(kCustomCheckPortalList, &error); 4507 manager->profiles_[0]->Save(); 4508 4509 // Instantiate a new manager. It should have our settings for 4510 // check_portal_list, rather than the default. 4511 manager.reset(new Manager(control_interface(), 4512 dispatcher(), 4513 metrics(), 4514 run_path(), 4515 temp_dir.path().value(), 4516 temp_dir.path().value())); 4517 manager->InitializeProfiles(); 4518 EXPECT_EQ(kCustomCheckPortalList, manager->props_.check_portal_list); 4519 4520 // If we clear the persistent storage, we again get the default value. 4521 ASSERT_TRUE(temp_dir.Delete()); 4522 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 4523 manager.reset(new Manager(control_interface(), 4524 dispatcher(), 4525 metrics(), 4526 run_path(), 4527 temp_dir.path().value(), 4528 temp_dir.path().value())); 4529 manager->InitializeProfiles(); 4530 EXPECT_EQ(PortalDetector::kDefaultCheckPortalList, 4531 manager->props_.check_portal_list); 4532 } 4533 4534 TEST_F(ManagerTest, ProfileStackChangeLogging) { 4535 ScopedTempDir temp_dir; 4536 std::unique_ptr<Manager> manager; 4537 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 4538 manager.reset(new Manager(control_interface(), 4539 dispatcher(), 4540 metrics(), 4541 run_path(), 4542 temp_dir.path().value(), 4543 temp_dir.path().value())); 4544 4545 ScopedMockLog log; 4546 EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); 4547 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr("1 profile(s)"))); 4548 manager->InitializeProfiles(); 4549 4550 const char kProfile0[] = "~user/profile0"; 4551 const char kProfile1[] = "~user/profile1"; 4552 const char kProfile2[] = "~user/profile2"; 4553 ASSERT_TRUE(base::CreateDirectory(temp_dir.path().Append("user"))); 4554 TestCreateProfile(manager.get(), kProfile0); 4555 TestCreateProfile(manager.get(), kProfile1); 4556 TestCreateProfile(manager.get(), kProfile2); 4557 4558 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr("2 profile(s)"))); 4559 TestPushProfile(manager.get(), kProfile0); 4560 4561 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr("3 profile(s)"))); 4562 TestInsertUserProfile(manager.get(), kProfile1, "not-so-random-string"); 4563 4564 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr("4 profile(s)"))); 4565 TestInsertUserProfile(manager.get(), kProfile2, "very-random-string"); 4566 4567 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr("3 profile(s)"))); 4568 TestPopProfile(manager.get(), kProfile2); 4569 4570 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr("2 profile(s)"))); 4571 TestPopAnyProfile(manager.get()); 4572 4573 EXPECT_CALL(log, Log(logging::LOG_INFO, _, HasSubstr("1 profile(s)"))); 4574 TestPopAllUserProfiles(manager.get()); 4575 } 4576 4577 // Custom property setters should return false, and make no changes, if 4578 // the new value is the same as the old value. 4579 TEST_F(ManagerTest, CustomSetterNoopChange) { 4580 // SetCheckPortalList 4581 { 4582 static const string kCheckPortalList = "weird-device,weirder-device"; 4583 Error error; 4584 // Set to known value. 4585 EXPECT_TRUE(SetCheckPortalList(kCheckPortalList, &error)); 4586 EXPECT_TRUE(error.IsSuccess()); 4587 // Set to same value. 4588 EXPECT_FALSE(SetCheckPortalList(kCheckPortalList, &error)); 4589 EXPECT_TRUE(error.IsSuccess()); 4590 } 4591 4592 // SetIgnoredDNSSearchPaths 4593 { 4594 NiceMock<MockResolver> resolver; 4595 static const string kIgnoredPaths = "example.com,example.org"; 4596 Error error; 4597 SetResolver(&resolver); 4598 // Set to known value. 4599 EXPECT_CALL(resolver, set_ignored_search_list(_)); 4600 EXPECT_TRUE(SetIgnoredDNSSearchPaths(kIgnoredPaths, &error)); 4601 EXPECT_TRUE(error.IsSuccess()); 4602 Mock::VerifyAndClearExpectations(&resolver); 4603 // Set to same value. 4604 EXPECT_CALL(resolver, set_ignored_search_list(_)).Times(0); 4605 EXPECT_FALSE(SetIgnoredDNSSearchPaths(kIgnoredPaths, &error)); 4606 EXPECT_TRUE(error.IsSuccess()); 4607 Mock::VerifyAndClearExpectations(&resolver); 4608 } 4609 } 4610 4611 TEST_F(ManagerTest, GeoLocation) { 4612 EXPECT_TRUE(manager()->GetNetworksForGeolocation().empty()); 4613 4614 auto device = make_scoped_refptr(new NiceMock<MockDevice>(control_interface(), 4615 dispatcher(), 4616 metrics(), 4617 manager(), 4618 "null", 4619 "addr", 4620 0)); 4621 4622 // Manager should ignore gelocation info from technologies it does not know. 4623 EXPECT_CALL(*device, technology()) 4624 .Times(AtLeast(1)) 4625 .WillRepeatedly(Return(Technology::kEthernet)); 4626 EXPECT_CALL(*device, GetGeolocationObjects()).Times(0); 4627 manager()->OnDeviceGeolocationInfoUpdated(device); 4628 Mock::VerifyAndClearExpectations(device.get()); 4629 EXPECT_TRUE(manager()->GetNetworksForGeolocation().empty()); 4630 4631 // Manager should add WiFi geolocation info. 4632 EXPECT_CALL(*device, technology()) 4633 .Times(AtLeast(1)) 4634 .WillRepeatedly(Return(Technology::kWifi)); 4635 EXPECT_CALL(*device, GetGeolocationObjects()) 4636 .WillOnce(Return(vector<GeolocationInfo>())); 4637 manager()->OnDeviceGeolocationInfoUpdated(device); 4638 Mock::VerifyAndClearExpectations(device.get()); 4639 auto location_infos = manager()->GetNetworksForGeolocation(); 4640 EXPECT_EQ(1, location_infos.size()); 4641 EXPECT_TRUE(ContainsKey(location_infos, kGeoWifiAccessPointsProperty)); 4642 4643 // Manager should inclusively add cellular info. 4644 EXPECT_CALL(*device, technology()) 4645 .Times(AtLeast(1)) 4646 .WillRepeatedly(Return(Technology::kCellular)); 4647 EXPECT_CALL(*device, GetGeolocationObjects()) 4648 .WillOnce(Return(vector<GeolocationInfo>())); 4649 manager()->OnDeviceGeolocationInfoUpdated(device); 4650 location_infos = manager()->GetNetworksForGeolocation(); 4651 EXPECT_EQ(2, location_infos.size()); 4652 EXPECT_TRUE(ContainsKey(location_infos, kGeoWifiAccessPointsProperty)); 4653 EXPECT_TRUE(ContainsKey(location_infos, kGeoCellTowersProperty)); 4654 } 4655 4656 TEST_F(ManagerTest, IsWifiIdle) { 4657 // No registered service. 4658 EXPECT_FALSE(manager()->IsWifiIdle()); 4659 4660 scoped_refptr<MockService> wifi_service(new MockService(control_interface(), 4661 dispatcher(), 4662 metrics(), 4663 manager())); 4664 4665 scoped_refptr<MockService> cell_service(new MockService(control_interface(), 4666 dispatcher(), 4667 metrics(), 4668 manager())); 4669 4670 manager()->RegisterService(wifi_service); 4671 manager()->RegisterService(cell_service); 4672 4673 EXPECT_CALL(*wifi_service.get(), technology()) 4674 .WillRepeatedly(Return(Technology::kWifi)); 4675 EXPECT_CALL(*cell_service.get(), technology()) 4676 .WillRepeatedly(Return(Technology::kCellular)); 4677 4678 // Cellular is connected. 4679 EXPECT_CALL(*cell_service.get(), IsConnected()) 4680 .WillRepeatedly(Return(true)); 4681 manager()->UpdateService(cell_service); 4682 4683 // No wifi connection attempt. 4684 EXPECT_CALL(*wifi_service.get(), IsConnecting()) 4685 .WillRepeatedly(Return(false)); 4686 EXPECT_CALL(*wifi_service.get(), IsConnected()) 4687 .WillRepeatedly(Return(false)); 4688 manager()->UpdateService(wifi_service); 4689 EXPECT_TRUE(manager()->IsWifiIdle()); 4690 4691 // Attempt wifi connection. 4692 Mock::VerifyAndClearExpectations(wifi_service.get()); 4693 EXPECT_CALL(*wifi_service.get(), technology()) 4694 .WillRepeatedly(Return(Technology::kWifi)); 4695 EXPECT_CALL(*wifi_service.get(), IsConnecting()) 4696 .WillRepeatedly(Return(true)); 4697 EXPECT_CALL(*wifi_service.get(), IsConnected()) 4698 .WillRepeatedly(Return(false)); 4699 manager()->UpdateService(wifi_service); 4700 EXPECT_FALSE(manager()->IsWifiIdle()); 4701 4702 // wifi connected. 4703 Mock::VerifyAndClearExpectations(wifi_service.get()); 4704 EXPECT_CALL(*wifi_service.get(), technology()) 4705 .WillRepeatedly(Return(Technology::kWifi)); 4706 EXPECT_CALL(*wifi_service.get(), IsConnecting()) 4707 .WillRepeatedly(Return(false)); 4708 EXPECT_CALL(*wifi_service.get(), IsConnected()) 4709 .WillRepeatedly(Return(true)); 4710 manager()->UpdateService(wifi_service); 4711 EXPECT_FALSE(manager()->IsWifiIdle()); 4712 } 4713 4714 TEST_F(ManagerTest, DetectMultiHomedDevices) { 4715 vector<scoped_refptr<MockConnection>> mock_connections; 4716 vector<ConnectionRefPtr> device_connections; 4717 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 4718 dispatcher(), 4719 metrics(), 4720 manager(), 4721 "null4", 4722 "addr4", 4723 0)); 4724 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 4725 dispatcher(), 4726 metrics(), 4727 manager(), 4728 "null5", 4729 "addr5", 4730 0)); 4731 for (const auto& device : mock_devices_) { 4732 manager()->RegisterDevice(device); 4733 mock_connections.emplace_back( 4734 new NiceMock<MockConnection>(device_info_.get())); 4735 device_connections.emplace_back(mock_connections.back()); 4736 } 4737 EXPECT_CALL(*mock_connections[1], GetSubnetName()).WillOnce(Return("1")); 4738 EXPECT_CALL(*mock_connections[2], GetSubnetName()).WillOnce(Return("2")); 4739 EXPECT_CALL(*mock_connections[3], GetSubnetName()).WillOnce(Return("1")); 4740 EXPECT_CALL(*mock_connections[4], GetSubnetName()).WillOnce(Return("")); 4741 EXPECT_CALL(*mock_connections[5], GetSubnetName()).WillOnce(Return("")); 4742 4743 // Do not assign a connection to mock_devices_[0]. 4744 EXPECT_CALL(*mock_devices_[1], connection()) 4745 .WillRepeatedly(ReturnRef(device_connections[1])); 4746 EXPECT_CALL(*mock_devices_[2], connection()) 4747 .WillRepeatedly(ReturnRef(device_connections[2])); 4748 EXPECT_CALL(*mock_devices_[3], connection()) 4749 .WillRepeatedly(ReturnRef(device_connections[3])); 4750 EXPECT_CALL(*mock_devices_[4], connection()) 4751 .WillRepeatedly(ReturnRef(device_connections[4])); 4752 EXPECT_CALL(*mock_devices_[5], connection()) 4753 .WillRepeatedly(ReturnRef(device_connections[5])); 4754 4755 EXPECT_CALL(*mock_devices_[0], SetIsMultiHomed(false)); 4756 EXPECT_CALL(*mock_devices_[1], SetIsMultiHomed(true)); 4757 EXPECT_CALL(*mock_devices_[2], SetIsMultiHomed(false)); 4758 EXPECT_CALL(*mock_devices_[3], SetIsMultiHomed(true)); 4759 EXPECT_CALL(*mock_devices_[4], SetIsMultiHomed(false)); 4760 EXPECT_CALL(*mock_devices_[5], SetIsMultiHomed(false)); 4761 manager()->DetectMultiHomedDevices(); 4762 } 4763 4764 TEST_F(ManagerTest, IsTechnologyProhibited) { 4765 // Test initial state. 4766 EXPECT_EQ("", manager()->props_.prohibited_technologies); 4767 EXPECT_FALSE(manager()->IsTechnologyProhibited(Technology::kWiMax)); 4768 EXPECT_FALSE(manager()->IsTechnologyProhibited(Technology::kVPN)); 4769 4770 Error smoke_error; 4771 EXPECT_FALSE(manager()->SetProhibitedTechnologies("smoke_signal", 4772 &smoke_error)); 4773 EXPECT_EQ(Error::kInvalidArguments, smoke_error.type()); 4774 4775 ON_CALL(*mock_devices_[0], technology()) 4776 .WillByDefault(Return(Technology::kVPN)); 4777 ON_CALL(*mock_devices_[1], technology()) 4778 .WillByDefault(Return(Technology::kWiMax)); 4779 ON_CALL(*mock_devices_[2], technology()) 4780 .WillByDefault(Return(Technology::kWifi)); 4781 4782 manager()->RegisterDevice(mock_devices_[0]); 4783 manager()->RegisterDevice(mock_devices_[1]); 4784 manager()->RegisterDevice(mock_devices_[2]); 4785 4786 // Registered devices of prohibited technology types should be disabled. 4787 EXPECT_CALL(*mock_devices_[0], SetEnabledNonPersistent(false, _, _)); 4788 EXPECT_CALL(*mock_devices_[1], SetEnabledNonPersistent(false, _, _)); 4789 EXPECT_CALL(*mock_devices_[2], SetEnabledNonPersistent(false, _, _)).Times(0); 4790 Error error; 4791 manager()->SetProhibitedTechnologies("wimax,vpn", &error); 4792 EXPECT_TRUE(manager()->IsTechnologyProhibited(Technology::kVPN)); 4793 EXPECT_TRUE(manager()->IsTechnologyProhibited(Technology::kWiMax)); 4794 EXPECT_FALSE(manager()->IsTechnologyProhibited(Technology::kWifi)); 4795 Mock::VerifyAndClearExpectations(mock_devices_[0].get()); 4796 Mock::VerifyAndClearExpectations(mock_devices_[1].get()); 4797 Mock::VerifyAndClearExpectations(mock_devices_[2].get()); 4798 4799 // Newly registered devices should be disabled. 4800 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 4801 dispatcher(), 4802 metrics(), 4803 manager(), 4804 "null4", 4805 "addr4", 4806 0)); 4807 mock_devices_.push_back(new NiceMock<MockDevice>(control_interface(), 4808 dispatcher(), 4809 metrics(), 4810 manager(), 4811 "null5", 4812 "addr5", 4813 0)); 4814 ON_CALL(*mock_devices_[3], technology()) 4815 .WillByDefault(Return(Technology::kVPN)); 4816 ON_CALL(*mock_devices_[4], technology()) 4817 .WillByDefault(Return(Technology::kWiMax)); 4818 ON_CALL(*mock_devices_[5], technology()) 4819 .WillByDefault(Return(Technology::kWifi)); 4820 4821 EXPECT_CALL(*mock_devices_[3], SetEnabledNonPersistent(false, _, _)); 4822 EXPECT_CALL(*mock_devices_[4], SetEnabledNonPersistent(false, _, _)); 4823 EXPECT_CALL(*mock_devices_[5], SetEnabledPersistent(false, _, _)).Times(0); 4824 4825 manager()->RegisterDevice(mock_devices_[3]); 4826 manager()->RegisterDevice(mock_devices_[4]); 4827 manager()->RegisterDevice(mock_devices_[5]); 4828 Mock::VerifyAndClearExpectations(mock_devices_[3].get()); 4829 Mock::VerifyAndClearExpectations(mock_devices_[4].get()); 4830 Mock::VerifyAndClearExpectations(mock_devices_[5].get()); 4831 4832 // Calls to enable a non-prohibited technology should succeed. 4833 Error enable_error(Error::kOperationInitiated); 4834 DisableTechnologyReplyHandler technology_reply_handler; 4835 ResultCallback enable_technology_callback( 4836 Bind(&DisableTechnologyReplyHandler::ReportResult, 4837 technology_reply_handler.AsWeakPtr())); 4838 EXPECT_CALL(*mock_devices_[2], SetEnabledPersistent(true, _, _)); 4839 EXPECT_CALL(*mock_devices_[5], SetEnabledPersistent(true, _, _)); 4840 manager()->SetEnabledStateForTechnology( 4841 "wifi", true, true, &enable_error, enable_technology_callback); 4842 EXPECT_EQ(Error::kOperationInitiated, enable_error.type()); 4843 4844 // Calls to enable a prohibited technology should fail. 4845 Error enable_prohibited_error(Error::kOperationInitiated); 4846 EXPECT_CALL(*mock_devices_[0], SetEnabledPersistent(true, _, _)).Times(0); 4847 EXPECT_CALL(*mock_devices_[3], SetEnabledPersistent(true, _, _)).Times(0); 4848 manager()->SetEnabledStateForTechnology( 4849 "vpn", true, true, &enable_prohibited_error, enable_technology_callback); 4850 EXPECT_EQ(Error::kPermissionDenied, enable_prohibited_error.type()); 4851 } 4852 4853 TEST_F(ManagerTest, ClaimBlacklistedDevice) { 4854 const string kClaimerName = "test_claimer"; 4855 const string kDeviceName = "test_device"; 4856 4857 // Set blacklisted devices. 4858 vector<string> blacklisted_devices = { kDeviceName }; 4859 manager()->SetBlacklistedDevices(blacklisted_devices); 4860 4861 Error error; 4862 manager()->ClaimDevice(kClaimerName, kDeviceName, &error); 4863 EXPECT_TRUE(error.IsFailure()); 4864 EXPECT_EQ("Not allowed to claim unmanaged device", error.message()); 4865 // Verify device claimer is not created. 4866 EXPECT_EQ(nullptr, manager()->device_claimer_.get()); 4867 } 4868 4869 TEST_F(ManagerTest, ReleaseBlacklistedDevice) { 4870 const string kClaimerName = "test_claimer"; 4871 const string kDeviceName = "test_device"; 4872 4873 // Set blacklisted devices. 4874 vector<string> blacklisted_devices = { kDeviceName }; 4875 manager()->SetBlacklistedDevices(blacklisted_devices); 4876 4877 Error error; 4878 bool claimer_removed; 4879 manager()->ReleaseDevice(kClaimerName, kDeviceName, &claimer_removed, &error); 4880 EXPECT_TRUE(error.IsFailure()); 4881 EXPECT_FALSE(claimer_removed); 4882 EXPECT_EQ("Not allowed to release unmanaged device", error.message()); 4883 } 4884 4885 TEST_F(ManagerTest, BlacklistedDeviceIsNotManaged) { 4886 const string kDeviceName = "test_device"; 4887 4888 vector<string> blacklisted_devices = { kDeviceName }; 4889 manager()->SetBlacklistedDevices(blacklisted_devices); 4890 EXPECT_FALSE(manager()->DeviceManagementAllowed(kDeviceName)); 4891 } 4892 4893 TEST_F(ManagerTest, NonBlacklistedDeviceIsManaged) { 4894 const string kDeviceName = "test_device"; 4895 4896 vector<string> blacklisted_devices = { "other_device" }; 4897 manager()->SetBlacklistedDevices(blacklisted_devices); 4898 EXPECT_TRUE(manager()->DeviceManagementAllowed(kDeviceName)); 4899 } 4900 4901 TEST_F(ManagerTest, WhitelistedDeviceIsManaged) { 4902 const string kDeviceName = "test_device"; 4903 4904 vector<string> whitelisted_devices = { kDeviceName }; 4905 manager()->SetWhitelistedDevices(whitelisted_devices); 4906 EXPECT_TRUE(manager()->DeviceManagementAllowed(kDeviceName)); 4907 } 4908 4909 TEST_F(ManagerTest, NonWhitelistedDeviceIsNotManaged) { 4910 const string kDeviceName = "test_device"; 4911 4912 vector<string> whitelisted_devices = { "other_device" }; 4913 manager()->SetWhitelistedDevices(whitelisted_devices); 4914 EXPECT_FALSE(manager()->DeviceManagementAllowed(kDeviceName)); 4915 } 4916 4917 TEST_F(ManagerTest, DevicesIsManagedByDefault) { 4918 EXPECT_TRUE(manager()->DeviceManagementAllowed("test_device")); 4919 } 4920 4921 TEST_F(ManagerTest, ClaimDeviceWithoutClaimer) { 4922 const char kClaimerName[] = "test_claimer1"; 4923 const char kDeviceName[] = "test_device"; 4924 4925 // Claim device when device claimer doesn't exist yet. 4926 Error error; 4927 manager()->ClaimDevice(kClaimerName, kDeviceName, &error); 4928 EXPECT_TRUE(error.IsSuccess()); 4929 EXPECT_TRUE(manager()->device_info()->IsDeviceBlackListed(kDeviceName)); 4930 // Verify device claimer is created. 4931 EXPECT_NE(nullptr, manager()->device_claimer_.get()); 4932 } 4933 4934 TEST_F(ManagerTest, ClaimDeviceWithClaimer) { 4935 const char kClaimer1Name[] = "test_claimer1"; 4936 const char kClaimer2Name[] = "test_claimer2"; 4937 const char kDeviceName[] = "test_device"; 4938 4939 // Setup device claimer. 4940 MockDeviceClaimer* device_claimer = new MockDeviceClaimer(kClaimer1Name); 4941 SetDeviceClaimer(device_claimer); 4942 4943 // Claim device with empty string name. 4944 const char kEmptyDeviceNameError[] = "Empty device name"; 4945 Error error; 4946 manager()->ClaimDevice(kClaimer1Name, "", &error); 4947 EXPECT_EQ(string(kEmptyDeviceNameError), error.message()); 4948 4949 // Device claim succeed. 4950 error.Reset(); 4951 EXPECT_CALL(*device_claimer, Claim(kDeviceName, _)).WillOnce(Return(true)); 4952 manager()->ClaimDevice(kClaimer1Name, kDeviceName, &error); 4953 EXPECT_EQ(Error::kSuccess, error.type()); 4954 Mock::VerifyAndClearExpectations(device_claimer); 4955 4956 // Claimer mismatch, current implementation only allows one claimer at a time. 4957 const char kInvalidClaimerError[] = 4958 "Invalid claimer name test_claimer2. Claimer test_claimer1 already exist"; 4959 error.Reset(); 4960 EXPECT_CALL(*device_claimer, Claim(_, _)).Times(0); 4961 manager()->ClaimDevice(kClaimer2Name, kDeviceName, &error); 4962 EXPECT_EQ(string(kInvalidClaimerError), error.message()); 4963 } 4964 4965 TEST_F(ManagerTest, ClaimRegisteredDevice) { 4966 const char kClaimerName[] = "test_claimer"; 4967 4968 // Setup device claimer. 4969 MockDeviceClaimer* device_claimer = new MockDeviceClaimer(kClaimerName); 4970 SetDeviceClaimer(device_claimer); 4971 4972 // Register a device to manager. 4973 ON_CALL(*mock_devices_[0].get(), technology()) 4974 .WillByDefault(Return(Technology::kWifi)); 4975 manager()->RegisterDevice(mock_devices_[0]); 4976 // Verify device is registered. 4977 EXPECT_TRUE(IsDeviceRegistered(mock_devices_[0], Technology::kWifi)); 4978 4979 // Claim the registered device. 4980 Error error; 4981 EXPECT_CALL(*device_claimer, Claim(mock_devices_[0]->link_name(), _)) 4982 .WillOnce(Return(true)); 4983 manager()->ClaimDevice(kClaimerName, mock_devices_[0]->link_name(), &error); 4984 EXPECT_EQ(Error::kSuccess, error.type()); 4985 Mock::VerifyAndClearExpectations(device_claimer); 4986 4987 // Expect device to not be registered anymore. 4988 EXPECT_FALSE(IsDeviceRegistered(mock_devices_[0], Technology::kWifi)); 4989 } 4990 4991 TEST_F(ManagerTest, ReleaseDevice) { 4992 const char kClaimerName[] = "test_claimer"; 4993 const char kWrongClaimerName[] = "test_claimer1"; 4994 const char kDeviceName[] = "test_device"; 4995 4996 // Release device without claimer. 4997 const char kNoClaimerError[] = "Device claimer doesn't exist"; 4998 Error error; 4999 bool claimer_removed; 5000 manager()->ReleaseDevice(kClaimerName, kDeviceName, &claimer_removed, &error); 5001 EXPECT_EQ(string(kNoClaimerError), error.message()); 5002 EXPECT_FALSE(claimer_removed); 5003 5004 // Setup device claimer. 5005 MockDeviceClaimer* device_claimer = new MockDeviceClaimer(kClaimerName); 5006 SetDeviceClaimer(device_claimer); 5007 5008 // Release device from wrong claimer. 5009 const char kClaimerMismatchError[] = 5010 "Invalid claimer name test_claimer1. Claimer test_claimer already exist"; 5011 error.Reset(); 5012 manager()->ReleaseDevice(kWrongClaimerName, kDeviceName, &claimer_removed, 5013 &error); 5014 EXPECT_EQ(string(kClaimerMismatchError), error.message()); 5015 EXPECT_FALSE(claimer_removed); 5016 5017 // Release one of multiple device from a non-default claimer. 5018 error.Reset(); 5019 EXPECT_CALL(*device_claimer, Release(kDeviceName, &error)) 5020 .WillOnce(Return(true)); 5021 EXPECT_CALL(*device_claimer, default_claimer()).WillOnce(Return(false)); 5022 EXPECT_CALL(*device_claimer, DevicesClaimed()).WillOnce(Return(true)); 5023 manager()->ReleaseDevice(kClaimerName, kDeviceName, &claimer_removed, &error); 5024 Mock::VerifyAndClearExpectations(device_claimer); 5025 EXPECT_TRUE(error.IsSuccess()); 5026 EXPECT_FALSE(claimer_removed); 5027 5028 // Release a device with default claimer. Claimer should not be resetted. 5029 error.Reset(); 5030 EXPECT_CALL(*device_claimer, Release(kDeviceName, &error)) 5031 .WillOnce(Return(true)); 5032 EXPECT_CALL(*device_claimer, default_claimer()).WillOnce(Return(true)); 5033 EXPECT_CALL(*device_claimer, DevicesClaimed()).Times(0); 5034 manager()->ReleaseDevice(kClaimerName, kDeviceName, &claimer_removed, &error); 5035 Mock::VerifyAndClearExpectations(device_claimer); 5036 EXPECT_TRUE(error.IsSuccess()); 5037 EXPECT_FALSE(claimer_removed); 5038 EXPECT_NE(nullptr, manager()->device_claimer_.get()); 5039 5040 // Release last device with non-default claimer. Claimer should be resetted. 5041 error.Reset(); 5042 EXPECT_CALL(*device_claimer, Release(kDeviceName, &error)) 5043 .WillOnce(Return(true)); 5044 EXPECT_CALL(*device_claimer, default_claimer()).WillOnce(Return(false)); 5045 EXPECT_CALL(*device_claimer, DevicesClaimed()).WillOnce(Return(false)); 5046 manager()->ReleaseDevice(kClaimerName, kDeviceName, &claimer_removed, &error); 5047 Mock::VerifyAndClearExpectations(device_claimer); 5048 EXPECT_TRUE(error.IsSuccess()); 5049 EXPECT_TRUE(claimer_removed); 5050 EXPECT_EQ(nullptr, manager()->device_claimer_.get()); 5051 } 5052 5053 TEST_F(ManagerTest, GetEnabledDeviceWithTechnology) { 5054 auto ethernet_device = mock_devices_[0]; 5055 auto wifi_device = mock_devices_[1]; 5056 auto cellular_device = mock_devices_[2]; 5057 ON_CALL(*ethernet_device.get(), technology()) 5058 .WillByDefault(Return(Technology::kEthernet)); 5059 ON_CALL(*wifi_device.get(), technology()) 5060 .WillByDefault(Return(Technology::kWifi)); 5061 ON_CALL(*cellular_device.get(), technology()) 5062 .WillByDefault(Return(Technology::kCellular)); 5063 ethernet_device->enabled_ = true; 5064 wifi_device->enabled_ = true; 5065 cellular_device->enabled_ = true; 5066 5067 manager()->RegisterDevice(ethernet_device); 5068 manager()->RegisterDevice(wifi_device); 5069 manager()->RegisterDevice(cellular_device); 5070 5071 EXPECT_EQ(ethernet_device, 5072 manager()->GetEnabledDeviceWithTechnology(Technology::kEthernet)); 5073 EXPECT_EQ(wifi_device, 5074 manager()->GetEnabledDeviceWithTechnology(Technology::kWifi)); 5075 EXPECT_EQ(cellular_device, 5076 manager()->GetEnabledDeviceWithTechnology(Technology::kCellular)); 5077 } 5078 5079 TEST_F(ManagerTest, GetEnabledDeviceByLinkName) { 5080 auto ethernet_device = mock_devices_[0]; 5081 auto wifi_device = mock_devices_[1]; 5082 auto disabled_wifi_device = mock_devices_[2]; 5083 ON_CALL(*ethernet_device.get(), technology()) 5084 .WillByDefault(Return(Technology::kEthernet)); 5085 ON_CALL(*wifi_device.get(), technology()) 5086 .WillByDefault(Return(Technology::kWifi)); 5087 ON_CALL(*disabled_wifi_device.get(), technology()) 5088 .WillByDefault(Return(Technology::kWifi)); 5089 ethernet_device->enabled_ = true; 5090 wifi_device->enabled_ = true; 5091 disabled_wifi_device->enabled_ = false; 5092 5093 manager()->RegisterDevice(ethernet_device); 5094 manager()->RegisterDevice(wifi_device); 5095 5096 EXPECT_EQ(ethernet_device, 5097 manager()->GetEnabledDeviceByLinkName( 5098 ethernet_device->link_name())); 5099 EXPECT_EQ(wifi_device, 5100 manager()->GetEnabledDeviceByLinkName(wifi_device->link_name())); 5101 EXPECT_EQ(nullptr, 5102 manager()->GetEnabledDeviceByLinkName( 5103 disabled_wifi_device->link_name())); 5104 } 5105 5106 TEST_F(ManagerTest, AcceptHostnameFrom) { 5107 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth0")); 5108 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth1")); 5109 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("wlan0")); 5110 5111 manager()->SetAcceptHostnameFrom("eth0"); 5112 EXPECT_TRUE(manager()->ShouldAcceptHostnameFrom("eth0")); 5113 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth1")); 5114 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("wlan0")); 5115 5116 manager()->SetAcceptHostnameFrom("eth1"); 5117 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth0")); 5118 EXPECT_TRUE(manager()->ShouldAcceptHostnameFrom("eth1")); 5119 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("wlan0")); 5120 5121 manager()->SetAcceptHostnameFrom("eth*"); 5122 EXPECT_TRUE(manager()->ShouldAcceptHostnameFrom("eth0")); 5123 EXPECT_TRUE(manager()->ShouldAcceptHostnameFrom("eth1")); 5124 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("wlan0")); 5125 5126 manager()->SetAcceptHostnameFrom("wlan*"); 5127 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth0")); 5128 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth1")); 5129 EXPECT_TRUE(manager()->ShouldAcceptHostnameFrom("wlan0")); 5130 5131 manager()->SetAcceptHostnameFrom("ether*"); 5132 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth0")); 5133 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("eth1")); 5134 EXPECT_FALSE(manager()->ShouldAcceptHostnameFrom("wlan0")); 5135 } 5136 5137 TEST_F(ManagerTest, DHCPv6EnabledDevices) { 5138 EXPECT_FALSE(manager()->IsDHCPv6EnabledForDevice("eth0")); 5139 EXPECT_FALSE(manager()->IsDHCPv6EnabledForDevice("eth1")); 5140 EXPECT_FALSE(manager()->IsDHCPv6EnabledForDevice("wlan0")); 5141 5142 vector<string> enabled_devices; 5143 enabled_devices.push_back("eth0"); 5144 manager()->SetDHCPv6EnabledDevices(enabled_devices); 5145 EXPECT_TRUE(manager()->IsDHCPv6EnabledForDevice("eth0")); 5146 EXPECT_FALSE(manager()->IsDHCPv6EnabledForDevice("eth1")); 5147 EXPECT_FALSE(manager()->IsDHCPv6EnabledForDevice("wlan0")); 5148 5149 enabled_devices.push_back("eth1"); 5150 manager()->SetDHCPv6EnabledDevices(enabled_devices); 5151 EXPECT_TRUE(manager()->IsDHCPv6EnabledForDevice("eth0")); 5152 EXPECT_TRUE(manager()->IsDHCPv6EnabledForDevice("eth1")); 5153 EXPECT_FALSE(manager()->IsDHCPv6EnabledForDevice("wlan0")); 5154 5155 enabled_devices.push_back("wlan0"); 5156 manager()->SetDHCPv6EnabledDevices(enabled_devices); 5157 EXPECT_TRUE(manager()->IsDHCPv6EnabledForDevice("eth0")); 5158 EXPECT_TRUE(manager()->IsDHCPv6EnabledForDevice("eth1")); 5159 EXPECT_TRUE(manager()->IsDHCPv6EnabledForDevice("wlan0")); 5160 } 5161 5162 TEST_F(ManagerTest, FilterPrependDNSServersByFamily) { 5163 const struct { 5164 IPAddress::Family family; 5165 string prepend_value; 5166 vector<string> output_list; 5167 } expectations[] = { 5168 {IPAddress::kFamilyIPv4, "", {}}, 5169 {IPAddress::kFamilyIPv4, "8.8.8.8", {"8.8.8.8"}}, 5170 {IPAddress::kFamilyIPv4, "8.8.8.8,2001:4860:4860::8888", {"8.8.8.8"}}, 5171 {IPAddress::kFamilyIPv4, "2001:4860:4860::8844", {}}, 5172 {IPAddress::kFamilyIPv6, "", {}}, 5173 {IPAddress::kFamilyIPv6, "8.8.8.8", {}}, 5174 {IPAddress::kFamilyIPv6, "2001:4860:4860::8844", 5175 {"2001:4860:4860::8844"}}, 5176 {IPAddress::kFamilyIPv6, "8.8.8.8,2001:4860:4860::8888", 5177 {"2001:4860:4860::8888"}} 5178 }; 5179 5180 for (const auto& expectation : expectations) { 5181 manager()->SetPrependDNSServers(expectation.prepend_value); 5182 auto dns_servers = 5183 manager()->FilterPrependDNSServersByFamily(expectation.family); 5184 EXPECT_EQ(expectation.output_list, dns_servers); 5185 } 5186 } 5187 5188 } // namespace shill 5189