16246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei/*
26246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * Copyright (C) 2017 The Android Open Source Project
36246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei *
46246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * Licensed under the Apache License, Version 2.0 (the "License");
56246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * you may not use this file except in compliance with the License.
66246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * You may obtain a copy of the License at
76246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei *
86246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei *      http://www.apache.org/licenses/LICENSE-2.0
96246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei *
106246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * Unless required by applicable law or agreed to in writing, software
116246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * distributed under the License is distributed on an "AS IS" BASIS,
126246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * See the License for the specific language governing permissions and
146246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei * limitations under the License.
156246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei */
166246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleipackage com.android.settings.fuelgauge;
176246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
186246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport android.content.Context;
196246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport android.content.Intent;
206246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport android.os.BatteryManager;
216246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
229f1e911759dc6fedaac9fa65afb79f6a93022bf4Andrew Sappersteinimport com.android.settings.testutils.SettingsRobolectricTestRunner;
236246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport com.android.settings.TestConfig;
246246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport com.android.settings.Utils;
256246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
266246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport org.junit.Before;
276246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport org.junit.Test;
286246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport org.junit.runner.RunWith;
296246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport org.mockito.Mock;
306246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport org.mockito.MockitoAnnotations;
316246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport org.robolectric.RuntimeEnvironment;
326246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport org.robolectric.annotation.Config;
336246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
346246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport static com.google.common.truth.Truth.assertThat;
35114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei
36114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyuleiimport static org.mockito.Matchers.any;
37114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyuleiimport static org.mockito.Mockito.doReturn;
386246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport static org.mockito.Mockito.never;
39114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyuleiimport static org.mockito.Mockito.spy;
4088b27fdeac1215b26eb84c4a1bc9c2b3a0d25522jackqdyuleiimport static org.mockito.Mockito.times;
416246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleiimport static org.mockito.Mockito.verify;
426246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
436246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei@RunWith(SettingsRobolectricTestRunner.class)
446246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
456246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyuleipublic class BatteryBroadcastReceiverTest {
466246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private static final String BATTERY_INIT_LEVEL = "100%";
476246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private static final String BATTERY_INIT_STATUS = "Not charging";
486246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private static final int BATTERY_INTENT_LEVEL = 80;
496246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private static final int BATTERY_INTENT_SCALE = 100;
506246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
516246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    @Mock
526246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private BatteryBroadcastReceiver.OnBatteryChangedListener mBatteryListener;
536246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private BatteryBroadcastReceiver mBatteryBroadcastReceiver;
546246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private Context mContext;
556246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    private Intent mChargingIntent;
566246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
576246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    @Before
586246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    public void setUp() {
596246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        MockitoAnnotations.initMocks(this);
60114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei        mContext = spy(RuntimeEnvironment.application);
616246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
626246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver = new BatteryBroadcastReceiver(mContext);
636246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver.mBatteryLevel = BATTERY_INIT_LEVEL;
646246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver.mBatteryStatus = BATTERY_INIT_STATUS;
656246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver.setBatteryChangedListener(mBatteryListener);
666246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
676246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mChargingIntent = new Intent(Intent.ACTION_BATTERY_CHANGED);
686246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mChargingIntent.putExtra(BatteryManager.EXTRA_LEVEL, BATTERY_INTENT_LEVEL);
696246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mChargingIntent.putExtra(BatteryManager.EXTRA_SCALE, BATTERY_INTENT_SCALE);
706246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mChargingIntent.putExtra(BatteryManager.EXTRA_STATUS,
716246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei                BatteryManager.BATTERY_STATUS_CHARGING);
726246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    }
736246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
746246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    @Test
756246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    public void testOnReceive_batteryDataChanged_dataUpdated() {
766246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
776246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
786246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(
796246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei                Utils.getBatteryPercentage(mChargingIntent));
806246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(
816246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei                Utils.getBatteryStatus(mContext.getResources(), mChargingIntent));
826246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        verify(mBatteryListener).onBatteryChanged();
836246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    }
846246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
856246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    @Test
866246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    public void testOnReceive_batteryDataNotChanged_listenerNotInvoked() {
876246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        final String batteryLevel = Utils.getBatteryPercentage(mChargingIntent);
886246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        final String batteryStatus = Utils.getBatteryStatus(mContext.getResources(),
896246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei                mChargingIntent);
906246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver.mBatteryLevel = batteryLevel;
916246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver.mBatteryStatus = batteryStatus;
926246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
936246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        mBatteryBroadcastReceiver.onReceive(mContext, mChargingIntent);
946246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
956246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(batteryLevel);
966246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(batteryStatus);
976246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei        verify(mBatteryListener, never()).onBatteryChanged();
986246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei    }
996246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei
100114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei    @Test
101114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei    public void testRegister_updateBatteryStatus() {
102114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei        doReturn(mChargingIntent).when(mContext).registerReceiver(any(), any());
103114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei
104114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei        mBatteryBroadcastReceiver.register();
10588b27fdeac1215b26eb84c4a1bc9c2b3a0d25522jackqdyulei        mBatteryBroadcastReceiver.register();
106114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei
107114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei        assertThat(mBatteryBroadcastReceiver.mBatteryLevel).isEqualTo(
108114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei                Utils.getBatteryPercentage(mChargingIntent));
109114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei        assertThat(mBatteryBroadcastReceiver.mBatteryStatus).isEqualTo(
110114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei                Utils.getBatteryStatus(mContext.getResources(), mChargingIntent));
11188b27fdeac1215b26eb84c4a1bc9c2b3a0d25522jackqdyulei        // 2 times because register will force update the battery
11288b27fdeac1215b26eb84c4a1bc9c2b3a0d25522jackqdyulei        verify(mBatteryListener, times(2)).onBatteryChanged();
113114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei    }
114114cf2a1a75a4e46243aa2b27e007add7899d08fjackqdyulei
1156246fad7ff75753ec984c1c008c25b9edc49b6eejackqdyulei}
116