| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/wifi/fake_wifi_service.h" |
| |
| #include <memory> |
| #include <utility> |
| |
| #include "base/functional/bind.h" |
| #include "base/task/sequenced_task_runner.h" |
| #include "base/task/single_thread_task_runner.h" |
| #include "base/values.h" |
| #include "components/onc/onc_constants.h" |
| |
| namespace wifi { |
| |
| FakeWiFiService::FakeWiFiService() { |
| // Populate data expected by unit test. |
| { |
| NetworkProperties network_properties; |
| network_properties.connection_state = onc::connection_state::kConnected; |
| network_properties.guid = "stub_wifi1_guid"; |
| network_properties.name = "wifi1"; |
| network_properties.type = onc::network_type::kWiFi; |
| network_properties.frequency = 0; |
| network_properties.ssid = "wifi1"; |
| network_properties.security = onc::wifi::kWEP_PSK; |
| network_properties.signal_strength = 40; |
| networks_.push_back(network_properties); |
| } |
| { |
| NetworkProperties network_properties; |
| network_properties.connection_state = onc::connection_state::kNotConnected; |
| network_properties.guid = "stub_wifi2_guid"; |
| network_properties.name = "wifi2_PSK"; |
| network_properties.type = onc::network_type::kWiFi; |
| network_properties.frequency = 5000; |
| network_properties.frequency_set.insert(2400); |
| network_properties.frequency_set.insert(5000); |
| network_properties.ssid = "wifi2_PSK"; |
| network_properties.security = onc::wifi::kWPA_PSK; |
| network_properties.signal_strength = 80; |
| networks_.push_back(network_properties); |
| } |
| } |
| |
| FakeWiFiService::~FakeWiFiService() { |
| } |
| |
| void FakeWiFiService::Initialize( |
| scoped_refptr<base::SequencedTaskRunner> task_runner) { |
| } |
| |
| void FakeWiFiService::UnInitialize() { |
| } |
| |
| void FakeWiFiService::GetProperties(const std::string& network_guid, |
| base::Value::Dict* properties, |
| std::string* error) { |
| NetworkList::iterator network_properties = FindNetwork(network_guid); |
| if (network_properties == networks_.end()) { |
| *error = "Error.InvalidNetworkGuid"; |
| return; |
| } |
| *properties = network_properties->ToValue(/*network_list=*/false); |
| } |
| |
| void FakeWiFiService::GetManagedProperties( |
| const std::string& network_guid, |
| base::Value::Dict* managed_properties, |
| std::string* error) { |
| // Not implemented |
| *error = kErrorWiFiService; |
| } |
| |
| void FakeWiFiService::GetState(const std::string& network_guid, |
| base::Value::Dict* properties, |
| std::string* error) { |
| NetworkList::iterator network_properties = FindNetwork(network_guid); |
| if (network_properties == networks_.end()) { |
| *error = "Error.InvalidNetworkGuid"; |
| return; |
| } |
| *properties = network_properties->ToValue(/*network_list=*/true); |
| } |
| |
| void FakeWiFiService::SetProperties(const std::string& network_guid, |
| base::Value::Dict properties, |
| std::string* error) { |
| NetworkList::iterator network_properties = FindNetwork(network_guid); |
| if (network_properties == networks_.end() || |
| !network_properties->UpdateFromValue(properties)) { |
| *error = "Error.DBusFailed"; |
| } |
| } |
| |
| void FakeWiFiService::CreateNetwork(bool shared, |
| base::Value::Dict properties, |
| std::string* network_guid, |
| std::string* error) { |
| NetworkProperties network_properties; |
| if (network_properties.UpdateFromValue(properties)) { |
| network_properties.guid = network_properties.ssid; |
| networks_.push_back(network_properties); |
| *network_guid = network_properties.guid; |
| } else { |
| *error = "Error.DBusFailed"; |
| } |
| } |
| |
| void FakeWiFiService::GetVisibleNetworks(const std::string& network_type, |
| bool include_details, |
| base::Value::List* network_list) { |
| for (NetworkList::const_iterator it = networks_.begin(); |
| it != networks_.end(); |
| ++it) { |
| if (network_type.empty() || network_type == onc::network_type::kAllTypes || |
| it->type == network_type) { |
| network_list->Append(it->ToValue(/*network_list=*/!include_details)); |
| } |
| } |
| } |
| |
| void FakeWiFiService::RequestNetworkScan() { |
| NotifyNetworkListChanged(networks_); |
| } |
| |
| void FakeWiFiService::StartConnect(const std::string& network_guid, |
| std::string* error) { |
| NetworkList::iterator network_properties = FindNetwork(network_guid); |
| if (network_properties == networks_.end()) { |
| *error = "Error.InvalidNetworkGuid"; |
| return; |
| } |
| DisconnectAllNetworksOfType(network_properties->type); |
| network_properties->connection_state = onc::connection_state::kConnected; |
| SortNetworks(); |
| NotifyNetworkListChanged(networks_); |
| NotifyNetworkChanged(network_guid); |
| } |
| |
| void FakeWiFiService::StartDisconnect(const std::string& network_guid, |
| std::string* error) { |
| NetworkList::iterator network_properties = FindNetwork(network_guid); |
| if (network_properties == networks_.end()) { |
| *error = "Error.InvalidNetworkGuid"; |
| return; |
| } |
| network_properties->connection_state = onc::connection_state::kNotConnected; |
| SortNetworks(); |
| NotifyNetworkListChanged(networks_); |
| NotifyNetworkChanged(network_guid); |
| } |
| |
| void FakeWiFiService::GetKeyFromSystem(const std::string& network_guid, |
| std::string* key_data, |
| std::string* error) { |
| *error = "not-found"; |
| } |
| |
| void FakeWiFiService::SetEventObservers( |
| scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| NetworkGuidListCallback networks_changed_observer, |
| NetworkGuidListCallback network_list_changed_observer) { |
| task_runner_.swap(task_runner); |
| networks_changed_observer_ = std::move(networks_changed_observer); |
| network_list_changed_observer_ = std::move(network_list_changed_observer); |
| } |
| |
| void FakeWiFiService::RequestConnectedNetworkUpdate() { |
| } |
| |
| void FakeWiFiService::GetConnectedNetworkSSID(std::string* ssid, |
| std::string* error) { |
| *ssid = ""; |
| *error = ""; |
| } |
| |
| NetworkList::iterator FakeWiFiService::FindNetwork( |
| const std::string& network_guid) { |
| for (NetworkList::iterator it = networks_.begin(); it != networks_.end(); |
| ++it) { |
| if (it->guid == network_guid) |
| return it; |
| } |
| return networks_.end(); |
| } |
| |
| void FakeWiFiService::DisconnectAllNetworksOfType(const std::string& type) { |
| for (NetworkList::iterator it = networks_.begin(); it != networks_.end(); |
| ++it) { |
| if (it->type == type) |
| it->connection_state = onc::connection_state::kNotConnected; |
| } |
| } |
| |
| void FakeWiFiService::SortNetworks() { |
| // Sort networks, so connected/connecting is up front, then by type: |
| // Ethernet, WiFi, Cellular, VPN |
| networks_.sort(NetworkProperties::OrderByType); |
| } |
| |
| void FakeWiFiService::NotifyNetworkListChanged(const NetworkList& networks) { |
| WiFiService::NetworkGuidList current_networks; |
| for (NetworkList::const_iterator it = networks.begin(); it != networks.end(); |
| ++it) { |
| current_networks.push_back(it->guid); |
| } |
| |
| task_runner_->PostTask( |
| FROM_HERE, |
| base::BindOnce(network_list_changed_observer_, current_networks)); |
| } |
| |
| void FakeWiFiService::NotifyNetworkChanged(const std::string& network_guid) { |
| WiFiService::NetworkGuidList changed_networks(1, network_guid); |
| task_runner_->PostTask( |
| FROM_HERE, base::BindOnce(networks_changed_observer_, changed_networks)); |
| } |
| |
| } // namespace wifi |