1cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria/*
2cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * Copyright (C) 2017 The Android Open Source Project
3cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria *
4cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * Licensed under the Apache License, Version 2.0 (the "License");
5cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * you may not use this file except in compliance with the License.
6cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * You may obtain a copy of the License at
7cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria *
8cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria *      http://www.apache.org/licenses/LICENSE-2.0
9cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria *
10cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * Unless required by applicable law or agreed to in writing, software
11cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * distributed under the License is distributed on an "AS IS" BASIS,
12cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * See the License for the specific language governing permissions and
14cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria * limitations under the License.
15cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria */
16564e43098c323d1a90be53c190b8fdbdde973505Sumir Katariapackage androidx.work.impl.constraints.trackers;
17cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria
18cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria
19cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport static org.hamcrest.CoreMatchers.is;
2047bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagarimport static org.hamcrest.CoreMatchers.nullValue;
21cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport static org.hamcrest.MatcherAssert.assertThat;
222f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarinimport static org.mockito.ArgumentMatchers.any;
232f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarinimport static org.mockito.ArgumentMatchers.isNull;
24cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport static org.mockito.Mockito.mock;
2547bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagarimport static org.mockito.Mockito.times;
26cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport static org.mockito.Mockito.verify;
2747bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagarimport static org.mockito.Mockito.verifyNoMoreInteractions;
282f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarinimport static org.mockito.Mockito.when;
29cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria
302f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarinimport android.content.BroadcastReceiver;
312f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarinimport android.content.Context;
32cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport android.content.Intent;
33cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport android.content.IntentFilter;
342f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarinimport android.os.BatteryManager;
35cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport android.support.test.filters.SmallTest;
36cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport android.support.test.runner.AndroidJUnit4;
37cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria
38b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Katariaimport androidx.work.impl.constraints.ConstraintListener;
39b5728f4e1a4b3f4f1fabf033b1363ca6b1cffdefSumir Kataria
40cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport org.junit.Before;
41cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport org.junit.Test;
42cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariaimport org.junit.runner.RunWith;
43cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria
44cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria@RunWith(AndroidJUnit4.class)
45cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Katariapublic class BatteryNotLowTrackerTest {
46cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria
472f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    private static final int PLUGGED_IN = BatteryManager.BATTERY_PLUGGED_AC;
482f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    private static final int NOT_PLUGGED_IN = BatteryNotLowTracker.BATTERY_PLUGGED_NONE;
492f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    private static final int KNOWN_STATUS = BatteryManager.BATTERY_STATUS_CHARGING;
502f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    private static final int UNKNOWN_STATUS = BatteryManager.BATTERY_STATUS_UNKNOWN;
512f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    private static final float AT_LOW_PERCENTAGE = BatteryNotLowTracker.BATTERY_LOW_PERCENTAGE;
5247bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    private static final float ABOVE_LOW_PERCENTAGE =
532f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin            BatteryNotLowTracker.BATTERY_LOW_PERCENTAGE + 0.01f;
542f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
552f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    private Context mMockContext;
56cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria    private BatteryNotLowTracker mTracker;
57a0d0d16f358a6cd71033a9d12c934c1c90b07973Xyan Bhatnagar    private ConstraintListener<Boolean> mListener;
58cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria
59cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria    @Before
60cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria    public void setUp() {
612f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        mMockContext = mock(Context.class);
622f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        when(mMockContext.getApplicationContext()).thenReturn(mMockContext);
632f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
642f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        mTracker = new BatteryNotLowTracker(mMockContext);
65a0d0d16f358a6cd71033a9d12c934c1c90b07973Xyan Bhatnagar        mListener = mock(ConstraintListener.class);
66cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria    }
672f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
6847bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    private void mockContextReturns(Intent expectedIntent) {
6947bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        when(mMockContext.registerReceiver((BroadcastReceiver) isNull(),
7047bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar                any(IntentFilter.class))).thenReturn(expectedIntent);
7147bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    }
7247bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar
732f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    private Intent createBatteryChangedIntent(int plugged, int status, float percent) {
742f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        int scale = 100;
752f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        int level = (int) (scale * percent);
762f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
7747bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
782f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        intent.putExtra(BatteryManager.EXTRA_PLUGGED, plugged);
792f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        intent.putExtra(BatteryManager.EXTRA_STATUS, status);
802f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        intent.putExtra(BatteryManager.EXTRA_LEVEL, level);
812f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        intent.putExtra(BatteryManager.EXTRA_SCALE, scale);
822f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin        return intent;
832f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
842f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
8547bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    private void testGetInitialStateHelper(
862f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin            int plugged, int status, float percentage, boolean expectedBatteryNotLow) {
8747bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        mockContextReturns(createBatteryChangedIntent(plugged, status, percentage));
8847bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        assertThat(mTracker.getInitialState(), is(expectedBatteryNotLow));
892f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
902f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
912f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
921b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
9347bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_nullIntent() {
9447bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        mockContextReturns(null);
9547bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        assertThat(mTracker.getInitialState(), is(nullValue()));
961b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    }
971b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin
981b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @Test
991b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
10047bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_notPlugged_knownStatus_atBatteryLowPercentage() {
10147bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(NOT_PLUGGED_IN, KNOWN_STATUS, AT_LOW_PERCENTAGE, false);
1022f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
1032f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
1042f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
1051b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
10647bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_plugged_knownStatus_aboveBatteryLowPercentage() {
10747bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(PLUGGED_IN, KNOWN_STATUS, ABOVE_LOW_PERCENTAGE, true);
1082f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
1092f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
1102f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
1111b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
11247bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_plugged_knownStatus_atBatteryLowPercentage() {
11347bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(PLUGGED_IN, KNOWN_STATUS, AT_LOW_PERCENTAGE, true);
1142f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
1152f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
1162f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
1171b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
11847bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_plugged_unknownStatus_aboveBatteryLowPercentage() {
11947bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(PLUGGED_IN, UNKNOWN_STATUS, ABOVE_LOW_PERCENTAGE, true);
1202f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
1212f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
1222f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
1231b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
12447bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_plugged_unknownStatus_atBatteryLowPercentage() {
12547bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(PLUGGED_IN, UNKNOWN_STATUS, AT_LOW_PERCENTAGE, true);
1262f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
1272f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
1282f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
1291b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
13047bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_notPlugged_knownStatus_aboveBatteryLowPercentage() {
13147bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(NOT_PLUGGED_IN, KNOWN_STATUS, ABOVE_LOW_PERCENTAGE, true);
1322f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
1332f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
1342f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
1351b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
13647bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_notPlugged_unknownStatus_aboveBatteryLowPercentage() {
13747bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(NOT_PLUGGED_IN, UNKNOWN_STATUS, ABOVE_LOW_PERCENTAGE, true);
1382f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
1392f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin
1402f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    @Test
1411b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
14247bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar    public void testGetInitialState_notPlugged_unknownStatus_atBatteryLowPercentage() {
14347bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        testGetInitialStateHelper(NOT_PLUGGED_IN, UNKNOWN_STATUS, AT_LOW_PERCENTAGE, true);
1441b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    }
1451b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin
1461b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @Test
1471b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
1481b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    public void testGetIntentFilter() {
1491b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin        IntentFilter intentFilter = mTracker.getIntentFilter();
1501b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin        assertThat(intentFilter.hasAction(Intent.ACTION_BATTERY_OKAY), is(true));
1511b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin        assertThat(intentFilter.hasAction(Intent.ACTION_BATTERY_LOW), is(true));
1521b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin        assertThat(intentFilter.countActions(), is(2));
1531b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    }
1541b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin
1551b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @Test
1561b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
1571b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    public void testOnBroadcastReceive_invalidIntentAction_doesNotNotifyListeners() {
15847bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        mockContextReturns(
15947bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar                createBatteryChangedIntent(PLUGGED_IN, KNOWN_STATUS, ABOVE_LOW_PERCENTAGE));
16047bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        mTracker.addListener(mListener);
16147bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        verify(mListener).onConstraintChanged(true);
16247bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar
1631b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin        mTracker.onBroadcastReceive(mMockContext, new Intent("INVALID"));
16447bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        verifyNoMoreInteractions(mListener);
1651b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    }
1661b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin
1671b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @Test
1681b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    @SmallTest
1691b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin    public void testOnBroadcastReceive_notifiesListeners() {
17047bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        mockContextReturns(
17147bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar                createBatteryChangedIntent(NOT_PLUGGED_IN, KNOWN_STATUS, AT_LOW_PERCENTAGE));
17247bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        mTracker.addListener(mListener);
17347bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        verify(mListener).onConstraintChanged(false);
17447bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar
1751b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin        mTracker.onBroadcastReceive(mMockContext, new Intent(Intent.ACTION_BATTERY_OKAY));
176a0d0d16f358a6cd71033a9d12c934c1c90b07973Xyan Bhatnagar        verify(mListener).onConstraintChanged(true);
1771b58a02b857bf59a52a702dd30f31db9a152f19bJan Clarin        mTracker.onBroadcastReceive(mMockContext, new Intent(Intent.ACTION_BATTERY_LOW));
17847bc9f58bf013dcb40ba1ee33f72c196d5e3001aXyan Bhatnagar        verify(mListener, times(2)).onConstraintChanged(false);
1792f217c3ecdbc8c98410f58a3ea6cc36d11c5867aJan Clarin    }
180cac53d44f27fcf13aab265cac19bc574ac44aae3Sumir Kataria}
181