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