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 */
16package com.android.server.power;
17
18import android.os.PowerSaveState;
19import android.os.Handler;
20import android.test.AndroidTestCase;
21import android.test.suitebuilder.annotation.SmallTest;
22
23import com.android.server.power.BatterySaverPolicy.ServiceType;
24
25import org.mockito.Mock;
26import org.mockito.MockitoAnnotations;
27
28import static com.google.common.truth.Truth.assertThat;
29
30/**
31 * Tests for {@link com.android.server.power.BatterySaverPolicy}
32 */
33public class BatterySaverPolicyTest extends AndroidTestCase {
34    private static final boolean BATTERY_SAVER_ON = true;
35    private static final boolean BATTERY_SAVER_OFF = false;
36    private static final float BRIGHTNESS_FACTOR = 0.7f;
37    private static final float DEFAULT_BRIGHTNESS_FACTOR = 0.5f;
38    private static final float PRECISION = 0.001f;
39    private static final int GPS_MODE = 0;
40    private static final int DEFAULT_GPS_MODE = 1;
41    private static final String BATTERY_SAVER_CONSTANTS = "vibration_disabled=true,"
42            + "animation_disabled=false,"
43            + "soundtrigger_disabled=true,"
44            + "firewall_disabled=false,"
45            + "datasaver_disabled=false,"
46            + "adjust_brightness_disabled=true,"
47            + "adjust_brightness_factor=0.7,"
48            + "fullbackup_deferred=true,"
49            + "keyvaluebackup_deferred=false,"
50            + "gps_mode=0";
51    private static final String BATTERY_SAVER_INCORRECT_CONSTANTS = "vi*,!=,,true";
52
53    @Mock
54    Handler mHandler;
55    private BatterySaverPolicy mBatterySaverPolicy;
56
57    public void setUp() throws Exception {
58        super.setUp();
59        MockitoAnnotations.initMocks(this);
60        mBatterySaverPolicy = new BatterySaverPolicy(mHandler);
61        mBatterySaverPolicy.start(getContext().getContentResolver());
62    }
63
64    @SmallTest
65    public void testGetBatterySaverPolicy_PolicyNull_DefaultValueCorrect() {
66        testServiceDefaultValue(ServiceType.NULL);
67    }
68
69    @SmallTest
70    public void testGetBatterySaverPolicy_PolicyVibration_DefaultValueCorrect() {
71        testServiceDefaultValue(ServiceType.VIBRATION);
72    }
73
74    @SmallTest
75    public void testGetBatterySaverPolicy_PolicySound_DefaultValueCorrect() {
76        testServiceDefaultValue(ServiceType.SOUND);
77    }
78
79    @SmallTest
80    public void testGetBatterySaverPolicy_PolicyFullBackup_DefaultValueCorrect() {
81        testServiceDefaultValue(ServiceType.FULL_BACKUP);
82    }
83
84    @SmallTest
85    public void testGetBatterySaverPolicy_PolicyKeyValueBackup_DefaultValueCorrect() {
86        testServiceDefaultValue(ServiceType.KEYVALUE_BACKUP);
87    }
88
89    @SmallTest
90    public void testGetBatterySaverPolicy_PolicyAnimation_DefaultValueCorrect() {
91        testServiceDefaultValue(ServiceType.ANIMATION);
92    }
93
94    @SmallTest
95    public void testGetBatterySaverPolicy_PolicyBatteryStats_DefaultValueCorrect() {
96        testServiceDefaultValue(ServiceType.BATTERY_STATS);
97    }
98
99    @SmallTest
100    public void testGetBatterySaverPolicy_PolicyNetworkFirewall_DefaultValueCorrect() {
101        testServiceDefaultValue(ServiceType.NETWORK_FIREWALL);
102    }
103
104    @SmallTest
105    public void testGetBatterySaverPolicy_PolicyDataSaver_DefaultValueCorrect() {
106        mBatterySaverPolicy.updateConstants("");
107        final PowerSaveState batterySaverStateOn =
108                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.DATA_SAVER, BATTERY_SAVER_ON);
109        assertThat(batterySaverStateOn.batterySaverEnabled).isFalse();
110
111        final PowerSaveState batterySaverStateOff = mBatterySaverPolicy.getBatterySaverPolicy(
112                ServiceType.DATA_SAVER, BATTERY_SAVER_OFF);
113        assertThat(batterySaverStateOff.batterySaverEnabled).isFalse();
114    }
115
116    @SmallTest
117    public void testGetBatterySaverPolicy_PolicyScreenBrightness_DefaultValueCorrect() {
118        testServiceDefaultValue(ServiceType.SCREEN_BRIGHTNESS);
119
120        PowerSaveState stateOn =
121                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS, true);
122        assertThat(stateOn.brightnessFactor).isWithin(PRECISION).of(DEFAULT_BRIGHTNESS_FACTOR);
123    }
124
125    @SmallTest
126    public void testGetBatterySaverPolicy_PolicyGps_DefaultValueCorrect() {
127        testServiceDefaultValue(ServiceType.GPS);
128
129        PowerSaveState stateOn =
130                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS, true);
131        assertThat(stateOn.gpsMode).isEqualTo(DEFAULT_GPS_MODE);
132    }
133
134    @SmallTest
135    public void testUpdateConstants_getCorrectData() {
136        mBatterySaverPolicy.updateConstants(BATTERY_SAVER_CONSTANTS);
137
138        final PowerSaveState vibrationState =
139                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.VIBRATION, BATTERY_SAVER_ON);
140        assertThat(vibrationState.batterySaverEnabled).isTrue();
141
142        final PowerSaveState animationState =
143                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.ANIMATION, BATTERY_SAVER_ON);
144        assertThat(animationState.batterySaverEnabled).isFalse();
145
146        final PowerSaveState soundState =
147                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SOUND, BATTERY_SAVER_ON);
148        assertThat(soundState.batterySaverEnabled).isTrue();
149
150        final PowerSaveState networkState = mBatterySaverPolicy.getBatterySaverPolicy(
151                ServiceType.NETWORK_FIREWALL, BATTERY_SAVER_ON);
152        assertThat(networkState.batterySaverEnabled).isTrue();
153
154        final PowerSaveState screenState =
155                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.SCREEN_BRIGHTNESS,
156                        BATTERY_SAVER_ON);
157        assertThat(screenState.batterySaverEnabled).isFalse();
158        assertThat(screenState.brightnessFactor).isWithin(PRECISION).of(BRIGHTNESS_FACTOR);
159
160        final PowerSaveState fullBackupState = mBatterySaverPolicy.getBatterySaverPolicy(
161                ServiceType.FULL_BACKUP, BATTERY_SAVER_ON);
162        assertThat(fullBackupState.batterySaverEnabled).isTrue();
163
164        final PowerSaveState keyValueBackupState = mBatterySaverPolicy.getBatterySaverPolicy(
165                ServiceType.KEYVALUE_BACKUP, BATTERY_SAVER_ON);
166        assertThat(keyValueBackupState.batterySaverEnabled).isFalse();
167
168        final PowerSaveState dataSaverState = mBatterySaverPolicy.getBatterySaverPolicy(
169                ServiceType.DATA_SAVER, BATTERY_SAVER_ON);
170        assertThat(dataSaverState.batterySaverEnabled).isTrue();
171
172        final PowerSaveState gpsState =
173                mBatterySaverPolicy.getBatterySaverPolicy(ServiceType.GPS, BATTERY_SAVER_ON);
174        assertThat(gpsState.batterySaverEnabled).isTrue();
175        assertThat(gpsState.gpsMode).isEqualTo(GPS_MODE);
176    }
177
178    @SmallTest
179    public void testUpdateConstants_IncorrectData_NotCrash() {
180        //Should not crash
181        mBatterySaverPolicy.updateConstants(BATTERY_SAVER_INCORRECT_CONSTANTS);
182        mBatterySaverPolicy.updateConstants(null);
183    }
184
185    private void testServiceDefaultValue(@ServiceType int type) {
186        mBatterySaverPolicy.updateConstants("");
187        final PowerSaveState batterySaverStateOn =
188                mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_ON);
189        assertThat(batterySaverStateOn.batterySaverEnabled).isTrue();
190
191        final PowerSaveState batterySaverStateOff =
192                mBatterySaverPolicy.getBatterySaverPolicy(type, BATTERY_SAVER_OFF);
193        assertThat(batterySaverStateOff.batterySaverEnabled).isFalse();
194    }
195}
196