#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
Unit tests for the contents of battery_utils.py
"""

# pylint: disable=protected-access,unused-argument

import logging
import unittest

from devil import devil_env
from devil.android import battery_utils
from devil.android import device_errors
from devil.android import device_utils
from devil.android import device_utils_test
from devil.utils import mock_calls

with devil_env.SysPath(devil_env.PYMOCK_PATH):
  import mock  # pylint: disable=import-error

_DUMPSYS_OUTPUT = [
    '9,0,i,uid,1000,test_package1',
    '9,0,i,uid,1001,test_package2',
    '9,1000,l,pwi,uid,1',
    '9,1001,l,pwi,uid,2',
    '9,0,l,pws,1728,2000,190,207',
]


class BatteryUtilsTest(mock_calls.TestCase):

  _NEXUS_5 = {
    'name': 'Nexus 5',
    'witness_file': '/sys/kernel/debug/bq24192/INPUT_SRC_CONT',
    'enable_command': (
        'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
        'echo 1 > /sys/class/power_supply/usb/online'),
    'disable_command': (
        'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
        'chmod 644 /sys/class/power_supply/usb/online && '
        'echo 0 > /sys/class/power_supply/usb/online'),
    'charge_counter': None,
    'voltage': None,
    'current': None,
  }

  _NEXUS_6 = {
    'name': 'Nexus 6',
    'witness_file': None,
    'enable_command': None,
    'disable_command': None,
    'charge_counter': (
        '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
    'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
    'current': '/sys/class/power_supply/max170xx_battery/current_now',
  }

  _NEXUS_10 = {
    'name': 'Nexus 10',
    'witness_file': None,
    'enable_command': None,
    'disable_command': None,
    'charge_counter': (
        '/sys/class/power_supply/ds2784-fuelgauge/charge_counter_ext'),
    'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
    'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
  }

  def ShellError(self, output=None, status=1):
    def action(cmd, *args, **kwargs):
      raise device_errors.AdbShellCommandFailedError(
          cmd, output, status, str(self.device))
    if output is None:
      output = 'Permission denied\n'
    return action

  def setUp(self):
    self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef')
    self.device = device_utils.DeviceUtils(
        self.adb, default_timeout=10, default_retries=0)
    self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
    self.battery = battery_utils.BatteryUtils(
        self.device, default_timeout=10, default_retries=0)


class BatteryUtilsInitTest(unittest.TestCase):

  def testInitWithDeviceUtil(self):
    serial = '0fedcba987654321'
    d = device_utils.DeviceUtils(serial)
    b = battery_utils.BatteryUtils(d)
    self.assertEqual(d, b._device)

  def testInitWithMissing_fails(self):
    with self.assertRaises(TypeError):
      battery_utils.BatteryUtils(None)
    with self.assertRaises(TypeError):
      battery_utils.BatteryUtils('')


class BatteryUtilsSetChargingTest(BatteryUtilsTest):

  @mock.patch('time.sleep', mock.Mock())
  def testHardwareSetCharging_enabled(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.device.RunShellCommand(
            mock.ANY, shell=True, check_return=True, as_root=True,
            large_output=True), []),
        (self.call.battery.GetCharging(), False),
        (self.call.battery.GetCharging(), True)):
      self.battery._HardwareSetCharging(True)

  def testHardwareSetCharging_alreadyEnabled(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.device.RunShellCommand(
            mock.ANY, shell=True, check_return=True, as_root=True,
            large_output=True), []),
        (self.call.battery.GetCharging(), True)):
      self.battery._HardwareSetCharging(True)

  @mock.patch('time.sleep', mock.Mock())
  def testHardwareSetCharging_disabled(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.device.RunShellCommand(
            mock.ANY, shell=True, check_return=True, as_root=True,
            large_output=True), []),
        (self.call.battery.GetCharging(), True),
        (self.call.battery.GetCharging(), False)):
      self.battery._HardwareSetCharging(False)


class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest):

  @mock.patch('time.sleep', mock.Mock())
  def testBatteryMeasurementWifi(self):
    with self.patch_call(self.call.device.build_version_sdk,
                         return_value=22):
      with self.assertCalls(
          (self.call.battery._ClearPowerData(), True),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
           []),
          (self.call.battery.GetCharging(), False),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'reset'], check_return=True), []),
          (self.call.battery.GetCharging(), False),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
          (self.call.battery.GetCharging(), False),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery'], check_return=True), [])):
        with self.battery.BatteryMeasurement():
          pass

  @mock.patch('time.sleep', mock.Mock())
  def testBatteryMeasurementUsb(self):
    with self.patch_call(self.call.device.build_version_sdk,
                         return_value=22):
      with self.assertCalls(
          (self.call.battery._ClearPowerData(), True),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
           []),
          (self.call.battery.GetCharging(), False),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'reset'], check_return=True), []),
          (self.call.battery.GetCharging(), False),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
          (self.call.battery.GetCharging(), True)):
        with self.battery.BatteryMeasurement():
          pass


class BatteryUtilsGetPowerData(BatteryUtilsTest):

  def testGetPowerData(self):
    with self.assertCalls(
        (self.call.device.RunShellCommand(
            ['dumpsys', 'batterystats', '-c'],
            check_return=True, large_output=True),
         _DUMPSYS_OUTPUT)):
      data = self.battery.GetPowerData()
      check = {
        'system_total': 2000.0,
        'per_package': {
          'test_package1': {'uid': '1000', 'data': [1.0]},
          'test_package2': {'uid': '1001', 'data': [2.0]}
        }
      }
      self.assertEqual(data, check)

  def testGetPowerData_packageCollisionSame(self):
    self.battery._cache['uids'] = {'test_package1': '1000'}
    with self.assertCall(
        self.call.device.RunShellCommand(
            ['dumpsys', 'batterystats', '-c'],
            check_return=True, large_output=True),
        _DUMPSYS_OUTPUT):
      data = self.battery.GetPowerData()
      check = {
        'system_total': 2000.0,
        'per_package': {
          'test_package1': {'uid': '1000', 'data': [1.0]},
          'test_package2': {'uid': '1001', 'data': [2.0]}
        }
      }
      self.assertEqual(data, check)

  def testGetPowerData_packageCollisionDifferent(self):
    self.battery._cache['uids'] = {'test_package1': '1'}
    with self.assertCall(
        self.call.device.RunShellCommand(
            ['dumpsys', 'batterystats', '-c'],
            check_return=True, large_output=True),
        _DUMPSYS_OUTPUT):
      with self.assertRaises(device_errors.CommandFailedError):
        self.battery.GetPowerData()

  def testGetPowerData_cacheCleared(self):
    with self.assertCalls(
        (self.call.device.RunShellCommand(
            ['dumpsys', 'batterystats', '-c'],
            check_return=True, large_output=True),
         _DUMPSYS_OUTPUT)):
      self.battery._cache.clear()
      data = self.battery.GetPowerData()
      check = {
        'system_total': 2000.0,
        'per_package': {
          'test_package1': {'uid': '1000', 'data': [1.0]},
          'test_package2': {'uid': '1001', 'data': [2.0]}
        }
      }
      self.assertEqual(data, check)


class BatteryUtilsChargeDevice(BatteryUtilsTest):

  @mock.patch('time.sleep', mock.Mock())
  def testChargeDeviceToLevel_pass(self):
    with self.assertCalls(
        (self.call.battery.SetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
      self.battery.ChargeDeviceToLevel(95)

  @mock.patch('time.sleep', mock.Mock())
  def testChargeDeviceToLevel_failureSame(self):
    with self.assertCalls(
        (self.call.battery.SetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
        (self.call.battery.GetBatteryInfo(), {'level': '50'}),

        (self.call.battery.GetBatteryInfo(), {'level': '50'})):
      with self.assertRaises(device_errors.DeviceChargingError):
        old_max = battery_utils._MAX_CHARGE_ERROR
        try:
          battery_utils._MAX_CHARGE_ERROR = 2
          self.battery.ChargeDeviceToLevel(95)
        finally:
          battery_utils._MAX_CHARGE_ERROR = old_max

  @mock.patch('time.sleep', mock.Mock())
  def testChargeDeviceToLevel_failureDischarge(self):
    with self.assertCalls(
        (self.call.battery.SetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '50'}),
        (self.call.battery.GetBatteryInfo(), {'level': '49'}),
        (self.call.battery.GetBatteryInfo(), {'level': '48'})):
      with self.assertRaises(device_errors.DeviceChargingError):
        old_max = battery_utils._MAX_CHARGE_ERROR
        try:
          battery_utils._MAX_CHARGE_ERROR = 2
          self.battery.ChargeDeviceToLevel(95)
        finally:
          battery_utils._MAX_CHARGE_ERROR = old_max


class BatteryUtilsDischargeDevice(BatteryUtilsTest):

  @mock.patch('time.sleep', mock.Mock())
  def testDischargeDevice_exact(self):
    with self.assertCalls(
        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
        (self.call.battery._HardwareSetCharging(False)),
        (self.call.battery._HardwareSetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '99'})):
      self.battery._DischargeDevice(1)

  @mock.patch('time.sleep', mock.Mock())
  def testDischargeDevice_over(self):
    with self.assertCalls(
        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
        (self.call.battery._HardwareSetCharging(False)),
        (self.call.battery._HardwareSetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '50'})):
      self.battery._DischargeDevice(1)

  @mock.patch('time.sleep', mock.Mock())
  def testDischargeDevice_takeslong(self):
    with self.assertCalls(
        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
        (self.call.battery._HardwareSetCharging(False)),
        (self.call.battery._HardwareSetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '100'}),
        (self.call.battery._HardwareSetCharging(False)),
        (self.call.battery._HardwareSetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '99'}),
        (self.call.battery._HardwareSetCharging(False)),
        (self.call.battery._HardwareSetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '98'}),
        (self.call.battery._HardwareSetCharging(False)),
        (self.call.battery._HardwareSetCharging(True)),
        (self.call.battery.GetBatteryInfo(), {'level': '97'})):
      self.battery._DischargeDevice(3)

  @mock.patch('time.sleep', mock.Mock())
  def testDischargeDevice_dischargeTooClose(self):
    with self.assertCalls(
        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
      self.battery._DischargeDevice(99)

  @mock.patch('time.sleep', mock.Mock())
  def testDischargeDevice_percentageOutOfBounds(self):
    with self.assertCalls(
        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
      with self.assertRaises(ValueError):
        self.battery._DischargeDevice(100)
    with self.assertCalls(
        (self.call.battery.GetBatteryInfo(), {'level': '100'})):
      with self.assertRaises(ValueError):
        self.battery._DischargeDevice(0)


class BatteryUtilsGetBatteryInfoTest(BatteryUtilsTest):

  def testGetBatteryInfo_normal(self):
    with self.assertCalls(
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery'], check_return=True),
        [
          'Current Battery Service state:',
          '  AC powered: false',
          '  USB powered: true',
          '  level: 100',
          '  temperature: 321',
        ])):
      self.assertEquals(
          {
            'AC powered': 'false',
            'USB powered': 'true',
            'level': '100',
            'temperature': '321',
          },
          self.battery.GetBatteryInfo())

  def testGetBatteryInfo_nothing(self):
    with self.assertCalls(
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery'], check_return=True), [])):
      self.assertEquals({}, self.battery.GetBatteryInfo())


class BatteryUtilsGetChargingTest(BatteryUtilsTest):

  def testGetCharging_usb(self):
    with self.assertCall(
        self.call.battery.GetBatteryInfo(), {'USB powered': 'true'}):
      self.assertTrue(self.battery.GetCharging())

  def testGetCharging_usbFalse(self):
    with self.assertCall(
        self.call.battery.GetBatteryInfo(), {'USB powered': 'false'}):
      self.assertFalse(self.battery.GetCharging())

  def testGetCharging_ac(self):
    with self.assertCall(
        self.call.battery.GetBatteryInfo(), {'AC powered': 'true'}):
      self.assertTrue(self.battery.GetCharging())

  def testGetCharging_wireless(self):
    with self.assertCall(
        self.call.battery.GetBatteryInfo(), {'Wireless powered': 'true'}):
      self.assertTrue(self.battery.GetCharging())

  def testGetCharging_unknown(self):
    with self.assertCall(
        self.call.battery.GetBatteryInfo(), {'level': '42'}):
      self.assertFalse(self.battery.GetCharging())


class BatteryUtilsLetBatteryCoolToTemperatureTest(BatteryUtilsTest):

  @mock.patch('time.sleep', mock.Mock())
  def testLetBatteryCoolToTemperature_startUnder(self):
    self.battery._cache['profile'] = self._NEXUS_6
    with self.assertCalls(
        (self.call.battery.EnableBatteryUpdates(), []),
        (self.call.battery.GetBatteryInfo(), {'temperature': '500'})):
      self.battery.LetBatteryCoolToTemperature(600)

  @mock.patch('time.sleep', mock.Mock())
  def testLetBatteryCoolToTemperature_startOver(self):
    self.battery._cache['profile'] = self._NEXUS_6
    with self.assertCalls(
        (self.call.battery.EnableBatteryUpdates(), []),
        (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
      self.battery.LetBatteryCoolToTemperature(400)

  @mock.patch('time.sleep', mock.Mock())
  def testLetBatteryCoolToTemperature_nexus5Hot(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.battery.EnableBatteryUpdates(), []),
        (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
        (self.call.battery._DischargeDevice(1), []),
        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
      self.battery.LetBatteryCoolToTemperature(400)

  @mock.patch('time.sleep', mock.Mock())
  def testLetBatteryCoolToTemperature_nexus5Cool(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.battery.EnableBatteryUpdates(), []),
        (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
      self.battery.LetBatteryCoolToTemperature(400)


class BatteryUtilsSupportsFuelGaugeTest(BatteryUtilsTest):

  def testSupportsFuelGauge_false(self):
    self.battery._cache['profile'] = self._NEXUS_5
    self.assertFalse(self.battery.SupportsFuelGauge())

  def testSupportsFuelGauge_trueMax(self):
    self.battery._cache['profile'] = self._NEXUS_6
    # TODO(rnephew): Change this to assertTrue when we have support for
    # disabling hardware charging on nexus 6.
    self.assertFalse(self.battery.SupportsFuelGauge())

  def testSupportsFuelGauge_trueDS(self):
    self.battery._cache['profile'] = self._NEXUS_10
    # TODO(rnephew): Change this to assertTrue when we have support for
    # disabling hardware charging on nexus 10.
    self.assertFalse(self.battery.SupportsFuelGauge())


class BatteryUtilsGetFuelGaugeChargeCounterTest(BatteryUtilsTest):

  def testGetFuelGaugeChargeCounter_noFuelGauge(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertRaises(device_errors.CommandFailedError):
      self.battery.GetFuelGaugeChargeCounter()

  def testGetFuelGaugeChargeCounter_fuelGaugePresent(self):
    self.battery._cache['profile'] = self._NEXUS_6
    with self.assertCalls(
        (self.call.battery.SupportsFuelGauge(), True),
        (self.call.device.ReadFile(mock.ANY), '123')):
      self.assertEqual(self.battery.GetFuelGaugeChargeCounter(), 123)


class BatteryUtilsSetCharging(BatteryUtilsTest):

  @mock.patch('time.sleep', mock.Mock())
  def testSetCharging_softwareSetTrue(self):
    self.battery._cache['profile'] = self._NEXUS_6
    with self.assertCalls(
        (self.call.battery.GetCharging(), False),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery', 'reset'], check_return=True), []),
        (self.call.battery.GetCharging(), False),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
        (self.call.battery.GetCharging(), True)):
      self.battery.SetCharging(True)

  @mock.patch('time.sleep', mock.Mock())
  def testSetCharging_softwareSetFalse(self):
    self.battery._cache['profile'] = self._NEXUS_6
    with self.assertCalls(
        (self.call.battery.GetCharging(), True),
        (self.call.battery._ClearPowerData(), True),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
        (self.call.battery.GetCharging(), False)):
      self.battery.SetCharging(False)

  @mock.patch('time.sleep', mock.Mock())
  def testSetCharging_hardwareSetTrue(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.battery.GetCharging(), False),
        (self.call.battery._HardwareSetCharging(True))):
      self.battery.SetCharging(True)

  @mock.patch('time.sleep', mock.Mock())
  def testSetCharging_hardwareSetFalse(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.battery.GetCharging(), True),
        (self.call.battery._ClearPowerData(), True),
        (self.call.battery._HardwareSetCharging(False))):
      self.battery.SetCharging(False)

  def testSetCharging_expectedStateAlreadyTrue(self):
    with self.assertCalls((self.call.battery.GetCharging(), True)):
      self.battery.SetCharging(True)

  def testSetCharging_expectedStateAlreadyFalse(self):
    with self.assertCalls((self.call.battery.GetCharging(), False)):
      self.battery.SetCharging(False)


class BatteryUtilsPowerMeasurement(BatteryUtilsTest):

  def testPowerMeasurement_hardware(self):
    self.battery._cache['profile'] = self._NEXUS_5
    with self.assertCalls(
        (self.call.battery.GetCharging(), True),
        (self.call.battery._ClearPowerData(), True),
        (self.call.battery._HardwareSetCharging(False)),
        (self.call.battery.GetCharging(), False),
        (self.call.battery._HardwareSetCharging(True))):
      with self.battery.PowerMeasurement():
        pass

  @mock.patch('time.sleep', mock.Mock())
  def testPowerMeasurement_software(self):
    self.battery._cache['profile'] = self._NEXUS_6
    with self.assertCalls(
        (self.call.battery.GetCharging(), True),
        (self.call.battery._ClearPowerData(), True),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
        (self.call.battery.GetCharging(), False),
        (self.call.battery.GetCharging(), False),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery', 'reset'], check_return=True), []),
        (self.call.battery.GetCharging(), False),
        (self.call.device.RunShellCommand(
            ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
        (self.call.battery.GetCharging(), True)):
      with self.battery.PowerMeasurement():
        pass


class BatteryUtilsDiscoverDeviceProfile(BatteryUtilsTest):

  def testDiscoverDeviceProfile_known(self):
    with self.patch_call(self.call.device.product_model,
                         return_value='Nexus 4'):
      self.battery._DiscoverDeviceProfile()
      self.assertListEqual(self.battery._cache['profile']['name'], ["Nexus 4"])

  def testDiscoverDeviceProfile_unknown(self):
    with self.patch_call(self.call.device.product_model,
                         return_value='Other'):
      self.battery._DiscoverDeviceProfile()
      self.assertListEqual(self.battery._cache['profile']['name'], [])


class BatteryUtilsClearPowerData(BatteryUtilsTest):

  def testClearPowerData_preL(self):
    with self.patch_call(self.call.device.build_version_sdk,
                         return_value=20):
      self.assertFalse(self.battery._ClearPowerData())

  def testClearPowerData_clearedL(self):
    with self.patch_call(self.call.device.build_version_sdk,
                         return_value=22):
      with self.assertCalls(
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
           []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--charged', '-c'],
              check_return=True, large_output=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'reset'], check_return=True), [])):
        self.assertTrue(self.battery._ClearPowerData())

  @mock.patch('time.sleep', mock.Mock())
  def testClearPowerData_notClearedL(self):
    with self.patch_call(self.call.device.build_version_sdk,
                         return_value=22):
      with self.assertCalls(
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
           []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--charged', '-c'],
              check_return=True, large_output=True),
              ['9,1000,l,pwi,uid,0.0327']),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--charged', '-c'],
              check_return=True, large_output=True),
              ['9,1000,l,pwi,uid,0.0327']),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--charged', '-c'],
              check_return=True, large_output=True),
              ['9,1000,l,pwi,uid,0.0327']),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'batterystats', '--charged', '-c'],
              check_return=True, large_output=True),
              ['9,1000,l,pwi,uid,0.0']),
          (self.call.device.RunShellCommand(
              ['dumpsys', 'battery', 'reset'], check_return=True), [])):
        self.battery._ClearPowerData()


if __name__ == '__main__':
  logging.getLogger().setLevel(logging.DEBUG)
  unittest.main(verbosity=2)
