blob: 561c61fb979f6e9ad16e7031802d4dd6707e0648 [file] [log] [blame]
jackqdyulei92681e82017-02-28 11:26:28 -08001/*
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
17package com.android.server.power;
18
Makoto Onuki66a78122017-11-14 15:03:21 -080019import static android.os.PowerManagerInternal.WAKEFULNESS_ASLEEP;
20import static android.os.PowerManagerInternal.WAKEFULNESS_AWAKE;
21
22import static com.google.common.truth.Truth.assertThat;
23
Santos Cordon64a6e612018-08-22 19:27:04 +010024import static org.mockito.ArgumentMatchers.anyBoolean;
25import static org.mockito.ArgumentMatchers.eq;
26import static org.mockito.Mockito.mock;
Makoto Onuki66a78122017-11-14 15:03:21 -080027import static org.mockito.Mockito.when;
28
Santos Cordon64a6e612018-08-22 19:27:04 +010029import android.app.ActivityManagerInternal;
30import android.content.Context;
31import android.hardware.display.DisplayManagerInternal;
jackqdyulei92681e82017-02-28 11:26:28 -080032import android.hardware.display.DisplayManagerInternal.DisplayPowerRequest;
Santos Cordon64a6e612018-08-22 19:27:04 +010033import android.os.BatteryManagerInternal;
34import android.os.Looper;
Salvador Martineza6f7b252017-04-10 10:46:15 -070035import android.os.PowerManager;
jackqdyulei92681e82017-02-28 11:26:28 -080036import android.os.PowerSaveState;
Santos Cordon64a6e612018-08-22 19:27:04 +010037import android.os.SystemClock;
Mark Salyzyne65c0c62017-08-15 07:53:47 -070038import android.os.SystemProperties;
jackqdyulei92681e82017-02-28 11:26:28 -080039import android.test.AndroidTestCase;
Alex Kershaw2418ea92018-10-19 17:17:49 +010040import android.test.suitebuilder.annotation.MediumTest;
jackqdyulei92681e82017-02-28 11:26:28 -080041import android.test.suitebuilder.annotation.SmallTest;
Makoto Onuki66a78122017-11-14 15:03:21 -080042
Santos Cordon64a6e612018-08-22 19:27:04 +010043import com.android.internal.app.IBatteryStats;
44import com.android.server.LocalServices;
45import com.android.server.SystemService;
46import com.android.server.lights.LightsManager;
47import com.android.server.policy.WindowManagerPolicy;
48import com.android.server.power.PowerManagerService.Injector;
49import com.android.server.power.PowerManagerService.NativeWrapper;
50import com.android.server.power.batterysaver.BatterySavingStats;
Makoto Onuki66a78122017-11-14 15:03:21 -080051
Salvador Martineza6f7b252017-04-10 10:46:15 -070052import org.junit.Rule;
jackqdyulei92681e82017-02-28 11:26:28 -080053import org.mockito.Mock;
54import org.mockito.MockitoAnnotations;
55
jackqdyulei92681e82017-02-28 11:26:28 -080056/**
57 * Tests for {@link com.android.server.power.PowerManagerService}
58 */
59public class PowerManagerServiceTest extends AndroidTestCase {
60 private static final float PRECISION = 0.001f;
61 private static final float BRIGHTNESS_FACTOR = 0.7f;
62 private static final boolean BATTERY_SAVER_ENABLED = true;
Mark Salyzyne65c0c62017-08-15 07:53:47 -070063 private static final String TEST_LAST_REBOOT_PROPERTY = "test.sys.boot.reason";
jackqdyulei92681e82017-02-28 11:26:28 -080064
Santos Cordon64a6e612018-08-22 19:27:04 +010065 private @Mock BatterySaverPolicy mBatterySaverPolicyMock;
66 private @Mock LightsManager mLightsManagerMock;
67 private @Mock DisplayManagerInternal mDisplayManagerInternalMock;
68 private @Mock BatteryManagerInternal mBatteryManagerInternalMock;
69 private @Mock ActivityManagerInternal mActivityManagerInternalMock;
70 private @Mock PowerManagerService.NativeWrapper mNativeWrapperMock;
71 private @Mock Notifier mNotifierMock;
jackqdyulei92681e82017-02-28 11:26:28 -080072 private PowerManagerService mService;
73 private PowerSaveState mPowerSaveState;
74 private DisplayPowerRequest mDisplayPowerRequest;
Salvador Martineza6f7b252017-04-10 10:46:15 -070075
Santos Cordon64a6e612018-08-22 19:27:04 +010076
77
Salvador Martineza6f7b252017-04-10 10:46:15 -070078 @Rule
jackqdyulei92681e82017-02-28 11:26:28 -080079 public void setUp() throws Exception {
80 super.setUp();
81 MockitoAnnotations.initMocks(this);
82
83 mPowerSaveState = new PowerSaveState.Builder()
84 .setBatterySaverEnabled(BATTERY_SAVER_ENABLED)
85 .setBrightnessFactor(BRIGHTNESS_FACTOR)
86 .build();
Santos Cordon64a6e612018-08-22 19:27:04 +010087 when(mBatterySaverPolicyMock.getBatterySaverPolicy(
Makoto Onuki2eccd022017-11-01 13:44:23 -070088 eq(PowerManager.ServiceType.SCREEN_BRIGHTNESS), anyBoolean()))
jackqdyulei92681e82017-02-28 11:26:28 -080089 .thenReturn(mPowerSaveState);
Santos Cordon64a6e612018-08-22 19:27:04 +010090
jackqdyulei92681e82017-02-28 11:26:28 -080091 mDisplayPowerRequest = new DisplayPowerRequest();
Santos Cordon64a6e612018-08-22 19:27:04 +010092 addLocalServiceMock(LightsManager.class, mLightsManagerMock);
93 addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock);
94 addLocalServiceMock(BatteryManagerInternal.class, mBatteryManagerInternalMock);
95 addLocalServiceMock(ActivityManagerInternal.class, mActivityManagerInternalMock);
96
97 mService = new PowerManagerService(getContext(), new Injector() {
98 Notifier createNotifier(Looper looper, Context context, IBatteryStats batteryStats,
99 SuspendBlocker suspendBlocker, WindowManagerPolicy policy) {
100 return mNotifierMock;
101 }
102
103 SuspendBlocker createSuspendBlocker(PowerManagerService service, String name) {
104 return mock(SuspendBlocker.class);
105 }
106
107 BatterySaverPolicy createBatterySaverPolicy(
108 Object lock, Context context, BatterySavingStats batterySavingStats) {
109 return mBatterySaverPolicyMock;
110 }
111
112 NativeWrapper createNativeWrapper() {
113 return mNativeWrapperMock;
114 }
115 });
116 }
117
118 @Override
119 public void tearDown() throws Exception {
120 LocalServices.removeServiceForTest(LightsManager.class);
121 LocalServices.removeServiceForTest(DisplayManagerInternal.class);
122 LocalServices.removeServiceForTest(BatteryManagerInternal.class);
123 LocalServices.removeServiceForTest(ActivityManagerInternal.class);
124 }
125
126 /**
127 * Creates a mock and registers it to {@link LocalServices}.
128 */
129 private static <T> void addLocalServiceMock(Class<T> clazz, T mock) {
130 LocalServices.removeServiceForTest(clazz);
131 LocalServices.addService(clazz, mock);
jackqdyulei92681e82017-02-28 11:26:28 -0800132 }
133
134 @SmallTest
135 public void testUpdatePowerScreenPolicy_UpdateDisplayPowerRequest() {
136 mService.updatePowerRequestFromBatterySaverPolicy(mDisplayPowerRequest);
137 assertThat(mDisplayPowerRequest.lowPowerMode).isEqualTo(BATTERY_SAVER_ENABLED);
138 assertThat(mDisplayPowerRequest.screenLowPowerBrightnessFactor)
139 .isWithin(PRECISION).of(BRIGHTNESS_FACTOR);
140 }
Salvador Martineza6f7b252017-04-10 10:46:15 -0700141
142 @SmallTest
143 public void testGetLastShutdownReasonInternal() {
Mark Salyzyne65c0c62017-08-15 07:53:47 -0700144 SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, "shutdown,thermal");
145 int reason = mService.getLastShutdownReasonInternal(TEST_LAST_REBOOT_PROPERTY);
146 SystemProperties.set(TEST_LAST_REBOOT_PROPERTY, "");
Salvador Martineza6f7b252017-04-10 10:46:15 -0700147 assertThat(reason).isEqualTo(PowerManager.SHUTDOWN_REASON_THERMAL_SHUTDOWN);
148 }
Santos Cordon21e9f2b2017-09-13 11:59:39 -0700149
150 @SmallTest
151 public void testGetDesiredScreenPolicy_WithVR() throws Exception {
152 // Brighten up the screen
153 mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, 0);
154 assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo(
155 DisplayPowerRequest.POLICY_BRIGHT);
156
157 // Move to VR
158 mService.setVrModeEnabled(true);
159 assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo(
160 DisplayPowerRequest.POLICY_VR);
161
162 // Then take a nap
163 mService.setWakefulnessLocked(WAKEFULNESS_ASLEEP, 0);
164 assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo(
165 DisplayPowerRequest.POLICY_OFF);
166
167 // Wake up to VR
168 mService.setWakefulnessLocked(WAKEFULNESS_AWAKE, 0);
169 assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo(
170 DisplayPowerRequest.POLICY_VR);
171
172 // And back to normal
173 mService.setVrModeEnabled(false);
174 assertThat(mService.getDesiredScreenPolicyLocked()).isEqualTo(
175 DisplayPowerRequest.POLICY_BRIGHT);
Santos Cordon64a6e612018-08-22 19:27:04 +0100176 }
Santos Cordon21e9f2b2017-09-13 11:59:39 -0700177
Santos Cordon64a6e612018-08-22 19:27:04 +0100178 @SmallTest
179 public void testWakefulnessAwake_InitialValue() throws Exception {
180 assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
181 }
182
183 @SmallTest
184 public void testWakefulnessSleep_NoDozeSleepFlag() throws Exception {
185 // Start with AWAKE state
186 assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_AWAKE);
187
188 mService.systemReady(null);
189 mService.onBootPhase(SystemService.PHASE_BOOT_COMPLETED);
190
191 // Take a nap with a flag.
192 mService.getBinderServiceInstance().goToSleep(SystemClock.uptimeMillis(),
193 PowerManager.GO_TO_SLEEP_REASON_APPLICATION, PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
194
195 assertThat(mService.getWakefulness()).isEqualTo(WAKEFULNESS_ASLEEP);
Santos Cordon21e9f2b2017-09-13 11:59:39 -0700196 }
Alex Kershaw2418ea92018-10-19 17:17:49 +0100197
198 @MediumTest
199 public void testWasDeviceIdleFor_true() {
200 int interval = 1000;
201 mService.onUserActivity();
202 SystemClock.sleep(interval);
203 assertThat(mService.wasDeviceIdleForInternal(interval)).isTrue();
204 }
205
206 @SmallTest
207 public void testWasDeviceIdleFor_false() {
208 int interval = 1000;
209 mService.onUserActivity();
210 assertThat(mService.wasDeviceIdleForInternal(interval)).isFalse();
211 }
jackqdyulei92681e82017-02-28 11:26:28 -0800212}