OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chromeos/dbus/fake_shill_profile_client.h" | 5 #include "chromeos/dbus/fake_shill_profile_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
11 #include "base/values.h" | 11 #include "base/values.h" |
12 #include "chromeos/dbus/dbus_thread_manager.h" | 12 #include "chromeos/dbus/dbus_thread_manager.h" |
13 #include "chromeos/dbus/shill_manager_client.h" | 13 #include "chromeos/dbus/shill_manager_client.h" |
14 #include "chromeos/dbus/shill_property_changed_observer.h" | 14 #include "chromeos/dbus/shill_property_changed_observer.h" |
15 #include "chromeos/dbus/shill_service_client.h" | 15 #include "chromeos/dbus/shill_service_client.h" |
16 #include "dbus/bus.h" | 16 #include "dbus/bus.h" |
17 #include "dbus/message.h" | 17 #include "dbus/message.h" |
18 #include "dbus/object_path.h" | 18 #include "dbus/object_path.h" |
19 #include "dbus/values_util.h" | 19 #include "dbus/values_util.h" |
20 #include "third_party/cros_system_api/dbus/service_constants.h" | 20 #include "third_party/cros_system_api/dbus/service_constants.h" |
21 | 21 |
22 namespace chromeos { | 22 namespace chromeos { |
23 | 23 |
24 struct FakeShillProfileClient::ProfileProperties { | 24 struct FakeShillProfileClient::ProfileProperties { |
25 base::DictionaryValue entries; | 25 base::DictionaryValue entries; // Dictionary of Service Dictionaries |
26 base::DictionaryValue properties; | 26 base::DictionaryValue properties; // Dictionary of Profile properties |
27 }; | 27 }; |
28 | 28 |
29 namespace { | 29 namespace { |
30 | 30 |
31 void PassDictionary( | 31 void PassDictionary( |
32 const ShillProfileClient::DictionaryValueCallbackWithoutStatus& callback, | 32 const ShillProfileClient::DictionaryValueCallbackWithoutStatus& callback, |
33 const base::DictionaryValue* dictionary) { | 33 const base::DictionaryValue* dictionary) { |
34 callback.Run(*dictionary); | 34 callback.Run(*dictionary); |
35 } | 35 } |
36 | 36 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> | 136 DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> |
137 AddProfile(profile_path); | 137 AddProfile(profile_path); |
138 } | 138 } |
139 | 139 |
140 void FakeShillProfileClient::AddEntry(const std::string& profile_path, | 140 void FakeShillProfileClient::AddEntry(const std::string& profile_path, |
141 const std::string& entry_path, | 141 const std::string& entry_path, |
142 const base::DictionaryValue& properties) { | 142 const base::DictionaryValue& properties) { |
143 ProfileProperties* profile = GetProfile(dbus::ObjectPath(profile_path), | 143 ProfileProperties* profile = GetProfile(dbus::ObjectPath(profile_path), |
144 ErrorCallback()); | 144 ErrorCallback()); |
145 DCHECK(profile); | 145 DCHECK(profile); |
146 profile->entries.SetWithoutPathExpansion(entry_path, | 146 profile->entries.SetWithoutPathExpansion(entry_path, properties.DeepCopy()); |
147 properties.DeepCopy()); | |
148 DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> | 147 DBusThreadManager::Get()->GetShillManagerClient()->GetTestInterface()-> |
149 AddManagerService(entry_path, false /* visible */, false /* watch */); | 148 AddManagerService(entry_path, false /* visible */, false /* watch */); |
150 } | 149 } |
151 | 150 |
152 bool FakeShillProfileClient::AddService(const std::string& profile_path, | 151 bool FakeShillProfileClient::AddService(const std::string& profile_path, |
153 const std::string& service_path) { | 152 const std::string& service_path) { |
154 ProfileProperties* profile = GetProfile(dbus::ObjectPath(profile_path), | 153 ProfileProperties* profile = GetProfile(dbus::ObjectPath(profile_path), |
155 ErrorCallback()); | 154 ErrorCallback()); |
156 if (!profile) { | 155 if (!profile) { |
157 LOG(ERROR) << "No matching profile: " << profile_path; | 156 LOG(ERROR) << "AddService: No matching profile: " << profile_path; |
158 return false; | 157 return false; |
159 } | 158 } |
| 159 if (profile->entries.HasKey(service_path)) { |
| 160 LOG(ERROR) << "AddService: Profile: " << profile_path |
| 161 << " already contains Service: " << service_path; |
| 162 return false; |
| 163 } |
| 164 return AddOrUpdateServiceImpl(profile_path, service_path, profile); |
| 165 } |
160 | 166 |
| 167 bool FakeShillProfileClient::UpdateService(const std::string& profile_path, |
| 168 const std::string& service_path) { |
| 169 ProfileProperties* profile = GetProfile(dbus::ObjectPath(profile_path), |
| 170 ErrorCallback()); |
| 171 if (!profile) { |
| 172 LOG(ERROR) << "UpdateService: No matching profile: " << profile_path; |
| 173 return false; |
| 174 } |
| 175 if (!profile->entries.HasKey(service_path)) { |
| 176 LOG(ERROR) << "UpdateService: Profile: " << profile_path |
| 177 << " does not contain Service: " << service_path; |
| 178 return false; |
| 179 } |
| 180 return AddOrUpdateServiceImpl(profile_path, service_path, profile); |
| 181 } |
| 182 |
| 183 bool FakeShillProfileClient::AddOrUpdateServiceImpl( |
| 184 const std::string& profile_path, |
| 185 const std::string& service_path, |
| 186 ProfileProperties* profile) { |
161 ShillServiceClient::TestInterface* service_test = | 187 ShillServiceClient::TestInterface* service_test = |
162 DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); | 188 DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface(); |
163 const base::DictionaryValue* service_properties = | 189 const base::DictionaryValue* service_properties = |
164 service_test->GetServiceProperties(service_path); | 190 service_test->GetServiceProperties(service_path); |
165 if (!service_properties) { | 191 if (!service_properties) { |
166 LOG(ERROR) << "No matching service: " << service_path; | 192 LOG(ERROR) << "No matching service: " << service_path; |
167 return false; | 193 return false; |
168 } | 194 } |
169 std::string service_profile_path; | 195 std::string service_profile_path; |
170 service_properties->GetStringWithoutPathExpansion(shill::kProfileProperty, | 196 service_properties->GetStringWithoutPathExpansion(shill::kProfileProperty, |
171 &service_profile_path); | 197 &service_profile_path); |
172 if (!service_profile_path.empty() && service_profile_path != profile_path) { | 198 if (service_profile_path.empty()) { |
| 199 base::StringValue profile_path_value(profile_path); |
| 200 service_test->SetServiceProperty(service_path, |
| 201 shill::kProfileProperty, |
| 202 profile_path_value); |
| 203 } else if (service_profile_path != profile_path) { |
173 LOG(ERROR) << "Service has non matching profile path: " | 204 LOG(ERROR) << "Service has non matching profile path: " |
174 << service_profile_path; | 205 << service_profile_path; |
175 return false; | 206 return false; |
176 } | 207 } |
177 | 208 |
178 base::StringValue profile_path_value(profile_path); | |
179 service_test->SetServiceProperty(service_path, | |
180 shill::kProfileProperty, | |
181 profile_path_value); | |
182 profile->entries.SetWithoutPathExpansion(service_path, | 209 profile->entries.SetWithoutPathExpansion(service_path, |
183 service_properties->DeepCopy()); | 210 service_properties->DeepCopy()); |
184 return true; | 211 return true; |
185 } | 212 } |
186 | 213 |
187 void FakeShillProfileClient::GetProfilePaths( | 214 void FakeShillProfileClient::GetProfilePaths( |
188 std::vector<std::string>* profiles) { | 215 std::vector<std::string>* profiles) { |
189 for (ProfileMap::iterator iter = profiles_.begin(); | 216 for (ProfileMap::iterator iter = profiles_.begin(); |
190 iter != profiles_.end(); ++iter) { | 217 iter != profiles_.end(); ++iter) { |
191 profiles->push_back(iter->first); | 218 profiles->push_back(iter->first); |
192 } | 219 } |
193 } | 220 } |
194 | 221 |
| 222 bool FakeShillProfileClient::GetService(const std::string& service_path, |
| 223 std::string* profile_path, |
| 224 base::DictionaryValue* properties) { |
| 225 properties->Clear(); |
| 226 for (ProfileMap::const_iterator iter = profiles_.begin(); |
| 227 iter != profiles_.end(); ++iter) { |
| 228 const ProfileProperties* profile = iter->second; |
| 229 const base::DictionaryValue* entry; |
| 230 if (!profile->entries.GetDictionaryWithoutPathExpansion( |
| 231 service_path, &entry)) { |
| 232 continue; |
| 233 } |
| 234 *profile_path = iter->first; |
| 235 properties->MergeDictionary(entry); |
| 236 return true; |
| 237 } |
| 238 return false; |
| 239 } |
| 240 |
| 241 void FakeShillProfileClient::ClearProfiles() { |
| 242 STLDeleteValues(&profiles_); |
| 243 } |
| 244 |
195 FakeShillProfileClient::ProfileProperties* FakeShillProfileClient::GetProfile( | 245 FakeShillProfileClient::ProfileProperties* FakeShillProfileClient::GetProfile( |
196 const dbus::ObjectPath& profile_path, | 246 const dbus::ObjectPath& profile_path, |
197 const ErrorCallback& error_callback) { | 247 const ErrorCallback& error_callback) { |
198 ProfileMap::const_iterator found = profiles_.find(profile_path.value()); | 248 ProfileMap::const_iterator found = profiles_.find(profile_path.value()); |
199 if (found == profiles_.end()) { | 249 if (found == profiles_.end()) { |
200 if (!error_callback.is_null()) | 250 if (!error_callback.is_null()) |
201 error_callback.Run("Error.InvalidProfile", "Invalid profile"); | 251 error_callback.Run("Error.InvalidProfile", "Invalid profile"); |
202 return NULL; | 252 return NULL; |
203 } | 253 } |
204 | 254 |
205 return found->second; | 255 return found->second; |
206 } | 256 } |
207 | 257 |
208 } // namespace chromeos | 258 } // namespace chromeos |
OLD | NEW |