1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.settings.fuelgauge; 17 18 import static com.android.settings.fuelgauge.BatteryBroadcastReceiver.BatteryUpdateType; 19 20 import static com.google.common.truth.Truth.assertThat; 21 import static org.mockito.Matchers.any; 22 import static org.mockito.Matchers.anyInt; 23 import static org.mockito.Mockito.doReturn; 24 import static org.mockito.Mockito.never; 25 import static org.mockito.Mockito.spy; 26 import static org.mockito.Mockito.times; 27 import static org.mockito.Mockito.verify; 28 29 import android.content.Context; 30 import android.content.Intent; 31 import android.os.BatteryManager; 32 import android.os.PowerManager; 33 34 import com.android.settings.Utils; 35 import com.android.settings.testutils.SettingsRobolectricTestRunner; 36 37 import org.junit.Before; 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.mockito.Mock; 41 import org.mockito.MockitoAnnotations; 42 import org.robolectric.RuntimeEnvironment; 43 44 @RunWith(SettingsRobolectricTestRunner.class) 45 public class BatteryBroadcastReceiverTest { 46 47 private static final String BATTERY_INIT_LEVEL = "100%"; 48 private static final String BATTERY_INIT_STATUS = "Not charging"; 49 private static final int BATTERY_INTENT_LEVEL = 80; 50 private static final int BATTERY_INTENT_SCALE = 100; 51 52 @Mock 53 private BatteryBroadcastReceiver.OnBatteryChangedListener mBatteryListener; 54 private BatteryBroadcastReceiver mBatteryBroadcastReceiver; 55 private Context mContext; 56 private Intent mChargingIntent; 57 58 @Before setUp()59 public void setUp() { 60 MockitoAnnotations.initMocks(this); 61 mContext = spy(RuntimeEnvironment.application); 62 63 mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext); 64 mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL; 65 mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS; 66 mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener); 67 68 mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED); 69 mChargingIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_INTENT_LEVEL); 70 mChargingIntent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_INTENT_SCALE); 71 mChargingIntent 72 .putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING); 73 } 74 75 @Test testOnReceive_batteryLevelChanged_dataUpdated()76 public void testOnReceive_batteryLevelChanged_dataUpdated() { 77 mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent); 78 79 assertThat(mBatteryBroadcastReceiver.mBatteryLevel) 80 .isEqualTo(Utils.getBatteryPercentage(mChargingIntent)); 81 assertThat(mBatteryBroadcastReceiver.mBatteryStatus) 82 .isEqualTo(Utils.getBatteryStatus(mContext.getResources(), mChargingIntent)); 83 verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_LEVEL); 84 } 85 86 @Test testOnReceive_powerSaveModeChanged_listenerInvoked()87 public void testOnReceive_powerSaveModeChanged_listenerInvoked() { 88 mBatteryBroadcastReceiver.onReceive(mContext, 89 new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)); 90 91 verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_SAVER); 92 } 93 94 @Test testOnReceive_batteryDataNotChanged_listenerNotInvoked()95 public void testOnReceive_batteryDataNotChanged_listenerNotInvoked() { 96 final String batteryLevel = Utils.getBatteryPercentage(mChargingIntent); 97 final String batteryStatus = 98 Utils.getBatteryStatus(mContext.getResources(), mChargingIntent); 99 mBatteryBroadcastReceiver.mBatteryLevel = batteryLevel; 100 mBatteryBroadcastReceiver.mBatteryStatus = batteryStatus; 101 102 mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent); 103 104 assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(batteryLevel); 105 assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus); 106 verify(mBatteryListener, never()).onBatteryChanged(anyInt()); 107 } 108 109 @Test testRegister_updateBatteryStatus()110 public void testRegister_updateBatteryStatus() { 111 doReturn(mChargingIntent).when(mContext).registerReceiver(any(), any()); 112 113 mBatteryBroadcastReceiver.register(); 114 mBatteryBroadcastReceiver.register(); 115 116 assertThat(mBatteryBroadcastReceiver.mBatteryLevel) 117 .isEqualTo(Utils.getBatteryPercentage(mChargingIntent)); 118 assertThat(mBatteryBroadcastReceiver.mBatteryStatus) 119 .isEqualTo(Utils.getBatteryStatus(mContext.getResources(), mChargingIntent)); 120 // 2 times because register will force update the battery 121 verify(mBatteryListener, times(2)).onBatteryChanged(BatteryUpdateType.MANUAL); 122 } 123 } 124