1 // Copyright 2013 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.
5 #include "components/wifi/fake_wifi_service.h"
8 #include "base/json/json_reader.h"
9 #include "base/message_loop/message_loop.h"
10 #include "components/onc/onc_constants.h"
14 FakeWiFiService::FakeWiFiService() {
15 // Populate data expected by unit test.
17 WiFiService::NetworkProperties network_properties;
18 network_properties.connection_state = onc::connection_state::kConnected;
19 network_properties.guid = "stub_wifi1";
20 network_properties.name = "wifi1";
21 network_properties.type = onc::network_type::kWiFi;
22 network_properties.frequency = 0;
23 network_properties.ssid = "wifi1";
24 network_properties.security = onc::wifi::kWEP_PSK;
25 network_properties.signal_strength = 40;
26 network_properties.json_extra =
29 " \"Gateway\": \"0.0.0.1\","
30 " \"IPAddress\": \"0.0.0.0\","
31 " \"RoutingPrefix\": 0,"
35 " \"Frequency\": 2400,"
36 " \"FrequencyList\": [2400]"
39 networks_.push_back(network_properties);
42 WiFiService::NetworkProperties network_properties;
43 network_properties.connection_state = onc::connection_state::kNotConnected;
44 network_properties.guid = "stub_wifi2";
45 network_properties.name = "wifi2_PSK";
46 network_properties.type = onc::network_type::kWiFi;
47 network_properties.frequency = 5000;
48 network_properties.frequency_set.insert(2400);
49 network_properties.frequency_set.insert(5000);
50 network_properties.ssid = "wifi2_PSK";
51 network_properties.security = onc::wifi::kWPA_PSK;
52 network_properties.signal_strength = 80;
53 networks_.push_back(network_properties);
57 FakeWiFiService::~FakeWiFiService() {
60 void FakeWiFiService::Initialize(
61 scoped_refptr<base::SequencedTaskRunner> task_runner) {
64 void FakeWiFiService::UnInitialize() {
67 void FakeWiFiService::GetProperties(const std::string& network_guid,
68 base::DictionaryValue* properties,
70 WiFiService::NetworkList::iterator network_properties =
71 FindNetwork(network_guid);
72 if (network_properties != networks_.end()) {
73 properties->Swap(network_properties->ToValue(false).get());
75 *error = "Error.DBusFailed";
79 void FakeWiFiService::GetManagedProperties(
80 const std::string& network_guid,
81 base::DictionaryValue* managed_properties,
84 *error = kErrorWiFiService;
87 void FakeWiFiService::GetState(const std::string& network_guid,
88 base::DictionaryValue* properties,
90 WiFiService::NetworkList::iterator network_properties =
91 FindNetwork(network_guid);
92 if (network_properties == networks_.end()) {
93 *error = "Error.InvalidParameter";
96 properties->Swap(network_properties->ToValue(true).get());
99 void FakeWiFiService::SetProperties(
100 const std::string& network_guid,
101 scoped_ptr<base::DictionaryValue> properties,
102 std::string* error) {
103 WiFiService::NetworkList::iterator network_properties =
104 FindNetwork(network_guid);
105 if (network_properties == networks_.end() ||
106 !network_properties->UpdateFromValue(*properties)) {
107 *error = "Error.DBusFailed";
111 void FakeWiFiService::CreateNetwork(
113 scoped_ptr<base::DictionaryValue> properties,
114 std::string* network_guid,
115 std::string* error) {
116 WiFiService::NetworkProperties network_properties;
117 if (network_properties.UpdateFromValue(*properties)) {
118 network_properties.guid = network_properties.ssid;
119 networks_.push_back(network_properties);
120 *network_guid = network_properties.guid;
122 *error = "Error.DBusFailed";
126 void FakeWiFiService::GetVisibleNetworks(const std::string& network_type,
127 base::ListValue* network_list) {
128 for (WiFiService::NetworkList::const_iterator it = networks_.begin();
129 it != networks_.end();
131 if (network_type.empty() || network_type == onc::network_type::kAllTypes ||
132 it->type == network_type) {
133 scoped_ptr<base::DictionaryValue> network(it->ToValue(true));
134 network_list->Append(network.release());
139 void FakeWiFiService::RequestNetworkScan() {
140 NotifyNetworkListChanged(networks_);
143 void FakeWiFiService::StartConnect(const std::string& network_guid,
144 std::string* error) {
145 NetworkList::iterator network_properties = FindNetwork(network_guid);
146 if (network_properties != networks_.end()) {
147 DisconnectAllNetworksOfType(network_properties->type);
148 network_properties->connection_state = onc::connection_state::kConnected;
150 NotifyNetworkListChanged(networks_);
151 NotifyNetworkChanged(network_guid);
153 *error = "configure-failed";
157 void FakeWiFiService::StartDisconnect(const std::string& network_guid,
158 std::string* error) {
159 WiFiService::NetworkList::iterator network_properties =
160 FindNetwork(network_guid);
161 if (network_properties != networks_.end()) {
162 network_properties->connection_state = onc::connection_state::kNotConnected;
164 NotifyNetworkListChanged(networks_);
165 NotifyNetworkChanged(network_guid);
167 *error = "not-found";
171 void FakeWiFiService::GetKeyFromSystem(const std::string& network_guid,
172 std::string* key_data,
173 std::string* error) {
174 *error = "not-found";
177 void FakeWiFiService::SetEventObservers(
178 scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
179 const NetworkGuidListCallback& networks_changed_observer,
180 const NetworkGuidListCallback& network_list_changed_observer) {
181 message_loop_proxy_.swap(message_loop_proxy);
182 networks_changed_observer_ = networks_changed_observer;
183 network_list_changed_observer_ = network_list_changed_observer;
186 void FakeWiFiService::RequestConnectedNetworkUpdate() {
189 WiFiService::NetworkList::iterator FakeWiFiService::FindNetwork(
190 const std::string& network_guid) {
191 for (WiFiService::NetworkList::iterator it = networks_.begin();
192 it != networks_.end();
194 if (it->guid == network_guid)
197 return networks_.end();
200 void FakeWiFiService::DisconnectAllNetworksOfType(const std::string& type) {
201 for (WiFiService::NetworkList::iterator it = networks_.begin();
202 it != networks_.end();
204 if (it->type == type)
205 it->connection_state = onc::connection_state::kNotConnected;
209 void FakeWiFiService::SortNetworks() {
210 // Sort networks, so connected/connecting is up front, then by type:
211 // Ethernet, WiFi, Cellular, VPN
212 networks_.sort(WiFiService::NetworkProperties::OrderByType);
215 void FakeWiFiService::NotifyNetworkListChanged(
216 const WiFiService::NetworkList& networks) {
217 WiFiService::NetworkGuidList current_networks;
218 for (WiFiService::NetworkList::const_iterator it = networks.begin();
219 it != networks.end();
221 current_networks.push_back(it->guid);
224 message_loop_proxy_->PostTask(
225 FROM_HERE, base::Bind(network_list_changed_observer_, current_networks));
228 void FakeWiFiService::NotifyNetworkChanged(const std::string& network_guid) {
229 WiFiService::NetworkGuidList changed_networks(1, network_guid);
230 message_loop_proxy_->PostTask(
231 FROM_HERE, base::Bind(networks_changed_observer_, changed_networks));