Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: device/battery/battery_status_manager_linux_unittest.cc

Issue 2818673003: [DeviceService] Expose battery monitoring solely via the Device Service (Closed)
Patch Set: Java file format change Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW
« no previous file with comments | « device/battery/battery_status_manager_linux-inl.h ('k') | device/battery/battery_status_manager_mac.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698