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