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 17 package com.android.cts.net; 18 19 import android.platform.test.annotations.SecurityTest; 20 21 import com.android.ddmlib.Log; 22 import com.android.tradefed.device.DeviceNotAvailableException; 23 import com.android.tradefed.util.RunUtil; 24 25 public class HostsideRestrictBackgroundNetworkTests extends HostsideNetworkTestCase { 26 27 @Override setUp()28 protected void setUp() throws Exception { 29 super.setUp(); 30 31 uninstallPackage(TEST_APP2_PKG, false); 32 installPackage(TEST_APP2_APK); 33 } 34 35 @Override tearDown()36 protected void tearDown() throws Exception { 37 super.tearDown(); 38 39 uninstallPackage(TEST_APP2_PKG, true); 40 } 41 42 @SecurityTest testDataWarningReceiver()43 public void testDataWarningReceiver() throws Exception { 44 runDeviceTests(TEST_PKG, TEST_PKG + ".DataWarningReceiverTest", 45 "testSnoozeWarningNotReceived"); 46 } 47 48 /************************** 49 * Data Saver Mode tests. * 50 **************************/ 51 testDataSaverMode_disabled()52 public void testDataSaverMode_disabled() throws Exception { 53 runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest", 54 "testGetRestrictBackgroundStatus_disabled"); 55 } 56 testDataSaverMode_whitelisted()57 public void testDataSaverMode_whitelisted() throws Exception { 58 runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest", 59 "testGetRestrictBackgroundStatus_whitelisted"); 60 } 61 testDataSaverMode_enabled()62 public void testDataSaverMode_enabled() throws Exception { 63 runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest", 64 "testGetRestrictBackgroundStatus_enabled"); 65 } 66 testDataSaverMode_blacklisted()67 public void testDataSaverMode_blacklisted() throws Exception { 68 runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest", 69 "testGetRestrictBackgroundStatus_blacklisted"); 70 } 71 testDataSaverMode_reinstall()72 public void testDataSaverMode_reinstall() throws Exception { 73 final int oldUid = getUid(TEST_APP2_PKG); 74 75 // Make sure whitelist is revoked when package is removed 76 addRestrictBackgroundWhitelist(oldUid); 77 78 uninstallPackage(TEST_APP2_PKG, true); 79 assertPackageUninstalled(TEST_APP2_PKG); 80 assertRestrictBackgroundWhitelist(oldUid, false); 81 82 installPackage(TEST_APP2_APK); 83 final int newUid = getUid(TEST_APP2_PKG); 84 assertRestrictBackgroundWhitelist(oldUid, false); 85 assertRestrictBackgroundWhitelist(newUid, false); 86 } 87 testDataSaverMode_requiredWhitelistedPackages()88 public void testDataSaverMode_requiredWhitelistedPackages() throws Exception { 89 runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest", 90 "testGetRestrictBackgroundStatus_requiredWhitelistedPackages"); 91 } 92 testDataSaverMode_broadcastNotSentOnUnsupportedDevices()93 public void testDataSaverMode_broadcastNotSentOnUnsupportedDevices() throws Exception { 94 runDeviceTests(TEST_PKG, TEST_PKG + ".DataSaverModeTest", 95 "testBroadcastNotSentOnUnsupportedDevices"); 96 } 97 98 /***************************** 99 * Battery Saver Mode tests. * 100 *****************************/ 101 testBatterySaverModeMetered_disabled()102 public void testBatterySaverModeMetered_disabled() throws Exception { 103 runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeMeteredTest", 104 "testBackgroundNetworkAccess_disabled"); 105 } 106 testBatterySaverModeMetered_whitelisted()107 public void testBatterySaverModeMetered_whitelisted() throws Exception { 108 runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeMeteredTest", 109 "testBackgroundNetworkAccess_whitelisted"); 110 } 111 testBatterySaverModeMetered_enabled()112 public void testBatterySaverModeMetered_enabled() throws Exception { 113 runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeMeteredTest", 114 "testBackgroundNetworkAccess_enabled"); 115 } 116 testBatterySaverMode_reinstall()117 public void testBatterySaverMode_reinstall() throws Exception { 118 if (!isDozeModeEnabled()) { 119 Log.w(TAG, "testBatterySaverMode_reinstall() skipped because device does not support " 120 + "Doze Mode"); 121 return; 122 } 123 124 addPowerSaveModeWhitelist(TEST_APP2_PKG); 125 126 uninstallPackage(TEST_APP2_PKG, true); 127 assertPackageUninstalled(TEST_APP2_PKG); 128 assertPowerSaveModeWhitelist(TEST_APP2_PKG, false); 129 130 installPackage(TEST_APP2_APK); 131 assertPowerSaveModeWhitelist(TEST_APP2_PKG, false); 132 } 133 testBatterySaverModeNonMetered_disabled()134 public void testBatterySaverModeNonMetered_disabled() throws Exception { 135 runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeNonMeteredTest", 136 "testBackgroundNetworkAccess_disabled"); 137 } 138 testBatterySaverModeNonMetered_whitelisted()139 public void testBatterySaverModeNonMetered_whitelisted() throws Exception { 140 runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeNonMeteredTest", 141 "testBackgroundNetworkAccess_whitelisted"); 142 } 143 testBatterySaverModeNonMetered_enabled()144 public void testBatterySaverModeNonMetered_enabled() throws Exception { 145 runDeviceTests(TEST_PKG, TEST_PKG + ".BatterySaverModeNonMeteredTest", 146 "testBackgroundNetworkAccess_enabled"); 147 } 148 149 /******************* 150 * App idle tests. * 151 *******************/ 152 testAppIdleMetered_disabled()153 public void testAppIdleMetered_disabled() throws Exception { 154 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest", 155 "testBackgroundNetworkAccess_disabled"); 156 } 157 testAppIdleMetered_whitelisted()158 public void testAppIdleMetered_whitelisted() throws Exception { 159 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest", 160 "testBackgroundNetworkAccess_whitelisted"); 161 } 162 testAppIdleMetered_tempWhitelisted()163 public void testAppIdleMetered_tempWhitelisted() throws Exception { 164 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest", 165 "testBackgroundNetworkAccess_tempWhitelisted"); 166 } 167 testAppIdleMetered_enabled()168 public void testAppIdleMetered_enabled() throws Exception { 169 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest", 170 "testBackgroundNetworkAccess_enabled"); 171 } 172 testAppIdleMetered_idleWhitelisted()173 public void testAppIdleMetered_idleWhitelisted() throws Exception { 174 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest", 175 "testAppIdleNetworkAccess_idleWhitelisted"); 176 } 177 178 // TODO: currently power-save mode and idle uses the same whitelist, so this test would be 179 // redundant (as it would be testing the same as testBatterySaverMode_reinstall()) 180 // public void testAppIdle_reinstall() throws Exception { 181 // } 182 testAppIdleNonMetered_disabled()183 public void testAppIdleNonMetered_disabled() throws Exception { 184 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest", 185 "testBackgroundNetworkAccess_disabled"); 186 } 187 testAppIdleNonMetered_whitelisted()188 public void testAppIdleNonMetered_whitelisted() throws Exception { 189 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest", 190 "testBackgroundNetworkAccess_whitelisted"); 191 } 192 testAppIdleNonMetered_tempWhitelisted()193 public void testAppIdleNonMetered_tempWhitelisted() throws Exception { 194 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest", 195 "testBackgroundNetworkAccess_tempWhitelisted"); 196 } 197 testAppIdleNonMetered_enabled()198 public void testAppIdleNonMetered_enabled() throws Exception { 199 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest", 200 "testBackgroundNetworkAccess_enabled"); 201 } 202 testAppIdleNonMetered_idleWhitelisted()203 public void testAppIdleNonMetered_idleWhitelisted() throws Exception { 204 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest", 205 "testAppIdleNetworkAccess_idleWhitelisted"); 206 } 207 testAppIdleNonMetered_whenCharging()208 public void testAppIdleNonMetered_whenCharging() throws Exception { 209 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest", 210 "testAppIdleNetworkAccess_whenCharging"); 211 } 212 testAppIdleMetered_whenCharging()213 public void testAppIdleMetered_whenCharging() throws Exception { 214 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleMeteredTest", 215 "testAppIdleNetworkAccess_whenCharging"); 216 } 217 testAppIdle_toast()218 public void testAppIdle_toast() throws Exception { 219 // Check that showing a toast doesn't bring an app out of standby 220 runDeviceTests(TEST_PKG, TEST_PKG + ".AppIdleNonMeteredTest", 221 "testAppIdle_toast"); 222 } 223 224 /******************** 225 * Doze Mode tests. * 226 ********************/ 227 testDozeModeMetered_disabled()228 public void testDozeModeMetered_disabled() throws Exception { 229 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest", 230 "testBackgroundNetworkAccess_disabled"); 231 } 232 testDozeModeMetered_whitelisted()233 public void testDozeModeMetered_whitelisted() throws Exception { 234 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest", 235 "testBackgroundNetworkAccess_whitelisted"); 236 } 237 testDozeModeMetered_enabled()238 public void testDozeModeMetered_enabled() throws Exception { 239 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest", 240 "testBackgroundNetworkAccess_enabled"); 241 } 242 testDozeModeMetered_enabledButWhitelistedOnNotificationAction()243 public void testDozeModeMetered_enabledButWhitelistedOnNotificationAction() throws Exception { 244 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeMeteredTest", 245 "testBackgroundNetworkAccess_enabledButWhitelistedOnNotificationAction"); 246 } 247 248 // TODO: currently power-save mode and idle uses the same whitelist, so this test would be 249 // redundant (as it would be testing the same as testBatterySaverMode_reinstall()) 250 // public void testDozeMode_reinstall() throws Exception { 251 // } 252 testDozeModeNonMetered_disabled()253 public void testDozeModeNonMetered_disabled() throws Exception { 254 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest", 255 "testBackgroundNetworkAccess_disabled"); 256 } 257 testDozeModeNonMetered_whitelisted()258 public void testDozeModeNonMetered_whitelisted() throws Exception { 259 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest", 260 "testBackgroundNetworkAccess_whitelisted"); 261 } 262 testDozeModeNonMetered_enabled()263 public void testDozeModeNonMetered_enabled() throws Exception { 264 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest", 265 "testBackgroundNetworkAccess_enabled"); 266 } 267 testDozeModeNonMetered_enabledButWhitelistedOnNotificationAction()268 public void testDozeModeNonMetered_enabledButWhitelistedOnNotificationAction() 269 throws Exception { 270 runDeviceTests(TEST_PKG, TEST_PKG + ".DozeModeNonMeteredTest", 271 "testBackgroundNetworkAccess_enabledButWhitelistedOnNotificationAction"); 272 } 273 274 /********************** 275 * Mixed modes tests. * 276 **********************/ 277 testDataAndBatterySaverModes_meteredNetwork()278 public void testDataAndBatterySaverModes_meteredNetwork() throws Exception { 279 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 280 "testDataAndBatterySaverModes_meteredNetwork"); 281 } 282 testDataAndBatterySaverModes_nonMeteredNetwork()283 public void testDataAndBatterySaverModes_nonMeteredNetwork() throws Exception { 284 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 285 "testDataAndBatterySaverModes_nonMeteredNetwork"); 286 } 287 testDozeAndBatterySaverMode_powerSaveWhitelists()288 public void testDozeAndBatterySaverMode_powerSaveWhitelists() throws Exception { 289 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 290 "testDozeAndBatterySaverMode_powerSaveWhitelists"); 291 } 292 testDozeAndAppIdle_powerSaveWhitelists()293 public void testDozeAndAppIdle_powerSaveWhitelists() throws Exception { 294 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 295 "testDozeAndAppIdle_powerSaveWhitelists"); 296 } 297 testAppIdleAndDoze_tempPowerSaveWhitelists()298 public void testAppIdleAndDoze_tempPowerSaveWhitelists() throws Exception { 299 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 300 "testAppIdleAndDoze_tempPowerSaveWhitelists"); 301 } 302 testAppIdleAndBatterySaver_tempPowerSaveWhitelists()303 public void testAppIdleAndBatterySaver_tempPowerSaveWhitelists() throws Exception { 304 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 305 "testAppIdleAndBatterySaver_tempPowerSaveWhitelists"); 306 } 307 testDozeAndAppIdle_appIdleWhitelist()308 public void testDozeAndAppIdle_appIdleWhitelist() throws Exception { 309 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 310 "testDozeAndAppIdle_appIdleWhitelist"); 311 } 312 testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists()313 public void testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists() throws Exception { 314 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 315 "testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists"); 316 } 317 testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists()318 public void testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists() throws Exception { 319 runDeviceTests(TEST_PKG, TEST_PKG + ".MixedModesTest", 320 "testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists"); 321 } 322 323 /************************** 324 * Restricted mode tests. * 325 **************************/ testNetworkAccess_restrictedMode()326 public void testNetworkAccess_restrictedMode() throws Exception { 327 runDeviceTests(TEST_PKG, TEST_PKG + ".RestrictedModeTest", 328 "testNetworkAccess"); 329 } 330 testNetworkAccess_restrictedMode_withBatterySaver()331 public void testNetworkAccess_restrictedMode_withBatterySaver() throws Exception { 332 runDeviceTests(TEST_PKG, TEST_PKG + ".RestrictedModeTest", 333 "testNetworkAccess_withBatterySaver"); 334 } 335 336 /************************ 337 * Expedited job tests. * 338 ************************/ 339 testMeteredNetworkAccess_expeditedJob()340 public void testMeteredNetworkAccess_expeditedJob() throws Exception { 341 runDeviceTests(TEST_PKG, TEST_PKG + ".ExpeditedJobMeteredTest"); 342 } 343 testNonMeteredNetworkAccess_expeditedJob()344 public void testNonMeteredNetworkAccess_expeditedJob() throws Exception { 345 runDeviceTests(TEST_PKG, TEST_PKG + ".ExpeditedJobNonMeteredTest"); 346 } 347 348 /******************* 349 * Helper methods. * 350 *******************/ 351 assertRestrictBackgroundWhitelist(int uid, boolean expected)352 private void assertRestrictBackgroundWhitelist(int uid, boolean expected) throws Exception { 353 final int max_tries = 5; 354 boolean actual = false; 355 for (int i = 1; i <= max_tries; i++) { 356 final String output = runCommand("cmd netpolicy list restrict-background-whitelist "); 357 actual = output.contains(Integer.toString(uid)); 358 if (expected == actual) { 359 return; 360 } 361 Log.v(TAG, "whitelist check for uid " + uid + " doesn't match yet (expected " 362 + expected + ", got " + actual + "); sleeping 1s before polling again"); 363 RunUtil.getDefault().sleep(1000); 364 } 365 fail("whitelist check for uid " + uid + " failed: expected " 366 + expected + ", got " + actual); 367 } 368 assertPowerSaveModeWhitelist(String packageName, boolean expected)369 private void assertPowerSaveModeWhitelist(String packageName, boolean expected) 370 throws Exception { 371 // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll 372 // need to use netpolicy for whitelisting 373 assertDelayedCommand("dumpsys deviceidle whitelist =" + packageName, 374 Boolean.toString(expected)); 375 } 376 377 /** 378 * Asserts the result of a command, wait and re-running it a couple times if necessary. 379 */ assertDelayedCommand(String command, String expectedResult)380 private void assertDelayedCommand(String command, String expectedResult) 381 throws InterruptedException, DeviceNotAvailableException { 382 final int maxTries = 5; 383 for (int i = 1; i <= maxTries; i++) { 384 final String result = runCommand(command).trim(); 385 if (result.equals(expectedResult)) return; 386 Log.v(TAG, "Command '" + command + "' returned '" + result + " instead of '" 387 + expectedResult + "' on attempt #; sleeping 1s before polling again"); 388 RunUtil.getDefault().sleep(1000); 389 } 390 fail("Command '" + command + "' did not return '" + expectedResult + "' after " + maxTries 391 + " attempts"); 392 } 393 addRestrictBackgroundWhitelist(int uid)394 protected void addRestrictBackgroundWhitelist(int uid) throws Exception { 395 runCommand("cmd netpolicy add restrict-background-whitelist " + uid); 396 assertRestrictBackgroundWhitelist(uid, true); 397 } 398 addPowerSaveModeWhitelist(String packageName)399 private void addPowerSaveModeWhitelist(String packageName) throws Exception { 400 Log.i(TAG, "Adding package " + packageName + " to power-save-mode whitelist"); 401 // TODO: currently the power-save mode is behaving like idle, but once it changes, we'll 402 // need to use netpolicy for whitelisting 403 runCommand("dumpsys deviceidle whitelist +" + packageName); 404 assertPowerSaveModeWhitelist(packageName, true); 405 } 406 isDozeModeEnabled()407 protected boolean isDozeModeEnabled() throws Exception { 408 final String result = runCommand("cmd deviceidle enabled deep").trim(); 409 return result.equals("1"); 410 } 411 } 412