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.cts.net.hostside; 17 18 import android.os.SystemClock; 19 import android.util.Log; 20 21 /** 22 * Test cases for the more complex scenarios where multiple restrictions (like Battery Saver Mode 23 * and Data Saver Mode) are applied simultaneously. 24 * <p> 25 * <strong>NOTE: </strong>it might sound like the test methods on this class are testing too much, 26 * which would make it harder to diagnose individual failures, but the assumption is that such 27 * failure most likely will happen when the restriction is tested individually as well. 28 */ 29 public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase { 30 private static final String TAG = "MixedModesTest"; 31 32 @Override 33 public void setUp() throws Exception { 34 super.setUp(); 35 36 if (!isSupported()) return; 37 38 // Set initial state. 39 removeRestrictBackgroundWhitelist(mUid); 40 removeRestrictBackgroundBlacklist(mUid); 41 removePowerSaveModeWhitelist(TEST_APP2_PKG); 42 removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG); 43 44 registerBroadcastReceiver(); 45 } 46 47 @Override 48 protected void tearDown() throws Exception { 49 super.tearDown(); 50 51 if (!isSupported()) return; 52 53 try { 54 setRestrictBackground(false); 55 } finally { 56 setBatterySaverMode(false); 57 } 58 } 59 60 @Override 61 public boolean isSupported() throws Exception { 62 if (!isDozeModeEnabled()) { 63 Log.i(TAG, "Skipping " + getClass() + "." + getName() 64 + "() because device does not support Doze Mode"); 65 return false; 66 } 67 return true; 68 } 69 70 /** 71 * Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on metered networks. 72 */ 73 public void testDataAndBatterySaverModes_meteredNetwork() throws Exception { 74 if (!isSupported()) return; 75 76 Log.i(TAG, "testDataAndBatterySaverModes_meteredNetwork() tests"); 77 if (!setMeteredNetwork()) { 78 Log.w(TAG, "testDataAndBatterySaverModes_meteredNetwork() skipped because " 79 + "device cannot use a metered network"); 80 return; 81 } 82 83 try { 84 setRestrictBackground(true); 85 setBatterySaverMode(true); 86 87 Log.v(TAG, "Not whitelisted for any."); 88 assertBackgroundNetworkAccess(false); 89 assertsForegroundAlwaysHasNetworkAccess(); 90 assertBackgroundNetworkAccess(false); 91 92 Log.v(TAG, "Whitelisted for Data Saver but not for Battery Saver."); 93 addRestrictBackgroundWhitelist(mUid); 94 removePowerSaveModeWhitelist(TEST_APP2_PKG); 95 assertBackgroundNetworkAccess(false); 96 assertsForegroundAlwaysHasNetworkAccess(); 97 assertBackgroundNetworkAccess(false); 98 removeRestrictBackgroundWhitelist(mUid); 99 100 Log.v(TAG, "Whitelisted for Battery Saver but not for Data Saver."); 101 addPowerSaveModeWhitelist(TEST_APP2_PKG); 102 removeRestrictBackgroundWhitelist(mUid); 103 assertBackgroundNetworkAccess(false); 104 assertsForegroundAlwaysHasNetworkAccess(); 105 assertBackgroundNetworkAccess(false); 106 removePowerSaveModeWhitelist(TEST_APP2_PKG); 107 108 Log.v(TAG, "Whitelisted for both."); 109 addRestrictBackgroundWhitelist(mUid); 110 addPowerSaveModeWhitelist(TEST_APP2_PKG); 111 assertBackgroundNetworkAccess(true); 112 assertsForegroundAlwaysHasNetworkAccess(); 113 assertBackgroundNetworkAccess(true); 114 removePowerSaveModeWhitelist(TEST_APP2_PKG); 115 assertBackgroundNetworkAccess(false); 116 removeRestrictBackgroundWhitelist(mUid); 117 118 Log.v(TAG, "Blacklisted for Data Saver, not whitelisted for Battery Saver."); 119 addRestrictBackgroundBlacklist(mUid); 120 removePowerSaveModeWhitelist(TEST_APP2_PKG); 121 assertBackgroundNetworkAccess(false); 122 assertsForegroundAlwaysHasNetworkAccess(); 123 assertBackgroundNetworkAccess(false); 124 removeRestrictBackgroundBlacklist(mUid); 125 126 Log.v(TAG, "Blacklisted for Data Saver, whitelisted for Battery Saver."); 127 addRestrictBackgroundBlacklist(mUid); 128 addPowerSaveModeWhitelist(TEST_APP2_PKG); 129 assertBackgroundNetworkAccess(false); 130 assertsForegroundAlwaysHasNetworkAccess(); 131 assertBackgroundNetworkAccess(false); 132 removeRestrictBackgroundBlacklist(mUid); 133 removePowerSaveModeWhitelist(TEST_APP2_PKG); 134 } finally { 135 resetMeteredNetwork(); 136 } 137 } 138 139 /** 140 * Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on non-metered 141 * networks. 142 */ 143 public void testDataAndBatterySaverModes_nonMeteredNetwork() throws Exception { 144 if (!isSupported()) return; 145 146 if (!setUnmeteredNetwork()) { 147 Log.w(TAG, "testDataAndBatterySaverModes_nonMeteredNetwork() skipped because network" 148 + " is metered"); 149 return; 150 } 151 Log.i(TAG, "testDataAndBatterySaverModes_nonMeteredNetwork() tests"); 152 setRestrictBackground(true); 153 setBatterySaverMode(true); 154 155 Log.v(TAG, "Not whitelisted for any."); 156 assertBackgroundNetworkAccess(false); 157 assertsForegroundAlwaysHasNetworkAccess(); 158 assertBackgroundNetworkAccess(false); 159 160 Log.v(TAG, "Whitelisted for Data Saver but not for Battery Saver."); 161 addRestrictBackgroundWhitelist(mUid); 162 removePowerSaveModeWhitelist(TEST_APP2_PKG); 163 assertBackgroundNetworkAccess(false); 164 assertsForegroundAlwaysHasNetworkAccess(); 165 assertBackgroundNetworkAccess(false); 166 removeRestrictBackgroundWhitelist(mUid); 167 168 Log.v(TAG, "Whitelisted for Battery Saver but not for Data Saver."); 169 addPowerSaveModeWhitelist(TEST_APP2_PKG); 170 removeRestrictBackgroundWhitelist(mUid); 171 assertBackgroundNetworkAccess(true); 172 assertsForegroundAlwaysHasNetworkAccess(); 173 assertBackgroundNetworkAccess(true); 174 removePowerSaveModeWhitelist(TEST_APP2_PKG); 175 176 Log.v(TAG, "Whitelisted for both."); 177 addRestrictBackgroundWhitelist(mUid); 178 addPowerSaveModeWhitelist(TEST_APP2_PKG); 179 assertBackgroundNetworkAccess(true); 180 assertsForegroundAlwaysHasNetworkAccess(); 181 assertBackgroundNetworkAccess(true); 182 removePowerSaveModeWhitelist(TEST_APP2_PKG); 183 assertBackgroundNetworkAccess(false); 184 removeRestrictBackgroundWhitelist(mUid); 185 186 Log.v(TAG, "Blacklisted for Data Saver, not whitelisted for Battery Saver."); 187 addRestrictBackgroundBlacklist(mUid); 188 removePowerSaveModeWhitelist(TEST_APP2_PKG); 189 assertBackgroundNetworkAccess(false); 190 assertsForegroundAlwaysHasNetworkAccess(); 191 assertBackgroundNetworkAccess(false); 192 removeRestrictBackgroundBlacklist(mUid); 193 194 Log.v(TAG, "Blacklisted for Data Saver, whitelisted for Battery Saver."); 195 addRestrictBackgroundBlacklist(mUid); 196 addPowerSaveModeWhitelist(TEST_APP2_PKG); 197 assertBackgroundNetworkAccess(true); 198 assertsForegroundAlwaysHasNetworkAccess(); 199 assertBackgroundNetworkAccess(true); 200 removeRestrictBackgroundBlacklist(mUid); 201 removePowerSaveModeWhitelist(TEST_APP2_PKG); 202 } 203 204 /** 205 * Tests that powersave whitelists works as expected when doze and battery saver modes 206 * are enabled. 207 */ 208 public void testDozeAndBatterySaverMode_powerSaveWhitelists() throws Exception { 209 if (!isSupported()) { 210 return; 211 } 212 213 setBatterySaverMode(true); 214 setDozeMode(true); 215 216 try { 217 addPowerSaveModeWhitelist(TEST_APP2_PKG); 218 assertBackgroundNetworkAccess(true); 219 220 removePowerSaveModeWhitelist(TEST_APP2_PKG); 221 assertBackgroundNetworkAccess(false); 222 223 addPowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG); 224 assertBackgroundNetworkAccess(false); 225 226 removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG); 227 assertBackgroundNetworkAccess(false); 228 } finally { 229 setBatterySaverMode(false); 230 setDozeMode(false); 231 } 232 } 233 234 /** 235 * Tests that powersave whitelists works as expected when doze and appIdle modes 236 * are enabled. 237 */ 238 public void testDozeAndAppIdle_powerSaveWhitelists() throws Exception { 239 if (!isSupported()) { 240 return; 241 } 242 243 setDozeMode(true); 244 setAppIdle(true); 245 246 try { 247 addPowerSaveModeWhitelist(TEST_APP2_PKG); 248 assertBackgroundNetworkAccess(true); 249 250 removePowerSaveModeWhitelist(TEST_APP2_PKG); 251 assertBackgroundNetworkAccess(false); 252 253 addPowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG); 254 assertBackgroundNetworkAccess(false); 255 256 removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG); 257 assertBackgroundNetworkAccess(false); 258 } finally { 259 setAppIdle(false); 260 setDozeMode(false); 261 } 262 } 263 264 public void testAppIdleAndDoze_tempPowerSaveWhitelists() throws Exception { 265 if (!isSupported()) { 266 return; 267 } 268 269 setDozeMode(true); 270 setAppIdle(true); 271 272 try { 273 assertBackgroundNetworkAccess(false); 274 275 addTempPowerSaveModeWhitelist(TEST_APP2_PKG, TEMP_POWERSAVE_WHITELIST_DURATION_MS); 276 assertBackgroundNetworkAccess(true); 277 278 // Wait until the whitelist duration is expired. 279 SystemClock.sleep(TEMP_POWERSAVE_WHITELIST_DURATION_MS); 280 assertBackgroundNetworkAccess(false); 281 } finally { 282 setAppIdle(false); 283 setDozeMode(false); 284 } 285 } 286 287 public void testAppIdleAndBatterySaver_tempPowerSaveWhitelists() throws Exception { 288 if (!isSupported()) { 289 return; 290 } 291 292 setBatterySaverMode(true); 293 setAppIdle(true); 294 295 try { 296 assertBackgroundNetworkAccess(false); 297 298 addTempPowerSaveModeWhitelist(TEST_APP2_PKG, TEMP_POWERSAVE_WHITELIST_DURATION_MS); 299 assertBackgroundNetworkAccess(true); 300 301 // Wait until the whitelist duration is expired. 302 SystemClock.sleep(TEMP_POWERSAVE_WHITELIST_DURATION_MS); 303 assertBackgroundNetworkAccess(false); 304 } finally { 305 setAppIdle(false); 306 setBatterySaverMode(false); 307 } 308 } 309 } 310