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

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: Implement device::BatteryStatus support for UPower daemon 0.99.x (rebased) Created 4 years, 4 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
« no previous file with comments | « device/battery/battery_status_manager_linux-inl.h ('k') | device/device_tests.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 kUPowerDeviceACLinePath[] =
14 TEST(BatteryStatusManagerLinuxTest, EmptyDictionary) { 33 "/org/freedesktop/UPower/devices/line_power_AC";
15 base::DictionaryValue dictionary; 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 BatteryStatus& last_battery_status() const { return last_status_; }
371
372 protected:
373 scoped_refptr<dbus::MockBus> mock_bus_;
374 MockUPowerObject mock_upower_;
375 std::unique_ptr<MockBatteryObject> mock_display_device_;
376 std::list<std::unique_ptr<MockBatteryObject>> mock_battery_devices_;
377
378 private:
379 std::unique_ptr<MockBatteryObject> CreateMockBatteryObject(
380 const std::string& object_path,
381 MockBatteryProperties* properties);
382 void BatteryUpdateCallback(const BatteryStatus& status);
383 void SyncWithNotifierThread();
384
385 std::unique_ptr<BatteryStatusManagerLinux> manager_;
386 int count_battery_updates_ = 0;
387 BatteryStatus last_status_;
388
389 DISALLOW_COPY_AND_ASSIGN(BatteryStatusManagerLinuxTest);
390 };
391
392 void BatteryStatusManagerLinuxTest::SetUp() {
393 dbus::Bus::Options options;
394 options.bus_type = dbus::Bus::SYSTEM;
395 options.connection_type = dbus::Bus::PRIVATE;
396 mock_bus_ = new NiceMock<dbus::MockBus>(options);
397
398 mock_upower_.proxy = new NiceMock<dbus::MockObjectProxy>(
399 mock_bus_.get(), kUPowerServiceName, dbus::ObjectPath(kUPowerPath));
400 ExpectGetObjectProxy(kUPowerPath, mock_upower_.proxy.get());
401 EXPECT_CALL(*mock_upower_.proxy.get(), MockCallMethodAndBlock(_, _))
402 .WillRepeatedly(
403 Invoke(&mock_upower_, &MockUPowerObject::CreateCallMethodResponse));
404 EXPECT_CALL(
405 *mock_upower_.proxy.get(),
406 ConnectToSignal(kUPowerInterfaceName, kUPowerSignalDeviceAdded, _, _))
407 .WillOnce(Invoke(&mock_upower_, &MockUPowerObject::ConnectToSignal));
408 EXPECT_CALL(
409 *mock_upower_.proxy.get(),
410 ConnectToSignal(kUPowerInterfaceName, kUPowerSignalDeviceRemoved, _, _))
411 .WillOnce(Invoke(&mock_upower_, &MockUPowerObject::ConnectToSignal));
412 }
413
414 MockBatteryObject& BatteryStatusManagerLinuxTest::SetUpDisplayDeviceProxy(
415 MockBatteryProperties* properties) {
416 mock_upower_.display_device = kUPowerDisplayDevicePath;
417 mock_display_device_ =
418 CreateMockBatteryObject(mock_upower_.display_device, properties);
419 return *mock_display_device_.get();
420 }
421
422 void BatteryStatusManagerLinuxTest::AddDevicePath(
423 const std::string& object_path) {
424 mock_upower_.devices.push_back(object_path);
425 }
426
427 void BatteryStatusManagerLinuxTest::PushFrontDevicePath(
428 const std::string& object_path) {
429 mock_upower_.devices.push_front(object_path);
430 }
431
432 MockBatteryObject& BatteryStatusManagerLinuxTest::AddDeviceProxy(
433 const std::string& object_path,
434 MockBatteryProperties* properties) {
435 AddDevicePath(object_path);
436 mock_battery_devices_.push_back(
437 CreateMockBatteryObject(object_path, properties));
438 return *mock_battery_devices_.back().get();
439 }
440
441 MockBatteryObject& BatteryStatusManagerLinuxTest::PushFrontDeviceProxy(
442 const std::string& object_path,
443 MockBatteryProperties* properties) {
444 PushFrontDevicePath(object_path);
445 mock_battery_devices_.push_front(
446 CreateMockBatteryObject(object_path, properties));
447 return *mock_battery_devices_.front().get();
448 }
449
450 void BatteryStatusManagerLinuxTest::ExpectGetObjectProxy(
451 const std::string& object_path,
452 MockBatteryObject* mock_object) {
453 ExpectGetObjectProxy(object_path, mock_object->proxy.get());
454 }
455
456 void BatteryStatusManagerLinuxTest::ExpectGetObjectProxy(
457 const std::string& object_path,
458 dbus::ObjectProxy* object_proxy) {
459 EXPECT_CALL(*mock_bus_.get(),
460 GetObjectProxy(kUPowerServiceName, dbus::ObjectPath(object_path)))
461 .WillOnce(Return(object_proxy));
462 }
463
464 void BatteryStatusManagerLinuxTest::DeviceSignalChanged(
465 MockBatteryObject* device) {
466 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask(
467 FROM_HERE,
468 base::Bind(&MockBatteryObject::SignalChanged, base::Unretained(device)));
469 SyncWithNotifierThread();
470 }
471
472 void BatteryStatusManagerLinuxTest::DeviceSignalPropertyChanged(
473 MockBatteryObject* device,
474 const std::string& property_name) {
475 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask(
476 FROM_HERE, base::Bind(&MockBatteryObject::SignalPropertyChanged,
477 base::Unretained(device), property_name));
478 SyncWithNotifierThread();
479 }
480
481 void BatteryStatusManagerLinuxTest::UPowerSignalDeviceAdded(
482 const std::string& device_path) {
483 ASSERT_FALSE(mock_upower_.signal_callback_device_added.is_null());
484 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask(
485 FROM_HERE, base::Bind(&MockUPowerObject::SignalDeviceAdded,
486 base::Unretained(&mock_upower_), device_path));
487 SyncWithNotifierThread();
488 }
489
490 void BatteryStatusManagerLinuxTest::UPowerSignalDeviceRemoved(
491 const std::string& device_path) {
492 ASSERT_FALSE(mock_upower_.signal_callback_device_removed.is_null());
493 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask(
494 FROM_HERE, base::Bind(&MockUPowerObject::SignalDeviceRemoved,
495 base::Unretained(&mock_upower_), device_path));
496 SyncWithNotifierThread();
497 }
498
499 void BatteryStatusManagerLinuxTest::StartBatteryStatusManagerLinux() {
500 manager_ = BatteryStatusManagerLinux::CreateForTesting(
501 base::Bind(&BatteryStatusManagerLinuxTest::BatteryUpdateCallback,
502 base::Unretained(this)),
503 mock_bus_.get());
504 manager_->StartListeningBatteryChange();
505 SyncWithNotifierThread();
506 }
507
508 std::unique_ptr<MockBatteryObject>
509 BatteryStatusManagerLinuxTest::CreateMockBatteryObject(
510 const std::string& object_path,
511 MockBatteryProperties* properties) {
512 std::unique_ptr<MockBatteryObject> mock_object(
513 new MockBatteryObject(mock_bus_.get(), object_path, properties));
514 ExpectGetObjectProxy(object_path, mock_object.get());
515 EXPECT_CALL(*mock_object->proxy.get(), MockCallMethodAndBlock(_, _))
516 .WillRepeatedly(Invoke(mock_object.get(),
517 &MockBatteryObject::CreateCallMethodResponse));
518 return mock_object;
519 }
520
521 void BatteryStatusManagerLinuxTest::BatteryUpdateCallback(
522 const BatteryStatus& status) {
523 ++count_battery_updates_;
524 last_status_ = status;
525 }
526
527 void BatteryStatusManagerLinuxTest::SyncWithNotifierThread() {
528 ASSERT_TRUE(manager_ != nullptr);
529 base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
530 base::WaitableEvent::InitialState::NOT_SIGNALED);
531 manager_->GetNotifierThreadForTesting()->task_runner()->PostTask(
532 FROM_HERE,
533 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event)));
534 event.Wait();
535 }
536
537 TEST_F(BatteryStatusManagerLinuxTest, NoBattery) {
16 BatteryStatus default_status; 538 BatteryStatus default_status;
17 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 539 StartBatteryStatusManagerLinux();
540 BatteryStatus status = last_battery_status();
541 EXPECT_LE(1, count_battery_updates());
18 542
19 EXPECT_EQ(default_status.charging, status.charging); 543 EXPECT_EQ(default_status.charging, status.charging);
20 EXPECT_EQ(default_status.charging_time, status.charging_time); 544 EXPECT_EQ(default_status.charging_time, status.charging_time);
21 EXPECT_EQ(default_status.discharging_time, status.discharging_time); 545 EXPECT_EQ(default_status.discharging_time, status.discharging_time);
22 EXPECT_EQ(default_status.level, status.level); 546 EXPECT_EQ(default_status.level, status.level);
23 } 547 }
24 548
25 TEST(BatteryStatusManagerLinuxTest, ChargingHalfFull) { 549 TEST_F(BatteryStatusManagerLinuxTest, ChargingHalfFull) {
26 base::DictionaryValue dictionary; 550 MockBatteryProperties battery_bat0_properties;
27 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_CHARGING); 551 battery_bat0_properties.state =
28 dictionary.SetDouble("TimeToFull", 0); 552 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING;
29 dictionary.SetDouble("Percentage", 50); 553 battery_bat0_properties.time_to_full = 0;
554 battery_bat0_properties.percentage = 50;
555 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
556 .ExpectConnectToSignalPropertyChanged();
30 557
31 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 558 StartBatteryStatusManagerLinux();
559 BatteryStatus status = last_battery_status();
560 EXPECT_LE(1, count_battery_updates());
32 561
33 EXPECT_TRUE(status.charging); 562 EXPECT_TRUE(status.charging);
34 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); 563 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
35 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); 564 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
36 EXPECT_EQ(0.5, status.level); 565 EXPECT_EQ(0.5, status.level);
37 } 566 }
38 567
39 TEST(BatteryStatusManagerLinuxTest, ChargingTimeToFull) { 568 TEST_F(BatteryStatusManagerLinuxTest, ChargingTimeToFull) {
40 base::DictionaryValue dictionary; 569 MockBatteryProperties battery_bat0_properties;
41 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_CHARGING); 570 battery_bat0_properties.state =
42 dictionary.SetDouble("TimeToFull", 100.f); 571 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING;
43 dictionary.SetDouble("Percentage", 1); 572 battery_bat0_properties.time_to_full = 100;
573 battery_bat0_properties.percentage = 1;
574 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
575 .ExpectConnectToSignalPropertyChanged();
44 576
45 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 577 StartBatteryStatusManagerLinux();
578 BatteryStatus status = last_battery_status();
579 EXPECT_LE(1, count_battery_updates());
46 580
47 EXPECT_TRUE(status.charging); 581 EXPECT_TRUE(status.charging);
48 EXPECT_EQ(100, status.charging_time); 582 EXPECT_EQ(100, status.charging_time);
49 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); 583 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
50 EXPECT_EQ(.01, status.level); 584 EXPECT_EQ(.01, status.level);
51 } 585 }
52 586
53 TEST(BatteryStatusManagerLinuxTest, FullyCharged) { 587 TEST_F(BatteryStatusManagerLinuxTest, FullyCharged) {
54 base::DictionaryValue dictionary; 588 MockBatteryProperties battery_bat0_properties;
55 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_FULL); 589 battery_bat0_properties.state = UPowerDeviceState::UPOWER_DEVICE_STATE_FULL;
56 dictionary.SetDouble("TimeToFull", 100); 590 battery_bat0_properties.time_to_full = 100;
57 dictionary.SetDouble("TimeToEmpty", 200); 591 battery_bat0_properties.time_to_empty = 200;
58 dictionary.SetDouble("Percentage", 100); 592 battery_bat0_properties.percentage = 100;
593 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
594 .ExpectConnectToSignalPropertyChanged();
59 595
60 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 596 StartBatteryStatusManagerLinux();
597 BatteryStatus status = last_battery_status();
598 EXPECT_LE(1, count_battery_updates());
61 599
62 EXPECT_TRUE(status.charging); 600 EXPECT_TRUE(status.charging);
63 EXPECT_EQ(0, status.charging_time); 601 EXPECT_EQ(0, status.charging_time);
64 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); 602 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
65 EXPECT_EQ(1, status.level); 603 EXPECT_EQ(1, status.level);
66 } 604 }
67 605
68 TEST(BatteryStatusManagerLinuxTest, Discharging) { 606 TEST_F(BatteryStatusManagerLinuxTest, Discharging) {
69 base::DictionaryValue dictionary; 607 MockBatteryProperties battery_bat0_properties;
70 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_DISCHARGING); 608 battery_bat0_properties.state =
71 dictionary.SetDouble("TimeToFull", 0); 609 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
72 dictionary.SetDouble("TimeToEmpty", 200); 610 battery_bat0_properties.time_to_full = 0;
73 dictionary.SetDouble("Percentage", 90); 611 battery_bat0_properties.time_to_empty = 200;
612 battery_bat0_properties.percentage = 90;
613 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
614 .ExpectConnectToSignalPropertyChanged();
74 615
75 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 616 StartBatteryStatusManagerLinux();
617 BatteryStatus status = last_battery_status();
618 EXPECT_LE(1, count_battery_updates());
76 619
77 EXPECT_FALSE(status.charging); 620 EXPECT_FALSE(status.charging);
78 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); 621 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
79 EXPECT_EQ(200, status.discharging_time); 622 EXPECT_EQ(200, status.discharging_time);
80 EXPECT_EQ(.9, status.level); 623 EXPECT_EQ(.9, status.level);
81 } 624 }
82 625
83 TEST(BatteryStatusManagerLinuxTest, DischargingTimeToEmptyUnknown) { 626 TEST_F(BatteryStatusManagerLinuxTest, DischargingTimeToEmptyUnknown) {
84 base::DictionaryValue dictionary; 627 MockBatteryProperties battery_bat0_properties;
85 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_DISCHARGING); 628 battery_bat0_properties.state =
86 dictionary.SetDouble("TimeToFull", 0); 629 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
87 dictionary.SetDouble("TimeToEmpty", 0); 630 battery_bat0_properties.time_to_full = 0;
88 dictionary.SetDouble("Percentage", 90); 631 battery_bat0_properties.time_to_empty = 0;
632 battery_bat0_properties.percentage = 90;
633 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
634 .ExpectConnectToSignalPropertyChanged();
89 635
90 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 636 StartBatteryStatusManagerLinux();
637 BatteryStatus status = last_battery_status();
638 EXPECT_LE(1, count_battery_updates());
91 639
92 EXPECT_FALSE(status.charging); 640 EXPECT_FALSE(status.charging);
93 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); 641 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
94 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); 642 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
95 EXPECT_EQ(.9, status.level); 643 EXPECT_EQ(.9, status.level);
96 } 644 }
97 645
98 TEST(BatteryStatusManagerLinuxTest, DeviceStateUnknown) { 646 TEST_F(BatteryStatusManagerLinuxTest, DeviceStateUnknown) {
99 base::DictionaryValue dictionary; 647 MockBatteryProperties battery_bat0_properties;
100 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_UNKNOWN); 648 battery_bat0_properties.state =
101 dictionary.SetDouble("TimeToFull", 0); 649 UPowerDeviceState::UPOWER_DEVICE_STATE_UNKNOWN;
102 dictionary.SetDouble("TimeToEmpty", 0); 650 battery_bat0_properties.time_to_full = 0;
103 dictionary.SetDouble("Percentage", 50); 651 battery_bat0_properties.time_to_empty = 0;
652 battery_bat0_properties.percentage = 50;
653 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
654 .ExpectConnectToSignalPropertyChanged();
104 655
105 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 656 StartBatteryStatusManagerLinux();
657 BatteryStatus status = last_battery_status();
658 EXPECT_LE(1, count_battery_updates());
106 659
107 EXPECT_TRUE(status.charging); 660 EXPECT_TRUE(status.charging);
108 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); 661 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
109 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); 662 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
110 EXPECT_EQ(.5, status.level); 663 EXPECT_EQ(.5, status.level);
111 } 664 }
112 665
113 TEST(BatteryStatusManagerLinuxTest, DeviceStateEmpty) { 666 TEST_F(BatteryStatusManagerLinuxTest, DeviceStateEmpty) {
114 base::DictionaryValue dictionary; 667 MockBatteryProperties battery_bat0_properties;
115 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_EMPTY); 668 battery_bat0_properties.state = UPowerDeviceState::UPOWER_DEVICE_STATE_EMPTY;
116 dictionary.SetDouble("TimeToFull", 0); 669 battery_bat0_properties.time_to_full = 0;
117 dictionary.SetDouble("TimeToEmpty", 0); 670 battery_bat0_properties.time_to_empty = 0;
118 dictionary.SetDouble("Percentage", 0); 671 battery_bat0_properties.percentage = 0;
672 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
673 .ExpectConnectToSignalPropertyChanged();
119 674
120 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 675 StartBatteryStatusManagerLinux();
676 BatteryStatus status = last_battery_status();
677 EXPECT_LE(1, count_battery_updates());
121 678
122 EXPECT_FALSE(status.charging); 679 EXPECT_FALSE(status.charging);
123 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); 680 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
124 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); 681 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
125 EXPECT_EQ(0, status.level); 682 EXPECT_EQ(0, status.level);
126 } 683 }
127 684
128 TEST(BatteryStatusManagerLinuxTest, LevelRoundedToThreeSignificantDigits) { 685 TEST_F(BatteryStatusManagerLinuxTest, LevelRoundedToThreeSignificantDigits) {
129 base::DictionaryValue dictionary; 686 MockBatteryProperties battery_bat0_properties;
130 dictionary.SetDouble("State", UPOWER_DEVICE_STATE_DISCHARGING); 687 battery_bat0_properties.state =
131 dictionary.SetDouble("Percentage", 14.56); 688 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
689 battery_bat0_properties.percentage = 14.56;
690 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
691 .ExpectConnectToSignalPropertyChanged();
132 692
133 BatteryStatus status = ComputeWebBatteryStatus(dictionary); 693 StartBatteryStatusManagerLinux();
694 BatteryStatus status = last_battery_status();
695 EXPECT_LE(1, count_battery_updates());
134 696
135 EXPECT_FALSE(status.charging); 697 EXPECT_FALSE(status.charging);
136 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time); 698 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
137 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time); 699 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
138 EXPECT_EQ(0.15, status.level); 700 EXPECT_EQ(0.15, status.level);
139 } 701 }
140 702
141 } // namespace 703 TEST_F(BatteryStatusManagerLinuxTest, UsingFirstBatteryDevice) {
704 MockBatteryProperties battery_bat0_properties;
705 battery_bat0_properties.state =
706 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
707 battery_bat0_properties.time_to_full = 0;
708 battery_bat0_properties.time_to_empty = 200;
709 battery_bat0_properties.percentage = 70;
710 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
711 .ExpectConnectToSignalPropertyChanged();
712
713 MockBatteryProperties battery_bat1_properties;
714 battery_bat1_properties.state =
715 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING;
716 battery_bat1_properties.time_to_full = 100;
717 battery_bat1_properties.time_to_empty = 0;
718 battery_bat1_properties.percentage = 80;
719 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties);
720
721 StartBatteryStatusManagerLinux();
722 BatteryStatus status = last_battery_status();
723 EXPECT_LE(1, count_battery_updates());
724
725 EXPECT_FALSE(status.charging);
726 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
727 EXPECT_EQ(200, status.discharging_time);
728 EXPECT_EQ(0.7, status.level);
729 }
730
731 TEST_F(BatteryStatusManagerLinuxTest, SkipNonBatteryDevice) {
732 MockBatteryProperties line_power_AC_properties;
733 line_power_AC_properties.type =
734 UPowerDeviceType::UPOWER_DEVICE_TYPE_LINE_POWER;
735 AddDeviceProxy(kUPowerDeviceACLinePath, &line_power_AC_properties);
736
737 MockBatteryProperties battery_bat0_properties;
738 battery_bat0_properties.state =
739 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
740 battery_bat0_properties.time_to_full = 0;
741 battery_bat0_properties.time_to_empty = 200;
742 battery_bat0_properties.percentage = 70;
743 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
744 .ExpectConnectToSignalPropertyChanged();
745
746 StartBatteryStatusManagerLinux();
747 BatteryStatus status = last_battery_status();
748 EXPECT_LE(1, count_battery_updates());
749
750 EXPECT_FALSE(status.charging);
751 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
752 EXPECT_EQ(200, status.discharging_time);
753 EXPECT_EQ(0.7, status.level);
754 }
755
756 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyState) {
757 MockBatteryProperties battery_bat0_properties;
758 battery_bat0_properties.state =
759 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING;
760 battery_bat0_properties.time_to_full = 100;
761 battery_bat0_properties.time_to_empty = 200;
762 battery_bat0_properties.percentage = 80;
763 MockBatteryObject& battery_bat0 =
764 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
765 .ExpectConnectToSignalPropertyChanged();
766
767 StartBatteryStatusManagerLinux();
768 BatteryStatus status = last_battery_status();
769 EXPECT_LE(1, count_battery_updates());
770
771 EXPECT_TRUE(status.charging);
772 EXPECT_EQ(100, status.charging_time);
773 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
774 EXPECT_EQ(.8, status.level);
775
776 int last_count = count_battery_updates();
777 battery_bat0_properties.state =
778 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
779 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyState);
780 status = last_battery_status();
781
782 EXPECT_LT(last_count, count_battery_updates());
783 EXPECT_FALSE(status.charging);
784 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
785 EXPECT_EQ(200, status.discharging_time);
786 EXPECT_EQ(.8, status.level);
787 }
788
789 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyPercentage) {
790 MockBatteryProperties battery_bat0_properties;
791 battery_bat0_properties.state =
792 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
793 battery_bat0_properties.time_to_full = 100;
794 battery_bat0_properties.time_to_empty = 200;
795 battery_bat0_properties.percentage = 80;
796 MockBatteryObject& battery_bat0 =
797 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
798 .ExpectConnectToSignalPropertyChanged();
799
800 StartBatteryStatusManagerLinux();
801 BatteryStatus status = last_battery_status();
802 EXPECT_LE(1, count_battery_updates());
803
804 EXPECT_FALSE(status.charging);
805 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
806 EXPECT_EQ(200, status.discharging_time);
807 EXPECT_EQ(.8, status.level);
808
809 int last_count = count_battery_updates();
810 battery_bat0_properties.percentage = 70;
811 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyPercentage);
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(.7, status.level);
819 }
820
821 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyTimeToEmpty) {
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.time_to_empty = 150;
843 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyTimeToEmpty);
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(150, status.discharging_time);
850 EXPECT_EQ(.8, status.level);
851 }
852
853 TEST_F(BatteryStatusManagerLinuxTest, UpdateDevicePropertyTimeToFull) {
854 MockBatteryProperties battery_bat0_properties;
855 battery_bat0_properties.state =
856 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING;
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_TRUE(status.charging);
869 EXPECT_EQ(100, status.charging_time);
870 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
871 EXPECT_EQ(.8, status.level);
872
873 int last_count = count_battery_updates();
874 battery_bat0_properties.time_to_full = 50;
875 DeviceSignalPropertyChanged(&battery_bat0, kUPowerDevicePropertyTimeToFull);
876 status = last_battery_status();
877
878 EXPECT_LT(last_count, count_battery_updates());
879 EXPECT_TRUE(status.charging);
880 EXPECT_EQ(50, status.charging_time);
881 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
882 EXPECT_EQ(.8, status.level);
883 }
884
885 TEST_F(BatteryStatusManagerLinuxTest, OldDaemonDeviceSignalChanged) {
886 mock_upower_.daemon_version = "0.9.23";
887
888 MockBatteryProperties battery_bat0_properties;
889 battery_bat0_properties.state =
890 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
891 battery_bat0_properties.time_to_full = 100;
892 battery_bat0_properties.time_to_empty = 200;
893 battery_bat0_properties.percentage = 80;
894 MockBatteryObject& battery_bat0 =
895 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
896 .ExpectConnectToSignalChanged()
897 .ExpectConnectToSignalPropertyChanged();
898
899 StartBatteryStatusManagerLinux();
900 BatteryStatus status = last_battery_status();
901 EXPECT_LE(1, count_battery_updates());
902
903 EXPECT_FALSE(status.charging);
904 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
905 EXPECT_EQ(200, status.discharging_time);
906 EXPECT_EQ(.8, status.level);
907
908 int last_count = count_battery_updates();
909 battery_bat0_properties.percentage = 70;
910 DeviceSignalChanged(&battery_bat0);
911 status = last_battery_status();
912
913 EXPECT_LT(last_count, count_battery_updates());
914 EXPECT_FALSE(status.charging);
915 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
916 EXPECT_EQ(200, status.discharging_time);
917 EXPECT_EQ(.7, status.level);
918 }
919
920 TEST_F(BatteryStatusManagerLinuxTest, DisplayDeviceNoBattery) {
921 MockBatteryProperties display_device_properties;
922 display_device_properties.type = UPowerDeviceType::UPOWER_DEVICE_TYPE_UNKNOWN;
923 SetUpDisplayDeviceProxy(&display_device_properties);
924
925 MockBatteryProperties battery_bat0_properties;
926 battery_bat0_properties.state =
927 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
928 battery_bat0_properties.time_to_full = 0;
929 battery_bat0_properties.time_to_empty = 200;
930 battery_bat0_properties.percentage = 90;
931 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
932 .ExpectConnectToSignalPropertyChanged();
933
934 StartBatteryStatusManagerLinux();
935 BatteryStatus status = last_battery_status();
936 EXPECT_LE(1, count_battery_updates());
937
938 EXPECT_FALSE(status.charging);
939 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
940 EXPECT_EQ(200, status.discharging_time);
941 EXPECT_EQ(0.9, status.level);
942 }
943
944 TEST_F(BatteryStatusManagerLinuxTest, DisplayDeviceBattery) {
945 MockBatteryProperties display_device_properties;
946 display_device_properties.state =
947 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
948 display_device_properties.time_to_full = 0;
949 display_device_properties.time_to_empty = 200;
950 display_device_properties.percentage = 90;
951 SetUpDisplayDeviceProxy(&display_device_properties)
952 .ExpectConnectToSignalPropertyChanged();
953
954 StartBatteryStatusManagerLinux();
955 BatteryStatus status = last_battery_status();
956 EXPECT_LE(1, count_battery_updates());
957
958 EXPECT_FALSE(status.charging);
959 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
960 EXPECT_EQ(200, status.discharging_time);
961 EXPECT_EQ(.9, status.level);
962 }
963
964 TEST_F(BatteryStatusManagerLinuxTest, DisplayDeviceBatterySkipsEnumerate) {
965 MockBatteryProperties display_device_properties;
966 display_device_properties.state =
967 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
968 display_device_properties.time_to_full = 0;
969 display_device_properties.time_to_empty = 200;
970 display_device_properties.percentage = 90;
971 SetUpDisplayDeviceProxy(&display_device_properties)
972 .ExpectConnectToSignalPropertyChanged();
973
974 AddDevicePath(kUPowerDeviceACLinePath);
975 AddDevicePath(kUPowerDeviceBattery0Path);
976 AddDevicePath(kUPowerDeviceBattery1Path);
977
978 StartBatteryStatusManagerLinux();
979 BatteryStatus status = last_battery_status();
980 EXPECT_LE(1, count_battery_updates());
981
982 EXPECT_FALSE(status.charging);
983 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
984 EXPECT_EQ(200, status.discharging_time);
985 EXPECT_EQ(.9, status.level);
986 }
987
988 // Adding a display-device will make the BatteryStatusManagerLinux switch to
989 // the display-device.
990 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedDisplayDevice) {
991 MockBatteryProperties battery_bat0_properties;
992 battery_bat0_properties.state =
993 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
994 battery_bat0_properties.time_to_full = 0;
995 battery_bat0_properties.time_to_empty = 200;
996 battery_bat0_properties.percentage = 70;
997 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
998 .ExpectConnectToSignalPropertyChanged();
999
1000 StartBatteryStatusManagerLinux();
1001 BatteryStatus status = last_battery_status();
1002 EXPECT_LE(1, count_battery_updates());
1003
1004 EXPECT_FALSE(status.charging);
1005 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1006 EXPECT_EQ(200, status.discharging_time);
1007 EXPECT_EQ(0.7, status.level);
1008
1009 int last_count = count_battery_updates();
1010 MockBatteryProperties display_device_properties;
1011 display_device_properties.state =
1012 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING;
1013 display_device_properties.time_to_full = 100;
1014 display_device_properties.time_to_empty = 150;
1015 display_device_properties.percentage = 80;
1016 SetUpDisplayDeviceProxy(&display_device_properties)
1017 .ExpectConnectToSignalPropertyChanged();
1018
1019 UPowerSignalDeviceAdded(mock_upower_.display_device);
1020 status = last_battery_status();
1021 EXPECT_LT(last_count, count_battery_updates());
1022
1023 EXPECT_TRUE(status.charging);
1024 EXPECT_EQ(100, status.charging_time);
1025 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
1026 EXPECT_EQ(0.8, status.level);
1027 }
1028
1029 // Prepending a battery should switch to that battery.
1030 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedBatteryAtFront) {
1031 MockBatteryProperties battery_bat1_properties;
1032 battery_bat1_properties.state =
1033 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
1034 battery_bat1_properties.time_to_full = 0;
1035 battery_bat1_properties.time_to_empty = 200;
1036 battery_bat1_properties.percentage = 70;
1037 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties)
1038 .ExpectConnectToSignalPropertyChanged();
1039
1040 StartBatteryStatusManagerLinux();
1041 BatteryStatus status = last_battery_status();
1042 EXPECT_LE(1, count_battery_updates());
1043
1044 EXPECT_FALSE(status.charging);
1045 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1046 EXPECT_EQ(200, status.discharging_time);
1047 EXPECT_EQ(0.7, status.level);
1048
1049 int last_count = count_battery_updates();
1050 MockBatteryProperties battery_bat0_properties;
1051 battery_bat0_properties.state =
1052 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
1053 battery_bat0_properties.time_to_full = 0;
1054 battery_bat0_properties.time_to_empty = 150;
1055 battery_bat0_properties.percentage = 50;
1056 PushFrontDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
1057 .ExpectConnectToSignalPropertyChanged();
1058 UPowerSignalDeviceAdded(kUPowerDeviceBattery0Path);
1059 status = last_battery_status();
1060 EXPECT_LT(last_count, count_battery_updates());
1061
1062 EXPECT_FALSE(status.charging);
1063 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1064 EXPECT_EQ(150, status.discharging_time);
1065 EXPECT_EQ(0.5, status.level);
1066 }
1067
1068 // Appending a battery should keep the current battery.
1069 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedBatteryAtBack) {
1070 MockBatteryProperties battery_bat0_properties;
1071 battery_bat0_properties.state =
1072 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
1073 battery_bat0_properties.time_to_full = 0;
1074 battery_bat0_properties.time_to_empty = 150;
1075 battery_bat0_properties.percentage = 50;
1076 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
1077 .ExpectConnectToSignalPropertyChanged();
1078
1079 StartBatteryStatusManagerLinux();
1080 BatteryStatus status = last_battery_status();
1081 EXPECT_LE(1, count_battery_updates());
1082
1083 EXPECT_FALSE(status.charging);
1084 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1085 EXPECT_EQ(150, status.discharging_time);
1086 EXPECT_EQ(0.5, status.level);
1087
1088 int last_count = count_battery_updates();
1089 MockBatteryProperties battery_bat1_properties;
1090 battery_bat1_properties.state =
1091 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
1092 battery_bat1_properties.time_to_full = 0;
1093 battery_bat1_properties.time_to_empty = 200;
1094 battery_bat1_properties.percentage = 70;
1095 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties);
1096 UPowerSignalDeviceAdded(kUPowerDeviceBattery1Path);
1097 status = last_battery_status();
1098 EXPECT_LT(last_count, count_battery_updates());
1099
1100 EXPECT_FALSE(status.charging);
1101 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1102 EXPECT_EQ(150, status.discharging_time);
1103 EXPECT_EQ(0.5, status.level);
1104 }
1105
1106 // Adding a device that is no battery should not change anything.
1107 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceAddedNoBattery) {
1108 MockBatteryProperties battery_bat0_properties;
1109 battery_bat0_properties.state =
1110 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
1111 battery_bat0_properties.time_to_full = 0;
1112 battery_bat0_properties.time_to_empty = 200;
1113 battery_bat0_properties.percentage = 70;
1114 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
1115 .ExpectConnectToSignalPropertyChanged();
1116
1117 StartBatteryStatusManagerLinux();
1118 BatteryStatus status = last_battery_status();
1119 EXPECT_LE(1, count_battery_updates());
1120
1121 EXPECT_FALSE(status.charging);
1122 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1123 EXPECT_EQ(200, status.discharging_time);
1124 EXPECT_EQ(0.7, status.level);
1125
1126 int last_count = count_battery_updates();
1127 MockBatteryProperties line_power_AC_properties;
1128 line_power_AC_properties.type =
1129 UPowerDeviceType::UPOWER_DEVICE_TYPE_LINE_POWER;
1130 PushFrontDeviceProxy(kUPowerDeviceACLinePath, &line_power_AC_properties);
1131 UPowerSignalDeviceAdded(kUPowerDeviceACLinePath);
1132 status = last_battery_status();
1133 EXPECT_LT(last_count, count_battery_updates());
1134
1135 EXPECT_FALSE(status.charging);
1136 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1137 EXPECT_EQ(200, status.discharging_time);
1138 EXPECT_EQ(0.7, status.level);
1139 }
1140
1141 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceRemovedBattery) {
1142 MockBatteryProperties battery_bat0_properties;
1143 battery_bat0_properties.state =
1144 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
1145 battery_bat0_properties.time_to_full = 0;
1146 battery_bat0_properties.time_to_empty = 200;
1147 battery_bat0_properties.percentage = 70;
1148 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
1149 .ExpectConnectToSignalPropertyChanged();
1150
1151 MockBatteryProperties battery_bat1_properties;
1152 battery_bat1_properties.state =
1153 UPowerDeviceState::UPOWER_DEVICE_STATE_CHARGING;
1154 battery_bat1_properties.time_to_full = 100;
1155 battery_bat1_properties.time_to_empty = 0;
1156 battery_bat1_properties.percentage = 80;
1157 MockBatteryObject& battery_bat1 =
1158 AddDeviceProxy(kUPowerDeviceBattery1Path, &battery_bat1_properties);
1159
1160 StartBatteryStatusManagerLinux();
1161 BatteryStatus status = last_battery_status();
1162 EXPECT_LE(1, count_battery_updates());
1163
1164 EXPECT_FALSE(status.charging);
1165 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1166 EXPECT_EQ(200, status.discharging_time);
1167 EXPECT_EQ(0.7, status.level);
1168
1169 int last_count = count_battery_updates();
1170 ExpectGetObjectProxy(kUPowerDeviceBattery1Path, &battery_bat1);
1171 battery_bat1.ExpectConnectToSignalPropertyChanged();
1172
1173 EXPECT_EQ(kUPowerDeviceBattery0Path, mock_upower_.devices.front());
1174 mock_upower_.devices.pop_front();
1175 UPowerSignalDeviceRemoved(kUPowerDeviceBattery0Path);
1176 status = last_battery_status();
1177 EXPECT_LT(last_count, count_battery_updates());
1178
1179 EXPECT_TRUE(status.charging);
1180 EXPECT_EQ(100, status.charging_time);
1181 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.discharging_time);
1182 EXPECT_EQ(0.8, status.level);
1183 }
1184
1185 TEST_F(BatteryStatusManagerLinuxTest, SignalDeviceRemovedOther) {
1186 MockBatteryProperties battery_bat0_properties;
1187 battery_bat0_properties.state =
1188 UPowerDeviceState::UPOWER_DEVICE_STATE_DISCHARGING;
1189 battery_bat0_properties.time_to_full = 0;
1190 battery_bat0_properties.time_to_empty = 200;
1191 battery_bat0_properties.percentage = 70;
1192 AddDeviceProxy(kUPowerDeviceBattery0Path, &battery_bat0_properties)
1193 .ExpectConnectToSignalPropertyChanged();
1194
1195 MockBatteryProperties line_power_AC_properties;
1196 line_power_AC_properties.type =
1197 UPowerDeviceType::UPOWER_DEVICE_TYPE_LINE_POWER;
1198 AddDeviceProxy(kUPowerDeviceACLinePath, &line_power_AC_properties);
1199
1200 StartBatteryStatusManagerLinux();
1201 BatteryStatus status = last_battery_status();
1202 EXPECT_LE(1, count_battery_updates());
1203
1204 EXPECT_FALSE(status.charging);
1205 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1206 EXPECT_EQ(200, status.discharging_time);
1207 EXPECT_EQ(0.7, status.level);
1208
1209 int last_count = count_battery_updates();
1210 mock_upower_.devices.pop_back();
1211 UPowerSignalDeviceRemoved(kUPowerDeviceACLinePath);
1212 status = last_battery_status();
1213 EXPECT_EQ(last_count, count_battery_updates());
1214
1215 EXPECT_FALSE(status.charging);
1216 EXPECT_EQ(std::numeric_limits<double>::infinity(), status.charging_time);
1217 EXPECT_EQ(200, status.discharging_time);
1218 EXPECT_EQ(0.7, status.level);
1219 }
142 1220
143 } // namespace device 1221 } // namespace device
OLDNEW
« no previous file with comments | « device/battery/battery_status_manager_linux-inl.h ('k') | device/device_tests.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698