OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "device/battery/battery_monitor_impl.h" |
| 6 |
| 7 #include <utility> |
| 8 |
| 9 #include "base/macros.h" |
| 10 #include "base/run_loop.h" |
| 11 #include "base/threading/thread_task_runner_handle.h" |
| 12 #include "device/battery/battery_monitor.mojom.h" |
| 13 #include "device/battery/battery_status_manager.h" |
| 14 #include "device/battery/battery_status_service.h" |
| 15 #include "services/device/device_service_test_base.h" |
| 16 #include "services/device/public/interfaces/constants.mojom.h" |
| 17 |
| 18 // These tests run against the implementation of the BatteryMonitor interface |
| 19 // inside Device Service, with a dummy BatteryManager set as a source of the |
| 20 // battery information. They can be run only on platforms that use the default |
| 21 // battery service implementation, ie. on the platforms where |
| 22 // BatteryStatusService is used. |
| 23 |
| 24 namespace device { |
| 25 |
| 26 namespace { |
| 27 |
| 28 void ExpectBatteryStatus(bool* out_called, |
| 29 const mojom::BatteryStatus& expected, |
| 30 const base::Closure& quit_closure, |
| 31 mojom::BatteryStatusPtr status) { |
| 32 if (out_called) |
| 33 *out_called = true; |
| 34 EXPECT_EQ(expected.charging, status->charging); |
| 35 EXPECT_EQ(expected.charging_time, status->charging_time); |
| 36 EXPECT_EQ(expected.discharging_time, status->discharging_time); |
| 37 EXPECT_EQ(expected.level, status->level); |
| 38 quit_closure.Run(); |
| 39 } |
| 40 |
| 41 class FakeBatteryManager : public BatteryStatusManager { |
| 42 public: |
| 43 explicit FakeBatteryManager( |
| 44 const BatteryStatusService::BatteryUpdateCallback& callback) |
| 45 : callback_(callback), battery_status_available_(true), started_(false) {} |
| 46 ~FakeBatteryManager() override {} |
| 47 |
| 48 // Methods from BatteryStatusManager. |
| 49 bool StartListeningBatteryChange() override { |
| 50 started_ = true; |
| 51 if (battery_status_available_) |
| 52 InvokeUpdateCallback(); |
| 53 return battery_status_available_; |
| 54 } |
| 55 |
| 56 void StopListeningBatteryChange() override {} |
| 57 |
| 58 void InvokeUpdateCallback() { |
| 59 // Invoke asynchronously to mimic the OS-specific battery managers. |
| 60 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 61 FROM_HERE, base::Bind(callback_, status_)); |
| 62 } |
| 63 |
| 64 void set_battery_status(const mojom::BatteryStatus& status) { |
| 65 status_ = status; |
| 66 } |
| 67 |
| 68 void set_battery_status_available(bool value) { |
| 69 battery_status_available_ = value; |
| 70 } |
| 71 |
| 72 bool started() { return started_; } |
| 73 |
| 74 private: |
| 75 BatteryStatusService::BatteryUpdateCallback callback_; |
| 76 bool battery_status_available_; |
| 77 bool started_; |
| 78 mojom::BatteryStatus status_; |
| 79 |
| 80 DISALLOW_COPY_AND_ASSIGN(FakeBatteryManager); |
| 81 }; |
| 82 |
| 83 class BatteryMonitorImplTest : public DeviceServiceTestBase { |
| 84 public: |
| 85 BatteryMonitorImplTest() = default; |
| 86 ~BatteryMonitorImplTest() override = default; |
| 87 |
| 88 protected: |
| 89 void SetUp() override { |
| 90 DeviceServiceTestBase::SetUp(); |
| 91 |
| 92 BatteryStatusService* battery_service = BatteryStatusService::GetInstance(); |
| 93 std::unique_ptr<FakeBatteryManager> battery_manager( |
| 94 new FakeBatteryManager(battery_service->GetUpdateCallbackForTesting())); |
| 95 battery_manager_ = battery_manager.get(); |
| 96 battery_service->SetBatteryManagerForTesting(std::move(battery_manager)); |
| 97 |
| 98 connector()->BindInterface(mojom::kServiceName, &battery_monitor_); |
| 99 } |
| 100 |
| 101 void TearDown() override { |
| 102 battery_monitor_.reset(); |
| 103 // Enforce BatteryMonitorImpl destruction to run before Device Service |
| 104 // destruction shutting down battery status service, thus the |
| 105 // BatteryMonitorImpl instance can detach from battery status service |
| 106 // completely. |
| 107 base::RunLoop().RunUntilIdle(); |
| 108 } |
| 109 |
| 110 FakeBatteryManager* battery_manager() { return battery_manager_; } |
| 111 |
| 112 mojom::BatteryMonitorPtr battery_monitor_; |
| 113 |
| 114 private: |
| 115 FakeBatteryManager* battery_manager_; |
| 116 |
| 117 DISALLOW_COPY_AND_ASSIGN(BatteryMonitorImplTest); |
| 118 }; |
| 119 |
| 120 TEST_F(BatteryMonitorImplTest, BatteryManagerDefaultValues) { |
| 121 // Set the fake battery manager to return false on start. Verify that the |
| 122 // default battery values will be returned to consumers of Device Service. |
| 123 battery_manager()->set_battery_status_available(false); |
| 124 |
| 125 mojom::BatteryStatus default_status; |
| 126 default_status.charging = true; |
| 127 default_status.charging_time = 0; |
| 128 default_status.discharging_time = std::numeric_limits<double>::infinity(); |
| 129 default_status.level = 1.0; |
| 130 base::RunLoop run_loop; |
| 131 battery_monitor_->QueryNextStatus(base::Bind( |
| 132 &ExpectBatteryStatus, nullptr, default_status, run_loop.QuitClosure())); |
| 133 run_loop.Run(); |
| 134 EXPECT_TRUE(battery_manager()->started()); |
| 135 } |
| 136 |
| 137 TEST_F(BatteryMonitorImplTest, BatteryManagerPredefinedValues) { |
| 138 // Set the fake battery manager to return predefined battery status values. |
| 139 // Verify that the predefined values will be returned to consumers of Device |
| 140 // Service. |
| 141 mojom::BatteryStatus status; |
| 142 status.charging = true; |
| 143 status.charging_time = 100; |
| 144 status.discharging_time = std::numeric_limits<double>::infinity(); |
| 145 status.level = 0.5; |
| 146 battery_manager()->set_battery_status(status); |
| 147 |
| 148 base::RunLoop run_loop; |
| 149 battery_monitor_->QueryNextStatus(base::Bind(&ExpectBatteryStatus, nullptr, |
| 150 status, run_loop.QuitClosure())); |
| 151 run_loop.Run(); |
| 152 EXPECT_TRUE(battery_manager()->started()); |
| 153 } |
| 154 |
| 155 TEST_F(BatteryMonitorImplTest, BatteryManagerInvokeUpdate) { |
| 156 // Set the fake battery manager to return predefined battery status values, |
| 157 // after queried the battery status first time, query again, the second time |
| 158 // query will be pending, and then we change battery level to 0.6 and invoke |
| 159 // update. Verify that the second query will get the new level 0.6 correctly. |
| 160 mojom::BatteryStatus status; |
| 161 status.charging = true; |
| 162 status.charging_time = 100; |
| 163 status.discharging_time = std::numeric_limits<double>::infinity(); |
| 164 status.level = 0.5; |
| 165 battery_manager()->set_battery_status(status); |
| 166 |
| 167 // The first time query should succeed. |
| 168 base::RunLoop run_loop1; |
| 169 battery_monitor_->QueryNextStatus(base::Bind( |
| 170 &ExpectBatteryStatus, nullptr, status, run_loop1.QuitClosure())); |
| 171 run_loop1.Run(); |
| 172 EXPECT_TRUE(battery_manager()->started()); |
| 173 |
| 174 // The second time query should be pending. |
| 175 bool called = false; |
| 176 status.level = 0.6; |
| 177 base::RunLoop run_loop2; |
| 178 battery_monitor_->QueryNextStatus(base::Bind( |
| 179 &ExpectBatteryStatus, &called, status, run_loop2.QuitClosure())); |
| 180 base::RunLoop().RunUntilIdle(); |
| 181 EXPECT_FALSE(called); |
| 182 |
| 183 // InvokeUpdateCallback should fire the pending query correctly. |
| 184 battery_manager()->set_battery_status(status); |
| 185 battery_manager()->InvokeUpdateCallback(); |
| 186 run_loop2.Run(); |
| 187 EXPECT_TRUE(called); |
| 188 } |
| 189 |
| 190 } // namespace |
| 191 |
| 192 } // namespace device |
OLD | NEW |