OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. |
| 5 |
| 6 """ |
| 7 Unit tests for the contents of battery_utils.py |
| 8 """ |
| 9 |
| 10 # pylint: disable=W0613 |
| 11 |
| 12 import logging |
| 13 import os |
| 14 import sys |
| 15 import unittest |
| 16 |
| 17 from pylib import android_commands |
| 18 from pylib import constants |
| 19 from pylib.device import battery_utils |
| 20 from pylib.device import device_errors |
| 21 from pylib.device import device_utils |
| 22 from pylib.device import device_utils_test |
| 23 from pylib.utils import mock_calls |
| 24 |
| 25 # RunCommand from third_party/android_testrunner/run_command.py is mocked |
| 26 # below, so its path needs to be in sys.path. |
| 27 sys.path.append(os.path.join( |
| 28 constants.DIR_SOURCE_ROOT, 'third_party', 'android_testrunner')) |
| 29 |
| 30 sys.path.append(os.path.join( |
| 31 constants.DIR_SOURCE_ROOT, 'third_party', 'pymock')) |
| 32 import mock # pylint: disable=F0401 |
| 33 |
| 34 _DUMPSYS_OUTPUT = [ |
| 35 '9,0,i,uid,1000,test_package1', |
| 36 '9,0,i,uid,1001,test_package2', |
| 37 '9,1000,l,pwi,uid,1', |
| 38 '9,1001,l,pwi,uid,2' |
| 39 ] |
| 40 |
| 41 |
| 42 class BatteryUtilsTest(mock_calls.TestCase): |
| 43 |
| 44 def ShellError(self, output=None, status=1): |
| 45 def action(cmd, *args, **kwargs): |
| 46 raise device_errors.AdbShellCommandFailedError( |
| 47 cmd, output, status, str(self.device)) |
| 48 if output is None: |
| 49 output = 'Permission denied\n' |
| 50 return action |
| 51 |
| 52 def setUp(self): |
| 53 self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef') |
| 54 self.device = device_utils.DeviceUtils( |
| 55 self.adb, default_timeout=10, default_retries=0) |
| 56 self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial']) |
| 57 self.battery = battery_utils.BatteryUtils( |
| 58 self.device, default_timeout=10, default_retries=0) |
| 59 |
| 60 |
| 61 class BatteryUtilsInitTest(unittest.TestCase): |
| 62 |
| 63 def testInitWithDeviceUtil(self): |
| 64 serial = '0fedcba987654321' |
| 65 a = android_commands.AndroidCommands(device=serial) |
| 66 d = device_utils.DeviceUtils(a) |
| 67 b = battery_utils.BatteryUtils(d) |
| 68 self.assertEqual(d, b._device) |
| 69 |
| 70 def testInitWithMissing_fails(self): |
| 71 with self.assertRaises(TypeError): |
| 72 battery_utils.BatteryUtils(None) |
| 73 with self.assertRaises(TypeError): |
| 74 battery_utils.BatteryUtils('') |
| 75 |
| 76 |
| 77 class BatteryUtilsSetChargingTest(BatteryUtilsTest): |
| 78 |
| 79 @mock.patch('time.sleep', mock.Mock()) |
| 80 def testSetCharging_enabled(self): |
| 81 with self.assertCalls( |
| 82 (self.call.device.FileExists(mock.ANY), True), |
| 83 (self.call.device.RunShellCommand(mock.ANY, check_return=True), []), |
| 84 (self.call.battery.GetCharging(), False), |
| 85 (self.call.device.RunShellCommand(mock.ANY, check_return=True), []), |
| 86 (self.call.battery.GetCharging(), True)): |
| 87 self.battery.SetCharging(True) |
| 88 |
| 89 def testSetCharging_alreadyEnabled(self): |
| 90 with self.assertCalls( |
| 91 (self.call.device.FileExists(mock.ANY), True), |
| 92 (self.call.device.RunShellCommand(mock.ANY, check_return=True), []), |
| 93 (self.call.battery.GetCharging(), True)): |
| 94 self.battery.SetCharging(True) |
| 95 |
| 96 @mock.patch('time.sleep', mock.Mock()) |
| 97 def testSetCharging_disabled(self): |
| 98 with self.assertCalls( |
| 99 (self.call.device.FileExists(mock.ANY), True), |
| 100 (self.call.device.RunShellCommand(mock.ANY, check_return=True), []), |
| 101 (self.call.battery.GetCharging(), True), |
| 102 (self.call.device.RunShellCommand(mock.ANY, check_return=True), []), |
| 103 (self.call.battery.GetCharging(), False)): |
| 104 self.battery.SetCharging(False) |
| 105 |
| 106 |
| 107 class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest): |
| 108 |
| 109 def testBatteryMeasurement(self): |
| 110 with self.assertCalls( |
| 111 (self.call.device.RunShellCommand( |
| 112 mock.ANY, retries=0, single_line=True, |
| 113 timeout=10, check_return=True), '22'), |
| 114 (self.call.device.RunShellCommand( |
| 115 ['dumpsys', 'battery', 'reset'], check_return=True), []), |
| 116 (self.call.device.RunShellCommand( |
| 117 ['dumpsys', 'batterystats', '--reset'], check_return=True), []), |
| 118 (self.call.device.RunShellCommand( |
| 119 ['dumpsys', 'batterystats', '--charged', '--checkin'], |
| 120 check_return=True), []), |
| 121 (self.call.device.RunShellCommand( |
| 122 ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []), |
| 123 (self.call.device.RunShellCommand( |
| 124 ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []), |
| 125 (self.call.battery.GetCharging(), False), |
| 126 (self.call.device.RunShellCommand( |
| 127 ['dumpsys', 'battery', 'reset'], check_return=True), []), |
| 128 (self.call.battery.GetCharging(), True)): |
| 129 with self.battery.BatteryMeasurement(): |
| 130 pass |
| 131 |
| 132 |
| 133 class BatteryUtilsGetPowerData(BatteryUtilsTest): |
| 134 |
| 135 def testGetPowerData(self): |
| 136 with self.assertCalls( |
| 137 (self.call.device.RunShellCommand( |
| 138 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 139 _DUMPSYS_OUTPUT)): |
| 140 data = self.battery.GetPowerData() |
| 141 check = { |
| 142 'test_package1': {'uid': '1000', 'data': [1.0]}, |
| 143 'test_package2': {'uid': '1001', 'data': [2.0]} |
| 144 } |
| 145 self.assertEqual(data, check) |
| 146 |
| 147 def testGetPowerData_packageCollisionSame(self): |
| 148 self.battery._cache['uids'] = {'test_package1': '1000'} |
| 149 with self.assertCall( |
| 150 self.call.device.RunShellCommand( |
| 151 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 152 _DUMPSYS_OUTPUT): |
| 153 data = self.battery.GetPowerData() |
| 154 check = { |
| 155 'test_package1': {'uid': '1000', 'data': [1.0]}, |
| 156 'test_package2': {'uid': '1001', 'data': [2.0]} |
| 157 } |
| 158 self.assertEqual(data, check) |
| 159 |
| 160 def testGetPowerData_packageCollisionDifferent(self): |
| 161 self.battery._cache['uids'] = {'test_package1': '1'} |
| 162 with self.assertCall( |
| 163 self.call.device.RunShellCommand( |
| 164 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 165 _DUMPSYS_OUTPUT): |
| 166 with self.assertRaises(device_errors.CommandFailedError): |
| 167 self.battery.GetPowerData() |
| 168 |
| 169 def testGetPowerData_cacheCleared(self): |
| 170 with self.assertCalls( |
| 171 (self.call.device.RunShellCommand( |
| 172 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 173 _DUMPSYS_OUTPUT)): |
| 174 self.battery._cache.clear() |
| 175 data = self.battery.GetPowerData() |
| 176 check = { |
| 177 'test_package1': {'uid': '1000', 'data': [1.0]}, |
| 178 'test_package2': {'uid': '1001', 'data': [2.0]} |
| 179 } |
| 180 self.assertEqual(data, check) |
| 181 |
| 182 def testGetPackagePowerData(self): |
| 183 with self.assertCalls( |
| 184 (self.call.device.RunShellCommand( |
| 185 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 186 _DUMPSYS_OUTPUT)): |
| 187 data = self.battery.GetPackagePowerData('test_package2') |
| 188 self.assertEqual(data, {'uid': '1001', 'data': [2.0]}) |
| 189 |
| 190 def testGetPackagePowerData_badPackage(self): |
| 191 with self.assertCalls( |
| 192 (self.call.device.RunShellCommand( |
| 193 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 194 _DUMPSYS_OUTPUT)): |
| 195 data = self.battery.GetPackagePowerData('not_a_package') |
| 196 self.assertEqual(data, None) |
| 197 |
| 198 |
| 199 class BatteryUtilsChargeDevice(BatteryUtilsTest): |
| 200 |
| 201 @mock.patch('time.sleep', mock.Mock()) |
| 202 def testChargeDeviceToLevel(self): |
| 203 with self.assertCalls( |
| 204 (self.call.battery.SetCharging(True)), |
| 205 (self.call.battery.GetBatteryInfo(), {'level': '50'}), |
| 206 (self.call.battery.GetBatteryInfo(), {'level': '100'})): |
| 207 self.battery.ChargeDeviceToLevel(95) |
| 208 |
| 209 |
| 210 class DeviceUtilsGetBatteryInfoTest(BatteryUtilsTest): |
| 211 |
| 212 def testGetBatteryInfo_normal(self): |
| 213 with self.assertCall( |
| 214 self.call.device.RunShellCommand( |
| 215 ['dumpsys', 'battery'], check_return=True), |
| 216 [ |
| 217 'Current Battery Service state:', |
| 218 ' AC powered: false', |
| 219 ' USB powered: true', |
| 220 ' level: 100', |
| 221 ' temperature: 321', |
| 222 ]): |
| 223 self.assertEquals( |
| 224 { |
| 225 'AC powered': 'false', |
| 226 'USB powered': 'true', |
| 227 'level': '100', |
| 228 'temperature': '321', |
| 229 }, |
| 230 self.battery.GetBatteryInfo()) |
| 231 |
| 232 def testGetBatteryInfo_nothing(self): |
| 233 with self.assertCall( |
| 234 self.call.device.RunShellCommand( |
| 235 ['dumpsys', 'battery'], check_return=True), []): |
| 236 self.assertEquals({}, self.battery.GetBatteryInfo()) |
| 237 |
| 238 |
| 239 class DeviceUtilsGetChargingTest(BatteryUtilsTest): |
| 240 |
| 241 def testGetCharging_usb(self): |
| 242 with self.assertCall( |
| 243 self.call.battery.GetBatteryInfo(), {'USB powered': 'true'}): |
| 244 self.assertTrue(self.battery.GetCharging()) |
| 245 |
| 246 def testGetCharging_usbFalse(self): |
| 247 with self.assertCall( |
| 248 self.call.battery.GetBatteryInfo(), {'USB powered': 'false'}): |
| 249 self.assertFalse(self.battery.GetCharging()) |
| 250 |
| 251 def testGetCharging_ac(self): |
| 252 with self.assertCall( |
| 253 self.call.battery.GetBatteryInfo(), {'AC powered': 'true'}): |
| 254 self.assertTrue(self.battery.GetCharging()) |
| 255 |
| 256 def testGetCharging_wireless(self): |
| 257 with self.assertCall( |
| 258 self.call.battery.GetBatteryInfo(), {'Wireless powered': 'true'}): |
| 259 self.assertTrue(self.battery.GetCharging()) |
| 260 |
| 261 def testGetCharging_unknown(self): |
| 262 with self.assertCall( |
| 263 self.call.battery.GetBatteryInfo(), {'level': '42'}): |
| 264 self.assertFalse(self.battery.GetCharging()) |
| 265 |
| 266 |
| 267 class DeviceUtilsGetNetworkDataTest(BatteryUtilsTest): |
| 268 |
| 269 def testGetNetworkData_noDataUsage(self): |
| 270 with self.assertCalls( |
| 271 (self.call.device.RunShellCommand( |
| 272 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 273 _DUMPSYS_OUTPUT), |
| 274 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), |
| 275 self.ShellError()), |
| 276 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), |
| 277 self.ShellError())): |
| 278 self.assertEquals(self.battery.GetNetworkData('test_package1'), (0, 0)) |
| 279 |
| 280 def testGetNetworkData_badPackage(self): |
| 281 with self.assertCall( |
| 282 self.call.device.RunShellCommand( |
| 283 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 284 _DUMPSYS_OUTPUT): |
| 285 self.assertEqual(self.battery.GetNetworkData('asdf'), None) |
| 286 |
| 287 def testGetNetworkData_packageNotCached(self): |
| 288 with self.assertCalls( |
| 289 (self.call.device.RunShellCommand( |
| 290 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 291 _DUMPSYS_OUTPUT), |
| 292 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), |
| 293 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): |
| 294 self.assertEqual(self.battery.GetNetworkData('test_package1'), (1,2)) |
| 295 |
| 296 def testGetNetworkData_packageCached(self): |
| 297 self.battery._cache['uids'] = {'test_package1': '1000'} |
| 298 with self.assertCalls( |
| 299 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), |
| 300 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): |
| 301 self.assertEqual(self.battery.GetNetworkData('test_package1'), (1,2)) |
| 302 |
| 303 def testGetNetworkData_clearedCache(self): |
| 304 with self.assertCalls( |
| 305 (self.call.device.RunShellCommand( |
| 306 ['dumpsys', 'batterystats', '-c'], check_return=True), |
| 307 _DUMPSYS_OUTPUT), |
| 308 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1), |
| 309 (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)): |
| 310 self.battery._cache.clear() |
| 311 self.assertEqual(self.battery.GetNetworkData('test_package1'), (1,2)) |
| 312 |
| 313 |
| 314 if __name__ == '__main__': |
| 315 logging.getLogger().setLevel(logging.DEBUG) |
| 316 unittest.main(verbosity=2) |
OLD | NEW |