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 22 import static org.mockito.ArgumentMatchers.any; 23 import static org.mockito.ArgumentMatchers.anyInt; 24 import static org.mockito.Mockito.doReturn; 25 import static org.mockito.Mockito.never; 26 import static org.mockito.Mockito.spy; 27 import static org.mockito.Mockito.times; 28 import static org.mockito.Mockito.verify; 29 30 import android.content.Context; 31 import android.content.Intent; 32 import android.os.BatteryManager; 33 import android.os.PowerManager; 34 35 import com.android.settings.Utils; 36 import com.android.settings.homepage.contextualcards.slices.BatteryFixSliceTest; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 import org.mockito.Mock; 42 import org.mockito.MockitoAnnotations; 43 import org.robolectric.RobolectricTestRunner; 44 import org.robolectric.RuntimeEnvironment; 45 import org.robolectric.annotation.Config; 46 47 @RunWith(RobolectricTestRunner.class) 48 public class BatteryBroadcastReceiverTest { 49 50 private static final String BATTERY_INIT_LEVEL = "100%"; 51 private static final String BATTERY_INIT_STATUS = "Not charging"; 52 private static final int BATTERY_INTENT_LEVEL = 80; 53 private static final int BATTERY_INTENT_SCALE = 100; 54 55 @Mock 56 private BatteryBroadcastReceiver.OnBatteryChangedListener mBatteryListener; 57 private BatteryBroadcastReceiver mBatteryBroadcastReceiver; 58 private Context mContext; 59 private Intent mChargingIntent; 60 61 @Before setUp()62 public void setUp() { 63 MockitoAnnotations.initMocks(this); 64 mContext = spy(RuntimeEnvironment.application); 65 66 mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext); 67 mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL; 68 mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS; 69 mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener); 70 71 mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED); 72 mChargingIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_INTENT_LEVEL); 73 mChargingIntent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_INTENT_SCALE); 74 mChargingIntent 75 .putExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_CHARGING); 76 } 77 78 @Test 79 @Config(shadows = { 80 BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class, 81 BatteryFixSliceTest.ShadowBatteryTipLoader.class 82 }) testOnReceive_batteryLevelChanged_dataUpdated()83 public void testOnReceive_batteryLevelChanged_dataUpdated() { 84 mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent); 85 86 assertThat(mBatteryBroadcastReceiver.mBatteryLevel) 87 .isEqualTo(Utils.getBatteryPercentage(mChargingIntent)); 88 assertThat(mBatteryBroadcastReceiver.mBatteryStatus) 89 .isEqualTo(Utils.getBatteryStatus(mContext, mChargingIntent)); 90 verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_LEVEL); 91 } 92 93 @Test 94 @Config(shadows = { 95 BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class, 96 BatteryFixSliceTest.ShadowBatteryTipLoader.class 97 }) testOnReceive_powerSaveModeChanged_listenerInvoked()98 public void testOnReceive_powerSaveModeChanged_listenerInvoked() { 99 mBatteryBroadcastReceiver.onReceive(mContext, 100 new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)); 101 102 verify(mBatteryListener).onBatteryChanged(BatteryUpdateType.BATTERY_SAVER); 103 } 104 105 @Test 106 @Config(shadows = { 107 BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class, 108 BatteryFixSliceTest.ShadowBatteryTipLoader.class 109 }) testOnReceive_batteryDataNotChanged_listenerNotInvoked()110 public void testOnReceive_batteryDataNotChanged_listenerNotInvoked() { 111 final String batteryLevel = Utils.getBatteryPercentage(mChargingIntent); 112 final String batteryStatus = 113 Utils.getBatteryStatus(mContext, mChargingIntent); 114 mBatteryBroadcastReceiver.mBatteryLevel = batteryLevel; 115 mBatteryBroadcastReceiver.mBatteryStatus = batteryStatus; 116 117 mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent); 118 119 assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(batteryLevel); 120 assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus); 121 verify(mBatteryListener, never()).onBatteryChanged(anyInt()); 122 } 123 124 @Test 125 @Config(shadows = { 126 BatteryFixSliceTest.ShadowBatteryStatsHelperLoader.class, 127 BatteryFixSliceTest.ShadowBatteryTipLoader.class 128 }) testRegister_updateBatteryStatus()129 public void testRegister_updateBatteryStatus() { 130 doReturn(mChargingIntent).when(mContext).registerReceiver(any(), any()); 131 132 mBatteryBroadcastReceiver.register(); 133 mBatteryBroadcastReceiver.register(); 134 135 assertThat(mBatteryBroadcastReceiver.mBatteryLevel) 136 .isEqualTo(Utils.getBatteryPercentage(mChargingIntent)); 137 assertThat(mBatteryBroadcastReceiver.mBatteryStatus) 138 .isEqualTo(Utils.getBatteryStatus(mContext, mChargingIntent)); 139 // 2 times because register will force update the battery 140 verify(mBatteryListener, times(2)).onBatteryChanged(BatteryUpdateType.MANUAL); 141 } 142 } 143