2 * Copyright (C) 2016 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.android.settings.fuelgauge;
18 import android.content.Context;
19 import android.content.Intent;
20 import android.os.Process;
21 import android.text.TextUtils;
22 import android.view.Menu;
23 import android.view.MenuInflater;
24 import android.view.MenuItem;
25 import com.android.internal.os.BatterySipper;
26 import com.android.internal.os.BatteryStatsImpl;
27 import com.android.settings.R;
28 import com.android.settings.TestConfig;
29 import com.android.settings.testutils.FakeFeatureFactory;
30 import org.junit.Before;
31 import org.junit.Test;
32 import org.junit.runner.RunWith;
33 import org.mockito.Answers;
34 import org.mockito.Mock;
35 import org.mockito.MockitoAnnotations;
36 import org.robolectric.RobolectricTestRunner;
37 import org.robolectric.annotation.Config;
39 import static com.android.settings.fuelgauge.PowerUsageBase.MENU_STATS_REFRESH;
40 import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_ADDITIONAL_BATTERY_INFO;
41 import static com.google.common.truth.Truth.assertThat;
42 import static org.mockito.Mockito.never;
43 import static org.mockito.Mockito.verify;
44 import static org.mockito.Mockito.when;
47 * Unit tests for {@link PowerUsageSummary}.
49 // TODO: Improve this test class so that it starts up the real activity and fragment.
50 @RunWith(RobolectricTestRunner.class)
51 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
52 public class PowerUsageSummaryTest {
53 private static final String[] PACKAGE_NAMES = {"com.app1", "com.app2"};
54 private static final int UID = 123;
55 private static final int POWER_MAH = 100;
57 private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
58 new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
60 @Mock(answer = Answers.RETURNS_DEEP_STUBS)
61 private Context mContext;
62 @Mock(answer = Answers.RETURNS_DEEP_STUBS)
65 private MenuItem mRefreshMenu;
67 private MenuItem mAdditionalBatteryInfoMenu;
69 private MenuInflater mMenuInflater;
71 private BatterySipper mBatterySipper;
73 private TestFragment mFragment;
74 private FakeFeatureFactory mFeatureFactory;
75 private PowerUsageSummary mPowerUsageSummary;
79 MockitoAnnotations.initMocks(this);
81 FakeFeatureFactory.setupForTest(mContext);
82 mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
84 mFragment = new TestFragment(mContext);
86 when(mMenu.add(Menu.NONE, MENU_STATS_REFRESH, Menu.NONE,
87 R.string.menu_stats_refresh)
88 .setIcon(com.android.internal.R.drawable.ic_menu_refresh)
89 .setAlphabeticShortcut('r'))
90 .thenReturn(mRefreshMenu);
91 when(mAdditionalBatteryInfoMenu.getItemId())
92 .thenReturn(MENU_ADDITIONAL_BATTERY_INFO);
93 when(mFeatureFactory.powerUsageFeatureProvider.getAdditionalBatteryInfoIntent())
94 .thenReturn(ADDITIONAL_BATTERY_INFO_INTENT);
96 mPowerUsageSummary = new PowerUsageSummary();
98 when(mBatterySipper.getPackages()).thenReturn(PACKAGE_NAMES);
99 when(mBatterySipper.getUid()).thenReturn(UID);
100 mBatterySipper.totalPowerMah = POWER_MAH;
104 public void testOptionsMenu_additionalBatteryInfoEnabled() {
105 when(mFeatureFactory.powerUsageFeatureProvider.isAdditionalBatteryInfoEnabled())
108 mFragment.onCreateOptionsMenu(mMenu, mMenuInflater);
110 verify(mMenu).add(Menu.NONE, MENU_ADDITIONAL_BATTERY_INFO,
111 Menu.NONE, R.string.additional_battery_info);
113 mFragment.onOptionsItemSelected(mAdditionalBatteryInfoMenu);
115 assertThat(mFragment.mStartActivityCalled).isTrue();
116 assertThat(mFragment.mStartActivityIntent).isEqualTo(ADDITIONAL_BATTERY_INFO_INTENT);
120 public void testOptionsMenu_additionalBatteryInfoDisabled() {
121 when(mFeatureFactory.powerUsageFeatureProvider.isAdditionalBatteryInfoEnabled())
124 mFragment.onCreateOptionsMenu(mMenu, mMenuInflater);
126 verify(mMenu, never()).add(Menu.NONE, MENU_ADDITIONAL_BATTERY_INFO,
127 Menu.NONE, R.string.additional_battery_info);
131 public void testExtractKeyFromSipper_TypeAPPUidObjectNull_ReturnPackageNames() {
132 mBatterySipper.uidObj = null;
133 mBatterySipper.drainType = BatterySipper.DrainType.APP;
135 final String key = mPowerUsageSummary.extractKeyFromSipper(mBatterySipper);
136 assertThat(key).isEqualTo(TextUtils.concat(mBatterySipper.getPackages()).toString());
140 public void testExtractKeyFromSipper_TypeOther_ReturnDrainType() {
141 mBatterySipper.uidObj = null;
142 mBatterySipper.drainType = BatterySipper.DrainType.BLUETOOTH;
144 final String key = mPowerUsageSummary.extractKeyFromSipper(mBatterySipper);
145 assertThat(key).isEqualTo(mBatterySipper.drainType.toString());
149 public void testExtractKeyFromSipper_TypeAPPUidObjectNotNull_ReturnUid() {
150 mBatterySipper.uidObj = new BatteryStatsImpl.Uid(new BatteryStatsImpl(), UID);
151 mBatterySipper.drainType = BatterySipper.DrainType.APP;
153 final String key = mPowerUsageSummary.extractKeyFromSipper(mBatterySipper);
154 assertThat(key).isEqualTo(Integer.toString(mBatterySipper.getUid()));
158 public void testShouldHideSipper_TypeIdle_ReturnTrue() {
159 mBatterySipper.drainType = BatterySipper.DrainType.IDLE;
160 assertThat(mPowerUsageSummary.shouldHideSipper(mBatterySipper)).isTrue();
164 public void testShouldHideSipper_TypeCell_ReturnTrue() {
165 mBatterySipper.drainType = BatterySipper.DrainType.CELL;
166 assertThat(mPowerUsageSummary.shouldHideSipper(mBatterySipper)).isTrue();
170 public void testShouldHideSipper_UidRoot_ReturnTrue() {
171 mBatterySipper.drainType = BatterySipper.DrainType.APP;
172 when(mBatterySipper.getUid()).thenReturn(Process.ROOT_UID);
173 assertThat(mPowerUsageSummary.shouldHideSipper(mBatterySipper)).isTrue();
177 public void testShouldHideSipper_UidSystem_ReturnTrue() {
178 mBatterySipper.drainType = BatterySipper.DrainType.APP;
179 when(mBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
180 assertThat(mPowerUsageSummary.shouldHideSipper(mBatterySipper)).isTrue();
184 public void testShouldHideSipper_UidNormal_ReturnFalse() {
185 mBatterySipper.drainType = BatterySipper.DrainType.APP;
186 when(mBatterySipper.getUid()).thenReturn(UID);
187 assertThat(mPowerUsageSummary.shouldHideSipper(mBatterySipper)).isFalse();
190 public static class TestFragment extends PowerUsageSummary {
192 private Context mContext;
193 private boolean mStartActivityCalled;
194 private Intent mStartActivityIntent;
196 public TestFragment(Context context) {
201 public Context getContext() {
206 public void startActivity(Intent intent) {
207 mStartActivityCalled = true;
208 mStartActivityIntent = intent;