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

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

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

Powered by Google App Engine
This is Rietveld 408576698