OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/shill_manager_client.h" | 5 #include "chromeos/dbus/shill_manager_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/chromeos/chromeos_version.h" | 8 #include "base/chromeos/chromeos_version.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
162 } | 162 } |
163 | 163 |
164 private: | 164 private: |
165 dbus::ObjectProxy* proxy_; | 165 dbus::ObjectProxy* proxy_; |
166 ShillClientHelper helper_; | 166 ShillClientHelper helper_; |
167 | 167 |
168 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientImpl); | 168 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientImpl); |
169 }; | 169 }; |
170 | 170 |
171 // A stub implementation of ShillManagerClient. | 171 // A stub implementation of ShillManagerClient. |
172 // Implemented: Stub cellular DeviceList entry for SMS testing. | 172 // Implemented: Stub devices and services for NetworkStateManager tests. |
| 173 // Implemented: Stub cellular device entry for SMS tests. |
173 class ShillManagerClientStubImpl : public ShillManagerClient { | 174 class ShillManagerClientStubImpl : public ShillManagerClient { |
174 public: | 175 public: |
175 ShillManagerClientStubImpl() : weak_ptr_factory_(this) { | 176 ShillManagerClientStubImpl() : weak_ptr_factory_(this) { |
| 177 // Stub Devices |
176 base::ListValue* device_list = new base::ListValue; | 178 base::ListValue* device_list = new base::ListValue; |
177 // Note: names match Device stub map. | 179 // Note: names match Device stub map. |
178 const char kStubCellular1[] = "stub_cellular1"; | 180 device_list->Append( |
179 const char kStubCellular2[] = "stub_cellular2"; | 181 base::Value::CreateStringValue("stub_wifi_device1")); |
180 device_list->Append(base::Value::CreateStringValue(kStubCellular1)); | 182 device_list->Append( |
181 device_list->Append(base::Value::CreateStringValue(kStubCellular2)); | 183 base::Value::CreateStringValue("stub_cellular_device1")); |
| 184 device_list->Append( |
| 185 base::Value::CreateStringValue("stub_cellular_device2")); |
182 stub_properties_.Set(flimflam::kDevicesProperty, device_list); | 186 stub_properties_.Set(flimflam::kDevicesProperty, device_list); |
| 187 |
| 188 // Stub Services |
| 189 base::ListValue* service_list = new base::ListValue; |
| 190 // Note: names match Service stub map. |
| 191 service_list->Append(base::Value::CreateStringValue("stub_ethernet")); |
| 192 service_list->Append(base::Value::CreateStringValue("stub_wifi1")); |
| 193 service_list->Append(base::Value::CreateStringValue("stub_wifi2")); |
| 194 service_list->Append(base::Value::CreateStringValue("stub_cellular1")); |
| 195 base::ListValue* watched_service_list = service_list->DeepCopy(); |
| 196 stub_properties_.Set(flimflam::kServicesProperty, service_list); |
| 197 stub_properties_.Set(flimflam::kServiceWatchListProperty, |
| 198 watched_service_list); |
| 199 |
| 200 // Stub Technologies |
| 201 base::ListValue* available_list = new base::ListValue; |
| 202 available_list->Append( |
| 203 base::Value::CreateStringValue(flimflam::kTypeEthernet)); |
| 204 available_list->Append( |
| 205 base::Value::CreateStringValue(flimflam::kTypeWifi)); |
| 206 available_list->Append( |
| 207 base::Value::CreateStringValue(flimflam::kTypeCellular)); |
| 208 stub_properties_.Set(flimflam::kAvailableTechnologiesProperty, |
| 209 available_list); |
| 210 |
| 211 base::ListValue* enabled_list = new base::ListValue; |
| 212 enabled_list->Append( |
| 213 base::Value::CreateStringValue(flimflam::kTypeEthernet)); |
| 214 enabled_list->Append( |
| 215 base::Value::CreateStringValue(flimflam::kTypeWifi)); |
| 216 enabled_list->Append( |
| 217 base::Value::CreateStringValue(flimflam::kTypeCellular)); |
| 218 stub_properties_.Set(flimflam::kEnabledTechnologiesProperty, enabled_list); |
183 } | 219 } |
184 | 220 |
185 virtual ~ShillManagerClientStubImpl() {} | 221 virtual ~ShillManagerClientStubImpl() {} |
186 | 222 |
187 ////////////////////////////////// | 223 ////////////////////////////////// |
188 // ShillManagerClient overrides. | 224 // ShillManagerClient overrides. |
189 virtual void AddPropertyChangedObserver( | 225 virtual void AddPropertyChangedObserver( |
190 ShillPropertyChangedObserver* observer) OVERRIDE {} | 226 ShillPropertyChangedObserver* observer) OVERRIDE { |
| 227 observer_list_.AddObserver(observer); |
| 228 } |
191 | 229 |
192 virtual void RemovePropertyChangedObserver( | 230 virtual void RemovePropertyChangedObserver( |
193 ShillPropertyChangedObserver* observer) OVERRIDE {} | 231 ShillPropertyChangedObserver* observer) OVERRIDE { |
| 232 observer_list_.RemoveObserver(observer); |
| 233 } |
194 | 234 |
195 // ShillManagerClient override. | 235 // ShillManagerClient override. |
196 virtual void GetProperties(const DictionaryValueCallback& callback) OVERRIDE { | 236 virtual void GetProperties(const DictionaryValueCallback& callback) OVERRIDE { |
197 MessageLoop::current()->PostTask( | 237 MessageLoop::current()->PostTask( |
198 FROM_HERE, base::Bind( | 238 FROM_HERE, base::Bind( |
199 &ShillManagerClientStubImpl::PassStubProperties, | 239 &ShillManagerClientStubImpl::PassStubProperties, |
200 weak_ptr_factory_.GetWeakPtr(), | 240 weak_ptr_factory_.GetWeakPtr(), |
201 callback)); | 241 callback)); |
202 } | 242 } |
203 | 243 |
204 // ShillManagerClient override. | 244 // ShillManagerClient override. |
205 virtual base::DictionaryValue* CallGetPropertiesAndBlock() OVERRIDE { | 245 virtual base::DictionaryValue* CallGetPropertiesAndBlock() OVERRIDE { |
206 return new base::DictionaryValue; | 246 return stub_properties_.DeepCopy(); |
207 } | 247 } |
208 | 248 |
209 // ShillManagerClient override. | 249 // ShillManagerClient override. |
210 virtual void SetProperty(const std::string& name, | 250 virtual void SetProperty(const std::string& name, |
211 const base::Value& value, | 251 const base::Value& value, |
212 const base::Closure& callback, | 252 const base::Closure& callback, |
213 const ErrorCallback& error_callback) OVERRIDE { | 253 const ErrorCallback& error_callback) OVERRIDE { |
214 stub_properties_.Set(name, value.DeepCopy()); | 254 stub_properties_.Set(name, value.DeepCopy()); |
215 MessageLoop::current()->PostTask(FROM_HERE, callback); | 255 MessageLoop::current()->PostTask(FROM_HERE, callback); |
216 } | 256 } |
217 | 257 |
218 // ShillManagerClient override. | 258 // ShillManagerClient override. |
219 virtual void RequestScan(const std::string& type, | 259 virtual void RequestScan(const std::string& type, |
220 const base::Closure& callback, | 260 const base::Closure& callback, |
221 const ErrorCallback& error_callback) OVERRIDE { | 261 const ErrorCallback& error_callback) OVERRIDE { |
222 MessageLoop::current()->PostTask(FROM_HERE, callback); | 262 MessageLoop::current()->PostTask(FROM_HERE, callback); |
| 263 const int kScanDelaySeconds = 3; |
| 264 MessageLoop::current()->PostDelayedTask( |
| 265 FROM_HERE, |
| 266 base::Bind(&ShillManagerClientStubImpl::NotifyObserversPropertyChanged, |
| 267 weak_ptr_factory_.GetWeakPtr(), |
| 268 flimflam::kServicesProperty), |
| 269 base::TimeDelta::FromSeconds(kScanDelaySeconds)); |
223 } | 270 } |
224 | 271 |
225 // ShillManagerClient override. | 272 // ShillManagerClient override. |
226 virtual void EnableTechnology( | 273 virtual void EnableTechnology( |
227 const std::string& type, | 274 const std::string& type, |
228 const base::Closure& callback, | 275 const base::Closure& callback, |
229 const ErrorCallback& error_callback) OVERRIDE { | 276 const ErrorCallback& error_callback) OVERRIDE { |
| 277 base::ListValue* enabled_list; |
| 278 if (!stub_properties_.GetListWithoutPathExpansion( |
| 279 flimflam::kEnabledTechnologiesProperty, &enabled_list)) { |
| 280 MessageLoop::current()->PostTask( |
| 281 FROM_HERE, |
| 282 base::Bind(error_callback, "StubError", "Property not found")); |
| 283 return; |
| 284 } |
230 MessageLoop::current()->PostTask(FROM_HERE, callback); | 285 MessageLoop::current()->PostTask(FROM_HERE, callback); |
| 286 enabled_list->AppendIfNotPresent(new base::StringValue(type)); |
| 287 MessageLoop::current()->PostTask( |
| 288 FROM_HERE, |
| 289 base::Bind(&ShillManagerClientStubImpl::NotifyObserversPropertyChanged, |
| 290 weak_ptr_factory_.GetWeakPtr(), |
| 291 flimflam::kEnabledTechnologiesProperty)); |
231 } | 292 } |
232 | 293 |
233 // ShillManagerClient override. | 294 // ShillManagerClient override. |
234 virtual void DisableTechnology( | 295 virtual void DisableTechnology( |
235 const std::string& type, | 296 const std::string& type, |
236 const base::Closure& callback, | 297 const base::Closure& callback, |
237 const ErrorCallback& error_callback) OVERRIDE { | 298 const ErrorCallback& error_callback) OVERRIDE { |
| 299 base::ListValue* enabled_list; |
| 300 if (!stub_properties_.GetListWithoutPathExpansion( |
| 301 flimflam::kEnabledTechnologiesProperty, &enabled_list)) { |
| 302 MessageLoop::current()->PostTask( |
| 303 FROM_HERE, |
| 304 base::Bind(error_callback, "StubError", "Property not found")); |
| 305 return; |
| 306 } |
238 MessageLoop::current()->PostTask(FROM_HERE, callback); | 307 MessageLoop::current()->PostTask(FROM_HERE, callback); |
| 308 enabled_list->Remove(base::StringValue(type), NULL); |
| 309 MessageLoop::current()->PostTask( |
| 310 FROM_HERE, |
| 311 base::Bind(&ShillManagerClientStubImpl::NotifyObserversPropertyChanged, |
| 312 weak_ptr_factory_.GetWeakPtr(), |
| 313 flimflam::kEnabledTechnologiesProperty)); |
239 } | 314 } |
240 | 315 |
241 // ShillManagerClient override. | 316 // ShillManagerClient override. |
242 virtual void ConfigureService( | 317 virtual void ConfigureService( |
243 const base::DictionaryValue& properties, | 318 const base::DictionaryValue& properties, |
244 const base::Closure& callback, | 319 const base::Closure& callback, |
245 const ErrorCallback& error_callback) OVERRIDE { | 320 const ErrorCallback& error_callback) OVERRIDE { |
246 MessageLoop::current()->PostTask(FROM_HERE, callback); | 321 MessageLoop::current()->PostTask(FROM_HERE, callback); |
247 } | 322 } |
248 | 323 |
249 // ShillManagerClient override. | 324 // ShillManagerClient override. |
250 virtual void GetService( | 325 virtual void GetService( |
251 const base::DictionaryValue& properties, | 326 const base::DictionaryValue& properties, |
252 const ObjectPathCallback& callback, | 327 const ObjectPathCallback& callback, |
253 const ErrorCallback& error_callback) OVERRIDE { | 328 const ErrorCallback& error_callback) OVERRIDE { |
254 MessageLoop::current()->PostTask(FROM_HERE, | 329 MessageLoop::current()->PostTask( |
255 base::Bind(callback, | 330 FROM_HERE, base::Bind(callback, dbus::ObjectPath())); |
256 dbus::ObjectPath())); | |
257 } | 331 } |
258 | 332 |
259 private: | 333 private: |
260 void PassStubProperties(const DictionaryValueCallback& callback) const { | 334 void PassStubProperties(const DictionaryValueCallback& callback) const { |
261 callback.Run(DBUS_METHOD_CALL_SUCCESS, stub_properties_); | 335 callback.Run(DBUS_METHOD_CALL_SUCCESS, stub_properties_); |
262 } | 336 } |
263 | 337 |
| 338 void NotifyObserversPropertyChanged(const std::string& property) { |
| 339 base::Value* value; |
| 340 if (!stub_properties_.GetWithoutPathExpansion(property, &value)) { |
| 341 LOG(ERROR) << "Notify for unknown property: " << property; |
| 342 return; |
| 343 } |
| 344 FOR_EACH_OBSERVER(ShillPropertyChangedObserver, |
| 345 observer_list_, |
| 346 OnPropertyChanged(property, *value)); |
| 347 } |
| 348 |
264 base::DictionaryValue stub_properties_; | 349 base::DictionaryValue stub_properties_; |
| 350 ObserverList<ShillPropertyChangedObserver> observer_list_; |
265 | 351 |
266 // Note: This should remain the last member so it'll be destroyed and | 352 // Note: This should remain the last member so it'll be destroyed and |
267 // invalidate its weak pointers before any other members are destroyed. | 353 // invalidate its weak pointers before any other members are destroyed. |
268 base::WeakPtrFactory<ShillManagerClientStubImpl> weak_ptr_factory_; | 354 base::WeakPtrFactory<ShillManagerClientStubImpl> weak_ptr_factory_; |
269 | 355 |
270 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientStubImpl); | 356 DISALLOW_COPY_AND_ASSIGN(ShillManagerClientStubImpl); |
271 }; | 357 }; |
272 | 358 |
273 } // namespace | 359 } // namespace |
274 | 360 |
275 ShillManagerClient::ShillManagerClient() {} | 361 ShillManagerClient::ShillManagerClient() {} |
276 | 362 |
277 ShillManagerClient::~ShillManagerClient() {} | 363 ShillManagerClient::~ShillManagerClient() {} |
278 | 364 |
279 // static | 365 // static |
280 ShillManagerClient* ShillManagerClient::Create( | 366 ShillManagerClient* ShillManagerClient::Create( |
281 DBusClientImplementationType type, | 367 DBusClientImplementationType type, |
282 dbus::Bus* bus) { | 368 dbus::Bus* bus) { |
283 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) | 369 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) |
284 return new ShillManagerClientImpl(bus); | 370 return new ShillManagerClientImpl(bus); |
285 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); | 371 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); |
286 return new ShillManagerClientStubImpl(); | 372 return new ShillManagerClientStubImpl(); |
287 } | 373 } |
288 | 374 |
289 } // namespace chromeos | 375 } // namespace chromeos |
OLD | NEW |