network_state_handler_unittest.cc revision 9ab5563a3196760eb381d102cbb2bc0f7abc6a50
13034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o// Use of this source code is governed by a BSD-style license that can be 3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o// found in the LICENSE file. 43034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o 53034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/network/network_state_handler.h" 63034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o 7543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o#include <map> 8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o#include <set> 93034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include <string> 103034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o 113034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "base/bind.h" 123034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "base/memory/scoped_ptr.h" 133034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "base/message_loop/message_loop.h" 143034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "base/values.h" 153034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/dbus/dbus_thread_manager.h" 163034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/dbus/shill_device_client.h" 173034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/dbus/shill_manager_client.h" 183034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/dbus/shill_profile_client.h" 193034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/dbus/shill_service_client.h" 203034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/network/network_state.h" 213034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "chromeos/network/network_state_handler_observer.h" 223034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "dbus/object_path.h" 233034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "testing/gtest/include/gtest/gtest.h" 243034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o#include "third_party/cros_system_api/dbus/service_constants.h" 253034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o 263034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'onamespace { 273034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o 28e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallvoid ErrorCallbackFunction(const std::string& error_name, 293034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o const std::string& error_message) { 30f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; 31f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o} 32f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o 33f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'oconst std::string kShillManagerClientStubDefaultService = "eth1"; 34f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'oconst std::string kShillManagerClientStubDefaultWireless = "wifi1"; 35f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'oconst std::string kShillManagerClientStubWireless2 = "wifi2"; 36f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'oconst std::string kShillManagerClientStubCellular = "cellular1"; 37f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o 38f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'ousing chromeos::NetworkState; 39f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'ousing chromeos::NetworkStateHandler; 40f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o 41e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallclass TestObserver : public chromeos::NetworkStateHandlerObserver { 42e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall public: 43e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall explicit TestObserver(NetworkStateHandler* handler) 44e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall : handler_(handler), 45e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall manager_changed_count_(0), 46e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_count_(0), 47e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall default_network_change_count_(0), 48e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall favorite_count_(0) { 49e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall } 50e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 51efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o virtual ~TestObserver() { 52a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 53a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 54a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual void NetworkManagerChanged() OVERRIDE { 55a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o ++manager_changed_count_; 56a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 57a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 58a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual void NetworkListChanged() OVERRIDE { 59a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o NetworkStateHandler::NetworkStateList networks; 60a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o handler_->GetNetworkList(&networks); 61a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_count_ = networks.size(); 62a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o if (network_count_ == 0) { 63a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o default_network_ = ""; 64a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o default_network_connection_state_ = ""; 65a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 66a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o NetworkStateHandler::FavoriteStateList favorites; 67a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o handler_->GetFavoriteList(&favorites); 68a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o favorite_count_ = favorites.size(); 69a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 70a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 71a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual void DefaultNetworkChanged(const NetworkState* network) OVERRIDE { 72a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o ++default_network_change_count_; 73a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o default_network_ = network ? network->path() : ""; 74a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o default_network_connection_state_ = 75a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network ? network->connection_state() : ""; 76efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o } 77a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 78a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual void NetworkConnectionStateChanged( 79a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o const NetworkState* network) OVERRIDE { 80a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_connection_state_[network->path()] = network->connection_state(); 81a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o connection_state_changes_[network->path()]++; 82a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 83a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 84a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual void NetworkPropertiesUpdated(const NetworkState* network) OVERRIDE { 85efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o DCHECK(network); 86a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o property_updates_[network->path()]++; 87a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 88a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 89a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o size_t manager_changed_count() { return manager_changed_count_; } 90a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o size_t network_count() { return network_count_; } 91a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o size_t default_network_change_count() { 92a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o return default_network_change_count_; 93a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 94a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::string default_network() { return default_network_; } 95a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::string default_network_connection_state() { 96a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o return default_network_connection_state_; 97a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 98a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o size_t favorite_count() { return favorite_count_; } 99a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 100a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o int PropertyUpdatesForService(const std::string& service_path) { 101a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o return property_updates_[service_path]; 102a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 103a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 104a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o int ConnectionStateChangesForService(const std::string& service_path) { 105a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o return connection_state_changes_[service_path]; 106a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 107a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 108a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::string NetworkConnectionStateForService( 109a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o const std::string& service_path) { 110a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o return network_connection_state_[service_path]; 111a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 112a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 113a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o private: 114a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o NetworkStateHandler* handler_; 115a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o size_t manager_changed_count_; 11651e64594919c986f87267b895504322a38ec4facTheodore Ts'o size_t network_count_; 11751e64594919c986f87267b895504322a38ec4facTheodore Ts'o size_t default_network_change_count_; 118a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::string default_network_; 119a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::string default_network_connection_state_; 120a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o size_t favorite_count_; 121a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::map<std::string, int> property_updates_; 122a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::map<std::string, int> connection_state_changes_; 123a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o std::map<std::string, std::string> network_connection_state_; 124a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 125a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o DISALLOW_COPY_AND_ASSIGN(TestObserver); 126a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o}; 127a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 128a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o} // namespace 129a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 130a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'onamespace chromeos { 131a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 132a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'oclass NetworkStateHandlerTest : public testing::Test { 133a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o public: 134a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o NetworkStateHandlerTest() {} 135a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual ~NetworkStateHandlerTest() {} 136a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 137a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual void SetUp() OVERRIDE { 138a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o // Initialize DBusThreadManager with a stub implementation. 139efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o DBusThreadManager::InitializeWithStub(); 140a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o SetupNetworkStateHandler(); 141a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o message_loop_.RunUntilIdle(); 142a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 143a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 144a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o virtual void TearDown() OVERRIDE { 145a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_state_handler_->RemoveObserver(test_observer_.get(), FROM_HERE); 146a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o test_observer_.reset(); 147efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o network_state_handler_.reset(); 148a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o DBusThreadManager::Shutdown(); 149a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 150a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 151a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o void SetupNetworkStateHandler() { 152a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o SetupDefaultShillState(); 153a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_state_handler_.reset(new NetworkStateHandler); 154a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o test_observer_.reset(new TestObserver(network_state_handler_.get())); 155a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_state_handler_->AddObserver(test_observer_.get(), FROM_HERE); 156a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_state_handler_->InitShillPropertyHandler(); 157a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o } 158a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 159a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o protected: 160a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o void SetupDefaultShillState() { 161a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o message_loop_.RunUntilIdle(); // Process any pending updates 162a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o ShillDeviceClient::TestInterface* device_test = 163a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o DBusThreadManager::Get()->GetShillDeviceClient()->GetTestInterface(); 164a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o device_test->ClearDevices(); 165a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o device_test->AddDevice("/device/stub_wifi_device1", 166a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o flimflam::kTypeWifi, "stub_wifi_device1"); 167a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o device_test->AddDevice("/device/stub_cellular_device1", 168a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o flimflam::kTypeCellular, "stub_cellular_device1"); 169a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 170b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o ShillServiceClient::TestInterface* service_test = 171b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); 172b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o service_test->ClearServices(); 173e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall const bool add_to_visible = true; 174e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall const bool add_to_watchlist = true; 175e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall service_test->AddService(kShillManagerClientStubDefaultService, 176e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall kShillManagerClientStubDefaultService, 177e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flimflam::kTypeEthernet, flimflam::kStateOnline, 178e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall add_to_visible, add_to_watchlist); 179e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall service_test->AddService(kShillManagerClientStubDefaultWireless, 180e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall kShillManagerClientStubDefaultWireless, 181e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flimflam::kTypeWifi, flimflam::kStateOnline, 182e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall add_to_visible, add_to_watchlist); 183e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall service_test->AddService(kShillManagerClientStubWireless2, 184e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall kShillManagerClientStubWireless2, 185b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o flimflam::kTypeWifi, flimflam::kStateIdle, 186b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o add_to_visible, add_to_watchlist); 187b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o service_test->AddService(kShillManagerClientStubCellular, 188b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o kShillManagerClientStubCellular, 189b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o flimflam::kTypeCellular, flimflam::kStateIdle, 190b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o add_to_visible, add_to_watchlist); 191b15beaaf386a13d9fbaf716aac2df44748261af1Theodore Ts'o } 1923034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o 1933034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o base::MessageLoopForUI message_loop_; 1943034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o scoped_ptr<NetworkStateHandler> network_state_handler_; 195e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall scoped_ptr<TestObserver> test_observer_; 196e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 197e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall private: 198e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall DISALLOW_COPY_AND_ASSIGN(NetworkStateHandlerTest); 199e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}; 200e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 201e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(NetworkStateHandlerTest, NetworkStateHandlerStub) { 202e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // Ensure that the network list is the expected size. 203e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall const size_t kNumShillManagerClientStubImplServices = 4; 204e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(kNumShillManagerClientStubImplServices, 205e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall test_observer_->network_count()); 206e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // Ensure that the first stub network is the default network. 2073034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o EXPECT_EQ(kShillManagerClientStubDefaultService, 2083034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o test_observer_->default_network()); 2093034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o EXPECT_EQ(kShillManagerClientStubDefaultService, 2103034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o network_state_handler_->ConnectedNetworkByType( 2113034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o NetworkStateHandler::kMatchTypeDefault)->path()); 2123034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o EXPECT_EQ(kShillManagerClientStubDefaultService, 2133034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o network_state_handler_->ConnectedNetworkByType( 2143034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o flimflam::kTypeEthernet)->path()); 2153034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o EXPECT_EQ(kShillManagerClientStubDefaultWireless, 2163034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o network_state_handler_->ConnectedNetworkByType( 217e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall NetworkStateHandler::kMatchTypeWireless)->path()); 218e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(flimflam::kStateOnline, 219e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall test_observer_->default_network_connection_state()); 220e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 221e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 222e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(NetworkStateHandlerTest, TechnologyChanged) { 223e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // There may be several manager changes during initialization. 224e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall size_t initial_changed_count = test_observer_->manager_changed_count(); 225e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // Enable a technology. 226e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_NE(NetworkStateHandler::TECHNOLOGY_ENABLED, 227e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 228e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_state_handler_->SetTechnologyEnabled( 2293034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o flimflam::kTypeWimax, true, network_handler::ErrorCallback()); 2303034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o // The technology state should immediately change to ENABLING and we should 2313034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o // receive a manager changed callback. 2323034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o EXPECT_EQ(initial_changed_count + 1, test_observer_->manager_changed_count()); 2333034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o EXPECT_EQ(NetworkStateHandler::TECHNOLOGY_ENABLING, 2343034f62a0f9c31e6dce8bd1237cffd3851847250Theodore Ts'o network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 2358df1827b55f11321bfe508c89b94591bdb97c3a6Theodore Ts'o message_loop_.RunUntilIdle(); 236271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o // Ensure we receive another manager changed callbacks when the technology 237271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o // becomes enabled. 238e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(initial_changed_count + 2, test_observer_->manager_changed_count()); 239e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(NetworkStateHandler::TECHNOLOGY_ENABLED, 240e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 241e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall} 242e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 243e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(NetworkStateHandlerTest, TechnologyState) { 244e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall ShillManagerClient::TestInterface* manager_test = 245e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface(); 246e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(NetworkStateHandler::TECHNOLOGY_UNAVAILABLE, 247e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 248e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 249e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall manager_test->AddTechnology(flimflam::kTypeWimax, false); 250271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o message_loop_.RunUntilIdle(); 251271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o EXPECT_EQ(NetworkStateHandler::TECHNOLOGY_AVAILABLE, 252271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 253271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o 254271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o manager_test->SetTechnologyInitializing(flimflam::kTypeWimax, true); 255e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall message_loop_.RunUntilIdle(); 256e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(NetworkStateHandler::TECHNOLOGY_UNINITIALIZED, 257e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 258e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 259e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall manager_test->SetTechnologyInitializing(flimflam::kTypeWimax, false); 260e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_state_handler_->SetTechnologyEnabled( 261e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flimflam::kTypeWimax, true, network_handler::ErrorCallback()); 262e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall message_loop_.RunUntilIdle(); 263e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(NetworkStateHandler::TECHNOLOGY_ENABLED, 264e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 265e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 266271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o manager_test->RemoveTechnology(flimflam::kTypeWimax); 267271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o message_loop_.RunUntilIdle(); 268271a375b596240866b4a2967e3b6f38ff7cecdf8Theodore Ts'o EXPECT_EQ(NetworkStateHandler::TECHNOLOGY_UNAVAILABLE, 269a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_state_handler_->GetTechnologyState(flimflam::kTypeWimax)); 270a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o} 271e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall 272e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP AbgrallTEST_F(NetworkStateHandlerTest, ServicePropertyChanged) { 273e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall // Set a service property. 274e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall const std::string eth1 = kShillManagerClientStubDefaultService; 275e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ("", network_state_handler_->GetNetworkState(eth1)->security()); 276e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall EXPECT_EQ(1, test_observer_->PropertyUpdatesForService(eth1)); 277e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall base::StringValue security_value("TestSecurity"); 278e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 279e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall dbus::ObjectPath(eth1), 280e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall flimflam::kSecurityProperty, security_value, 281a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 282e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall message_loop_.RunUntilIdle(); 283a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o EXPECT_EQ("TestSecurity", 284a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o network_state_handler_->GetNetworkState(eth1)->security()); 285a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o EXPECT_EQ(2, test_observer_->PropertyUpdatesForService(eth1)); 286a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 287a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o // Changing a service to the existing value should not trigger an update. 288a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 289a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o dbus::ObjectPath(eth1), 290a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o flimflam::kSecurityProperty, security_value, 291a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 292a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o message_loop_.RunUntilIdle(); 293efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o EXPECT_EQ(2, test_observer_->PropertyUpdatesForService(eth1)); 294a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o} 295a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o 296a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'oTEST_F(NetworkStateHandlerTest, FavoriteState) { 297a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o // Set the profile entry of a service 298a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o const std::string wifi1 = kShillManagerClientStubDefaultWireless; 299a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o ShillProfileClient::TestInterface* profile_test = 300a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o DBusThreadManager::Get()->GetShillProfileClient()->GetTestInterface(); 301a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o EXPECT_TRUE(profile_test->AddService("/profile/default", wifi1)); 30250448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o message_loop_.RunUntilIdle(); 30350448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o network_state_handler_->UpdateManagerProperties(); 30450448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o message_loop_.RunUntilIdle(); 30550448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(1u, test_observer_->favorite_count()); 30650448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o} 30750448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o 30850448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'oTEST_F(NetworkStateHandlerTest, NetworkConnectionStateChanged) { 30950448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // Change a network state. 31050448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o ShillServiceClient::TestInterface* service_test = 31150448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); 31250448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o const std::string eth1 = kShillManagerClientStubDefaultService; 31350448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o base::StringValue connection_state_idle_value(flimflam::kStateIdle); 31450448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o service_test->SetServiceProperty(eth1, flimflam::kStateProperty, 31550448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o connection_state_idle_value); 31650448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o message_loop_.RunUntilIdle(); 31750448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(flimflam::kStateIdle, 31850448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o test_observer_->NetworkConnectionStateForService(eth1)); 31950448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(2, test_observer_->ConnectionStateChangesForService(eth1)); 32050448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // Confirm that changing the connection state to the same value does *not* 32150448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // signal the observer. 32250448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o service_test->SetServiceProperty(eth1, flimflam::kStateProperty, 32350448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o connection_state_idle_value); 32450448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o message_loop_.RunUntilIdle(); 32550448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(2, test_observer_->ConnectionStateChangesForService(eth1)); 32650448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o} 32750448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o 328efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'oTEST_F(NetworkStateHandlerTest, DefaultServiceChanged) { 32950448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o ShillManagerClient::TestInterface* manager_test = 33050448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface(); 33150448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o ASSERT_TRUE(manager_test); 33250448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o ShillServiceClient::TestInterface* service_test = 33350448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); 33450448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o ASSERT_TRUE(service_test); 33550448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o 33650448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // Change the default network by moving wifi1 to the front of the list 33750448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // and changing the state of eth1 to Idle. 33850448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o const std::string wifi1 = kShillManagerClientStubDefaultWireless; 33950448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o manager_test->MoveServiceToIndex(wifi1, 0, true); 34050448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o const std::string eth1 = kShillManagerClientStubDefaultService; 34150448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o base::StringValue connection_state_idle_value(flimflam::kStateIdle); 34250448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o service_test->SetServiceProperty(eth1, flimflam::kStateProperty, 34350448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o connection_state_idle_value); 34450448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o message_loop_.RunUntilIdle(); 34550448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(wifi1, test_observer_->default_network()); 34650448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(flimflam::kStateOnline, 34750448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o test_observer_->default_network_connection_state()); 34850448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // We should have seen 2 default network updates - for the default 34950448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // service change, and for the state change. 350efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o EXPECT_EQ(2u, test_observer_->default_network_change_count()); 35150448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o 35250448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // Updating a property on the default network should trigger 35350448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // a default network change. 35450448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 35550448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o dbus::ObjectPath(wifi1), 35650448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o flimflam::kSecurityProperty, base::StringValue("TestSecurity"), 35750448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 35850448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o message_loop_.RunUntilIdle(); 35950448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(3u, test_observer_->default_network_change_count()); 36050448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o 36150448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o // No default network updates for signal strength changes. 36250448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o DBusThreadManager::Get()->GetShillServiceClient()->SetProperty( 36350448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o dbus::ObjectPath(wifi1), 36450448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o flimflam::kSignalStrengthProperty, base::FundamentalValue(32), 36550448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o base::Bind(&base::DoNothing), base::Bind(&ErrorCallbackFunction)); 36650448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o message_loop_.RunUntilIdle(); 36750448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o EXPECT_EQ(3u, test_observer_->default_network_change_count()); 36850448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o} 36950448d3dffc66f86592ee0d4b16e4bbe9d08449eTheodore Ts'o 370a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'oTEST_F(NetworkStateHandlerTest, RequestUpdate) { 371a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o // Request an update for kShillManagerClientStubDefaultWireless. 372a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o EXPECT_EQ(1, test_observer_->PropertyUpdatesForService( 373a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o kShillManagerClientStubDefaultWireless)); 374a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o EXPECT_TRUE(network_state_handler_->RequestUpdateForNetwork( 375efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o kShillManagerClientStubDefaultWireless)); 376efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o message_loop_.RunUntilIdle(); 377a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o EXPECT_EQ(2, test_observer_->PropertyUpdatesForService( 378a0553c9d6e8dd6f538f18ae447c45e52f3c40eb6Theodore Ts'o kShillManagerClientStubDefaultWireless)); 379f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o 380f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o // Request an update for all networks. 381f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o network_state_handler_->RequestUpdateForAllNetworks(); 382f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o message_loop_.RunUntilIdle(); 383f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o // kShillManagerClientStubDefaultWireless should now have 3 updates 384f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o EXPECT_EQ(3, test_observer_->PropertyUpdatesForService( 385f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o kShillManagerClientStubDefaultWireless)); 386f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o // Other networks should have 2 updates (inital + request). 387f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o EXPECT_EQ(2, test_observer_->PropertyUpdatesForService( 388f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o kShillManagerClientStubDefaultService)); 389f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o EXPECT_EQ(2, test_observer_->PropertyUpdatesForService( 390f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o kShillManagerClientStubWireless2)); 391f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o EXPECT_EQ(2, test_observer_->PropertyUpdatesForService( 392f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o kShillManagerClientStubCellular)); 393f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o} 394f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o 395f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o} // namespace chromeos 396f1f115a78f5ea599fc5f8815a741d43fedd5840dTheodore Ts'o