1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chromeos/network/network_state_handler.h" 6 7 #include <map> 8 #include <set> 9 #include <string> 10 11 #include "base/bind.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/message_loop/message_loop.h" 14 #include "base/values.h" 15 #include "chromeos/dbus/dbus_thread_manager.h" 16 #include "chromeos/dbus/shill_device_client.h" 17 #include "chromeos/dbus/shill_ipconfig_client.h" 18 #include "chromeos/dbus/shill_manager_client.h" 19 #include "chromeos/dbus/shill_profile_client.h" 20 #include "chromeos/dbus/shill_service_client.h" 21 #include "chromeos/network/device_state.h" 22 #include "chromeos/network/network_state.h" 23 #include "chromeos/network/network_state_handler.h" 24 #include "chromeos/network/network_state_handler_observer.h" 25 #include "dbus/object_path.h" 26 #include "testing/gtest/include/gtest/gtest.h" 27 #include "third_party/cros_system_api/dbus/service_constants.h" 28 29 namespace { 30 31 void ErrorCallbackFunction(const std::string& error_name, 32 const std::string& error_message) { 33 LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; 34 } 35 36 const std::string kShillManagerClientStubWifiDevice = 37 "/device/stub_wifi_device1"; 38 const std::string kShillManagerClientStubCellularDevice = 39 "/device/stub_cellular_device1"; 40 const std::string kShillManagerClientStubDefaultService = "/service/eth1"; 41 const std::string kShillManagerClientStubDefaultWifi = "/service/wifi1"; 42 const std::string kShillManagerClientStubWifi2 = "/service/wifi2"; 43 const std::string kShillManagerClientStubCellular = "/service/cellular1"; 44 45 using chromeos::DeviceState; 46 using chromeos::NetworkState; 47 using chromeos::NetworkStateHandler; 48 49 class TestObserver : public chromeos::NetworkStateHandlerObserver { 50 public: 51 explicit TestObserver(NetworkStateHandler* handler) 52 : handler_(handler), 53 device_list_changed_count_(0), 54 device_count_(0), 55 network_list_changed_count_(0), 56 network_count_(0), 57 default_network_change_count_(0) { 58 } 59 60 virtual ~TestObserver() { 61 } 62 63 virtual void DeviceListChanged() OVERRIDE { 64 NetworkStateHandler::DeviceStateList devices; 65 handler_->GetDeviceList(&devices); 66 device_count_ = devices.size(); 67 ++device_list_changed_count_; 68 } 69 70 virtual void NetworkListChanged() OVERRIDE { 71 NetworkStateHandler::NetworkStateList networks; 72 handler_->GetNetworkListByType(chromeos::NetworkTypePattern::Default(), 73 false /* configured_only */, 74 false /* visible_only */, 75 0 /* no limit */, 76 &networks); 77 network_count_ = networks.size(); 78 if (network_count_ == 0) { 79 default_network_ = ""; 80 default_network_connection_state_ = ""; 81 } 82 ++network_list_changed_count_; 83 } 84 85 virtual void DefaultNetworkChanged(const NetworkState* network) OVERRIDE { 86 ++default_network_change_count_; 87 default_network_ = network ? network->path() : ""; 88 default_network_connection_state_ = 89 network ? network->connection_state() : ""; 90 DVLOG(1) << "DefaultNetworkChanged: " << default_network_ 91 << " State: " << default_network_connection_state_; 92 } 93 94 virtual void NetworkConnectionStateChanged( 95 const NetworkState* network) OVERRIDE { 96 network_connection_state_[network->path()] = network->connection_state(); 97 connection_state_changes_[network->path()]++; 98 } 99 100 virtual void NetworkPropertiesUpdated(const NetworkState* network) OVERRIDE { 101 DCHECK(network); 102 property_updates_[network->path()]++; 103 } 104 105 virtual void DevicePropertiesUpdated(const DeviceState* device) OVERRIDE { 106 DCHECK(device); 107 device_property_updates_[device->path()]++; 108 } 109 110 size_t device_list_changed_count() { return device_list_changed_count_; } 111 size_t device_count() { return device_count_; } 112 size_t network_list_changed_count() { return network_list_changed_count_; } 113 size_t network_count() { return network_count_; } 114 size_t default_network_change_count() { 115 return default_network_change_count_; 116 } 117 void reset_change_counts() { 118 DVLOG(1) << "=== RESET CHANGE COUNTS ==="; 119 default_network_change_count_ = 0; 120 device_list_changed_count_ = 0; 121 network_list_changed_count_ = 0; 122 connection_state_changes_.clear(); 123 } 124 void reset_updates() { 125 property_updates_.clear(); 126 device_property_updates_.clear(); 127 } 128 std::string default_network() { return default_network_; } 129 std::string default_network_connection_state() { 130 return default_network_connection_state_; 131 } 132 133 int PropertyUpdatesForService(const std::string& service_path) { 134 return property_updates_[service_path]; 135 } 136 137 int PropertyUpdatesForDevice(const std::string& device_path) { 138 return device_property_updates_[device_path]; 139 } 140 141 int ConnectionStateChangesForService(const std::string& service_path) { 142 return connection_state_changes_[service_path]; 143 } 144 145 std::string NetworkConnectionStateForService( 146 const std::string& service_path) { 147 return network_connection_state_[service_path]; 148 } 149 150 private: 151 NetworkStateHandler* handler_; 152 size_t device_list_changed_count_; 153 size_t device_count_; 154 size_t network_list_changed_count_; 155 size_t network_count_; 156 size_t default_network_change_count_; 157 std::string default_network_; 158 std::string default_network_connection_state_; 159 std::map<std::string, int> property_updates_; 160 std::map<std::string, int> device_property_updates_; 161 std::map<std::string, int> connection_state_changes_; 162 std::map<std::string, std::string> network_connection_state_; 163 164 DISALLOW_COPY_AND_ASSIGN(TestObserver); 165 }; 166 167 } // namespace 168 169 namespace chromeos { 170 171 class NetworkStateHandlerTest : public testing::Test { 172 public: 173 NetworkStateHandlerTest() 174 : device_test_(NULL), 175 manager_test_(NULL), 176 profile_test_(NULL), 177 service_test_(NULL) {} 178 virtual ~NetworkStateHandlerTest() {} 179 180 virtual void SetUp() OVERRIDE { 181 // Initialize DBusThreadManager with a stub implementation. 182 DBusThreadManager::Initialize(); 183 SetupDefaultShillState(); 184 network_state_handler_.reset(new NetworkStateHandler); 185 test_observer_.reset(new TestObserver(network_state_handler_.get())); 186 network_state_handler_->AddObserver(test_observer_.get(), FROM_HERE); 187 network_state_handler_->InitShillPropertyHandler(); 188 message_loop_.RunUntilIdle(); 189 test_observer_->reset_change_counts(); 190 } 191 192 virtual void TearDown() OVERRIDE { 193 network_state_handler_->RemoveObserver(test_observer_.get(), FROM_HERE); 194 test_observer_.reset(); 195 network_state_handler_.reset(); 196 DBusThreadManager::Shutdown(); 197 } 198 199 protected: 200 void AddService(const std::string& service_path, 201 const std::string& guid, 202 const std::string& name, 203 const std::string& type, 204 const std::string& state) { 205 service_test_->AddService(service_path, guid, name, type, state, 206 true /* add_to_visible */); 207 } 208 209 void SetupDefaultShillState() { 210 message_loop_.RunUntilIdle(); // Process any pending updates 211 device_test_ = 212 DBusThreadManager::Get()->GetShillDeviceClient()->GetTestInterface(); 213 ASSERT_TRUE(device_test_); 214 device_test_->ClearDevices(); 215 device_test_->AddDevice(kShillManagerClientStubWifiDevice, 216 shill::kTypeWifi, "stub_wifi_device1"); 217 device_test_->AddDevice(kShillManagerClientStubCellularDevice, 218 shill::kTypeCellular, "stub_cellular_device1"); 219 220 manager_test_ = 221 DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface(); 222 ASSERT_TRUE(manager_test_); 223 224 profile_test_ = 225 DBusThreadManager::Get()->GetShillProfileClient()->GetTestInterface(); 226 ASSERT_TRUE(profile_test_); 227 profile_test_->ClearProfiles(); 228 229 service_test_ = 230 DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); 231 ASSERT_TRUE(service_test_); 232 service_test_->ClearServices(); 233 AddService(kShillManagerClientStubDefaultService, 234 "eth1_guid", 235 "eth1", 236 shill::kTypeEthernet, 237 shill::kStateOnline); 238 AddService(kShillManagerClientStubDefaultWifi, 239 "wifi1_guid", 240 "wifi1", 241 shill::kTypeWifi, 242 shill::kStateOnline); 243 AddService(kShillManagerClientStubWifi2, 244 "wifi2_guid", 245 "wifi2", 246 shill::kTypeWifi, 247 shill::kStateIdle); 248 AddService(kShillManagerClientStubCellular, 249 "cellular1_guid", 250 "cellular1", 251 shill::kTypeCellular, 252 shill::kStateIdle); 253 } 254 255 void UpdateManagerProperties() { 256 message_loop_.RunUntilIdle(); 257 } 258 259 base::MessageLoopForUI message_loop_; 260 scoped_ptr<NetworkStateHandler> network_state_handler_; 261 scoped_ptr<TestObserver> test_observer_; 262 ShillDeviceClient::TestInterface* device_test_; 263 ShillManagerClient::TestInterface* manager_test_; 264 ShillProfileClient::TestInterface* profile_test_; 265 ShillServiceClient::TestInterface* service_test_; 266 267 private: 268 DISALLOW_COPY_AND_ASSIGN(NetworkStateHandlerTest); 269 }; 270 271 TEST_F(NetworkStateHandlerTest, NetworkStateHandlerStub) { 272 // Ensure that the device and network list are the expected size. 273 const size_t kNumShillManagerClientStubImplDevices = 2; 274 EXPECT_EQ(kNumShillManagerClientStubImplDevices, 275 test_observer_->device_count()); 276 const size_t kNumShillManagerClientStubImplServices = 4; 277 EXPECT_EQ(kNumShillManagerClientStubImplServices, 278 test_observer_->network_count()); 279 // Ensure that the first stub network is the default network. 280 EXPECT_EQ(kShillManagerClientStubDefaultService, 281 test_observer_->default_network()); 282 ASSERT_TRUE(network_state_handler_->DefaultNetwork()); 283 EXPECT_EQ(kShillManagerClientStubDefaultService, 284 network_state_handler_->DefaultNetwork()->path()); 285 EXPECT_EQ(kShillManagerClientStubDefaultService, 286 network_state_handler_->ConnectedNetworkByType( 287 NetworkTypePattern::Ethernet())->path()); 288 EXPECT_EQ(kShillManagerClientStubDefaultWifi, 289 network_state_handler_->ConnectedNetworkByType( 290 NetworkTypePattern::WiFi())->path()); 291 EXPECT_EQ(kShillManagerClientStubCellular, 292 network_state_handler_->FirstNetworkByType( 293 NetworkTypePattern::Mobile())->path()); 294 EXPECT_EQ( 295 kShillManagerClientStubCellular, 296 network_state_handler_->FirstNetworkByType(NetworkTypePattern::Cellular()) 297 ->path()); 298 EXPECT_EQ(shill::kStateOnline, 299 test_observer_->default_network_connection_state()); 300 } 301 302 TEST_F(NetworkStateHandlerTest, GetNetworkList) { 303 // Ensure that the network list is the expected size. 304 const size_t kNumShillManagerClientStubImplServices = 4; 305 EXPECT_EQ(kNumShillManagerClientStubImplServices, 306 test_observer_->network_count()); 307 // Add a non-visible network to the profile. 308 const std::string profile = "/profile/profile1"; 309 const std::string wifi_favorite_path = "/service/wifi_faviorite"; 310 service_test_->AddService(wifi_favorite_path, 311 "wifi_faviorite_guid", 312 "wifi_faviorite", 313 shill::kTypeWifi, 314 shill::kStateIdle, 315 false /* add_to_visible */); 316 profile_test_->AddProfile(profile, "" /* userhash */); 317 EXPECT_TRUE(profile_test_->AddService(profile, wifi_favorite_path)); 318 UpdateManagerProperties(); 319 message_loop_.RunUntilIdle(); 320 EXPECT_EQ(kNumShillManagerClientStubImplServices + 1, 321 test_observer_->network_count()); 322 323 // Get all networks. 324 NetworkStateHandler::NetworkStateList networks; 325 network_state_handler_->GetNetworkListByType(NetworkTypePattern::Default(), 326 false /* configured_only */, 327 false /* visible_only */, 328 0 /* no limit */, 329 &networks); 330 EXPECT_EQ(kNumShillManagerClientStubImplServices + 1, networks.size()); 331 // Limit number of results. 332 network_state_handler_->GetNetworkListByType(NetworkTypePattern::Default(), 333 false /* configured_only */, 334 false /* visible_only */, 335 2 /* limit */, 336 &networks); 337 EXPECT_EQ(2u, networks.size()); 338 // Get all wifi networks. 339 network_state_handler_->GetNetworkListByType(NetworkTypePattern::WiFi(), 340 false /* configured_only */, 341 false /* visible_only */, 342 0 /* no limit */, 343 &networks); 344 EXPECT_EQ(3u, networks.size()); 345 // Get visible networks. 346 network_state_handler_->GetNetworkListByType(NetworkTypePattern::Default(), 347 false /* configured_only */, 348 true /* visible_only */, 349 0 /* no limit */, 350 &networks); 351 EXPECT_EQ(kNumShillManagerClientStubImplServices, networks.size()); 352 network_state_handler_->GetVisibleNetworkList(&networks); 353 EXPECT_EQ(kNumShillManagerClientStubImplServices, networks.size()); 354 // Get configured (profile) networks. 355 network_state_handler_->GetNetworkListByType(NetworkTypePattern::Default(), 356 true /* configured_only */, 357 false /* visible_only */, 358 0 /* no limit */, 359 &networks); 360 EXPECT_EQ(1u, networks.size()); 361 } 362 363 TEST_F(NetworkStateHandlerTest, NetworkListChanged) { 364 size_t stub_network_count = test_observer_->network_count(); 365 // Set up two additional visible networks. 366 const std::string wifi3 = "/service/wifi3"; 367 const std::string wifi4 = "/service/wifi4"; 368 service_test_->SetServiceProperties( 369 wifi3, "wifi3_guid", "wifi3", 370 shill::kTypeWifi, shill::kStateIdle, true /* visible */); 371 service_test_->SetServiceProperties( 372 wifi4, "wifi4_guid", "wifi4", 373 shill::kTypeWifi, shill::kStateIdle, true /* visible */); 374 // Add the services to the Manager. Only notify when the second service is 375 // added. 376 manager_test_->AddManagerService(wifi3, false); 377 manager_test_->AddManagerService(wifi4, true); 378 UpdateManagerProperties(); 379 // Expect two service updates and one list update. 380 EXPECT_EQ(stub_network_count + 2, test_observer_->network_count()); 381 EXPECT_EQ(1, test_observer_->PropertyUpdatesForService(wifi3)); 382 EXPECT_EQ(1, test_observer_->PropertyUpdatesForService(wifi4)); 383 EXPECT_EQ(1u, test_observer_->network_list_changed_count()); 384 } 385 386 TEST_F(NetworkStateHandlerTest, GetVisibleNetworks) { 387 // Ensure that the network list is the expected size. 388 const size_t kNumShillManagerClientStubImplServices = 4; 389 EXPECT_EQ(kNumShillManagerClientStubImplServices, 390 test_observer_->network_count()); 391 // Add a non-visible network to the profile. 392 const std::string profile = "/profile/profile1"; 393 const std::string wifi_favorite_path = "/service/wifi_faviorite"; 394 service_test_->AddService(wifi_favorite_path, 395 "wifi_faviorite_guid", 396 "wifi_faviorite", 397 shill::kTypeWifi, 398 shill::kStateIdle, 399 false /* add_to_visible */); 400 message_loop_.RunUntilIdle(); 401 EXPECT_EQ(kNumShillManagerClientStubImplServices + 1, 402 test_observer_->network_count()); 403 404 // Get visible networks. 405 NetworkStateHandler::NetworkStateList networks; 406 network_state_handler_->GetVisibleNetworkList(&networks); 407 EXPECT_EQ(kNumShillManagerClientStubImplServices, networks.size()); 408 409 // Change the visible state of a network. 410 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 411 dbus::ObjectPath(kShillManagerClientStubWifi2), 412 shill::kVisibleProperty, base::FundamentalValue(false), 413 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 414 message_loop_.RunUntilIdle(); 415 network_state_handler_->GetVisibleNetworkList(&networks); 416 EXPECT_EQ(kNumShillManagerClientStubImplServices - 1, networks.size()); 417 } 418 419 TEST_F(NetworkStateHandlerTest, TechnologyChanged) { 420 // Disable a technology. Will immediately set the state to AVAILABLE and 421 // notify observers. 422 network_state_handler_->SetTechnologyEnabled( 423 NetworkTypePattern::WiFi(), false, network_handler::ErrorCallback()); 424 EXPECT_EQ(1u, test_observer_->device_list_changed_count()); 425 EXPECT_EQ( 426 NetworkStateHandler::TECHNOLOGY_AVAILABLE, 427 network_state_handler_->GetTechnologyState(NetworkTypePattern::WiFi())); 428 429 // Run the message loop. An additional notification will be received when 430 // Shill updates the enabled technologies. The state should remain AVAILABLE. 431 test_observer_->reset_change_counts(); 432 message_loop_.RunUntilIdle(); 433 EXPECT_EQ(1u, test_observer_->device_list_changed_count()); 434 EXPECT_EQ( 435 NetworkStateHandler::TECHNOLOGY_AVAILABLE, 436 network_state_handler_->GetTechnologyState(NetworkTypePattern::WiFi())); 437 438 // Enable a technology. Will immediately set the state to ENABLING and 439 // notify observers. 440 test_observer_->reset_change_counts(); 441 network_state_handler_->SetTechnologyEnabled( 442 NetworkTypePattern::WiFi(), true, network_handler::ErrorCallback()); 443 EXPECT_EQ(1u, test_observer_->device_list_changed_count()); 444 EXPECT_EQ( 445 NetworkStateHandler::TECHNOLOGY_ENABLING, 446 network_state_handler_->GetTechnologyState(NetworkTypePattern::WiFi())); 447 448 // Run the message loop. State should change to ENABLED. 449 test_observer_->reset_change_counts(); 450 message_loop_.RunUntilIdle(); 451 EXPECT_EQ(1u, test_observer_->device_list_changed_count()); 452 EXPECT_EQ( 453 NetworkStateHandler::TECHNOLOGY_ENABLED, 454 network_state_handler_->GetTechnologyState(NetworkTypePattern::WiFi())); 455 } 456 457 TEST_F(NetworkStateHandlerTest, TechnologyState) { 458 manager_test_->RemoveTechnology(shill::kTypeWimax); 459 message_loop_.RunUntilIdle(); 460 EXPECT_EQ( 461 NetworkStateHandler::TECHNOLOGY_UNAVAILABLE, 462 network_state_handler_->GetTechnologyState(NetworkTypePattern::Wimax())); 463 464 manager_test_->AddTechnology(shill::kTypeWimax, false); 465 message_loop_.RunUntilIdle(); 466 EXPECT_EQ( 467 NetworkStateHandler::TECHNOLOGY_AVAILABLE, 468 network_state_handler_->GetTechnologyState(NetworkTypePattern::Wimax())); 469 470 manager_test_->SetTechnologyInitializing(shill::kTypeWimax, true); 471 message_loop_.RunUntilIdle(); 472 EXPECT_EQ( 473 NetworkStateHandler::TECHNOLOGY_UNINITIALIZED, 474 network_state_handler_->GetTechnologyState(NetworkTypePattern::Wimax())); 475 476 manager_test_->SetTechnologyInitializing(shill::kTypeWimax, false); 477 network_state_handler_->SetTechnologyEnabled( 478 NetworkTypePattern::Wimax(), true, network_handler::ErrorCallback()); 479 message_loop_.RunUntilIdle(); 480 EXPECT_EQ( 481 NetworkStateHandler::TECHNOLOGY_ENABLED, 482 network_state_handler_->GetTechnologyState(NetworkTypePattern::Wimax())); 483 484 manager_test_->RemoveTechnology(shill::kTypeWimax); 485 message_loop_.RunUntilIdle(); 486 EXPECT_EQ( 487 NetworkStateHandler::TECHNOLOGY_UNAVAILABLE, 488 network_state_handler_->GetTechnologyState(NetworkTypePattern::Wimax())); 489 } 490 491 TEST_F(NetworkStateHandlerTest, ServicePropertyChanged) { 492 // Set a service property. 493 const std::string eth1 = kShillManagerClientStubDefaultService; 494 const NetworkState* ethernet = network_state_handler_->GetNetworkState(eth1); 495 ASSERT_TRUE(ethernet); 496 EXPECT_EQ("", ethernet->security()); 497 EXPECT_EQ(1, test_observer_->PropertyUpdatesForService(eth1)); 498 base::StringValue security_value("TestSecurity"); 499 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 500 dbus::ObjectPath(eth1), 501 shill::kSecurityProperty, security_value, 502 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 503 message_loop_.RunUntilIdle(); 504 ethernet = network_state_handler_->GetNetworkState(eth1); 505 EXPECT_EQ("TestSecurity", ethernet->security()); 506 EXPECT_EQ(2, test_observer_->PropertyUpdatesForService(eth1)); 507 508 // Changing a service to the existing value should not trigger an update. 509 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 510 dbus::ObjectPath(eth1), 511 shill::kSecurityProperty, security_value, 512 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 513 message_loop_.RunUntilIdle(); 514 EXPECT_EQ(2, test_observer_->PropertyUpdatesForService(eth1)); 515 } 516 517 TEST_F(NetworkStateHandlerTest, GetState) { 518 const std::string profile = "/profile/profile1"; 519 const std::string wifi_path = kShillManagerClientStubDefaultWifi; 520 521 // Add a wifi service to a Profile. 522 profile_test_->AddProfile(profile, "" /* userhash */); 523 EXPECT_TRUE(profile_test_->AddService(profile, wifi_path)); 524 UpdateManagerProperties(); 525 526 // Ensure that a NetworkState exists. 527 const NetworkState* wifi_network = 528 network_state_handler_->GetNetworkStateFromServicePath( 529 wifi_path, true /* configured_only */); 530 ASSERT_TRUE(wifi_network); 531 532 // Test looking up by GUID. 533 ASSERT_FALSE(wifi_network->guid().empty()); 534 const NetworkState* wifi_network_guid = 535 network_state_handler_->GetNetworkStateFromGuid(wifi_network->guid()); 536 EXPECT_EQ(wifi_network, wifi_network_guid); 537 538 // Remove the service, verify that there is no longer a NetworkState for it. 539 service_test_->RemoveService(wifi_path); 540 UpdateManagerProperties(); 541 EXPECT_FALSE(network_state_handler_->GetNetworkState(wifi_path)); 542 } 543 544 TEST_F(NetworkStateHandlerTest, NetworkConnectionStateChanged) { 545 const std::string eth1 = kShillManagerClientStubDefaultService; 546 EXPECT_EQ(0, test_observer_->ConnectionStateChangesForService(eth1)); 547 548 // Change a network state. 549 base::StringValue connection_state_idle_value(shill::kStateIdle); 550 service_test_->SetServiceProperty(eth1, shill::kStateProperty, 551 connection_state_idle_value); 552 message_loop_.RunUntilIdle(); 553 EXPECT_EQ(shill::kStateIdle, 554 test_observer_->NetworkConnectionStateForService(eth1)); 555 EXPECT_EQ(1, test_observer_->ConnectionStateChangesForService(eth1)); 556 // Confirm that changing the connection state to the same value does *not* 557 // signal the observer. 558 service_test_->SetServiceProperty(eth1, shill::kStateProperty, 559 connection_state_idle_value); 560 message_loop_.RunUntilIdle(); 561 EXPECT_EQ(1, test_observer_->ConnectionStateChangesForService(eth1)); 562 } 563 564 TEST_F(NetworkStateHandlerTest, DefaultServiceDisconnected) { 565 const std::string eth1 = kShillManagerClientStubDefaultService; 566 const std::string wifi1 = kShillManagerClientStubDefaultWifi; 567 568 EXPECT_EQ(0u, test_observer_->default_network_change_count()); 569 // Disconnect ethernet. 570 base::StringValue connection_state_idle_value(shill::kStateIdle); 571 service_test_->SetServiceProperty(eth1, shill::kStateProperty, 572 connection_state_idle_value); 573 message_loop_.RunUntilIdle(); 574 // Expect two changes: first when eth1 becomes disconnected, second when 575 // wifi1 becomes the default. 576 EXPECT_EQ(2u, test_observer_->default_network_change_count()); 577 EXPECT_EQ(wifi1, test_observer_->default_network()); 578 579 // Disconnect wifi. 580 test_observer_->reset_change_counts(); 581 service_test_->SetServiceProperty(wifi1, shill::kStateProperty, 582 connection_state_idle_value); 583 message_loop_.RunUntilIdle(); 584 EXPECT_EQ(1u, test_observer_->default_network_change_count()); 585 EXPECT_EQ("", test_observer_->default_network()); 586 } 587 588 TEST_F(NetworkStateHandlerTest, DefaultServiceConnected) { 589 const std::string eth1 = kShillManagerClientStubDefaultService; 590 const std::string wifi1 = kShillManagerClientStubDefaultWifi; 591 592 // Disconnect ethernet and wifi. 593 base::StringValue connection_state_idle_value(shill::kStateIdle); 594 service_test_->SetServiceProperty(eth1, shill::kStateProperty, 595 connection_state_idle_value); 596 service_test_->SetServiceProperty(wifi1, shill::kStateProperty, 597 connection_state_idle_value); 598 message_loop_.RunUntilIdle(); 599 EXPECT_EQ(std::string(), test_observer_->default_network()); 600 601 // Connect ethernet, should become the default network. 602 test_observer_->reset_change_counts(); 603 base::StringValue connection_state_ready_value(shill::kStateReady); 604 service_test_->SetServiceProperty(eth1, shill::kStateProperty, 605 connection_state_ready_value); 606 message_loop_.RunUntilIdle(); 607 EXPECT_EQ(eth1, test_observer_->default_network()); 608 EXPECT_EQ(shill::kStateReady, 609 test_observer_->default_network_connection_state()); 610 EXPECT_EQ(1u, test_observer_->default_network_change_count()); 611 } 612 613 TEST_F(NetworkStateHandlerTest, DefaultServiceChanged) { 614 const std::string eth1 = kShillManagerClientStubDefaultService; 615 // The default service should be eth1. 616 EXPECT_EQ(eth1, test_observer_->default_network()); 617 618 // Change the default network by changing Manager.DefaultService. 619 const std::string wifi1 = kShillManagerClientStubDefaultWifi; 620 base::StringValue wifi1_value(wifi1); 621 manager_test_->SetManagerProperty( 622 shill::kDefaultServiceProperty, wifi1_value); 623 message_loop_.RunUntilIdle(); 624 EXPECT_EQ(wifi1, test_observer_->default_network()); 625 EXPECT_EQ(1u, test_observer_->default_network_change_count()); 626 627 // Change the state of the default network. 628 test_observer_->reset_change_counts(); 629 base::StringValue connection_state_ready_value(shill::kStateReady); 630 service_test_->SetServiceProperty(wifi1, shill::kStateProperty, 631 connection_state_ready_value); 632 message_loop_.RunUntilIdle(); 633 EXPECT_EQ(shill::kStateReady, 634 test_observer_->default_network_connection_state()); 635 EXPECT_EQ(1u, test_observer_->default_network_change_count()); 636 637 // Updating a property on the default network should trigger 638 // a default network change. 639 test_observer_->reset_change_counts(); 640 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 641 dbus::ObjectPath(wifi1), 642 shill::kSecurityProperty, base::StringValue("TestSecurity"), 643 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 644 message_loop_.RunUntilIdle(); 645 EXPECT_EQ(1u, test_observer_->default_network_change_count()); 646 647 // No default network updates for signal strength changes. 648 test_observer_->reset_change_counts(); 649 DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 650 dbus::ObjectPath(wifi1), 651 shill::kSignalStrengthProperty, base::FundamentalValue(32), 652 base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 653 message_loop_.RunUntilIdle(); 654 EXPECT_EQ(0u, test_observer_->default_network_change_count()); 655 } 656 657 TEST_F(NetworkStateHandlerTest, RequestUpdate) { 658 // Request an update for kShillManagerClientStubDefaultWifi. 659 EXPECT_EQ(1, test_observer_->PropertyUpdatesForService( 660 kShillManagerClientStubDefaultWifi)); 661 network_state_handler_->RequestUpdateForNetwork( 662 kShillManagerClientStubDefaultWifi); 663 message_loop_.RunUntilIdle(); 664 EXPECT_EQ(2, test_observer_->PropertyUpdatesForService( 665 kShillManagerClientStubDefaultWifi)); 666 } 667 668 TEST_F(NetworkStateHandlerTest, NetworkGuidInProfile) { 669 const std::string profile = "/profile/profile1"; 670 const std::string wifi_path = "/service/wifi_with_guid"; 671 const std::string wifi_guid = "wifi_guid"; 672 const std::string wifi_name = "WifiWithGuid"; 673 const bool is_service_configured = true; 674 675 // Add a network to the default Profile with a specified GUID. 676 AddService(wifi_path, wifi_guid, wifi_name, 677 shill::kTypeWifi, shill::kStateOnline); 678 profile_test_->AddProfile(profile, "" /* userhash */); 679 EXPECT_TRUE(profile_test_->AddService(profile, wifi_path)); 680 UpdateManagerProperties(); 681 682 // Verify that a NetworkState exists with a matching GUID. 683 const NetworkState* network = 684 network_state_handler_->GetNetworkStateFromServicePath( 685 wifi_path, is_service_configured); 686 ASSERT_TRUE(network); 687 EXPECT_EQ(wifi_guid, network->guid()); 688 689 // Remove the service (simulating a network going out of range). 690 service_test_->RemoveService(wifi_path); 691 UpdateManagerProperties(); 692 EXPECT_FALSE(network_state_handler_->GetNetworkState(wifi_path)); 693 694 // Add the service (simulating a network coming back in range) and verify that 695 // the NetworkState was created with the same GUID. 696 AddService(wifi_path, "" /* guid */, wifi_name, 697 shill::kTypeWifi, shill::kStateOnline); 698 UpdateManagerProperties(); 699 network = network_state_handler_->GetNetworkStateFromServicePath( 700 wifi_path, is_service_configured); 701 ASSERT_TRUE(network); 702 EXPECT_EQ(wifi_guid, network->guid()); 703 } 704 705 TEST_F(NetworkStateHandlerTest, NetworkGuidNotInProfile) { 706 const std::string wifi_path = "/service/wifi_with_guid"; 707 const std::string wifi_name = "WifiWithGuid"; 708 const bool is_service_configured = false; 709 710 // Add a network without specifying a GUID or adding it to a profile. 711 AddService(wifi_path, "" /* guid */, wifi_name, 712 shill::kTypeWifi, shill::kStateOnline); 713 UpdateManagerProperties(); 714 715 // Verify that a NetworkState exists with an assigned GUID. 716 const NetworkState* network = 717 network_state_handler_->GetNetworkStateFromServicePath( 718 wifi_path, is_service_configured); 719 ASSERT_TRUE(network); 720 std::string wifi_guid = network->guid(); 721 EXPECT_FALSE(wifi_guid.empty()); 722 723 // Remove the service (simulating a network going out of range). 724 service_test_->RemoveService(wifi_path); 725 UpdateManagerProperties(); 726 EXPECT_FALSE(network_state_handler_->GetNetworkState(wifi_path)); 727 728 // Add the service (simulating a network coming back in range) and verify that 729 // the NetworkState was created with the same GUID. 730 AddService(wifi_path, "" /* guid */, wifi_name, 731 shill::kTypeWifi, shill::kStateOnline); 732 UpdateManagerProperties(); 733 network = network_state_handler_->GetNetworkStateFromServicePath( 734 wifi_path, is_service_configured); 735 ASSERT_TRUE(network); 736 EXPECT_EQ(wifi_guid, network->guid()); 737 } 738 739 TEST_F(NetworkStateHandlerTest, DeviceListChanged) { 740 size_t stub_device_count = test_observer_->device_count(); 741 // Add an additional device. 742 const std::string wifi_device = "/service/stub_wifi_device2"; 743 device_test_->AddDevice(wifi_device, shill::kTypeWifi, "stub_wifi_device2"); 744 UpdateManagerProperties(); 745 // Expect a device list update. 746 EXPECT_EQ(stub_device_count + 1, test_observer_->device_count()); 747 EXPECT_EQ(0, test_observer_->PropertyUpdatesForDevice(wifi_device)); 748 // Change a device property. 749 device_test_->SetDeviceProperty( 750 wifi_device, shill::kScanningProperty, base::FundamentalValue(true)); 751 UpdateManagerProperties(); 752 EXPECT_EQ(1, test_observer_->PropertyUpdatesForDevice(wifi_device)); 753 } 754 755 TEST_F(NetworkStateHandlerTest, IPConfigChanged) { 756 test_observer_->reset_updates(); 757 EXPECT_EQ(0, test_observer_->PropertyUpdatesForDevice( 758 kShillManagerClientStubWifiDevice)); 759 EXPECT_EQ(0, test_observer_->PropertyUpdatesForService( 760 kShillManagerClientStubDefaultWifi)); 761 762 // Change IPConfigs property. 763 ShillIPConfigClient::TestInterface* ip_config_test = 764 DBusThreadManager::Get()->GetShillIPConfigClient()->GetTestInterface(); 765 const std::string kIPConfigPath = "test_ip_config"; 766 base::DictionaryValue ip_config_properties; 767 ip_config_test->AddIPConfig(kIPConfigPath, ip_config_properties); 768 base::ListValue device_ip_configs; 769 device_ip_configs.Append(new base::StringValue(kIPConfigPath)); 770 device_test_->SetDeviceProperty( 771 kShillManagerClientStubWifiDevice, shill::kIPConfigsProperty, 772 device_ip_configs); 773 service_test_->SetServiceProperty( 774 kShillManagerClientStubDefaultWifi, shill::kIPConfigProperty, 775 base::StringValue(kIPConfigPath)); 776 UpdateManagerProperties(); 777 EXPECT_EQ(1, test_observer_->PropertyUpdatesForDevice( 778 kShillManagerClientStubWifiDevice)); 779 EXPECT_EQ(1, test_observer_->PropertyUpdatesForService( 780 kShillManagerClientStubDefaultWifi)); 781 } 782 783 } // namespace chromeos 784