• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.google.common.truth.Truth.assertThat;
19 import static org.mockito.Mockito.mock;
20 import static org.mockito.Mockito.when;
21 
22 import android.content.Context;
23 import android.content.pm.ApplicationInfo;
24 import android.content.pm.PackageManager;
25 import android.content.pm.PackageManager.NameNotFoundException;
26 import android.os.Handler;
27 import android.os.Process;
28 import android.os.UserManager;
29 
30 import com.android.internal.os.BatterySipper;
31 import com.android.internal.os.BatterySipper.DrainType;
32 import com.android.settings.R;
33 
34 import org.junit.Before;
35 import org.junit.Rule;
36 import org.junit.Test;
37 import org.junit.runner.RunWith;
38 import org.mockito.Mock;
39 import org.mockito.junit.MockitoJUnit;
40 import org.mockito.junit.MockitoRule;
41 import org.robolectric.RobolectricTestRunner;
42 import org.robolectric.RuntimeEnvironment;
43 
44 import java.util.Locale;
45 
46 @RunWith(RobolectricTestRunner.class)
47 public class BatteryEntryTest {
48 
49     private static final int APP_UID = 123;
50     private static final int SYSTEM_UID = Process.SYSTEM_UID;
51     private static final String APP_DEFAULT_PACKAGE_NAME = "com.android.test";
52     private static final String APP_LABEL = "Test App Name";
53     private static final String HIGH_DRAIN_PACKAGE = "com.android.test.screen";
54     private static final String ANDROID_PACKAGE = "android";
55     private static final String[] SYSTEM_PACKAGES = {HIGH_DRAIN_PACKAGE, ANDROID_PACKAGE};
56 
57     @Rule public MockitoRule mocks = MockitoJUnit.rule();
58 
59     @Mock private Context mockContext;
60     @Mock private Handler mockHandler;
61     @Mock private PackageManager mockPackageManager;
62     @Mock private UserManager mockUserManager;
63 
64     @Before
stubContextToReturnMockPackageManager()65     public void stubContextToReturnMockPackageManager() {
66         when(mockContext.getPackageManager()).thenReturn(mockPackageManager);
67     }
68 
69     @Before
stubPackageManagerToReturnAppPackageAndName()70     public void stubPackageManagerToReturnAppPackageAndName() throws NameNotFoundException {
71         when(mockPackageManager.getPackagesForUid(APP_UID))
72             .thenReturn(new String[] {APP_DEFAULT_PACKAGE_NAME});
73 
74         ApplicationInfo appInfo = mock(ApplicationInfo.class);
75         when(mockPackageManager.getApplicationInfo(APP_DEFAULT_PACKAGE_NAME, 0 /* no flags */))
76             .thenReturn(appInfo);
77         when(mockPackageManager.getApplicationLabel(appInfo)).thenReturn(APP_LABEL);
78     }
79 
createBatteryEntryForApp()80     private BatteryEntry createBatteryEntryForApp() {
81         return new BatteryEntry(mockContext, mockHandler, mockUserManager, createSipperForApp());
82     }
83 
createSipperForApp()84     private BatterySipper createSipperForApp() {
85         BatterySipper sipper =
86             new BatterySipper(DrainType.APP, new FakeUid(APP_UID), 0 /* power use */);
87         sipper.packageWithHighestDrain = HIGH_DRAIN_PACKAGE;
88         return sipper;
89     }
90 
createBatteryEntryForSystem()91     private BatteryEntry createBatteryEntryForSystem() {
92         return new BatteryEntry(mockContext, mockHandler, mockUserManager, createSipperForSystem());
93     }
94 
createSipperForSystem()95     private BatterySipper createSipperForSystem() {
96         BatterySipper sipper =
97                 new BatterySipper(DrainType.APP, new FakeUid(SYSTEM_UID), 0 /* power use */);
98         sipper.packageWithHighestDrain = HIGH_DRAIN_PACKAGE;
99         sipper.mPackages = SYSTEM_PACKAGES;
100         return sipper;
101     }
102 
103     @Test
batteryEntryForApp_shouldSetDefaultPackageNameAndLabel()104     public void batteryEntryForApp_shouldSetDefaultPackageNameAndLabel() throws Exception {
105         BatteryEntry entry = createBatteryEntryForApp();
106 
107         assertThat(entry.defaultPackageName).isEqualTo(APP_DEFAULT_PACKAGE_NAME);
108         assertThat(entry.getLabel()).isEqualTo(APP_LABEL);
109     }
110 
111     @Test
batteryEntryForApp_shouldSetLabelAsPackageName_whenPackageCannotBeFound()112     public void batteryEntryForApp_shouldSetLabelAsPackageName_whenPackageCannotBeFound()
113         throws Exception {
114       when(mockPackageManager.getApplicationInfo(APP_DEFAULT_PACKAGE_NAME, 0 /* no flags */))
115           .thenThrow(new NameNotFoundException());
116 
117       BatteryEntry entry = createBatteryEntryForApp();
118 
119       assertThat(entry.getLabel()).isEqualTo(APP_DEFAULT_PACKAGE_NAME);
120     }
121 
122     @Test
batteryEntryForApp_shouldSetHighestDrainPackage_whenPackagesCannotBeFoundForUid()123     public void batteryEntryForApp_shouldSetHighestDrainPackage_whenPackagesCannotBeFoundForUid() {
124         when(mockPackageManager.getPackagesForUid(APP_UID)).thenReturn(null);
125 
126         BatteryEntry entry = createBatteryEntryForApp();
127 
128         assertThat(entry.getLabel()).isEqualTo(HIGH_DRAIN_PACKAGE);
129     }
130 
131     @Test
batteryEntryForApp_shouldSetHighestDrainPackage_whenMultiplePackagesFoundForUid()132     public void batteryEntryForApp_shouldSetHighestDrainPackage_whenMultiplePackagesFoundForUid() {
133         when(mockPackageManager.getPackagesForUid(APP_UID))
134             .thenReturn(new String[] {APP_DEFAULT_PACKAGE_NAME, "package2", "package3"});
135 
136         BatteryEntry entry = createBatteryEntryForApp();
137 
138         assertThat(entry.getLabel()).isEqualTo(HIGH_DRAIN_PACKAGE);
139     }
140 
141     @Test
batteryEntryForAOD_containCorrectInfo()142     public void batteryEntryForAOD_containCorrectInfo() {
143         final BatterySipper batterySipper = mock(BatterySipper.class);
144         batterySipper.drainType = DrainType.AMBIENT_DISPLAY;
145         final BatteryEntry entry = new BatteryEntry(RuntimeEnvironment.application, mockHandler,
146                 mockUserManager, batterySipper);
147 
148         assertThat(entry.iconId).isEqualTo(R.drawable.ic_settings_aod);
149         assertThat(entry.name).isEqualTo("Ambient display");
150     }
151 
152     @Test
extractPackageFromSipper_systemSipper_returnSystemPackage()153     public void extractPackageFromSipper_systemSipper_returnSystemPackage() {
154         BatteryEntry entry = createBatteryEntryForSystem();
155 
156         assertThat(entry.extractPackagesFromSipper(entry.sipper))
157             .isEqualTo(new String[] {ANDROID_PACKAGE});
158     }
159 
160     @Test
extractPackageFromSipper_normalSipper_returnDefaultPackage()161     public void extractPackageFromSipper_normalSipper_returnDefaultPackage() {
162         BatteryEntry entry = createBatteryEntryForApp();
163 
164         assertThat(entry.extractPackagesFromSipper(entry.sipper)).isEqualTo(entry.sipper.mPackages);
165     }
166 
167     @Test
testUidCache_switchLocale_shouldCleanCache()168     public void testUidCache_switchLocale_shouldCleanCache() {
169         BatteryEntry.stopRequestQueue();
170 
171         Locale.setDefault(new Locale("en_US"));
172         BatteryEntry.sUidCache.put(Integer.toString(APP_UID), null);
173         assertThat(BatteryEntry.sUidCache).isNotEmpty();
174 
175         Locale.setDefault(new Locale("zh_TW"));
176         createBatteryEntryForApp();
177         assertThat(BatteryEntry.sUidCache).isEmpty(); // check if cache is clear
178     }
179 }
180