Home | History | Annotate | Download | only in fuelgauge
      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 
     17 package com.android.settings.fuelgauge;
     18 
     19 import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS;
     20 import static com.google.common.truth.Truth.assertThat;
     21 import static org.mockito.Matchers.anyInt;
     22 import static org.mockito.Matchers.eq;
     23 import static org.mockito.Mockito.doAnswer;
     24 import static org.mockito.Mockito.doReturn;
     25 import static org.mockito.Mockito.spy;
     26 import static org.mockito.Mockito.when;
     27 import static org.mockito.Mockito.verify;
     28 
     29 import android.content.Intent;
     30 import android.content.pm.PackageManager;
     31 import android.graphics.drawable.Drawable;
     32 import android.support.v7.preference.Preference;
     33 import android.support.v7.preference.PreferenceCategory;
     34 import android.support.v7.preference.PreferenceGroup;
     35 import android.support.v7.preference.PreferenceManager;
     36 import android.util.IconDrawableFactory;
     37 
     38 import com.android.settings.SettingsActivity;
     39 import com.android.settings.fuelgauge.anomaly.Anomaly;
     40 import com.android.settings.testutils.SettingsRobolectricTestRunner;
     41 
     42 import org.junit.Before;
     43 import org.junit.Test;
     44 import org.junit.runner.RunWith;
     45 import org.mockito.ArgumentCaptor;
     46 import org.mockito.Mock;
     47 import org.mockito.MockitoAnnotations;
     48 import org.mockito.invocation.InvocationOnMock;
     49 import org.mockito.stubbing.Answer;
     50 import org.robolectric.RuntimeEnvironment;
     51 
     52 import java.util.ArrayList;
     53 import java.util.List;
     54 
     55 @RunWith(SettingsRobolectricTestRunner.class)
     56 public class PowerUsageAnomalyDetailsTest {
     57 
     58     private static final String NAME_APP_1 = "app1";
     59     private static final String NAME_APP_2 = "app2";
     60     private static final String NAME_APP_3 = "app3";
     61     private static final String PACKAGE_NAME_1 = "com.android.app1";
     62     private static final String PACKAGE_NAME_2 = "com.android.app2";
     63     private static final String PACKAGE_NAME_3 = "com.android.app3";
     64 
     65     @Mock
     66     private SettingsActivity mSettingsActivity;
     67     @Mock
     68     private PreferenceManager mPreferenceManager;
     69     @Mock
     70     private Drawable mDrawable1;
     71     @Mock
     72     private Drawable mDrawable2;
     73     @Mock
     74     private Drawable mDrawable3;
     75     @Mock
     76     private PackageManager mPackageManager;
     77     @Mock
     78     private IconDrawableFactory mIconDrawableFactory;
     79 
     80     private PowerUsageAnomalyDetails mFragment;
     81     private PreferenceGroup mAbnormalListGroup;
     82     private List<Anomaly> mAnomalyList;
     83 
     84     @Before
     85     public void setUp() {
     86         MockitoAnnotations.initMocks(this);
     87 
     88         mAbnormalListGroup = spy(new PreferenceCategory(RuntimeEnvironment.application));
     89 
     90         mAnomalyList = new ArrayList<>();
     91         Anomaly anomaly1 = new Anomaly.Builder()
     92                 .setType(Anomaly.AnomalyType.WAKE_LOCK)
     93                 .setPackageName(PACKAGE_NAME_1)
     94                 .setDisplayName(NAME_APP_1)
     95                 .build();
     96         mAnomalyList.add(anomaly1);
     97         Anomaly anomaly2 = new Anomaly.Builder()
     98                 .setType(Anomaly.AnomalyType.WAKEUP_ALARM)
     99                 .setPackageName(PACKAGE_NAME_2)
    100                 .setDisplayName(NAME_APP_2)
    101                 .build();
    102         mAnomalyList.add(anomaly2);
    103         Anomaly anomaly3 = new Anomaly.Builder()
    104                 .setType(Anomaly.AnomalyType.BLUETOOTH_SCAN)
    105                 .setPackageName(PACKAGE_NAME_3)
    106                 .setDisplayName(NAME_APP_3)
    107                 .build();
    108         mAnomalyList.add(anomaly3);
    109 
    110         mFragment = spy(new PowerUsageAnomalyDetails());
    111         mFragment.mAbnormalListGroup = mAbnormalListGroup;
    112         mFragment.mAnomalies = mAnomalyList;
    113         mFragment.mBatteryUtils = new BatteryUtils(RuntimeEnvironment.application);
    114         mFragment.mPackageManager = mPackageManager;
    115         mFragment.mIconDrawableFactory = mIconDrawableFactory;
    116         when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
    117         when(mPreferenceManager.getContext()).thenReturn(RuntimeEnvironment.application);
    118     }
    119 
    120     @Test
    121     public void testRefreshUi_displayCorrectTitleAndSummary() {
    122         final List<Preference> testPreferences = new ArrayList<>();
    123         final ArgumentCaptor<Preference> preferenceCaptor =
    124             ArgumentCaptor.forClass(Preference.class);
    125         Answer<Void> prefCallable = new Answer<Void>() {
    126             @Override
    127             public Void answer(InvocationOnMock invocation) throws Throwable {
    128                 testPreferences.add(preferenceCaptor.getValue());
    129                 return null;
    130             }
    131         };
    132         doAnswer(prefCallable).when(mAbnormalListGroup).addPreference(preferenceCaptor.capture());
    133 
    134         mFragment.refreshUi();
    135 
    136         final Preference wakelockPreference = testPreferences.get(0);
    137         assertThat(wakelockPreference.getTitle()).isEqualTo(NAME_APP_1);
    138         assertThat(wakelockPreference.getSummary()).isEqualTo("Keeping device awake");
    139         final Preference wakeupPreference = testPreferences.get(1);
    140         assertThat(wakeupPreference.getTitle()).isEqualTo(NAME_APP_2);
    141         assertThat(wakeupPreference.getSummary()).isEqualTo("Waking up device in background");
    142         final Preference bluetoothPreference = testPreferences.get(2);
    143         assertThat(bluetoothPreference.getTitle()).isEqualTo(NAME_APP_3);
    144         assertThat(bluetoothPreference.getSummary()).isEqualTo("Requesting location frequently");
    145     }
    146 
    147     @Test
    148     public void testRefreshUi_iconCorrect() {
    149         doReturn(mDrawable1).when(mFragment).getBadgedIcon(eq(PACKAGE_NAME_1), anyInt());
    150         doReturn(mDrawable2).when(mFragment).getBadgedIcon(eq(PACKAGE_NAME_2), anyInt());
    151         doReturn(mDrawable3).when(mFragment).getBadgedIcon(eq(PACKAGE_NAME_3), anyInt());
    152 
    153         final List<Drawable> testIcons = new ArrayList<>();
    154         final ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(
    155                 Preference.class);
    156         Answer<Void> prefCallable = new Answer<Void>() {
    157             @Override
    158             public Void answer(InvocationOnMock invocation) throws Throwable {
    159                 testIcons.add(preferenceCaptor.getValue().getIcon());
    160                 return null;
    161             }
    162         };
    163         doAnswer(prefCallable).when(mAbnormalListGroup).addPreference(preferenceCaptor.capture());
    164 
    165         mFragment.refreshUi();
    166 
    167         assertThat(testIcons).containsExactly(mDrawable1, mDrawable2, mDrawable3);
    168     }
    169 
    170     @Test
    171     public void testStartBatteryAbnormalPage_dataCorrect() {
    172         final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
    173 
    174         PowerUsageAnomalyDetails.startBatteryAbnormalPage(mSettingsActivity, mFragment,
    175                 mAnomalyList);
    176 
    177         verify(mSettingsActivity).startActivity(intent.capture());
    178         assertThat(intent.getValue().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS)
    179                 .getParcelableArrayList(PowerUsageAnomalyDetails.EXTRA_ANOMALY_LIST))
    180                 .isEqualTo(mAnomalyList);
    181     }
    182 }
    183