OLD | NEW |
| (Empty) |
1 // Copyright 2014 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. | |
4 | |
5 #include "device/battery/battery_status_manager_linux.h" | |
6 | |
7 #include <limits> | |
8 #include <list> | |
9 #include <string> | |
10 | |
11 #include "base/bind.h" | |
12 #include "base/single_thread_task_runner.h" | |
13 #include "base/synchronization/waitable_event.h" | |
14 #include "base/threading/thread.h" | |
15 #include "dbus/mock_bus.h" | |
16 #include "dbus/mock_object_proxy.h" | |
17 #include "dbus/object_path.h" | |
18 #include "dbus/property.h" | |
19 #include "device/battery/battery_status_manager_linux-inl.h" | |
20 #include "testing/gmock/include/gmock/gmock.h" | |
21 #include "testing/gtest/include/gtest/gtest.h" | |
22 | |
23 using testing::_; | |
24 using testing::Invoke; | |
25 using testing::NiceMock; | |
26 using testing::Return; | |
27 using testing::Unused; | |
28 | |
29 namespace device { | |
30 | |
31 namespace { | |
32 const char kUPowerDeviceACLinePath[] = | |
33 "/org/freedesktop/UPower/devices/line_power_AC"; | |
34 const char kUPowerDeviceBattery0Path[] = | |
35 "/org/freedesktop/UPower/devices/battery_BAT0"; | |
36 const char kUPowerDeviceBattery1Path[] = | |
37 "/org/freedesktop/UPower/devices/battery_BAT1"; | |
38 const char kUPowerDisplayDevicePath[] = | |
39 "/org/freedesktop/UPower/devices/DisplayDevice"; | |
40 | |
41 class MockUPowerObject { | |
42 public: | |
43 MockUPowerObject() {} | |
44 void ConnectToSignal( | |
45 const std::string& interface_name, | |
46 const std::string& signal_name, | |
47 dbus::ObjectProxy::SignalCallback signal_callback, | |
48 dbus::ObjectProxy::OnConnectedCallback on_connected_callback); | |
49 dbus::Response* CreateCallMethodResponse(dbus::MethodCall* method_call, | |
50 Unused); | |
51 void SignalDeviceAdded(const std::string& added_device_path); | |
52 void SignalDeviceRemoved(const std::string& removed_device_path); | |
53 | |
54 scoped_refptr<dbus::MockObjectProxy> proxy; | |
55 dbus::ObjectProxy::SignalCallback signal_callback_device_added; | |
56 dbus::ObjectProxy::SignalCallback signal_callback_device_changed; | |
57 dbus::ObjectProxy::SignalCallback signal_callback_device_removed; | |
58 std::string daemon_version; | |
59 std::list<std::string> devices; | |
60 std::string display_device; | |
61 | |
62 private: | |
63 DISALLOW_COPY_AND_ASSIGN(MockUPowerObject); | |
64 }; | |
65 | |
66 void MockUPowerObject::ConnectToSignal( | |
67 const std::string& interface_name, | |
68 const std::string& signal_name, | |
69 dbus::ObjectProxy::SignalCallback signal_callback, | |
70 dbus::ObjectProxy::OnConnectedCallback on_connected_callback) { | |
71 bool on_connected_success = true; | |
72 if (interface_name == kUPowerInterfaceName) { | |
73 if (signal_name == kUPowerSignalDeviceAdded) | |
74 signal_callback_device_added = signal_callback; | |
75 else if (signal_name == kUPowerSignalDeviceRemoved) | |
76 signal_callback_device_removed = signal_callback; | |
77 else | |
78 on_connected_success = false; | |
79 } else { | |
80 on_connected_success = false; | |
81 } | |
82 | |
83 if (!on_connected_success) { | |
84 LOG(WARNING) << "MockUPowerObject::" << __FUNCTION__ | |
85 << " Unexpected interface=" << interface_name | |
86 << ", signal=" << signal_name; | |
87 } | |
88 on_connected_callback.Run(interface_name, signal_name, on_connected_success); | |
89 } | |
90 | |
91 dbus::Response* MockUPowerObject::CreateCallMethodResponse( | |
92 dbus::MethodCall* method_call, | |
93 Unused) { | |
94 if (method_call->GetInterface() == kUPowerInterfaceName) { | |
95 if (method_call->GetMember() == kUPowerMethodEnumerateDevices) { | |
96 std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty(); | |
97 dbus::MessageWriter writer(response.get()); | |
98 dbus::MessageWriter array_writer(nullptr); | |
99 writer.OpenArray("o", &array_writer); | |
100 for (const auto& device : devices) | |
101 array_writer.AppendObjectPath(dbus::ObjectPath(device)); | |
102 writer.CloseContainer(&array_writer); | |
103 return response.release(); | |
104 } else if (method_call->GetMember() == kUPowerMethodGetDisplayDevice) { | |
105 std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty(); | |
106 if (!display_device.empty()) { | |
107 dbus::MessageWriter writer(response.get()); | |
108 writer.AppendObjectPath(dbus::ObjectPath(display_device)); | |
109 } | |
110 return response.release(); | |
111 } | |
112 } else if (method_call->GetInterface() == dbus::kPropertiesInterface) { | |
113 std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty(); | |
114 dbus::MessageWriter writer(response.get()); | |
115 if (method_call->GetMember() == dbus::kPropertiesGet) { | |
116 dbus::MessageReader reader(method_call); | |
117 std::string interface_name; | |
118 std::string property_name; | |
119 if (reader.PopString(&interface_name) && | |
120 reader.PopString(&property_name) && | |
121 property_name == kUPowerPropertyDaemonVersion) { | |
122 writer.AppendVariantOfString(daemon_version); | |
123 return response.release(); | |
124 } | |
125 } else if (method_call->GetMember() == dbus::kPropertiesGetAll) { | |
126 dbus::MessageWriter array_writer(nullptr); | |
127 dbus::MessageWriter dict_entry_writer(nullptr); | |
128 writer.OpenArray("{sv}", &array_writer); | |
129 array_writer.OpenDictEntry(&dict_entry_writer); | |
130 dict_entry_writer.AppendString(kUPowerPropertyDaemonVersion); | |
131 dict_entry_writer.AppendVariantOfString(daemon_version); | |
132 array_writer.CloseContainer(&dict_entry_writer); | |
133 writer.CloseContainer(&array_writer); | |
134 return response.release(); | |
135 } | |
136 } | |
137 | |
138 LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); | |
139 return nullptr; | |
140 } | |
141 | |
142 void MockUPowerObject::SignalDeviceAdded(const std::string& added_device_path) { | |
143 dbus::Signal signal(kUPowerInterfaceName, kUPowerSignalDeviceAdded); | |
144 signal.SetPath(proxy->object_path()); | |
145 dbus::MessageWriter writer(&signal); | |
146 writer.AppendObjectPath(dbus::ObjectPath(added_device_path)); | |
147 signal_callback_device_added.Run(&signal); | |
148 } | |
149 | |
150 void MockUPowerObject::SignalDeviceRemoved( | |
151 const std::string& removed_device_path) { | |
152 dbus::Signal signal(kUPowerInterfaceName, kUPowerSignalDeviceRemoved); | |
153 signal.SetPath(proxy->object_path()); | |
154 dbus::MessageWriter writer(&signal); | |
155 writer.AppendObjectPath(dbus::ObjectPath(removed_device_path)); | |
156 signal_callback_device_removed.Run(&signal); | |
157 } | |
158 | |
159 struct MockBatteryProperties { | |
160 bool is_present = true; | |
161 double percentage = 100; | |
162 uint32_t state = UPowerDeviceState::UPOWER_DEVICE_STATE_UNKNOWN; | |
163 int64_t time_to_empty = 0; | |
164 int64_t time_to_full = 0; | |
165 uint32_t type = UPowerDeviceType::UPOWER_DEVICE_TYPE_BATTERY; | |
166 }; | |
167 | |
168 class MockBatteryObject { | |
169 public: | |
170 MockBatteryObject(dbus::Bus* bus, | |
171 const std::string& object_path, | |
172 MockBatteryProperties* properties); | |
173 void ConnectToSignal( | |
174 const std::string& interface_name, | |
175 const std::string& signal_name, | |
176 dbus::ObjectProxy::SignalCallback signal_callback, | |
177 dbus::ObjectProxy::OnConnectedCallback on_connected_callback); | |
178 dbus::Response* CreateCallMethodResponse(dbus::MethodCall* method_call, | |
179 Unused); | |
180 MockBatteryObject& ExpectConnectToSignalChanged(); | |
181 MockBatteryObject& ExpectConnectToSignalPropertyChanged(); | |
182 void SignalChanged(); | |
183 void SignalPropertyChanged(const std::string& property_name); | |
184 | |
185 scoped_refptr<dbus::MockObjectProxy> proxy; | |
186 MockBatteryProperties* properties; | |
187 dbus::ObjectProxy::SignalCallback signal_callback_changed; | |
188 dbus::ObjectProxy::SignalCallback signal_callback_properties_changed; | |
189 | |
190 private: | |
191 void AppendPropertyToWriter(dbus::MessageWriter* writer, | |
192 const std::string& property_name); | |
193 void AppendAllPropertiesToWriter(dbus::MessageWriter* writer); | |
194 | |
195 DISALLOW_COPY_AND_ASSIGN(MockBatteryObject); | |
196 }; | |
197 | |
198 MockBatteryObject::MockBatteryObject(dbus::Bus* bus, | |
199 const std::string& object_path, | |
200 MockBatteryProperties* properties) | |
201 : proxy(new NiceMock<dbus::MockObjectProxy>(bus, | |
202 kUPowerServiceName, | |
203 dbus::ObjectPath(object_path))), | |
204 properties(properties) {} | |
205 | |
206 void MockBatteryObject::ConnectToSignal( | |
207 const std::string& interface_name, | |
208 const std::string& signal_name, | |
209 dbus::ObjectProxy::SignalCallback signal_callback, | |
210 dbus::ObjectProxy::OnConnectedCallback on_connected_callback) { | |
211 bool on_connected_success = true; | |
212 if (interface_name == kUPowerDeviceInterfaceName && | |
213 signal_name == kUPowerDeviceSignalChanged) | |
214 signal_callback_changed = signal_callback; | |
215 else if (interface_name == dbus::kPropertiesInterface && | |
216 signal_name == dbus::kPropertiesChanged) | |
217 signal_callback_properties_changed = signal_callback; | |
218 else | |
219 on_connected_success = false; | |
220 | |
221 if (!on_connected_success) { | |
222 LOG(WARNING) << "MockBatteryObject::" << __FUNCTION__ | |
223 << " Unexpected interface=" << interface_name | |
224 << ", signal=" << signal_name; | |
225 } | |
226 on_connected_callback.Run(interface_name, signal_name, on_connected_success); | |
227 } | |
228 | |
229 dbus::Response* MockBatteryObject::CreateCallMethodResponse( | |
230 dbus::MethodCall* method_call, | |
231 Unused) { | |
232 if (method_call->GetInterface() == dbus::kPropertiesInterface) { | |
233 if (method_call->GetMember() == dbus::kPropertiesGet) { | |
234 if (!properties) | |
235 return nullptr; | |
236 | |
237 dbus::MessageReader reader(method_call); | |
238 std::string interface_name; | |
239 std::string property_name; | |
240 if (reader.PopString(&interface_name) && | |
241 reader.PopString(&property_name)) { | |
242 std::unique_ptr<dbus::Response> response = | |
243 dbus::Response::CreateEmpty(); | |
244 dbus::MessageWriter writer(response.get()); | |
245 AppendPropertyToWriter(&writer, property_name); | |
246 return response.release(); | |
247 } | |
248 } else if (method_call->GetMember() == dbus::kPropertiesGetAll) { | |
249 if (!properties) | |
250 return nullptr; | |
251 | |
252 std::unique_ptr<dbus::Response> response = dbus::Response::CreateEmpty(); | |
253 dbus::MessageWriter writer(response.get()); | |
254 AppendAllPropertiesToWriter(&writer); | |
255 return response.release(); | |
256 } | |
257 } | |
258 LOG(ERROR) << "Unexpected method call: " << method_call->ToString(); | |
259 return nullptr; | |
260 } | |
261 | |
262 MockBatteryObject& MockBatteryObject::ExpectConnectToSignalChanged() { | |
263 EXPECT_CALL(*proxy.get(), ConnectToSignal(kUPowerDeviceInterfaceName, | |
264 kUPowerDeviceSignalChanged, _, _)) | |
265 .WillOnce(Invoke(this, &MockBatteryObject::ConnectToSignal)); | |
266 return *this; | |
267 } | |
268 | |
269 MockBatteryObject& MockBatteryObject::ExpectConnectToSignalPropertyChanged() { | |
270 EXPECT_CALL(*proxy.get(), ConnectToSignal(dbus::kPropertiesInterface, | |
271 dbus::kPropertiesChanged, _, _)) | |
272 .WillOnce(Invoke(this, &MockBatteryObject::ConnectToSignal)); | |
273 return *this; | |
274 } | |
275 | |
276 void MockBatteryObject::SignalChanged() { | |
277 dbus::Signal signal(kUPowerInterfaceName, kUPowerDeviceSignalChanged); | |
278 signal.SetPath(proxy->object_path()); | |
279 dbus::MessageWriter writer(&signal); | |
280 writer.AppendString(kUPowerDeviceInterfaceName); | |
281 signal_callback_changed.Run(&signal); | |
282 } | |
283 | |
284 void MockBatteryObject::SignalPropertyChanged( | |
285 const std::string& property_name) { | |
286 dbus::Signal signal(dbus::kPropertiesInterface, dbus::kPropertiesChanged); | |
287 signal.SetPath(proxy->object_path()); | |
288 dbus::MessageWriter writer(&signal); | |
289 writer.AppendString(kUPowerDeviceInterfaceName); | |
290 | |
291 // Dictionary {sv} of property-name => new value: | |
292 dbus::MessageWriter array_writer(nullptr); | |
293 writer.OpenArray("{sv}", &array_writer); | |
294 writer.CloseContainer(&array_writer); | |
295 | |
296 // Array of invalidated properties: | |
297 writer.OpenArray("s", &array_writer); | |
298 array_writer.AppendString(property_name); | |
299 writer.CloseContainer(&array_writer); | |
300 | |
301 signal_callback_properties_changed.Run(&signal); | |
302 } | |
303 | |
304 void MockBatteryObject::AppendPropertyToWriter( | |
305 dbus::MessageWriter* writer, | |
306 const std::string& property_name) { | |
307 if (property_name == kUPowerDevicePropertyIsPresent) | |
308 writer->AppendVariantOfBool(properties->is_present); | |
309 else if (property_name == kUPowerDevicePropertyPercentage) | |
310 writer->AppendVariantOfDouble(properties->percentage); | |
311 else if (property_name == kUPowerDevicePropertyState) | |
312 writer->AppendVariantOfUint32(properties->state); | |
313 else if (property_name == kUPowerDevicePropertyTimeToEmpty) | |
314 writer->AppendVariantOfInt64(properties->time_to_empty); | |
315 else if (property_name == kUPowerDevicePropertyTimeToFull) | |
316 writer->AppendVariantOfInt64(properties->time_to_full); | |
317 else if (property_name == kUPowerDevicePropertyType) | |
318 writer->AppendVariantOfUint32(properties->type); | |
319 else | |
320 LOG(WARNING) << __FUNCTION__ << " unknown property: " << property_name; | |
321 } | |
322 | |
323 void MockBatteryObject::AppendAllPropertiesToWriter( | |
324 dbus::MessageWriter* writer) { | |
325 dbus::MessageWriter array_writer(nullptr); | |
326 dbus::MessageWriter dict_entry_writer(nullptr); | |
327 writer->OpenArray("{sv}", &array_writer); | |
328 for (auto* property_name : | |
329 {kUPowerDevicePropertyIsPresent, kUPowerDevicePropertyState, | |
330 kUPowerDevicePropertyTimeToEmpty, kUPowerDevicePropertyTimeToFull, | |
331 kUPowerDevicePropertyType}) { | |
332 array_writer.OpenDictEntry(&dict_entry_writer); | |
333 dict_entry_writer.AppendString(property_name); | |
334 AppendPropertyToWriter(&dict_entry_writer, property_name); | |
335 array_writer.CloseContainer(&dict_entry_writer); | |
336 } | |
337 writer->CloseContainer(&array_writer); | |
338 } | |
339 | |
340 } // namespace | |
341 | |
342 class BatteryStatusManagerLinuxTest : public testing::Test { | |
343 public: | |
344 BatteryStatusManagerLinuxTest() {} | |
345 void SetUp() override; | |
346 | |
347 MockBatteryObject& SetUpDisplayDeviceProxy(MockBatteryProperties* properties); | |
348 void AddDevicePath(const std::string& object_path); | |
349 void PushFrontDevicePath(const std::string& object_path); | |
350 MockBatteryObject& AddDeviceProxy(const std::string& object_path, | |
351 MockBatteryProperties* properties); | |
352 MockBatteryObject& PushFrontDeviceProxy(const std::string& object_path, | |
353 MockBatteryProperties* properties); | |
354 | |
355 void ExpectGetObjectProxy(const std::string& object_path, | |
356 MockBatteryObject* mock_object); | |
357 void ExpectGetObjectProxy(const std::string& object_path, | |
358 dbus::ObjectProxy* object_proxy); | |
359 | |
360 void DeviceSignalChanged(MockBatteryObject* device); | |
361 void DeviceSignalPropertyChanged(MockBatteryObject* device, | |
362 const std::string& property_name); | |
363 | |
364 void UPowerSignalDeviceAdded(const std::string& device_path); | |
365 void UPowerSignalDeviceRemoved(const std::string& device_path); | |
366 | |
367 void StartBatteryStatusManagerLinux(); | |
368 | |
369 int count_battery_updates() const { return count_battery_updates_; } | |
370 const mojom::BatteryStatus& last_battery_status() const { | |
371 return last_status_; | |
372 } | |
373 | |
374 protected: | |
375 scoped_refptr<dbus::MockBus> mock_bus_; | |
376 MockUPowerObject mock_upower_; | |
377 std::unique_ptr<MockBatteryObject> mock_display_device_; | |
378 std::list<std::unique_ptr<MockBatteryObject>> mock_battery_devices_; | |
379 | |
380 private: | |
381 std::unique_ptr<MockBatteryObject> CreateMockBatteryObject( | |
382 const std::string& object_path, | |
383 MockBatteryProperties* properties); | |
384 void BatteryUpdateCallback(const mojom::BatteryStatus& status); | |
385 void SyncWithNotifierThread(); | |
386 | |
387 std::unique_ptr<BatteryStatusManagerLinux> manager_; | |
388 int count_battery_updates_ = 0; | |
389 mojom::BatteryStatus last_status_; | |
390 | |
391 DISALLOW_COPY_AND_ASSIGN(BatteryStatusManagerLinuxTest); | |
392 }; | |
393 | |
394 void BatteryStatusManagerLinuxTest::SetUp() { | |
395 dbus::Bus::Options options; | |
396 options.bus_type = dbus::Bus::SYSTEM; | |
397 options.connection_type = dbus::Bus::PRIVATE; | |
398 mock_bus_ = new NiceMock<dbus::MockBus>(options); | |
399 | |
400 mock_upower_.proxy = new NiceMock<dbus::MockObjectProxy>( | |
401 mock_bus_.get(), kUPowerServiceName, dbus::ObjectPath(kUPowerPath)); | |
402 ExpectGetObjectProxy(kUPowerPath, mock_upower_.proxy.get()); | |
403 EXPECT_CALL(*mock_upower_.proxy.get(), MockCallMethodAndBlock(_, _)) | |
404 .WillRepeatedly( | |
405 Invoke(&mock_upower_, &MockUPowerObject::CreateCallMethodResponse)); | |
406 EXPECT_CALL( | |
407 *mock_upower_.proxy.get(), | |
408 ConnectToSignal(kUPowerInterfaceName, kUPowerSignalDeviceAdded, _, _)) | |
409 .WillOnce(Invoke(&mock_upower_, &MockUPowerObject::ConnectToSignal)); | |
410 EXPECT_CALL( | |
411 *mock_upower_.proxy.get(), | |
412 ConnectToSignal(kUPowerInterfaceName, kUPowerSignalDeviceRemoved, _, _)) | |
413 .WillOnce(Invoke(&mock_upower_, &MockUPowerObject::ConnectToSignal)); | |
414 } | |
415 | |
416 MockBatteryObject& BatteryStatusManagerLinuxTest::SetUpDisplayDeviceProxy( | |
417 MockBatteryProperties* properties) { | |
418 mock_upower_.display_device = kUPowerDisplayDevicePath; | |
419 mock_display_device_ = | |
420 CreateMockBatteryObject(mock_upower_.display_device, properties); | |
421 return *mock_display_device_.get(); | |
422 } | |
423 | |
424 void BatteryStatusManagerLinuxTest::AddDevicePath( | |
425 const std::string& object_path) { | |
426 mock_upower_.devices.push_back(object_path); | |
427 } | |
428 | |
429 void BatteryStatusManagerLinuxTest::PushFrontDevicePath( | |
430 const std::string& object_path) { | |
431 mock_upower_.devices.push_front(object_path); | |
432 } | |
433 | |
434 MockBatteryObject& BatteryStatusManagerLinuxTest::AddDeviceProxy( | |
435 const std::string& object_path, | |
436 MockBatteryProperties* properties) { | |
437 AddDevicePath(object_path); | |
438 mock_battery_devices_.push_back( | |
439 CreateMockBatteryObject(object_path, properties)); | |
440 return *mock_battery_devices_.back().get(); | |
441 } | |
442 | |
443 MockBatteryObject& BatteryStatusManagerLinuxTest::PushFrontDeviceProxy( | |
444 const std::string& object_path, | |
445 MockBatteryProperties* properties) { | |
446 PushFrontDevicePath(object_path); | |
447 mock_battery_devices_.push_front( | |
448 CreateMockBatteryObject(object_path, properties)); | |
449 return *mock_battery_devices_.front().get(); | |
450 } | |
451 | |
452 void BatteryStatusManagerLinuxTest::ExpectGetObjectProxy( | |
453 const std::string& object_path, | |
454 MockBatteryObject* mock_object) { | |
455 ExpectGetObjectProxy(object_path, mock_object->proxy.get()); | |
456 } | |
457 | |
458 void BatteryStatusManagerLinuxTest::ExpectGetObjectProxy( | |
459 const std::string& object_path, | |
460 dbus::ObjectProxy* object_proxy) { | |
461 EXPECT_CALL(*mock_bus_.get(), | |
462 GetObjectProxy(kUPowerServiceName, dbus::ObjectPath(object_path))) | |
463 .WillOnce(Return(object_proxy)); | |
464 } | |
465 | |
466 void BatteryStatusManagerLinuxTest::DeviceSignalChanged( | |
467 MockBatteryObject* device) { | |
468 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask( | |
469 FROM_HERE, | |
470 base::Bind(&MockBatteryObject::SignalChanged, base::Unretained(device))); | |
471 SyncWithNotifierThread(); | |
472 } | |
473 | |
474 void BatteryStatusManagerLinuxTest::DeviceSignalPropertyChanged( | |
475 MockBatteryObject* device, | |
476 const std::string& property_name) { | |
477 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask( | |
478 FROM_HERE, base::Bind(&MockBatteryObject::SignalPropertyChanged, | |
479 base::Unretained(device), property_name)); | |
480 SyncWithNotifierThread(); | |
481 } | |
482 | |
483 void BatteryStatusManagerLinuxTest::UPowerSignalDeviceAdded( | |
484 const std::string& device_path) { | |
485 ASSERT_FALSE(mock_upower_.signal_callback_device_added.is_null()); | |
486 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask( | |
487 FROM_HERE, base::Bind(&MockUPowerObject::SignalDeviceAdded, | |
488 base::Unretained(&mock_upower_), device_path)); | |
489 SyncWithNotifierThread(); | |
490 } | |
491 | |
492 void BatteryStatusManagerLinuxTest::UPowerSignalDeviceRemoved( | |
493 const std::string& device_path) { | |
494 ASSERT_FALSE(mock_upower_.signal_callback_device_removed.is_null()); | |
495 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask( | |
496 FROM_HERE, base::Bind(&MockUPowerObject::SignalDeviceRemoved, | |
497 base::Unretained(&mock_upower_), device_path)); | |
498 SyncWithNotifierThread(); | |
499 } | |
500 | |
501 void BatteryStatusManagerLinuxTest::StartBatteryStatusManagerLinux() { | |
502 manager_ = BatteryStatusManagerLinux::CreateForTesting( | |
503 base::Bind(&BatteryStatusManagerLinuxTest::BatteryUpdateCallback, | |
504 base::Unretained(this)), | |
505 mock_bus_.get()); | |
506 manager_->StartListeningBatteryChange(); | |
507 SyncWithNotifierThread(); | |
508 } | |
509 | |
510 std::unique_ptr<MockBatteryObject> | |
511 BatteryStatusManagerLinuxTest::CreateMockBatteryObject( | |
512 const std::string& object_path, | |
513 MockBatteryProperties* properties) { | |
514 std::unique_ptr<MockBatteryObject> mock_object( | |
515 new MockBatteryObject(mock_bus_.get(), object_path, properties)); | |
516 ExpectGetObjectProxy(object_path, mock_object.get()); | |
517 EXPECT_CALL(*mock_object->proxy.get(), MockCallMethodAndBlock(_, _)) | |
518 .WillRepeatedly(Invoke(mock_object.get(), | |
519 &MockBatteryObject::CreateCallMethodResponse)); | |
520 return mock_object; | |
521 } | |
522 | |
523 void BatteryStatusManagerLinuxTest::BatteryUpdateCallback( | |
524 const mojom::BatteryStatus& status) { | |
525 ++count_battery_updates_; | |
526 last_status_ = status; | |
527 } | |
528 | |
529 void BatteryStatusManagerLinuxTest::SyncWithNotifierThread() { | |
530 ASSERT_TRUE(manager_ != nullptr); | |
531 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL, | |
532 base::WaitableEvent::InitialState::NOT_SIGNALED); | |
533 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask( | |
534 FROM_HERE, | |
535 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event))); | |
536 event.Wait(); | |
537 } | |
538 | |
539 TEST_F(BatteryStatusManagerLinuxTest, NoBattery) { | |
540 mojom::BatteryStatus default_status; | |
541 StartBatteryStatusManagerLinux(); | |
542 mojom::BatteryStatus status = last_battery_status(); | |
543 EXPECT_LE(1, count_battery_updates()); | |
544 | |
545 EXPECT_EQ(default_status.charging, status.charging); | |
546 EXPECT_EQ(default_status.charging_time, status.charging_time); | |
547 EXPECT_EQ(default_status.discharging_time, status.discharging_time); | |
548 EXPECT_EQ(default_status.level, status.level); | |
549 } | |
550 | |
551 TEST_F(BatteryStatusManagerLinuxTest, ChargingHalfFull) { | |
552 MockBatteryProperties battery_bat0_properties; | |
553 battery_bat0_properties.state = | |
554 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING; | |
555 battery_bat0_properties.time_to_full = 0; | |
556 battery_bat0_properties.percentage = 50; | |
557 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
558 .ExpectConnectToSignalPropertyChanged(); | |
559 | |
560 StartBatteryStatusManagerLinux(); | |
561 mojom::BatteryStatus status = last_battery_status(); | |
562 EXPECT_LE(1, count_battery_updates()); | |
563 | |
564 EXPECT_TRUE(status.charging); | |
565 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
566 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
567 EXPECT_EQ(0.5, status.level); | |
568 } | |
569 | |
570 TEST_F(BatteryStatusManagerLinuxTest, ChargingTimeToFull) { | |
571 MockBatteryProperties battery_bat0_properties; | |
572 battery_bat0_properties.state = | |
573 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING; | |
574 battery_bat0_properties.time_to_full = 100; | |
575 battery_bat0_properties.percentage = 1; | |
576 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
577 .ExpectConnectToSignalPropertyChanged(); | |
578 | |
579 StartBatteryStatusManagerLinux(); | |
580 mojom::BatteryStatus status = last_battery_status(); | |
581 EXPECT_LE(1, count_battery_updates()); | |
582 | |
583 EXPECT_TRUE(status.charging); | |
584 EXPECT_EQ(100, status.charging_time); | |
585 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
586 EXPECT_EQ(.01, status.level); | |
587 } | |
588 | |
589 TEST_F(BatteryStatusManagerLinuxTest, FullyCharged) { | |
590 MockBatteryProperties battery_bat0_properties; | |
591 battery_bat0_properties.state = UPowerDeviceState::UPOWER_DEVICE_STATE_FULL; | |
592 battery_bat0_properties.time_to_full = 100; | |
593 battery_bat0_properties.time_to_empty = 200; | |
594 battery_bat0_properties.percentage = 100; | |
595 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
596 .ExpectConnectToSignalPropertyChanged(); | |
597 | |
598 StartBatteryStatusManagerLinux(); | |
599 mojom::BatteryStatus status = last_battery_status(); | |
600 EXPECT_LE(1, count_battery_updates()); | |
601 | |
602 EXPECT_TRUE(status.charging); | |
603 EXPECT_EQ(0, status.charging_time); | |
604 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
605 EXPECT_EQ(1, status.level); | |
606 } | |
607 | |
608 TEST_F(BatteryStatusManagerLinuxTest, Discharging) { | |
609 MockBatteryProperties battery_bat0_properties; | |
610 battery_bat0_properties.state = | |
611 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
612 battery_bat0_properties.time_to_full = 0; | |
613 battery_bat0_properties.time_to_empty = 200; | |
614 battery_bat0_properties.percentage = 90; | |
615 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
616 .ExpectConnectToSignalPropertyChanged(); | |
617 | |
618 StartBatteryStatusManagerLinux(); | |
619 mojom::BatteryStatus status = last_battery_status(); | |
620 EXPECT_LE(1, count_battery_updates()); | |
621 | |
622 EXPECT_FALSE(status.charging); | |
623 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
624 EXPECT_EQ(200, status.discharging_time); | |
625 EXPECT_EQ(.9, status.level); | |
626 } | |
627 | |
628 TEST_F(BatteryStatusManagerLinuxTest, DischargingTimeToEmptyUnknown) { | |
629 MockBatteryProperties battery_bat0_properties; | |
630 battery_bat0_properties.state = | |
631 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
632 battery_bat0_properties.time_to_full = 0; | |
633 battery_bat0_properties.time_to_empty = 0; | |
634 battery_bat0_properties.percentage = 90; | |
635 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
636 .ExpectConnectToSignalPropertyChanged(); | |
637 | |
638 StartBatteryStatusManagerLinux(); | |
639 mojom::BatteryStatus status = last_battery_status(); | |
640 EXPECT_LE(1, count_battery_updates()); | |
641 | |
642 EXPECT_FALSE(status.charging); | |
643 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
644 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
645 EXPECT_EQ(.9, status.level); | |
646 } | |
647 | |
648 TEST_F(BatteryStatusManagerLinuxTest, DeviceStateUnknown) { | |
649 MockBatteryProperties battery_bat0_properties; | |
650 battery_bat0_properties.state = | |
651 UPowerDeviceState::UPOWER_DEVICE_STATE_UNKNOWN; | |
652 battery_bat0_properties.time_to_full = 0; | |
653 battery_bat0_properties.time_to_empty = 0; | |
654 battery_bat0_properties.percentage = 50; | |
655 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
656 .ExpectConnectToSignalPropertyChanged(); | |
657 | |
658 StartBatteryStatusManagerLinux(); | |
659 mojom::BatteryStatus status = last_battery_status(); | |
660 EXPECT_LE(1, count_battery_updates()); | |
661 | |
662 EXPECT_TRUE(status.charging); | |
663 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
664 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
665 EXPECT_EQ(.5, status.level); | |
666 } | |
667 | |
668 TEST_F(BatteryStatusManagerLinuxTest, DeviceStateEmpty) { | |
669 MockBatteryProperties battery_bat0_properties; | |
670 battery_bat0_properties.state = UPowerDeviceState::UPOWER_DEVICE_STATE_EMPTY; | |
671 battery_bat0_properties.time_to_full = 0; | |
672 battery_bat0_properties.time_to_empty = 0; | |
673 battery_bat0_properties.percentage = 0; | |
674 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
675 .ExpectConnectToSignalPropertyChanged(); | |
676 | |
677 StartBatteryStatusManagerLinux(); | |
678 mojom::BatteryStatus status = last_battery_status(); | |
679 EXPECT_LE(1, count_battery_updates()); | |
680 | |
681 EXPECT_FALSE(status.charging); | |
682 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
683 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
684 EXPECT_EQ(0, status.level); | |
685 } | |
686 | |
687 TEST_F(BatteryStatusManagerLinuxTest, LevelRoundedToThreeSignificantDigits) { | |
688 MockBatteryProperties battery_bat0_properties; | |
689 battery_bat0_properties.state = | |
690 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
691 battery_bat0_properties.percentage = 14.56; | |
692 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
693 .ExpectConnectToSignalPropertyChanged(); | |
694 | |
695 StartBatteryStatusManagerLinux(); | |
696 mojom::BatteryStatus status = last_battery_status(); | |
697 EXPECT_LE(1, count_battery_updates()); | |
698 | |
699 EXPECT_FALSE(status.charging); | |
700 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
701 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
702 EXPECT_EQ(0.15, status.level); | |
703 } | |
704 | |
705 TEST_F(BatteryStatusManagerLinuxTest, UsingFirstBatteryDevice) { | |
706 MockBatteryProperties battery_bat0_properties; | |
707 battery_bat0_properties.state = | |
708 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
709 battery_bat0_properties.time_to_full = 0; | |
710 battery_bat0_properties.time_to_empty = 200; | |
711 battery_bat0_properties.percentage = 70; | |
712 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
713 .ExpectConnectToSignalPropertyChanged(); | |
714 | |
715 MockBatteryProperties battery_bat1_properties; | |
716 battery_bat1_properties.state = | |
717 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING; | |
718 battery_bat1_properties.time_to_full = 100; | |
719 battery_bat1_properties.time_to_empty = 0; | |
720 battery_bat1_properties.percentage = 80; | |
721 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties); | |
722 | |
723 StartBatteryStatusManagerLinux(); | |
724 mojom::BatteryStatus status = last_battery_status(); | |
725 EXPECT_LE(1, count_battery_updates()); | |
726 | |
727 EXPECT_FALSE(status.charging); | |
728 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
729 EXPECT_EQ(200, status.discharging_time); | |
730 EXPECT_EQ(0.7, status.level); | |
731 } | |
732 | |
733 TEST_F(BatteryStatusManagerLinuxTest, SkipNonBatteryDevice) { | |
734 MockBatteryProperties line_power_AC_properties; | |
735 line_power_AC_properties.type = | |
736 UPowerDeviceType::UPOWER_DEVICE_TYPE_LINE_POWER; | |
737 AddDeviceProxy(kUPowerDeviceACLinePath, &line_power_AC_properties); | |
738 | |
739 MockBatteryProperties battery_bat0_properties; | |
740 battery_bat0_properties.state = | |
741 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
742 battery_bat0_properties.time_to_full = 0; | |
743 battery_bat0_properties.time_to_empty = 200; | |
744 battery_bat0_properties.percentage = 70; | |
745 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
746 .ExpectConnectToSignalPropertyChanged(); | |
747 | |
748 StartBatteryStatusManagerLinux(); | |
749 mojom::BatteryStatus status = last_battery_status(); | |
750 EXPECT_LE(1, count_battery_updates()); | |
751 | |
752 EXPECT_FALSE(status.charging); | |
753 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
754 EXPECT_EQ(200, status.discharging_time); | |
755 EXPECT_EQ(0.7, status.level); | |
756 } | |
757 | |
758 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyState) { | |
759 MockBatteryProperties battery_bat0_properties; | |
760 battery_bat0_properties.state = | |
761 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING; | |
762 battery_bat0_properties.time_to_full = 100; | |
763 battery_bat0_properties.time_to_empty = 200; | |
764 battery_bat0_properties.percentage = 80; | |
765 MockBatteryObject& battery_bat0 = | |
766 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
767 .ExpectConnectToSignalPropertyChanged(); | |
768 | |
769 StartBatteryStatusManagerLinux(); | |
770 mojom::BatteryStatus status = last_battery_status(); | |
771 EXPECT_LE(1, count_battery_updates()); | |
772 | |
773 EXPECT_TRUE(status.charging); | |
774 EXPECT_EQ(100, status.charging_time); | |
775 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
776 EXPECT_EQ(.8, status.level); | |
777 | |
778 int last_count = count_battery_updates(); | |
779 battery_bat0_properties.state = | |
780 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
781 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyState); | |
782 status = last_battery_status(); | |
783 | |
784 EXPECT_LT(last_count, count_battery_updates()); | |
785 EXPECT_FALSE(status.charging); | |
786 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
787 EXPECT_EQ(200, status.discharging_time); | |
788 EXPECT_EQ(.8, status.level); | |
789 } | |
790 | |
791 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyPercentage) { | |
792 MockBatteryProperties battery_bat0_properties; | |
793 battery_bat0_properties.state = | |
794 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
795 battery_bat0_properties.time_to_full = 100; | |
796 battery_bat0_properties.time_to_empty = 200; | |
797 battery_bat0_properties.percentage = 80; | |
798 MockBatteryObject& battery_bat0 = | |
799 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
800 .ExpectConnectToSignalPropertyChanged(); | |
801 | |
802 StartBatteryStatusManagerLinux(); | |
803 mojom::BatteryStatus status = last_battery_status(); | |
804 EXPECT_LE(1, count_battery_updates()); | |
805 | |
806 EXPECT_FALSE(status.charging); | |
807 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
808 EXPECT_EQ(200, status.discharging_time); | |
809 EXPECT_EQ(.8, status.level); | |
810 | |
811 int last_count = count_battery_updates(); | |
812 battery_bat0_properties.percentage = 70; | |
813 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyPercentage); | |
814 status = last_battery_status(); | |
815 | |
816 EXPECT_LT(last_count, count_battery_updates()); | |
817 EXPECT_FALSE(status.charging); | |
818 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
819 EXPECT_EQ(200, status.discharging_time); | |
820 EXPECT_EQ(.7, status.level); | |
821 } | |
822 | |
823 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyTimeToEmpty) { | |
824 MockBatteryProperties battery_bat0_properties; | |
825 battery_bat0_properties.state = | |
826 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
827 battery_bat0_properties.time_to_full = 100; | |
828 battery_bat0_properties.time_to_empty = 200; | |
829 battery_bat0_properties.percentage = 80; | |
830 MockBatteryObject& battery_bat0 = | |
831 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
832 .ExpectConnectToSignalPropertyChanged(); | |
833 | |
834 StartBatteryStatusManagerLinux(); | |
835 mojom::BatteryStatus status = last_battery_status(); | |
836 EXPECT_LE(1, count_battery_updates()); | |
837 | |
838 EXPECT_FALSE(status.charging); | |
839 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
840 EXPECT_EQ(200, status.discharging_time); | |
841 EXPECT_EQ(.8, status.level); | |
842 | |
843 int last_count = count_battery_updates(); | |
844 battery_bat0_properties.time_to_empty = 150; | |
845 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyTimeToEmpty); | |
846 status = last_battery_status(); | |
847 | |
848 EXPECT_LT(last_count, count_battery_updates()); | |
849 EXPECT_FALSE(status.charging); | |
850 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
851 EXPECT_EQ(150, status.discharging_time); | |
852 EXPECT_EQ(.8, status.level); | |
853 } | |
854 | |
855 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyTimeToFull) { | |
856 MockBatteryProperties battery_bat0_properties; | |
857 battery_bat0_properties.state = | |
858 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING; | |
859 battery_bat0_properties.time_to_full = 100; | |
860 battery_bat0_properties.time_to_empty = 200; | |
861 battery_bat0_properties.percentage = 80; | |
862 MockBatteryObject& battery_bat0 = | |
863 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
864 .ExpectConnectToSignalPropertyChanged(); | |
865 | |
866 StartBatteryStatusManagerLinux(); | |
867 mojom::BatteryStatus status = last_battery_status(); | |
868 EXPECT_LE(1, count_battery_updates()); | |
869 | |
870 EXPECT_TRUE(status.charging); | |
871 EXPECT_EQ(100, status.charging_time); | |
872 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
873 EXPECT_EQ(.8, status.level); | |
874 | |
875 int last_count = count_battery_updates(); | |
876 battery_bat0_properties.time_to_full = 50; | |
877 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyTimeToFull); | |
878 status = last_battery_status(); | |
879 | |
880 EXPECT_LT(last_count, count_battery_updates()); | |
881 EXPECT_TRUE(status.charging); | |
882 EXPECT_EQ(50, status.charging_time); | |
883 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
884 EXPECT_EQ(.8, status.level); | |
885 } | |
886 | |
887 TEST_F(BatteryStatusManagerLinuxTest, OldDaemonDeviceSignalChanged) { | |
888 mock_upower_.daemon_version = "0.9.23"; | |
889 | |
890 MockBatteryProperties battery_bat0_properties; | |
891 battery_bat0_properties.state = | |
892 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
893 battery_bat0_properties.time_to_full = 100; | |
894 battery_bat0_properties.time_to_empty = 200; | |
895 battery_bat0_properties.percentage = 80; | |
896 MockBatteryObject& battery_bat0 = | |
897 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
898 .ExpectConnectToSignalChanged() | |
899 .ExpectConnectToSignalPropertyChanged(); | |
900 | |
901 StartBatteryStatusManagerLinux(); | |
902 mojom::BatteryStatus status = last_battery_status(); | |
903 EXPECT_LE(1, count_battery_updates()); | |
904 | |
905 EXPECT_FALSE(status.charging); | |
906 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
907 EXPECT_EQ(200, status.discharging_time); | |
908 EXPECT_EQ(.8, status.level); | |
909 | |
910 int last_count = count_battery_updates(); | |
911 battery_bat0_properties.percentage = 70; | |
912 DeviceSignalChanged(&battery_bat0); | |
913 status = last_battery_status(); | |
914 | |
915 EXPECT_LT(last_count, count_battery_updates()); | |
916 EXPECT_FALSE(status.charging); | |
917 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
918 EXPECT_EQ(200, status.discharging_time); | |
919 EXPECT_EQ(.7, status.level); | |
920 } | |
921 | |
922 TEST_F(BatteryStatusManagerLinuxTest, DisplayDeviceNoBattery) { | |
923 MockBatteryProperties display_device_properties; | |
924 display_device_properties.type = UPowerDeviceType::UPOWER_DEVICE_TYPE_UNKNOWN; | |
925 SetUpDisplayDeviceProxy(&display_device_properties); | |
926 | |
927 MockBatteryProperties battery_bat0_properties; | |
928 battery_bat0_properties.state = | |
929 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
930 battery_bat0_properties.time_to_full = 0; | |
931 battery_bat0_properties.time_to_empty = 200; | |
932 battery_bat0_properties.percentage = 90; | |
933 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
934 .ExpectConnectToSignalPropertyChanged(); | |
935 | |
936 StartBatteryStatusManagerLinux(); | |
937 mojom::BatteryStatus status = last_battery_status(); | |
938 EXPECT_LE(1, count_battery_updates()); | |
939 | |
940 EXPECT_FALSE(status.charging); | |
941 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
942 EXPECT_EQ(200, status.discharging_time); | |
943 EXPECT_EQ(0.9, status.level); | |
944 } | |
945 | |
946 TEST_F(BatteryStatusManagerLinuxTest, DisplayDeviceBattery) { | |
947 MockBatteryProperties display_device_properties; | |
948 display_device_properties.state = | |
949 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
950 display_device_properties.time_to_full = 0; | |
951 display_device_properties.time_to_empty = 200; | |
952 display_device_properties.percentage = 90; | |
953 SetUpDisplayDeviceProxy(&display_device_properties) | |
954 .ExpectConnectToSignalPropertyChanged(); | |
955 | |
956 StartBatteryStatusManagerLinux(); | |
957 mojom::BatteryStatus status = last_battery_status(); | |
958 EXPECT_LE(1, count_battery_updates()); | |
959 | |
960 EXPECT_FALSE(status.charging); | |
961 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
962 EXPECT_EQ(200, status.discharging_time); | |
963 EXPECT_EQ(.9, status.level); | |
964 } | |
965 | |
966 TEST_F(BatteryStatusManagerLinuxTest, DisplayDeviceBatterySkipsEnumerate) { | |
967 MockBatteryProperties display_device_properties; | |
968 display_device_properties.state = | |
969 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
970 display_device_properties.time_to_full = 0; | |
971 display_device_properties.time_to_empty = 200; | |
972 display_device_properties.percentage = 90; | |
973 SetUpDisplayDeviceProxy(&display_device_properties) | |
974 .ExpectConnectToSignalPropertyChanged(); | |
975 | |
976 AddDevicePath(kUPowerDeviceACLinePath); | |
977 AddDevicePath(kUPowerDeviceBattery0Path); | |
978 AddDevicePath(kUPowerDeviceBattery1Path); | |
979 | |
980 StartBatteryStatusManagerLinux(); | |
981 mojom::BatteryStatus status = last_battery_status(); | |
982 EXPECT_LE(1, count_battery_updates()); | |
983 | |
984 EXPECT_FALSE(status.charging); | |
985 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
986 EXPECT_EQ(200, status.discharging_time); | |
987 EXPECT_EQ(.9, status.level); | |
988 } | |
989 | |
990 // Adding a display-device will make the BatteryStatusManagerLinux switch to | |
991 // the display-device. | |
992 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedDisplayDevice) { | |
993 MockBatteryProperties battery_bat0_properties; | |
994 battery_bat0_properties.state = | |
995 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
996 battery_bat0_properties.time_to_full = 0; | |
997 battery_bat0_properties.time_to_empty = 200; | |
998 battery_bat0_properties.percentage = 70; | |
999 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
1000 .ExpectConnectToSignalPropertyChanged(); | |
1001 | |
1002 StartBatteryStatusManagerLinux(); | |
1003 mojom::BatteryStatus status = last_battery_status(); | |
1004 EXPECT_LE(1, count_battery_updates()); | |
1005 | |
1006 EXPECT_FALSE(status.charging); | |
1007 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1008 EXPECT_EQ(200, status.discharging_time); | |
1009 EXPECT_EQ(0.7, status.level); | |
1010 | |
1011 int last_count = count_battery_updates(); | |
1012 MockBatteryProperties display_device_properties; | |
1013 display_device_properties.state = | |
1014 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING; | |
1015 display_device_properties.time_to_full = 100; | |
1016 display_device_properties.time_to_empty = 150; | |
1017 display_device_properties.percentage = 80; | |
1018 SetUpDisplayDeviceProxy(&display_device_properties) | |
1019 .ExpectConnectToSignalPropertyChanged(); | |
1020 | |
1021 UPowerSignalDeviceAdded(mock_upower_.display_device); | |
1022 status = last_battery_status(); | |
1023 EXPECT_LT(last_count, count_battery_updates()); | |
1024 | |
1025 EXPECT_TRUE(status.charging); | |
1026 EXPECT_EQ(100, status.charging_time); | |
1027 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
1028 EXPECT_EQ(0.8, status.level); | |
1029 } | |
1030 | |
1031 // Prepending a battery should switch to that battery. | |
1032 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedBatteryAtFront) { | |
1033 MockBatteryProperties battery_bat1_properties; | |
1034 battery_bat1_properties.state = | |
1035 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
1036 battery_bat1_properties.time_to_full = 0; | |
1037 battery_bat1_properties.time_to_empty = 200; | |
1038 battery_bat1_properties.percentage = 70; | |
1039 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties) | |
1040 .ExpectConnectToSignalPropertyChanged(); | |
1041 | |
1042 StartBatteryStatusManagerLinux(); | |
1043 mojom::BatteryStatus status = last_battery_status(); | |
1044 EXPECT_LE(1, count_battery_updates()); | |
1045 | |
1046 EXPECT_FALSE(status.charging); | |
1047 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1048 EXPECT_EQ(200, status.discharging_time); | |
1049 EXPECT_EQ(0.7, status.level); | |
1050 | |
1051 int last_count = count_battery_updates(); | |
1052 MockBatteryProperties battery_bat0_properties; | |
1053 battery_bat0_properties.state = | |
1054 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
1055 battery_bat0_properties.time_to_full = 0; | |
1056 battery_bat0_properties.time_to_empty = 150; | |
1057 battery_bat0_properties.percentage = 50; | |
1058 PushFrontDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
1059 .ExpectConnectToSignalPropertyChanged(); | |
1060 UPowerSignalDeviceAdded(kUPowerDeviceBattery0Path); | |
1061 status = last_battery_status(); | |
1062 EXPECT_LT(last_count, count_battery_updates()); | |
1063 | |
1064 EXPECT_FALSE(status.charging); | |
1065 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1066 EXPECT_EQ(150, status.discharging_time); | |
1067 EXPECT_EQ(0.5, status.level); | |
1068 } | |
1069 | |
1070 // Appending a battery should keep the current battery. | |
1071 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedBatteryAtBack) { | |
1072 MockBatteryProperties battery_bat0_properties; | |
1073 battery_bat0_properties.state = | |
1074 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
1075 battery_bat0_properties.time_to_full = 0; | |
1076 battery_bat0_properties.time_to_empty = 150; | |
1077 battery_bat0_properties.percentage = 50; | |
1078 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
1079 .ExpectConnectToSignalPropertyChanged(); | |
1080 | |
1081 StartBatteryStatusManagerLinux(); | |
1082 mojom::BatteryStatus status = last_battery_status(); | |
1083 EXPECT_LE(1, count_battery_updates()); | |
1084 | |
1085 EXPECT_FALSE(status.charging); | |
1086 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1087 EXPECT_EQ(150, status.discharging_time); | |
1088 EXPECT_EQ(0.5, status.level); | |
1089 | |
1090 int last_count = count_battery_updates(); | |
1091 MockBatteryProperties battery_bat1_properties; | |
1092 battery_bat1_properties.state = | |
1093 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
1094 battery_bat1_properties.time_to_full = 0; | |
1095 battery_bat1_properties.time_to_empty = 200; | |
1096 battery_bat1_properties.percentage = 70; | |
1097 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties); | |
1098 UPowerSignalDeviceAdded(kUPowerDeviceBattery1Path); | |
1099 status = last_battery_status(); | |
1100 EXPECT_LT(last_count, count_battery_updates()); | |
1101 | |
1102 EXPECT_FALSE(status.charging); | |
1103 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1104 EXPECT_EQ(150, status.discharging_time); | |
1105 EXPECT_EQ(0.5, status.level); | |
1106 } | |
1107 | |
1108 // Adding a device that is no battery should not change anything. | |
1109 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedNoBattery) { | |
1110 MockBatteryProperties battery_bat0_properties; | |
1111 battery_bat0_properties.state = | |
1112 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
1113 battery_bat0_properties.time_to_full = 0; | |
1114 battery_bat0_properties.time_to_empty = 200; | |
1115 battery_bat0_properties.percentage = 70; | |
1116 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
1117 .ExpectConnectToSignalPropertyChanged(); | |
1118 | |
1119 StartBatteryStatusManagerLinux(); | |
1120 mojom::BatteryStatus status = last_battery_status(); | |
1121 EXPECT_LE(1, count_battery_updates()); | |
1122 | |
1123 EXPECT_FALSE(status.charging); | |
1124 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1125 EXPECT_EQ(200, status.discharging_time); | |
1126 EXPECT_EQ(0.7, status.level); | |
1127 | |
1128 int last_count = count_battery_updates(); | |
1129 MockBatteryProperties line_power_AC_properties; | |
1130 line_power_AC_properties.type = | |
1131 UPowerDeviceType::UPOWER_DEVICE_TYPE_LINE_POWER; | |
1132 PushFrontDeviceProxy(kUPowerDeviceACLinePath, &line_power_AC_properties); | |
1133 UPowerSignalDeviceAdded(kUPowerDeviceACLinePath); | |
1134 status = last_battery_status(); | |
1135 EXPECT_LT(last_count, count_battery_updates()); | |
1136 | |
1137 EXPECT_FALSE(status.charging); | |
1138 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1139 EXPECT_EQ(200, status.discharging_time); | |
1140 EXPECT_EQ(0.7, status.level); | |
1141 } | |
1142 | |
1143 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceRemovedBattery) { | |
1144 MockBatteryProperties battery_bat0_properties; | |
1145 battery_bat0_properties.state = | |
1146 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
1147 battery_bat0_properties.time_to_full = 0; | |
1148 battery_bat0_properties.time_to_empty = 200; | |
1149 battery_bat0_properties.percentage = 70; | |
1150 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
1151 .ExpectConnectToSignalPropertyChanged(); | |
1152 | |
1153 MockBatteryProperties battery_bat1_properties; | |
1154 battery_bat1_properties.state = | |
1155 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING; | |
1156 battery_bat1_properties.time_to_full = 100; | |
1157 battery_bat1_properties.time_to_empty = 0; | |
1158 battery_bat1_properties.percentage = 80; | |
1159 MockBatteryObject& battery_bat1 = | |
1160 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties); | |
1161 | |
1162 StartBatteryStatusManagerLinux(); | |
1163 mojom::BatteryStatus status = last_battery_status(); | |
1164 EXPECT_LE(1, count_battery_updates()); | |
1165 | |
1166 EXPECT_FALSE(status.charging); | |
1167 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1168 EXPECT_EQ(200, status.discharging_time); | |
1169 EXPECT_EQ(0.7, status.level); | |
1170 | |
1171 int last_count = count_battery_updates(); | |
1172 ExpectGetObjectProxy(kUPowerDeviceBattery1Path, &battery_bat1); | |
1173 battery_bat1.ExpectConnectToSignalPropertyChanged(); | |
1174 | |
1175 EXPECT_EQ(kUPowerDeviceBattery0Path, mock_upower_.devices.front()); | |
1176 mock_upower_.devices.pop_front(); | |
1177 UPowerSignalDeviceRemoved(kUPowerDeviceBattery0Path); | |
1178 status = last_battery_status(); | |
1179 EXPECT_LT(last_count, count_battery_updates()); | |
1180 | |
1181 EXPECT_TRUE(status.charging); | |
1182 EXPECT_EQ(100, status.charging_time); | |
1183 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); | |
1184 EXPECT_EQ(0.8, status.level); | |
1185 } | |
1186 | |
1187 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceRemovedOther) { | |
1188 MockBatteryProperties battery_bat0_properties; | |
1189 battery_bat0_properties.state = | |
1190 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING; | |
1191 battery_bat0_properties.time_to_full = 0; | |
1192 battery_bat0_properties.time_to_empty = 200; | |
1193 battery_bat0_properties.percentage = 70; | |
1194 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties) | |
1195 .ExpectConnectToSignalPropertyChanged(); | |
1196 | |
1197 MockBatteryProperties line_power_AC_properties; | |
1198 line_power_AC_properties.type = | |
1199 UPowerDeviceType::UPOWER_DEVICE_TYPE_LINE_POWER; | |
1200 AddDeviceProxy(kUPowerDeviceACLinePath, &line_power_AC_properties); | |
1201 | |
1202 StartBatteryStatusManagerLinux(); | |
1203 mojom::BatteryStatus status = last_battery_status(); | |
1204 EXPECT_LE(1, count_battery_updates()); | |
1205 | |
1206 EXPECT_FALSE(status.charging); | |
1207 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1208 EXPECT_EQ(200, status.discharging_time); | |
1209 EXPECT_EQ(0.7, status.level); | |
1210 | |
1211 int last_count = count_battery_updates(); | |
1212 mock_upower_.devices.pop_back(); | |
1213 UPowerSignalDeviceRemoved(kUPowerDeviceACLinePath); | |
1214 status = last_battery_status(); | |
1215 EXPECT_EQ(last_count, count_battery_updates()); | |
1216 | |
1217 EXPECT_FALSE(status.charging); | |
1218 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); | |
1219 EXPECT_EQ(200, status.discharging_time); | |
1220 EXPECT_EQ(0.7, status.level); | |
1221 } | |
1222 | |
1223 } // namespace device | |
OLD | NEW |