Merge "Pull service dumps to help debug test failures." am: d8b6e3dfe8
Change-Id: I1db74e2c46445e7d54cf6758f7c2aeaffbfd2447
This commit is contained in:
@@ -31,4 +31,9 @@
|
|||||||
<option name="jar" value="CtsHostsideNetworkTests.jar" />
|
<option name="jar" value="CtsHostsideNetworkTests.jar" />
|
||||||
<option name="runtime-hint" value="3m56s" />
|
<option name="runtime-hint" value="3m56s" />
|
||||||
</test>
|
</test>
|
||||||
|
|
||||||
|
<metrics_collector class="com.android.tradefed.device.metric.FilePullerLogCollector">
|
||||||
|
<option name="directory-keys" value="/sdcard/CtsHostsideNetworkTests" />
|
||||||
|
<option name="collect-on-run-ended-only" value="true" />
|
||||||
|
</metrics_collector>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ android_test_helper_app {
|
|||||||
//sdk_version: "current",
|
//sdk_version: "current",
|
||||||
platform_apis: true,
|
platform_apis: true,
|
||||||
static_libs: [
|
static_libs: [
|
||||||
|
"androidx.test.rules",
|
||||||
|
"androidx.test.ext.junit",
|
||||||
"compatibility-device-util-axt",
|
"compatibility-device-util-axt",
|
||||||
"ctstestrunner-axt",
|
"ctstestrunner-axt",
|
||||||
"ub-uiautomator",
|
"ub-uiautomator",
|
||||||
|
|||||||
@@ -26,8 +26,9 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
|
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
<application>
|
<application android:requestLegacyExternalStorage="true" >
|
||||||
<uses-library android:name="android.test.runner" />
|
<uses-library android:name="android.test.runner" />
|
||||||
<activity android:name=".MyActivity" />
|
<activity android:name=".MyActivity" />
|
||||||
<service android:name=".MyVpnService"
|
<service android:name=".MyVpnService"
|
||||||
|
|||||||
@@ -16,20 +16,27 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.Property.APP_STANDBY_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.util.Log;
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for metered and non-metered tests on idle apps.
|
* Base class for metered and non-metered tests on idle apps.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({APP_STANDBY_MODE})
|
||||||
abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetworkTestCase {
|
abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetworkTestCase {
|
||||||
|
|
||||||
@Override
|
@Before
|
||||||
protected final void setUp() throws Exception {
|
public final void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
// Set initial state.
|
// Set initial state.
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
|
removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
|
||||||
@@ -39,41 +46,16 @@ abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetwork
|
|||||||
registerBroadcastReceiver();
|
registerBroadcastReceiver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@After
|
||||||
protected final void tearDown() throws Exception {
|
public final void tearDown() throws Exception {
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
turnBatteryOff();
|
||||||
|
setAppIdle(false);
|
||||||
try {
|
|
||||||
tearDownMeteredNetwork();
|
|
||||||
} finally {
|
|
||||||
turnBatteryOff();
|
|
||||||
setAppIdle(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isSupported() throws Exception {
|
|
||||||
boolean supported = isDozeModeEnabled();
|
|
||||||
if (!supported) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Doze Mode");
|
|
||||||
}
|
|
||||||
return supported;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the (non) metered network state.
|
|
||||||
*
|
|
||||||
* <p>By default is empty - it's up to subclasses to override.
|
|
||||||
*/
|
|
||||||
protected void tearDownMeteredNetwork() throws Exception {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_enabled() throws Exception {
|
public void testBackgroundNetworkAccess_enabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
@@ -98,9 +80,8 @@ abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetwork
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_whitelisted() throws Exception {
|
public void testBackgroundNetworkAccess_whitelisted() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
@@ -127,9 +108,8 @@ abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetwork
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_tempWhitelisted() throws Exception {
|
public void testBackgroundNetworkAccess_tempWhitelisted() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
@@ -140,23 +120,17 @@ abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetwork
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_disabled() throws Exception {
|
public void testBackgroundNetworkAccess_disabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({BATTERY_SAVER_MODE})
|
||||||
|
@Test
|
||||||
public void testAppIdleNetworkAccess_whenCharging() throws Exception {
|
public void testAppIdleNetworkAccess_whenCharging() throws Exception {
|
||||||
if (!isBatterySaverSupported()) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Battery saver mode");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
// Check that app is paroled when charging
|
// Check that app is paroled when charging
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
@@ -180,9 +154,8 @@ abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetwork
|
|||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testAppIdleNetworkAccess_idleWhitelisted() throws Exception {
|
public void testAppIdleNetworkAccess_idleWhitelisted() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
assertAppIdle(true);
|
assertAppIdle(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
@@ -199,9 +172,8 @@ abstract class AbstractAppIdleTestCase extends AbstractRestrictBackgroundNetwork
|
|||||||
removeAppIdleWhitelist(mUid + 1);
|
removeAppIdleWhitelist(mUid + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testAppIdle_toast() throws Exception {
|
public void testAppIdle_toast() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
assertAppIdle(true);
|
assertAppIdle(true);
|
||||||
assertEquals("Shown", showToast());
|
assertEquals("Shown", showToast());
|
||||||
|
|||||||
@@ -16,20 +16,22 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
import android.text.TextUtils;
|
import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
|
||||||
import android.util.Log;
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for metered and non-metered Battery Saver Mode tests.
|
* Base class for metered and non-metered Battery Saver Mode tests.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({BATTERY_SAVER_MODE})
|
||||||
abstract class AbstractBatterySaverModeTestCase extends AbstractRestrictBackgroundNetworkTestCase {
|
abstract class AbstractBatterySaverModeTestCase extends AbstractRestrictBackgroundNetworkTestCase {
|
||||||
|
|
||||||
@Override
|
@Before
|
||||||
protected final void setUp() throws Exception {
|
public final void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
// Set initial state.
|
// Set initial state.
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
|
removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
|
||||||
@@ -38,55 +40,15 @@ abstract class AbstractBatterySaverModeTestCase extends AbstractRestrictBackgrou
|
|||||||
registerBroadcastReceiver();
|
registerBroadcastReceiver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@After
|
||||||
protected final void tearDown() throws Exception {
|
public final void tearDown() throws Exception {
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
setBatterySaverMode(false);
|
||||||
|
|
||||||
try {
|
|
||||||
tearDownMeteredNetwork();
|
|
||||||
} finally {
|
|
||||||
setBatterySaverMode(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isSupported() throws Exception {
|
|
||||||
String unSupported = "";
|
|
||||||
if (!isDozeModeEnabled()) {
|
|
||||||
unSupported += "Doze mode,";
|
|
||||||
}
|
|
||||||
if (!isBatterySaverSupported()) {
|
|
||||||
unSupported += "Battery saver mode,";
|
|
||||||
}
|
|
||||||
if (!TextUtils.isEmpty(unSupported)) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support " + unSupported);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the initial (non) metered network state.
|
|
||||||
*
|
|
||||||
* <p>By default is empty - it's up to subclasses to override.
|
|
||||||
*/
|
|
||||||
protected void setUpMeteredNetwork() throws Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the (non) metered network state.
|
|
||||||
*
|
|
||||||
* <p>By default is empty - it's up to subclasses to override.
|
|
||||||
*/
|
|
||||||
protected void tearDownMeteredNetwork() throws Exception {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_enabled() throws Exception {
|
public void testBackgroundNetworkAccess_enabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
@@ -118,9 +80,8 @@ abstract class AbstractBatterySaverModeTestCase extends AbstractRestrictBackgrou
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_whitelisted() throws Exception {
|
public void testBackgroundNetworkAccess_whitelisted() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
@@ -140,9 +101,8 @@ abstract class AbstractBatterySaverModeTestCase extends AbstractRestrictBackgrou
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_disabled() throws Exception {
|
public void testBackgroundNetworkAccess_disabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
|
|||||||
@@ -16,20 +16,25 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.Property.DOZE_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.NOT_LOW_RAM_DEVICE;
|
||||||
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.util.Log;
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for metered and non-metered Doze Mode tests.
|
* Base class for metered and non-metered Doze Mode tests.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({DOZE_MODE})
|
||||||
abstract class AbstractDozeModeTestCase extends AbstractRestrictBackgroundNetworkTestCase {
|
abstract class AbstractDozeModeTestCase extends AbstractRestrictBackgroundNetworkTestCase {
|
||||||
|
|
||||||
@Override
|
@Before
|
||||||
protected final void setUp() throws Exception {
|
public final void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
// Set initial state.
|
// Set initial state.
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
|
removePowerSaveModeExceptIdleWhitelist(TEST_APP2_PKG);
|
||||||
@@ -38,48 +43,15 @@ abstract class AbstractDozeModeTestCase extends AbstractRestrictBackgroundNetwor
|
|||||||
registerBroadcastReceiver();
|
registerBroadcastReceiver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@After
|
||||||
protected final void tearDown() throws Exception {
|
public final void tearDown() throws Exception {
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
setDozeMode(false);
|
||||||
|
|
||||||
try {
|
|
||||||
tearDownMeteredNetwork();
|
|
||||||
} finally {
|
|
||||||
setDozeMode(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isSupported() throws Exception {
|
|
||||||
boolean supported = isDozeModeEnabled();
|
|
||||||
if (!supported) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Doze Mode");
|
|
||||||
}
|
|
||||||
return supported;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the initial (non) metered network state.
|
|
||||||
*
|
|
||||||
* <p>By default is empty - it's up to subclasses to override.
|
|
||||||
*/
|
|
||||||
protected void setUpMeteredNetwork() throws Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the (non) metered network state.
|
|
||||||
*
|
|
||||||
* <p>By default is empty - it's up to subclasses to override.
|
|
||||||
*/
|
|
||||||
protected void tearDownMeteredNetwork() throws Exception {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_enabled() throws Exception {
|
public void testBackgroundNetworkAccess_enabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setDozeMode(true);
|
setDozeMode(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
@@ -96,9 +68,8 @@ abstract class AbstractDozeModeTestCase extends AbstractRestrictBackgroundNetwor
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_whitelisted() throws Exception {
|
public void testBackgroundNetworkAccess_whitelisted() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setDozeMode(true);
|
setDozeMode(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
@@ -118,19 +89,18 @@ abstract class AbstractDozeModeTestCase extends AbstractRestrictBackgroundNetwor
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_disabled() throws Exception {
|
public void testBackgroundNetworkAccess_disabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({NOT_LOW_RAM_DEVICE})
|
||||||
|
@Test
|
||||||
public void testBackgroundNetworkAccess_enabledButWhitelistedOnNotificationAction()
|
public void testBackgroundNetworkAccess_enabledButWhitelistedOnNotificationAction()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
if (!isSupported() || isLowRamDevice()) return;
|
|
||||||
|
|
||||||
setPendingIntentWhitelistDuration(NETWORK_TIMEOUT_MS);
|
setPendingIntentWhitelistDuration(NETWORK_TIMEOUT_MS);
|
||||||
try {
|
try {
|
||||||
registerNotificationListenerService();
|
registerNotificationListenerService();
|
||||||
|
|||||||
@@ -17,14 +17,22 @@
|
|||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
|
import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED;
|
||||||
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
|
|
||||||
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
|
|
||||||
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
|
|
||||||
import static android.os.BatteryManager.BATTERY_PLUGGED_AC;
|
import static android.os.BatteryManager.BATTERY_PLUGGED_AC;
|
||||||
import static android.os.BatteryManager.BATTERY_PLUGGED_USB;
|
import static android.os.BatteryManager.BATTERY_PLUGGED_USB;
|
||||||
import static android.os.BatteryManager.BATTERY_PLUGGED_WIRELESS;
|
import static android.os.BatteryManager.BATTERY_PLUGGED_WIRELESS;
|
||||||
|
|
||||||
import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.executeShellCommand;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getConnectivityManager;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getContext;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getInstrumentation;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.getWifiManager;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isDozeModeSupported;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.restrictBackgroundValueToString;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.Instrumentation;
|
import android.app.Instrumentation;
|
||||||
@@ -34,9 +42,7 @@ import android.content.ComponentName;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.NetworkInfo;
|
|
||||||
import android.net.NetworkInfo.DetailedState;
|
import android.net.NetworkInfo.DetailedState;
|
||||||
import android.net.NetworkInfo.State;
|
import android.net.NetworkInfo.State;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
@@ -44,24 +50,27 @@ import android.os.BatteryManager;
|
|||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.SystemProperties;
|
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.service.notification.NotificationListenerService;
|
import android.service.notification.NotificationListenerService;
|
||||||
import android.test.InstrumentationTestCase;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.android.compatibility.common.util.BatteryUtils;
|
import org.junit.Rule;
|
||||||
|
import org.junit.rules.RuleChain;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
import androidx.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Superclass for tests related to background network restrictions.
|
* Superclass for tests related to background network restrictions.
|
||||||
*/
|
*/
|
||||||
abstract class AbstractRestrictBackgroundNetworkTestCase extends InstrumentationTestCase {
|
@RunWith(AndroidJUnit4.class)
|
||||||
protected static final String TAG = "RestrictBackgroundNetworkTests";
|
public abstract class AbstractRestrictBackgroundNetworkTestCase {
|
||||||
|
public static final String TAG = "RestrictBackgroundNetworkTests";
|
||||||
|
|
||||||
protected static final String TEST_PKG = "com.android.cts.net.hostside";
|
protected static final String TEST_PKG = "com.android.cts.net.hostside";
|
||||||
protected static final String TEST_APP2_PKG = "com.android.cts.net.hostside.app2";
|
protected static final String TEST_APP2_PKG = "com.android.cts.net.hostside.app2";
|
||||||
@@ -98,8 +107,6 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
static final int NETWORK_TIMEOUT_MS = 15 * SECOND_IN_MS;
|
static final int NETWORK_TIMEOUT_MS = 15 * SECOND_IN_MS;
|
||||||
private static int PROCESS_STATE_FOREGROUND_SERVICE;
|
private static int PROCESS_STATE_FOREGROUND_SERVICE;
|
||||||
|
|
||||||
private static final int PROCESS_STATE_TOP = 2;
|
|
||||||
|
|
||||||
private static final String KEY_NETWORK_STATE_OBSERVER = TEST_PKG + ".observer";
|
private static final String KEY_NETWORK_STATE_OBSERVER = TEST_PKG + ".observer";
|
||||||
|
|
||||||
protected static final int TYPE_COMPONENT_ACTIVTIY = 0;
|
protected static final int TYPE_COMPONENT_ACTIVTIY = 0;
|
||||||
@@ -126,22 +133,23 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
protected WifiManager mWfm;
|
protected WifiManager mWfm;
|
||||||
protected int mUid;
|
protected int mUid;
|
||||||
private int mMyUid;
|
private int mMyUid;
|
||||||
private String mMeteredWifi;
|
|
||||||
private MyServiceClient mServiceClient;
|
private MyServiceClient mServiceClient;
|
||||||
private String mDeviceIdleConstantsSetting;
|
private String mDeviceIdleConstantsSetting;
|
||||||
private boolean mSupported;
|
|
||||||
private boolean mIsLocationOn;
|
private boolean mIsLocationOn;
|
||||||
|
|
||||||
@Override
|
@Rule
|
||||||
|
public final RuleChain mRuleChain = RuleChain.outerRule(new DumpOnFailureRule())
|
||||||
|
.around(new RequiredPropertiesRule())
|
||||||
|
.around(new MeterednessConfigurationRule());
|
||||||
|
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() throws Exception {
|
||||||
super.setUp();
|
|
||||||
|
|
||||||
PROCESS_STATE_FOREGROUND_SERVICE = (Integer) ActivityManager.class
|
PROCESS_STATE_FOREGROUND_SERVICE = (Integer) ActivityManager.class
|
||||||
.getDeclaredField("PROCESS_STATE_FOREGROUND_SERVICE").get(null);
|
.getDeclaredField("PROCESS_STATE_FOREGROUND_SERVICE").get(null);
|
||||||
mInstrumentation = getInstrumentation();
|
mInstrumentation = getInstrumentation();
|
||||||
mContext = mInstrumentation.getContext();
|
mContext = getContext();
|
||||||
mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
|
mCm = getConnectivityManager();
|
||||||
mWfm = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
|
mWfm = getWifiManager();
|
||||||
mUid = getUid(TEST_APP2_PKG);
|
mUid = getUid(TEST_APP2_PKG);
|
||||||
mMyUid = getUid(mContext.getPackageName());
|
mMyUid = getUid(mContext.getPackageName());
|
||||||
mServiceClient = new MyServiceClient(mContext);
|
mServiceClient = new MyServiceClient(mContext);
|
||||||
@@ -151,10 +159,9 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
if (!mIsLocationOn) {
|
if (!mIsLocationOn) {
|
||||||
enableLocation();
|
enableLocation();
|
||||||
}
|
}
|
||||||
mSupported = setUpActiveNetworkMeteringState();
|
|
||||||
setAppIdle(false);
|
setAppIdle(false);
|
||||||
|
|
||||||
Log.i(TAG, "Apps status on " + getName() + ":\n"
|
Log.i(TAG, "Apps status:\n"
|
||||||
+ "\ttest app: uid=" + mMyUid + ", state=" + getProcessStateByUid(mMyUid) + "\n"
|
+ "\ttest app: uid=" + mMyUid + ", state=" + getProcessStateByUid(mMyUid) + "\n"
|
||||||
+ "\tapp2: uid=" + mUid + ", state=" + getProcessStateByUid(mUid));
|
+ "\tapp2: uid=" + mUid + ", state=" + getProcessStateByUid(mUid));
|
||||||
|
|
||||||
@@ -165,16 +172,13 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
final String currentConstants =
|
final String currentConstants =
|
||||||
executeShellCommand("settings get global app_idle_constants");
|
executeShellCommand("settings get global app_idle_constants");
|
||||||
assertEquals(appIdleConstants, currentConstants);
|
assertEquals(appIdleConstants, currentConstants);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void tearDown() throws Exception {
|
protected void tearDown() throws Exception {
|
||||||
if (!mIsLocationOn) {
|
if (!mIsLocationOn) {
|
||||||
disableLocation();
|
disableLocation();
|
||||||
}
|
}
|
||||||
mServiceClient.unbind();
|
mServiceClient.unbind();
|
||||||
|
|
||||||
super.tearDown();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enableLocation() throws Exception {
|
private void enableLocation() throws Exception {
|
||||||
@@ -259,23 +263,8 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
protected void assertRestrictBackgroundStatus(int expectedStatus) throws Exception {
|
protected void assertRestrictBackgroundStatus(int expectedStatus) throws Exception {
|
||||||
final String status = mServiceClient.getRestrictBackgroundStatus();
|
final String status = mServiceClient.getRestrictBackgroundStatus();
|
||||||
assertNotNull("didn't get API status from app2", status);
|
assertNotNull("didn't get API status from app2", status);
|
||||||
final String actualStatus = toString(Integer.parseInt(status));
|
assertEquals(restrictBackgroundValueToString(expectedStatus),
|
||||||
assertEquals("wrong status", toString(expectedStatus), actualStatus);
|
restrictBackgroundValueToString(Integer.parseInt(status)));
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertMyRestrictBackgroundStatus(int expectedStatus) throws Exception {
|
|
||||||
final int actualStatus = mCm.getRestrictBackgroundStatus();
|
|
||||||
assertEquals("Wrong status", toString(expectedStatus), toString(actualStatus));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isMyRestrictBackgroundStatus(int expectedStatus) throws Exception {
|
|
||||||
final int actualStatus = mCm.getRestrictBackgroundStatus();
|
|
||||||
if (expectedStatus != actualStatus) {
|
|
||||||
Log.d(TAG, "Expected: " + toString(expectedStatus)
|
|
||||||
+ " but actual: " + toString(actualStatus));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void assertBackgroundNetworkAccess(boolean expectAllowed) throws Exception {
|
protected void assertBackgroundNetworkAccess(boolean expectAllowed) throws Exception {
|
||||||
@@ -297,28 +286,6 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
assertNetworkAccess(true /* expectAvailable */, false /* needScreenOn */);
|
assertNetworkAccess(true /* expectAvailable */, false /* needScreenOn */);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether this device suport this type of test.
|
|
||||||
*
|
|
||||||
* <p>Should be overridden when necessary (but always calling
|
|
||||||
* {@code super.isSupported()} first), and explicitly used before each test
|
|
||||||
* Example:
|
|
||||||
*
|
|
||||||
* <pre><code>
|
|
||||||
* public void testSomething() {
|
|
||||||
* if (!isSupported()) return;
|
|
||||||
* </code></pre>
|
|
||||||
*
|
|
||||||
* @return {@code true} by default.
|
|
||||||
*/
|
|
||||||
protected boolean isSupported() throws Exception {
|
|
||||||
return mSupported;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean isBatterySaverSupported() {
|
|
||||||
return BatteryUtils.isBatterySaverSupported();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asserts that an app always have access while on foreground or running a foreground service.
|
* Asserts that an app always have access while on foreground or running a foreground service.
|
||||||
*
|
*
|
||||||
@@ -387,23 +354,6 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
fail("App2 is not on foreground service state after " + maxTries + " attempts: " + state );
|
fail("App2 is not on foreground service state after " + maxTries + " attempts: " + state );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* As per CDD requirements, if the device doesn't support data saver mode then
|
|
||||||
* ConnectivityManager.getRestrictBackgroundStatus() will always return
|
|
||||||
* RESTRICT_BACKGROUND_STATUS_DISABLED. So, enable the data saver mode and check if
|
|
||||||
* ConnectivityManager.getRestrictBackgroundStatus() for an app in background returns
|
|
||||||
* RESTRICT_BACKGROUND_STATUS_DISABLED or not.
|
|
||||||
*/
|
|
||||||
protected boolean isDataSaverSupported() throws Exception {
|
|
||||||
assertMyRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
|
|
||||||
try {
|
|
||||||
setRestrictBackground(true);
|
|
||||||
return !isMyRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
|
|
||||||
} finally {
|
|
||||||
setRestrictBackground(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether an app state should be considered "background" for restriction purposes.
|
* Returns whether an app state should be considered "background" for restriction purposes.
|
||||||
*/
|
*/
|
||||||
@@ -443,40 +393,10 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
// Exponential back-off.
|
// Exponential back-off.
|
||||||
timeoutMs = Math.min(timeoutMs*2, NETWORK_TIMEOUT_MS);
|
timeoutMs = Math.min(timeoutMs*2, NETWORK_TIMEOUT_MS);
|
||||||
}
|
}
|
||||||
dumpOnFailure();
|
|
||||||
fail("Invalid state for expectAvailable=" + expectAvailable + " after " + maxTries
|
fail("Invalid state for expectAvailable=" + expectAvailable + " after " + maxTries
|
||||||
+ " attempts.\nLast error: " + error);
|
+ " attempts.\nLast error: " + error);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dumpOnFailure() throws Exception {
|
|
||||||
dumpAllNetworkRules();
|
|
||||||
Log.d(TAG, "Usagestats dump: " + getUsageStatsDump());
|
|
||||||
executeShellCommand("settings get global app_idle_constants");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void dumpAllNetworkRules() throws Exception {
|
|
||||||
final String networkManagementDump = runShellCommand(mInstrumentation,
|
|
||||||
"dumpsys network_management").trim();
|
|
||||||
final String networkPolicyDump = runShellCommand(mInstrumentation,
|
|
||||||
"dumpsys netpolicy").trim();
|
|
||||||
TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter('\n');
|
|
||||||
splitter.setString(networkManagementDump);
|
|
||||||
String next;
|
|
||||||
Log.d(TAG, ">>> Begin network_management dump");
|
|
||||||
while (splitter.hasNext()) {
|
|
||||||
next = splitter.next();
|
|
||||||
Log.d(TAG, next);
|
|
||||||
}
|
|
||||||
Log.d(TAG, "<<< End network_management dump");
|
|
||||||
splitter.setString(networkPolicyDump);
|
|
||||||
Log.d(TAG, ">>> Begin netpolicy dump");
|
|
||||||
while (splitter.hasNext()) {
|
|
||||||
next = splitter.next();
|
|
||||||
Log.d(TAG, next);
|
|
||||||
}
|
|
||||||
Log.d(TAG, "<<< End netpolicy dump");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether the network is available as expected.
|
* Checks whether the network is available as expected.
|
||||||
*
|
*
|
||||||
@@ -528,22 +448,10 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
return errors.toString();
|
return errors.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isLowRamDevice() {
|
|
||||||
final ActivityManager am = (ActivityManager) mContext.getSystemService(
|
|
||||||
Context.ACTIVITY_SERVICE);
|
|
||||||
return am.isLowRamDevice();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String executeShellCommand(String command) throws Exception {
|
|
||||||
final String result = runShellCommand(mInstrumentation, command).trim();
|
|
||||||
if (DEBUG) Log.d(TAG, "Command '" + command + "' returned '" + result + "'");
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs a Shell command which is not expected to generate output.
|
* Runs a Shell command which is not expected to generate output.
|
||||||
*/
|
*/
|
||||||
protected void executeSilentShellCommand(String command) throws Exception {
|
protected void executeSilentShellCommand(String command) {
|
||||||
final String result = executeShellCommand(command);
|
final String result = executeShellCommand(command);
|
||||||
assertTrue("Command '" + command + "' failed: " + result, result.trim().isEmpty());
|
assertTrue("Command '" + command + "' failed: " + result, result.trim().isEmpty());
|
||||||
}
|
}
|
||||||
@@ -572,10 +480,6 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void assertDelayedShellCommand(String command, ExpectResultChecker checker)
|
|
||||||
throws Exception {
|
|
||||||
assertDelayedShellCommand(command, 5, 1, checker);
|
|
||||||
}
|
|
||||||
protected void assertDelayedShellCommand(String command, int maxTries, int napTimeSeconds,
|
protected void assertDelayedShellCommand(String command, int maxTries, int napTimeSeconds,
|
||||||
ExpectResultChecker checker) throws Exception {
|
ExpectResultChecker checker) throws Exception {
|
||||||
String result = "";
|
String result = "";
|
||||||
@@ -592,159 +496,6 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
+ " attempts. Last result: '" + result + "'");
|
+ " attempts. Last result: '" + result + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the initial metering state for the active network.
|
|
||||||
*
|
|
||||||
* <p>It's called on setup and by default does nothing - it's up to the
|
|
||||||
* subclasses to override.
|
|
||||||
*
|
|
||||||
* @return whether the tests in the subclass are supported on this device.
|
|
||||||
*/
|
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes sure the active network is not metered.
|
|
||||||
*
|
|
||||||
* <p>If the device does not supoprt un-metered networks (for example if it
|
|
||||||
* only has cellular data but not wi-fi), it should return {@code false};
|
|
||||||
* otherwise, it should return {@code true} (or fail if the un-metered
|
|
||||||
* network could not be set).
|
|
||||||
*
|
|
||||||
* @return {@code true} if the network is now unmetered.
|
|
||||||
*/
|
|
||||||
protected boolean setUnmeteredNetwork() throws Exception {
|
|
||||||
final NetworkInfo info = mCm.getActiveNetworkInfo();
|
|
||||||
assertNotNull("Could not get active network", info);
|
|
||||||
if (!mCm.isActiveNetworkMetered()) {
|
|
||||||
Log.d(TAG, "Active network is not metered: " + info);
|
|
||||||
} else if (info.getType() == ConnectivityManager.TYPE_WIFI) {
|
|
||||||
Log.i(TAG, "Setting active WI-FI network as not metered: " + info );
|
|
||||||
setWifiMeteredStatus(false);
|
|
||||||
} else {
|
|
||||||
Log.d(TAG, "Active network cannot be set to un-metered: " + info);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
assertActiveNetworkMetered(false); // Sanity check.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enables metering on the active network if supported.
|
|
||||||
*
|
|
||||||
* <p>If the device does not support metered networks it should return
|
|
||||||
* {@code false}; otherwise, it should return {@code true} (or fail if the
|
|
||||||
* metered network could not be set).
|
|
||||||
*
|
|
||||||
* @return {@code true} if the network is now metered.
|
|
||||||
*/
|
|
||||||
protected boolean setMeteredNetwork() throws Exception {
|
|
||||||
final NetworkInfo info = mCm.getActiveNetworkInfo();
|
|
||||||
final boolean metered = mCm.isActiveNetworkMetered();
|
|
||||||
if (metered) {
|
|
||||||
Log.d(TAG, "Active network already metered: " + info);
|
|
||||||
return true;
|
|
||||||
} else if (info.getType() != ConnectivityManager.TYPE_WIFI) {
|
|
||||||
Log.w(TAG, "Active network does not support metering: " + info);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
Log.w(TAG, "Active network not metered: " + info);
|
|
||||||
}
|
|
||||||
final String netId = setWifiMeteredStatus(true);
|
|
||||||
|
|
||||||
// Set flag so status is reverted on resetMeteredNetwork();
|
|
||||||
mMeteredWifi = netId;
|
|
||||||
// Sanity check.
|
|
||||||
assertWifiMeteredStatus(netId, true);
|
|
||||||
assertActiveNetworkMetered(true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resets the device metering state to what it was before the test started.
|
|
||||||
*
|
|
||||||
* <p>This reverts any metering changes made by {@code setMeteredNetwork}.
|
|
||||||
*/
|
|
||||||
protected void resetMeteredNetwork() throws Exception {
|
|
||||||
if (mMeteredWifi != null) {
|
|
||||||
Log.i(TAG, "resetMeteredNetwork(): SID '" + mMeteredWifi
|
|
||||||
+ "' was set as metered by test case; resetting it");
|
|
||||||
setWifiMeteredStatus(mMeteredWifi, false);
|
|
||||||
assertActiveNetworkMetered(false); // Sanity check.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertActiveNetworkMetered(boolean expected) throws Exception {
|
|
||||||
final int maxTries = 5;
|
|
||||||
NetworkInfo info = null;
|
|
||||||
for (int i = 1; i <= maxTries; i++) {
|
|
||||||
info = mCm.getActiveNetworkInfo();
|
|
||||||
if (info == null) {
|
|
||||||
Log.v(TAG, "No active network info on attempt #" + i
|
|
||||||
+ "; sleeping 1s before polling again");
|
|
||||||
} else if (mCm.isActiveNetworkMetered() != expected) {
|
|
||||||
Log.v(TAG, "Wrong metered status for active network " + info + "; expected="
|
|
||||||
+ expected + "; sleeping 1s before polling again");
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Thread.sleep(SECOND_IN_MS);
|
|
||||||
}
|
|
||||||
assertNotNull("No active network after " + maxTries + " attempts", info);
|
|
||||||
assertEquals("Wrong metered status for active network " + info, expected,
|
|
||||||
mCm.isActiveNetworkMetered());
|
|
||||||
}
|
|
||||||
|
|
||||||
private String setWifiMeteredStatus(boolean metered) throws Exception {
|
|
||||||
// We could call setWifiEnabled() here, but it might take sometime to be in a consistent
|
|
||||||
// state (for example, if one of the saved network is not properly authenticated), so it's
|
|
||||||
// better to let the hostside test take care of that.
|
|
||||||
assertTrue("wi-fi is disabled", mWfm.isWifiEnabled());
|
|
||||||
// TODO: if it's not guaranteed the device has wi-fi, we need to change the tests
|
|
||||||
// to make the actual verification of restrictions optional.
|
|
||||||
final String ssid = mWfm.getConnectionInfo().getSSID();
|
|
||||||
return setWifiMeteredStatus(ssid, metered);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String setWifiMeteredStatus(String ssid, boolean metered) throws Exception {
|
|
||||||
assertNotNull("null SSID", ssid);
|
|
||||||
final String netId = ssid.trim().replaceAll("\"", ""); // remove quotes, if any.
|
|
||||||
assertFalse("empty SSID", ssid.isEmpty());
|
|
||||||
|
|
||||||
Log.i(TAG, "Setting wi-fi network " + netId + " metered status to " + metered);
|
|
||||||
final String setCommand = "cmd netpolicy set metered-network " + netId + " " + metered;
|
|
||||||
assertDelayedShellCommand(setCommand, "");
|
|
||||||
|
|
||||||
return netId;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertWifiMeteredStatus(String netId, boolean status) throws Exception {
|
|
||||||
final String command = "cmd netpolicy list wifi-networks";
|
|
||||||
final String expectedLine = netId + ";" + status;
|
|
||||||
assertDelayedShellCommand(command, new ExpectResultChecker() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isExpected(String result) {
|
|
||||||
return result.contains(expectedLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getExpected() {
|
|
||||||
return "line containing " + expectedLine;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setRestrictBackground(boolean enabled) throws Exception {
|
|
||||||
executeShellCommand("cmd netpolicy set restrict-background " + enabled);
|
|
||||||
final String output = executeShellCommand("cmd netpolicy get restrict-background ");
|
|
||||||
final String expectedSuffix = enabled ? "enabled" : "disabled";
|
|
||||||
// TODO: use MoreAsserts?
|
|
||||||
assertTrue("output '" + output + "' should end with '" + expectedSuffix + "'",
|
|
||||||
output.endsWith(expectedSuffix));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void addRestrictBackgroundWhitelist(int uid) throws Exception {
|
protected void addRestrictBackgroundWhitelist(int uid) throws Exception {
|
||||||
executeShellCommand("cmd netpolicy add restrict-background-whitelist " + uid);
|
executeShellCommand("cmd netpolicy add restrict-background-whitelist " + uid);
|
||||||
assertRestrictBackgroundWhitelist(uid, true);
|
assertRestrictBackgroundWhitelist(uid, true);
|
||||||
@@ -924,7 +675,7 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
|
|
||||||
protected void setDozeMode(boolean enabled) throws Exception {
|
protected void setDozeMode(boolean enabled) throws Exception {
|
||||||
// Sanity check, since tests should check beforehand....
|
// Sanity check, since tests should check beforehand....
|
||||||
assertTrue("Device does not support Doze Mode", isDozeModeEnabled());
|
assertTrue("Device does not support Doze Mode", isDozeModeSupported());
|
||||||
|
|
||||||
Log.i(TAG, "Setting Doze Mode to " + enabled);
|
Log.i(TAG, "Setting Doze Mode to " + enabled);
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
@@ -944,43 +695,16 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
assertDelayedShellCommand("dumpsys deviceidle get deep", enabled ? "IDLE" : "ACTIVE");
|
assertDelayedShellCommand("dumpsys deviceidle get deep", enabled ? "IDLE" : "ACTIVE");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isDozeModeEnabled() throws Exception {
|
|
||||||
final String result = executeShellCommand("cmd deviceidle enabled deep").trim();
|
|
||||||
return result.equals("1");
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setAppIdle(boolean enabled) throws Exception {
|
protected void setAppIdle(boolean enabled) throws Exception {
|
||||||
Log.i(TAG, "Setting app idle to " + enabled);
|
Log.i(TAG, "Setting app idle to " + enabled);
|
||||||
executeSilentShellCommand("am set-inactive " + TEST_APP2_PKG + " " + enabled );
|
executeSilentShellCommand("am set-inactive " + TEST_APP2_PKG + " " + enabled );
|
||||||
assertAppIdle(enabled); // Sanity check
|
assertAppIdle(enabled); // Sanity check
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getUsageStatsDump() throws Exception {
|
|
||||||
final String output = runShellCommand(mInstrumentation, "dumpsys usagestats").trim();
|
|
||||||
final StringBuilder sb = new StringBuilder();
|
|
||||||
final TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter('\n');
|
|
||||||
splitter.setString(output);
|
|
||||||
String str;
|
|
||||||
while (splitter.hasNext()) {
|
|
||||||
str = splitter.next();
|
|
||||||
if (str.contains("package=")
|
|
||||||
&& !str.contains(TEST_PKG) && !str.contains(TEST_APP2_PKG)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (str.trim().startsWith("config=") || str.trim().startsWith("time=")) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
sb.append(str).append('\n');
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertAppIdle(boolean enabled) throws Exception {
|
protected void assertAppIdle(boolean enabled) throws Exception {
|
||||||
try {
|
try {
|
||||||
assertDelayedShellCommand("am get-inactive " + TEST_APP2_PKG, 15, 2, "Idle=" + enabled);
|
assertDelayedShellCommand("am get-inactive " + TEST_APP2_PKG, 15, 2, "Idle=" + enabled);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Log.d(TAG, "UsageStats dump:\n" + getUsageStatsDump());
|
|
||||||
executeShellCommand("settings get global app_idle_constants");
|
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1061,12 +785,10 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
// App didn't come to foreground when the activity is started, so try again.
|
// App didn't come to foreground when the activity is started, so try again.
|
||||||
assertForegroundNetworkAccess();
|
assertForegroundNetworkAccess();
|
||||||
} else {
|
} else {
|
||||||
dumpOnFailure();
|
|
||||||
fail("Network is not available for app2 (" + mUid + "): " + errors[0]);
|
fail("Network is not available for app2 (" + mUid + "): " + errors[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
dumpOnFailure();
|
|
||||||
fail("Timed out waiting for network availability status from app2 (" + mUid + ")");
|
fail("Timed out waiting for network availability status from app2 (" + mUid + ")");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1150,19 +872,6 @@ abstract class AbstractRestrictBackgroundNetworkTestCase extends Instrumentation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String toString(int status) {
|
|
||||||
switch (status) {
|
|
||||||
case RESTRICT_BACKGROUND_STATUS_DISABLED:
|
|
||||||
return "DISABLED";
|
|
||||||
case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
|
|
||||||
return "WHITELISTED";
|
|
||||||
case RESTRICT_BACKGROUND_STATUS_ENABLED:
|
|
||||||
return "ENABLED";
|
|
||||||
default:
|
|
||||||
return "UNKNOWN_STATUS_" + status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ProcessState getProcessStateByUid(int uid) throws Exception {
|
private ProcessState getProcessStateByUid(int uid) throws Exception {
|
||||||
return new ProcessState(executeShellCommand("cmd activity get-uid-state " + uid));
|
return new ProcessState(executeShellCommand("cmd activity get-uid-state " + uid));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,15 +16,8 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.Property.METERED_NETWORK;
|
||||||
|
|
||||||
|
@RequiredProperties({METERED_NETWORK})
|
||||||
public class AppIdleMeteredTest extends AbstractAppIdleTestCase {
|
public class AppIdleMeteredTest extends AbstractAppIdleTestCase {
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
|
||||||
return setMeteredNetwork();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void tearDownMeteredNetwork() throws Exception {
|
|
||||||
resetMeteredNetwork();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,9 +16,8 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
|
||||||
|
|
||||||
|
@RequiredProperties({NON_METERED_NETWORK})
|
||||||
public class AppIdleNonMeteredTest extends AbstractAppIdleTestCase {
|
public class AppIdleNonMeteredTest extends AbstractAppIdleTestCase {
|
||||||
@Override
|
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
|
||||||
return setUnmeteredNetwork();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,15 +16,8 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.Property.METERED_NETWORK;
|
||||||
|
|
||||||
|
@RequiredProperties({METERED_NETWORK})
|
||||||
public class BatterySaverModeMeteredTest extends AbstractBatterySaverModeTestCase {
|
public class BatterySaverModeMeteredTest extends AbstractBatterySaverModeTestCase {
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
|
||||||
return setMeteredNetwork();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void tearDownMeteredNetwork() throws Exception {
|
|
||||||
resetMeteredNetwork();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,10 +16,9 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
public class BatterySaverModeNonMeteredTest extends AbstractBatterySaverModeTestCase {
|
|
||||||
|
|
||||||
@Override
|
import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
|
||||||
return setUnmeteredNetwork();
|
@RequiredProperties({NON_METERED_NETWORK})
|
||||||
}
|
public class BatterySaverModeNonMeteredTest extends AbstractBatterySaverModeTestCase {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,24 +20,33 @@ import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLE
|
|||||||
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
|
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
|
||||||
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
|
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
|
||||||
|
|
||||||
import android.util.Log;
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
|
||||||
|
import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.METERED_NETWORK;
|
||||||
|
import static com.android.cts.net.hostside.Property.NO_DATA_SAVER_MODE;
|
||||||
|
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import com.android.compatibility.common.util.CddTest;
|
import com.android.compatibility.common.util.CddTest;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import androidx.test.filters.LargeTest;
|
||||||
|
|
||||||
|
@RequiredProperties({DATA_SAVER_MODE, METERED_NETWORK})
|
||||||
|
@LargeTest
|
||||||
public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase {
|
public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase {
|
||||||
|
|
||||||
private static final String[] REQUIRED_WHITELISTED_PACKAGES = {
|
private static final String[] REQUIRED_WHITELISTED_PACKAGES = {
|
||||||
"com.android.providers.downloads"
|
"com.android.providers.downloads"
|
||||||
};
|
};
|
||||||
|
|
||||||
private boolean mIsDataSaverSupported;
|
@Before
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
mIsDataSaverSupported = isDataSaverSupported();
|
|
||||||
|
|
||||||
// Set initial state.
|
// Set initial state.
|
||||||
setRestrictBackground(false);
|
setRestrictBackground(false);
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
@@ -47,36 +56,15 @@ public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase
|
|||||||
assertRestrictBackgroundChangedReceived(0);
|
assertRestrictBackgroundChangedReceived(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@After
|
||||||
protected void tearDown() throws Exception {
|
public void tearDown() throws Exception {
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
setRestrictBackground(false);
|
||||||
|
|
||||||
try {
|
|
||||||
resetMeteredNetwork();
|
|
||||||
} finally {
|
|
||||||
setRestrictBackground(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
|
||||||
return setMeteredNetwork();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isSupported() throws Exception {
|
|
||||||
if (!mIsDataSaverSupported) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Data Saver Mode");
|
|
||||||
}
|
|
||||||
return mIsDataSaverSupported && super.isSupported();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testGetRestrictBackgroundStatus_disabled() throws Exception {
|
public void testGetRestrictBackgroundStatus_disabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
|
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
|
||||||
|
|
||||||
// Sanity check: make sure status is always disabled, never whitelisted
|
// Sanity check: make sure status is always disabled, never whitelisted
|
||||||
@@ -88,9 +76,8 @@ public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase
|
|||||||
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
|
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_DISABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testGetRestrictBackgroundStatus_whitelisted() throws Exception {
|
public void testGetRestrictBackgroundStatus_whitelisted() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setRestrictBackground(true);
|
setRestrictBackground(true);
|
||||||
assertRestrictBackgroundChangedReceived(1);
|
assertRestrictBackgroundChangedReceived(1);
|
||||||
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
||||||
@@ -107,9 +94,8 @@ public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase
|
|||||||
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testGetRestrictBackgroundStatus_enabled() throws Exception {
|
public void testGetRestrictBackgroundStatus_enabled() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
setRestrictBackground(true);
|
setRestrictBackground(true);
|
||||||
assertRestrictBackgroundChangedReceived(1);
|
assertRestrictBackgroundChangedReceived(1);
|
||||||
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
||||||
@@ -142,9 +128,8 @@ public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase
|
|||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testGetRestrictBackgroundStatus_blacklisted() throws Exception {
|
public void testGetRestrictBackgroundStatus_blacklisted() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
addRestrictBackgroundBlacklist(mUid);
|
addRestrictBackgroundBlacklist(mUid);
|
||||||
assertRestrictBackgroundChangedReceived(1);
|
assertRestrictBackgroundChangedReceived(1);
|
||||||
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
assertDataSaverStatusOnBackground(RESTRICT_BACKGROUND_STATUS_ENABLED);
|
||||||
@@ -180,9 +165,8 @@ public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase
|
|||||||
assertsForegroundAlwaysHasNetworkAccess();
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testGetRestrictBackgroundStatus_requiredWhitelistedPackages() throws Exception {
|
public void testGetRestrictBackgroundStatus_requiredWhitelistedPackages() throws Exception {
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
final StringBuilder error = new StringBuilder();
|
final StringBuilder error = new StringBuilder();
|
||||||
for (String packageName : REQUIRED_WHITELISTED_PACKAGES) {
|
for (String packageName : REQUIRED_WHITELISTED_PACKAGES) {
|
||||||
int uid = -1;
|
int uid = -1;
|
||||||
@@ -202,10 +186,10 @@ public class DataSaverModeTest extends AbstractRestrictBackgroundNetworkTestCase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({NO_DATA_SAVER_MODE})
|
||||||
@CddTest(requirement="7.4.7/C-2-2")
|
@CddTest(requirement="7.4.7/C-2-2")
|
||||||
|
@Test
|
||||||
public void testBroadcastNotSentOnUnsupportedDevices() throws Exception {
|
public void testBroadcastNotSentOnUnsupportedDevices() throws Exception {
|
||||||
if (isSupported()) return;
|
|
||||||
|
|
||||||
setRestrictBackground(true);
|
setRestrictBackground(true);
|
||||||
assertRestrictBackgroundChangedReceived(0);
|
assertRestrictBackgroundChangedReceived(0);
|
||||||
|
|
||||||
|
|||||||
@@ -16,15 +16,8 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.Property.METERED_NETWORK;
|
||||||
|
|
||||||
|
@RequiredProperties({METERED_NETWORK})
|
||||||
public class DozeModeMeteredTest extends AbstractDozeModeTestCase {
|
public class DozeModeMeteredTest extends AbstractDozeModeTestCase {
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
|
||||||
return setMeteredNetwork();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void tearDownMeteredNetwork() throws Exception {
|
|
||||||
resetMeteredNetwork();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,10 +16,8 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
public class DozeModeNonMeteredTest extends AbstractDozeModeTestCase {
|
import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
|
||||||
|
|
||||||
@Override
|
@RequiredProperties({NON_METERED_NETWORK})
|
||||||
protected boolean setUpActiveNetworkMeteringState() throws Exception {
|
public class DozeModeNonMeteredTest extends AbstractDozeModeTestCase {
|
||||||
return setUnmeteredNetwork();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG;
|
||||||
|
import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TEST_PKG;
|
||||||
|
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.os.FileUtils;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.compatibility.common.util.OnFailureRule;
|
||||||
|
|
||||||
|
import org.junit.AssumptionViolatedException;
|
||||||
|
import org.junit.runner.Description;
|
||||||
|
import org.junit.runners.model.Statement;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
|
||||||
|
public class DumpOnFailureRule extends OnFailureRule {
|
||||||
|
private File mDumpDir = new File(Environment.getExternalStorageDirectory(),
|
||||||
|
"CtsHostsideNetworkTests");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTestFailure(Statement base, Description description, Throwable throwable) {
|
||||||
|
final String testName = description.getClassName() + "_" + description.getMethodName();
|
||||||
|
|
||||||
|
if (throwable instanceof AssumptionViolatedException) {
|
||||||
|
Log.d(TAG, "Skipping test " + testName + ": " + throwable);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prepareDumpRootDir();
|
||||||
|
final File dumpFile = new File(mDumpDir, "dump-" + testName);
|
||||||
|
Log.i(TAG, "Dumping debug info for " + description + ": " + dumpFile.getPath());
|
||||||
|
try (FileOutputStream out = new FileOutputStream(dumpFile)) {
|
||||||
|
for (String cmd : new String[] {
|
||||||
|
"dumpsys netpolicy",
|
||||||
|
"dumpsys network_management",
|
||||||
|
"dumpsys usagestats " + TEST_PKG,
|
||||||
|
"dumpsys usagestats appstandby",
|
||||||
|
}) {
|
||||||
|
dumpCommandOutput(out, cmd);
|
||||||
|
}
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
Log.e(TAG, "Error opening file: " + dumpFile, e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Error closing file: " + dumpFile, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dumpCommandOutput(FileOutputStream out, String cmd) {
|
||||||
|
final ParcelFileDescriptor pfd = InstrumentationRegistry.getInstrumentation()
|
||||||
|
.getUiAutomation().executeShellCommand(cmd);
|
||||||
|
try (FileInputStream in = new ParcelFileDescriptor.AutoCloseInputStream(pfd)) {
|
||||||
|
out.write(("Output of '" + cmd + "':\n").getBytes(StandardCharsets.UTF_8));
|
||||||
|
FileUtils.copy(in, out);
|
||||||
|
out.write("\n\n=================================================================\n\n"
|
||||||
|
.getBytes(StandardCharsets.UTF_8));
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(TAG, "Error dumping '" + cmd + "'", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void prepareDumpRootDir() {
|
||||||
|
if (!mDumpDir.exists() && !mDumpDir.mkdir()) {
|
||||||
|
Log.e(TAG, "Error creating " + mDumpDir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.resetMeteredNetwork;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setupMeteredNetwork;
|
||||||
|
import static com.android.cts.net.hostside.Property.METERED_NETWORK;
|
||||||
|
import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
|
||||||
|
|
||||||
|
import android.util.ArraySet;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import com.android.compatibility.common.util.BeforeAfterRule;
|
||||||
|
|
||||||
|
import org.junit.runner.Description;
|
||||||
|
import org.junit.runners.model.Statement;
|
||||||
|
|
||||||
|
public class MeterednessConfigurationRule extends BeforeAfterRule {
|
||||||
|
private Pair<String, Boolean> mSsidAndInitialMeteredness;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBefore(Statement base, Description description) throws Throwable {
|
||||||
|
final ArraySet<Property> requiredProperties
|
||||||
|
= RequiredPropertiesRule.getRequiredProperties();
|
||||||
|
if (requiredProperties.contains(METERED_NETWORK)) {
|
||||||
|
configureNetworkMeteredness(true);
|
||||||
|
} else if (requiredProperties.contains(NON_METERED_NETWORK)) {
|
||||||
|
configureNetworkMeteredness(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAfter(Statement base, Description description) throws Throwable {
|
||||||
|
resetNetworkMeteredness();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void configureNetworkMeteredness(boolean metered) throws Exception {
|
||||||
|
mSsidAndInitialMeteredness = setupMeteredNetwork(metered);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetNetworkMeteredness() throws Exception {
|
||||||
|
if (mSsidAndInitialMeteredness != null) {
|
||||||
|
resetMeteredNetwork(mSsidAndInitialMeteredness.first,
|
||||||
|
mSsidAndInitialMeteredness.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,9 +15,21 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
|
||||||
|
import static com.android.cts.net.hostside.Property.APP_STANDBY_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.DOZE_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.METERED_NETWORK;
|
||||||
|
import static com.android.cts.net.hostside.Property.NON_METERED_NETWORK;
|
||||||
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test cases for the more complex scenarios where multiple restrictions (like Battery Saver Mode
|
* Test cases for the more complex scenarios where multiple restrictions (like Battery Saver Mode
|
||||||
* and Data Saver Mode) are applied simultaneously.
|
* and Data Saver Mode) are applied simultaneously.
|
||||||
@@ -29,12 +41,10 @@ import android.util.Log;
|
|||||||
public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
||||||
private static final String TAG = "MixedModesTest";
|
private static final String TAG = "MixedModesTest";
|
||||||
|
|
||||||
@Override
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
// Set initial state.
|
// Set initial state.
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
removeRestrictBackgroundBlacklist(mUid);
|
removeRestrictBackgroundBlacklist(mUid);
|
||||||
@@ -44,12 +54,10 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
registerBroadcastReceiver();
|
registerBroadcastReceiver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@After
|
||||||
protected void tearDown() throws Exception {
|
public void tearDown() throws Exception {
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
|
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
setRestrictBackground(false);
|
setRestrictBackground(false);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -57,34 +65,15 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSupported() throws Exception {
|
|
||||||
if (!isDozeModeEnabled()) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Doze Mode");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on metered networks.
|
* Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on metered networks.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({DATA_SAVER_MODE, BATTERY_SAVER_MODE, METERED_NETWORK})
|
||||||
|
@Test
|
||||||
public void testDataAndBatterySaverModes_meteredNetwork() throws Exception {
|
public void testDataAndBatterySaverModes_meteredNetwork() throws Exception {
|
||||||
if (!isBatterySaverSupported()) {
|
final MeterednessConfigurationRule meterednessConfiguration
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
= new MeterednessConfigurationRule();
|
||||||
+ "() because device does not support Battery saver mode");
|
meterednessConfiguration.configureNetworkMeteredness(true);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
Log.i(TAG, "testDataAndBatterySaverModes_meteredNetwork() tests");
|
|
||||||
if (!setMeteredNetwork()) {
|
|
||||||
Log.w(TAG, "testDataAndBatterySaverModes_meteredNetwork() skipped because "
|
|
||||||
+ "device cannot use a metered network");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
setRestrictBackground(true);
|
setRestrictBackground(true);
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
@@ -137,7 +126,7 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
removeRestrictBackgroundBlacklist(mUid);
|
removeRestrictBackgroundBlacklist(mUid);
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
} finally {
|
} finally {
|
||||||
resetMeteredNetwork();
|
meterednessConfiguration.resetNetworkMeteredness();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,86 +134,75 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
* Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on non-metered
|
* Tests all DS ON and BS ON scenarios from network-policy-restrictions.md on non-metered
|
||||||
* networks.
|
* networks.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({DATA_SAVER_MODE, BATTERY_SAVER_MODE, NON_METERED_NETWORK})
|
||||||
|
@Test
|
||||||
public void testDataAndBatterySaverModes_nonMeteredNetwork() throws Exception {
|
public void testDataAndBatterySaverModes_nonMeteredNetwork() throws Exception {
|
||||||
if (!isBatterySaverSupported()) {
|
final MeterednessConfigurationRule meterednessConfiguration
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
= new MeterednessConfigurationRule();
|
||||||
+ "() because device does not support Battery saver mode");
|
meterednessConfiguration.configureNetworkMeteredness(false);
|
||||||
return;
|
try {
|
||||||
|
setRestrictBackground(true);
|
||||||
|
setBatterySaverMode(true);
|
||||||
|
|
||||||
|
Log.v(TAG, "Not whitelisted for any.");
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
|
||||||
|
Log.v(TAG, "Whitelisted for Data Saver but not for Battery Saver.");
|
||||||
|
addRestrictBackgroundWhitelist(mUid);
|
||||||
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
|
|
||||||
|
Log.v(TAG, "Whitelisted for Battery Saver but not for Data Saver.");
|
||||||
|
addPowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
|
||||||
|
Log.v(TAG, "Whitelisted for both.");
|
||||||
|
addRestrictBackgroundWhitelist(mUid);
|
||||||
|
addPowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
|
|
||||||
|
Log.v(TAG, "Blacklisted for Data Saver, not whitelisted for Battery Saver.");
|
||||||
|
addRestrictBackgroundBlacklist(mUid);
|
||||||
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
removeRestrictBackgroundBlacklist(mUid);
|
||||||
|
|
||||||
|
Log.v(TAG, "Blacklisted for Data Saver, whitelisted for Battery Saver.");
|
||||||
|
addRestrictBackgroundBlacklist(mUid);
|
||||||
|
addPowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
assertsForegroundAlwaysHasNetworkAccess();
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
removeRestrictBackgroundBlacklist(mUid);
|
||||||
|
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
||||||
|
} finally {
|
||||||
|
meterednessConfiguration.resetNetworkMeteredness();
|
||||||
}
|
}
|
||||||
if (!isSupported()) return;
|
|
||||||
|
|
||||||
if (!setUnmeteredNetwork()) {
|
|
||||||
Log.w(TAG, "testDataAndBatterySaverModes_nonMeteredNetwork() skipped because network"
|
|
||||||
+ " is metered");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Log.i(TAG, "testDataAndBatterySaverModes_nonMeteredNetwork() tests");
|
|
||||||
setRestrictBackground(true);
|
|
||||||
setBatterySaverMode(true);
|
|
||||||
|
|
||||||
Log.v(TAG, "Not whitelisted for any.");
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
|
|
||||||
Log.v(TAG, "Whitelisted for Data Saver but not for Battery Saver.");
|
|
||||||
addRestrictBackgroundWhitelist(mUid);
|
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
|
||||||
|
|
||||||
Log.v(TAG, "Whitelisted for Battery Saver but not for Data Saver.");
|
|
||||||
addPowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
|
|
||||||
Log.v(TAG, "Whitelisted for both.");
|
|
||||||
addRestrictBackgroundWhitelist(mUid);
|
|
||||||
addPowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
|
||||||
|
|
||||||
Log.v(TAG, "Blacklisted for Data Saver, not whitelisted for Battery Saver.");
|
|
||||||
addRestrictBackgroundBlacklist(mUid);
|
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
removeRestrictBackgroundBlacklist(mUid);
|
|
||||||
|
|
||||||
Log.v(TAG, "Blacklisted for Data Saver, whitelisted for Battery Saver.");
|
|
||||||
addRestrictBackgroundBlacklist(mUid);
|
|
||||||
addPowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
assertsForegroundAlwaysHasNetworkAccess();
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
removeRestrictBackgroundBlacklist(mUid);
|
|
||||||
removePowerSaveModeWhitelist(TEST_APP2_PKG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests that powersave whitelists works as expected when doze and battery saver modes
|
* Tests that powersave whitelists works as expected when doze and battery saver modes
|
||||||
* are enabled.
|
* are enabled.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({DOZE_MODE, BATTERY_SAVER_MODE})
|
||||||
|
@Test
|
||||||
public void testDozeAndBatterySaverMode_powerSaveWhitelists() throws Exception {
|
public void testDozeAndBatterySaverMode_powerSaveWhitelists() throws Exception {
|
||||||
if (!isBatterySaverSupported()) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Battery saver mode");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
setDozeMode(true);
|
setDozeMode(true);
|
||||||
|
|
||||||
@@ -250,11 +228,9 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
* Tests that powersave whitelists works as expected when doze and appIdle modes
|
* Tests that powersave whitelists works as expected when doze and appIdle modes
|
||||||
* are enabled.
|
* are enabled.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({DOZE_MODE, APP_STANDBY_MODE})
|
||||||
|
@Test
|
||||||
public void testDozeAndAppIdle_powerSaveWhitelists() throws Exception {
|
public void testDozeAndAppIdle_powerSaveWhitelists() throws Exception {
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setDozeMode(true);
|
setDozeMode(true);
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
|
|
||||||
@@ -276,11 +252,9 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({APP_STANDBY_MODE, DOZE_MODE})
|
||||||
|
@Test
|
||||||
public void testAppIdleAndDoze_tempPowerSaveWhitelists() throws Exception {
|
public void testAppIdleAndDoze_tempPowerSaveWhitelists() throws Exception {
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setDozeMode(true);
|
setDozeMode(true);
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
|
|
||||||
@@ -299,16 +273,9 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({APP_STANDBY_MODE, BATTERY_SAVER_MODE})
|
||||||
|
@Test
|
||||||
public void testAppIdleAndBatterySaver_tempPowerSaveWhitelists() throws Exception {
|
public void testAppIdleAndBatterySaver_tempPowerSaveWhitelists() throws Exception {
|
||||||
if (!isBatterySaverSupported()) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Battery saver mode");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
|
|
||||||
@@ -330,11 +297,9 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
/**
|
/**
|
||||||
* Tests that the app idle whitelist works as expected when doze and appIdle mode are enabled.
|
* Tests that the app idle whitelist works as expected when doze and appIdle mode are enabled.
|
||||||
*/
|
*/
|
||||||
|
@RequiredProperties({DOZE_MODE, APP_STANDBY_MODE})
|
||||||
|
@Test
|
||||||
public void testDozeAndAppIdle_appIdleWhitelist() throws Exception {
|
public void testDozeAndAppIdle_appIdleWhitelist() throws Exception {
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setDozeMode(true);
|
setDozeMode(true);
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
|
|
||||||
@@ -353,11 +318,9 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({APP_STANDBY_MODE, DOZE_MODE})
|
||||||
|
@Test
|
||||||
public void testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists() throws Exception {
|
public void testAppIdleAndDoze_tempPowerSaveAndAppIdleWhitelists() throws Exception {
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setDozeMode(true);
|
setDozeMode(true);
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
|
|
||||||
@@ -380,16 +343,9 @@ public class MixedModesTest extends AbstractRestrictBackgroundNetworkTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({APP_STANDBY_MODE, BATTERY_SAVER_MODE})
|
||||||
|
@Test
|
||||||
public void testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists() throws Exception {
|
public void testAppIdleAndBatterySaver_tempPowerSaveAndAppIdleWhitelists() throws Exception {
|
||||||
if (!isBatterySaverSupported()) {
|
|
||||||
Log.i(TAG, "Skipping " + getClass() + "." + getName()
|
|
||||||
+ "() because device does not support Battery saver mode");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!isSupported()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
setAppIdle(true);
|
setAppIdle(true);
|
||||||
|
|
||||||
|
|||||||
@@ -16,15 +16,26 @@
|
|||||||
|
|
||||||
package com.android.cts.net.hostside;
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.setRestrictBackground;
|
||||||
|
import static com.android.cts.net.hostside.Property.BATTERY_SAVER_MODE;
|
||||||
|
import static com.android.cts.net.hostside.Property.DATA_SAVER_MODE;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCase {
|
public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCase {
|
||||||
|
|
||||||
private boolean mIsDataSaverSupported;
|
|
||||||
private Network mNetwork;
|
private Network mNetwork;
|
||||||
private final TestNetworkCallback mTestNetworkCallback = new TestNetworkCallback();
|
private final TestNetworkCallback mTestNetworkCallback = new TestNetworkCallback();
|
||||||
|
|
||||||
@@ -132,108 +143,122 @@ public class NetworkCallbackTest extends AbstractRestrictBackgroundNetworkTestCa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
|
||||||
mIsDataSaverSupported = isDataSaverSupported();
|
|
||||||
|
|
||||||
mNetwork = mCm.getActiveNetwork();
|
mNetwork = mCm.getActiveNetwork();
|
||||||
|
|
||||||
// Set initial state.
|
|
||||||
setBatterySaverMode(false);
|
|
||||||
registerBroadcastReceiver();
|
registerBroadcastReceiver();
|
||||||
|
|
||||||
if (!mIsDataSaverSupported) return;
|
|
||||||
setRestrictBackground(false);
|
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
removeRestrictBackgroundBlacklist(mUid);
|
removeRestrictBackgroundBlacklist(mUid);
|
||||||
assertRestrictBackgroundChangedReceived(0);
|
assertRestrictBackgroundChangedReceived(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@After
|
||||||
protected void tearDown() throws Exception {
|
public void tearDown() throws Exception {
|
||||||
super.tearDown();
|
super.tearDown();
|
||||||
|
|
||||||
if (!mIsDataSaverSupported) return;
|
setRestrictBackground(false);
|
||||||
|
setBatterySaverMode(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiredProperties({DATA_SAVER_MODE})
|
||||||
|
@Test
|
||||||
|
public void testOnBlockedStatusChanged_dataSaver() throws Exception {
|
||||||
|
// Initial state
|
||||||
|
setBatterySaverMode(false);
|
||||||
|
setRestrictBackground(false);
|
||||||
|
|
||||||
|
final MeterednessConfigurationRule meterednessConfiguration
|
||||||
|
= new MeterednessConfigurationRule();
|
||||||
|
meterednessConfiguration.configureNetworkMeteredness(true);
|
||||||
try {
|
try {
|
||||||
resetMeteredNetwork();
|
// Register callback
|
||||||
|
registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
|
||||||
|
mTestNetworkCallback.expectAvailableCallback(mNetwork);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
||||||
|
|
||||||
|
// Enable restrict background
|
||||||
|
setRestrictBackground(true);
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
||||||
|
|
||||||
|
// Add to whitelist
|
||||||
|
addRestrictBackgroundWhitelist(mUid);
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
||||||
|
|
||||||
|
// Remove from whitelist
|
||||||
|
removeRestrictBackgroundWhitelist(mUid);
|
||||||
|
assertBackgroundNetworkAccess(false);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
||||||
} finally {
|
} finally {
|
||||||
|
meterednessConfiguration.resetNetworkMeteredness();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set to non-metered network
|
||||||
|
meterednessConfiguration.configureNetworkMeteredness(false);
|
||||||
|
try {
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
||||||
|
|
||||||
|
// Disable restrict background, should not trigger callback
|
||||||
setRestrictBackground(false);
|
setRestrictBackground(false);
|
||||||
|
assertBackgroundNetworkAccess(true);
|
||||||
|
mTestNetworkCallback.assertNoCallback();
|
||||||
|
} finally {
|
||||||
|
meterednessConfiguration.resetNetworkMeteredness();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testOnBlockedStatusChanged_data_saver() throws Exception {
|
@RequiredProperties({BATTERY_SAVER_MODE})
|
||||||
if (!mIsDataSaverSupported) return;
|
@Test
|
||||||
|
public void testOnBlockedStatusChanged_powerSaver() throws Exception {
|
||||||
// Prepare metered wifi
|
// Set initial state.
|
||||||
if (!setMeteredNetwork()) return;
|
setBatterySaverMode(false);
|
||||||
|
|
||||||
// Register callback
|
|
||||||
registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
|
|
||||||
mTestNetworkCallback.expectAvailableCallback(mNetwork);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
|
||||||
|
|
||||||
// Enable restrict background
|
|
||||||
setRestrictBackground(true);
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
|
||||||
|
|
||||||
// Add to whitelist
|
|
||||||
addRestrictBackgroundWhitelist(mUid);
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
|
||||||
|
|
||||||
// Remove from whitelist
|
|
||||||
removeRestrictBackgroundWhitelist(mUid);
|
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
|
||||||
|
|
||||||
// Set to non-metered network
|
|
||||||
setUnmeteredNetwork();
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
|
||||||
|
|
||||||
// Disable restrict background, should not trigger callback
|
|
||||||
setRestrictBackground(false);
|
setRestrictBackground(false);
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
mTestNetworkCallback.assertNoCallback();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
final MeterednessConfigurationRule meterednessConfiguration
|
||||||
|
= new MeterednessConfigurationRule();
|
||||||
|
meterednessConfiguration.configureNetworkMeteredness(true);
|
||||||
|
try {
|
||||||
|
// Register callback
|
||||||
|
registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
|
||||||
|
mTestNetworkCallback.expectAvailableCallback(mNetwork);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
||||||
|
|
||||||
public void testOnBlockedStatusChanged_power_saver() throws Exception {
|
// Enable Power Saver
|
||||||
// Prepare metered wifi
|
setBatterySaverMode(true);
|
||||||
if (!setMeteredNetwork()) return;
|
assertBackgroundNetworkAccess(false);
|
||||||
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
||||||
|
|
||||||
// Register callback
|
// Disable Power Saver
|
||||||
registerNetworkCallback((INetworkCallback.Stub) mTestNetworkCallback);
|
setBatterySaverMode(false);
|
||||||
mTestNetworkCallback.expectAvailableCallback(mNetwork);
|
assertBackgroundNetworkAccess(true);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
||||||
|
} finally {
|
||||||
// Enable Power Saver
|
meterednessConfiguration.resetNetworkMeteredness();
|
||||||
setBatterySaverMode(true);
|
}
|
||||||
assertBackgroundNetworkAccess(false);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
|
||||||
|
|
||||||
// Disable Power Saver
|
|
||||||
setBatterySaverMode(false);
|
|
||||||
assertBackgroundNetworkAccess(true);
|
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
|
||||||
|
|
||||||
// Set to non-metered network
|
// Set to non-metered network
|
||||||
setUnmeteredNetwork();
|
meterednessConfiguration.configureNetworkMeteredness(false);
|
||||||
mTestNetworkCallback.assertNoCallback();
|
try {
|
||||||
|
mTestNetworkCallback.assertNoCallback();
|
||||||
|
|
||||||
// Enable Power Saver
|
// Enable Power Saver
|
||||||
setBatterySaverMode(true);
|
setBatterySaverMode(true);
|
||||||
assertBackgroundNetworkAccess(false);
|
assertBackgroundNetworkAccess(false);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, true);
|
||||||
|
|
||||||
// Disable Power Saver
|
// Disable Power Saver
|
||||||
setBatterySaverMode(false);
|
setBatterySaverMode(false);
|
||||||
assertBackgroundNetworkAccess(true);
|
assertBackgroundNetworkAccess(true);
|
||||||
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
mTestNetworkCallback.expectBlockedStatusCallback(mNetwork, false);
|
||||||
|
} finally {
|
||||||
|
meterednessConfiguration.resetNetworkMeteredness();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: 1. test against VPN lockdown.
|
// TODO: 1. test against VPN lockdown.
|
||||||
|
|||||||
@@ -0,0 +1,255 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
|
||||||
|
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
|
||||||
|
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
|
||||||
|
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
|
||||||
|
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
|
||||||
|
|
||||||
|
import static com.android.compatibility.common.util.SystemUtil.runShellCommand;
|
||||||
|
import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
|
import android.app.ActivityManager;
|
||||||
|
import android.app.Instrumentation;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
|
import android.net.ConnectivityManager.NetworkCallback;
|
||||||
|
import android.net.Network;
|
||||||
|
import android.net.NetworkCapabilities;
|
||||||
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
|
import com.android.compatibility.common.util.AppStandbyUtils;
|
||||||
|
import com.android.compatibility.common.util.BatteryUtils;
|
||||||
|
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
|
||||||
|
public class NetworkPolicyTestUtils {
|
||||||
|
|
||||||
|
private static final int TIMEOUT_CHANGE_METEREDNESS_MS = 5000;
|
||||||
|
|
||||||
|
private static ConnectivityManager mCm;
|
||||||
|
private static WifiManager mWm;
|
||||||
|
|
||||||
|
private static Boolean mBatterySaverSupported;
|
||||||
|
private static Boolean mDataSaverSupported;
|
||||||
|
private static Boolean mDozeModeSupported;
|
||||||
|
private static Boolean mAppStandbySupported;
|
||||||
|
|
||||||
|
private NetworkPolicyTestUtils() {}
|
||||||
|
|
||||||
|
public static boolean isBatterySaverSupported() {
|
||||||
|
if (mBatterySaverSupported == null) {
|
||||||
|
mBatterySaverSupported = BatteryUtils.isBatterySaverSupported();
|
||||||
|
}
|
||||||
|
return mBatterySaverSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* As per CDD requirements, if the device doesn't support data saver mode then
|
||||||
|
* ConnectivityManager.getRestrictBackgroundStatus() will always return
|
||||||
|
* RESTRICT_BACKGROUND_STATUS_DISABLED. So, enable the data saver mode and check if
|
||||||
|
* ConnectivityManager.getRestrictBackgroundStatus() for an app in background returns
|
||||||
|
* RESTRICT_BACKGROUND_STATUS_DISABLED or not.
|
||||||
|
*/
|
||||||
|
public static boolean isDataSaverSupported() {
|
||||||
|
if (mDataSaverSupported == null) {
|
||||||
|
assertMyRestrictBackgroundStatus(RESTRICT_BACKGROUND_STATUS_DISABLED);
|
||||||
|
try {
|
||||||
|
setRestrictBackground(true);
|
||||||
|
mDataSaverSupported = !isMyRestrictBackgroundStatus(
|
||||||
|
RESTRICT_BACKGROUND_STATUS_DISABLED);
|
||||||
|
} finally {
|
||||||
|
setRestrictBackground(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mDataSaverSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isDozeModeSupported() {
|
||||||
|
if (mDozeModeSupported == null) {
|
||||||
|
final String result = executeShellCommand("cmd deviceidle enabled deep");
|
||||||
|
mDozeModeSupported = result.equals("1");
|
||||||
|
}
|
||||||
|
return mDozeModeSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isAppStandbySupported() {
|
||||||
|
if (mAppStandbySupported == null) {
|
||||||
|
mAppStandbySupported = AppStandbyUtils.isAppStandbyEnabled();
|
||||||
|
}
|
||||||
|
return mAppStandbySupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isLowRamDevice() {
|
||||||
|
final ActivityManager am = (ActivityManager) getContext().getSystemService(
|
||||||
|
Context.ACTIVITY_SERVICE);
|
||||||
|
return am.isLowRamDevice();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isActiveNetworkMetered(boolean metered) {
|
||||||
|
return getConnectivityManager().isActiveNetworkMetered() == metered;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean canChangeActiveNetworkMeteredness() {
|
||||||
|
final Network activeNetwork = getConnectivityManager().getActiveNetwork();
|
||||||
|
final NetworkCapabilities networkCapabilities
|
||||||
|
= getConnectivityManager().getNetworkCapabilities(activeNetwork);
|
||||||
|
return networkCapabilities.hasTransport(TRANSPORT_WIFI);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Pair<String, Boolean> setupMeteredNetwork(boolean metered) throws Exception {
|
||||||
|
if (isActiveNetworkMetered(metered)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final String ssid = unquoteSSID(getWifiManager().getConnectionInfo().getSSID());
|
||||||
|
setWifiMeteredStatus(ssid, metered);
|
||||||
|
return Pair.create(ssid, !metered);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void resetMeteredNetwork(String ssid, boolean metered) throws Exception {
|
||||||
|
setWifiMeteredStatus(ssid, metered);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setWifiMeteredStatus(String ssid, boolean metered) throws Exception {
|
||||||
|
assertFalse("SSID should not be empty", TextUtils.isEmpty(ssid));
|
||||||
|
final String cmd = "cmd netpolicy set metered-network " + ssid + " " + metered;
|
||||||
|
executeShellCommand(cmd);
|
||||||
|
assertWifiMeteredStatus(ssid, metered);
|
||||||
|
assertActiveNetworkMetered(metered);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void assertWifiMeteredStatus(String ssid, boolean expectedMeteredStatus) {
|
||||||
|
final String result = executeShellCommand("cmd netpolicy list wifi-networks");
|
||||||
|
final String expectedLine = ssid + ";" + expectedMeteredStatus;
|
||||||
|
assertTrue("Expected line: " + expectedLine + "; Actual result: " + result,
|
||||||
|
result.contains(expectedLine));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copied from cts/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
|
||||||
|
public static void assertActiveNetworkMetered(boolean expectedMeteredStatus) throws Exception {
|
||||||
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
|
final NetworkCallback networkCallback = new NetworkCallback() {
|
||||||
|
@Override
|
||||||
|
public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
|
||||||
|
final boolean metered = !nc.hasCapability(NET_CAPABILITY_NOT_METERED);
|
||||||
|
if (metered == expectedMeteredStatus) {
|
||||||
|
latch.countDown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// Registering a callback here guarantees onCapabilitiesChanged is called immediately
|
||||||
|
// with the current setting. Therefore, if the setting has already been changed,
|
||||||
|
// this method will return right away, and if not it will wait for the setting to change.
|
||||||
|
getConnectivityManager().registerDefaultNetworkCallback(networkCallback);
|
||||||
|
if (!latch.await(TIMEOUT_CHANGE_METEREDNESS_MS, TimeUnit.MILLISECONDS)) {
|
||||||
|
fail("Timed out waiting for active network metered status to change to "
|
||||||
|
+ expectedMeteredStatus + " ; network = "
|
||||||
|
+ getConnectivityManager().getActiveNetwork());
|
||||||
|
}
|
||||||
|
getConnectivityManager().unregisterNetworkCallback(networkCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setRestrictBackground(boolean enabled) {
|
||||||
|
executeShellCommand("cmd netpolicy set restrict-background " + enabled);
|
||||||
|
final String output = executeShellCommand("cmd netpolicy get restrict-background");
|
||||||
|
final String expectedSuffix = enabled ? "enabled" : "disabled";
|
||||||
|
assertTrue("output '" + output + "' should end with '" + expectedSuffix + "'",
|
||||||
|
output.endsWith(expectedSuffix));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isMyRestrictBackgroundStatus(int expectedStatus) {
|
||||||
|
final int actualStatus = getConnectivityManager().getRestrictBackgroundStatus();
|
||||||
|
if (expectedStatus != actualStatus) {
|
||||||
|
Log.d(TAG, "MyRestrictBackgroundStatus: "
|
||||||
|
+ "Expected: " + restrictBackgroundValueToString(expectedStatus)
|
||||||
|
+ "; Actual: " + restrictBackgroundValueToString(actualStatus));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copied from cts/tests/tests/net/src/android/net/cts/ConnectivityManagerTest.java
|
||||||
|
private static String unquoteSSID(String ssid) {
|
||||||
|
// SSID is returned surrounded by quotes if it can be decoded as UTF-8.
|
||||||
|
// Otherwise it's guaranteed not to start with a quote.
|
||||||
|
if (ssid.charAt(0) == '"') {
|
||||||
|
return ssid.substring(1, ssid.length() - 1);
|
||||||
|
} else {
|
||||||
|
return ssid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String restrictBackgroundValueToString(int status) {
|
||||||
|
switch (status) {
|
||||||
|
case RESTRICT_BACKGROUND_STATUS_DISABLED:
|
||||||
|
return "DISABLED";
|
||||||
|
case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
|
||||||
|
return "WHITELISTED";
|
||||||
|
case RESTRICT_BACKGROUND_STATUS_ENABLED:
|
||||||
|
return "ENABLED";
|
||||||
|
default:
|
||||||
|
return "UNKNOWN_STATUS_" + status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String executeShellCommand(String command) {
|
||||||
|
final String result = runShellCommand(command).trim();
|
||||||
|
Log.d(TAG, "Output of '" + command + "': '" + result + "'");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void assertMyRestrictBackgroundStatus(int expectedStatus) {
|
||||||
|
final int actualStatus = getConnectivityManager().getRestrictBackgroundStatus();
|
||||||
|
assertEquals(restrictBackgroundValueToString(expectedStatus),
|
||||||
|
restrictBackgroundValueToString(actualStatus));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ConnectivityManager getConnectivityManager() {
|
||||||
|
if (mCm == null) {
|
||||||
|
mCm = (ConnectivityManager) getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
}
|
||||||
|
return mCm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static WifiManager getWifiManager() {
|
||||||
|
if (mWm == null) {
|
||||||
|
mWm = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE);
|
||||||
|
}
|
||||||
|
return mWm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Context getContext() {
|
||||||
|
return getInstrumentation().getContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Instrumentation getInstrumentation() {
|
||||||
|
return InstrumentationRegistry.getInstrumentation();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.canChangeActiveNetworkMeteredness;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isActiveNetworkMetered;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isAppStandbySupported;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isBatterySaverSupported;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isDataSaverSupported;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isDozeModeSupported;
|
||||||
|
import static com.android.cts.net.hostside.NetworkPolicyTestUtils.isLowRamDevice;
|
||||||
|
|
||||||
|
public enum Property {
|
||||||
|
BATTERY_SAVER_MODE(1 << 0) {
|
||||||
|
public boolean isSupported() { return isBatterySaverSupported(); }
|
||||||
|
},
|
||||||
|
|
||||||
|
DATA_SAVER_MODE(1 << 1) {
|
||||||
|
public boolean isSupported() { return isDataSaverSupported(); }
|
||||||
|
},
|
||||||
|
|
||||||
|
NO_DATA_SAVER_MODE(~DATA_SAVER_MODE.getValue()) {
|
||||||
|
public boolean isSupported() { return !isDataSaverSupported(); }
|
||||||
|
},
|
||||||
|
|
||||||
|
DOZE_MODE(1 << 2) {
|
||||||
|
public boolean isSupported() { return isDozeModeSupported(); }
|
||||||
|
},
|
||||||
|
|
||||||
|
APP_STANDBY_MODE(1 << 3) {
|
||||||
|
public boolean isSupported() { return isAppStandbySupported(); }
|
||||||
|
},
|
||||||
|
|
||||||
|
NOT_LOW_RAM_DEVICE(1 << 4) {
|
||||||
|
public boolean isSupported() { return !isLowRamDevice(); }
|
||||||
|
},
|
||||||
|
|
||||||
|
METERED_NETWORK(1 << 5) {
|
||||||
|
public boolean isSupported() {
|
||||||
|
return isActiveNetworkMetered(true) || canChangeActiveNetworkMeteredness();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
NON_METERED_NETWORK(~METERED_NETWORK.getValue()) {
|
||||||
|
public boolean isSupported() {
|
||||||
|
return isActiveNetworkMetered(false) || canChangeActiveNetworkMeteredness();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private int mValue;
|
||||||
|
|
||||||
|
Property(int value) { mValue = value; }
|
||||||
|
|
||||||
|
public int getValue() { return mValue; }
|
||||||
|
|
||||||
|
abstract boolean isSupported();
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static java.lang.annotation.ElementType.METHOD;
|
||||||
|
import static java.lang.annotation.ElementType.TYPE;
|
||||||
|
import static java.lang.annotation.RetentionPolicy.RUNTIME;
|
||||||
|
|
||||||
|
import java.lang.annotation.Inherited;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Retention(RUNTIME)
|
||||||
|
@Target({METHOD, TYPE})
|
||||||
|
@Inherited
|
||||||
|
public @interface RequiredProperties {
|
||||||
|
Property[] value();
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.android.cts.net.hostside;
|
||||||
|
|
||||||
|
import static com.android.cts.net.hostside.AbstractRestrictBackgroundNetworkTestCase.TAG;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.ArraySet;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.compatibility.common.util.BeforeAfterRule;
|
||||||
|
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.runner.Description;
|
||||||
|
import org.junit.runners.model.Statement;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
public class RequiredPropertiesRule extends BeforeAfterRule {
|
||||||
|
|
||||||
|
private static ArraySet<Property> mRequiredProperties;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBefore(Statement base, Description description) {
|
||||||
|
mRequiredProperties = getAllRequiredProperties(description);
|
||||||
|
|
||||||
|
final String testName = description.getClassName() + "#" + description.getMethodName();
|
||||||
|
assertTestIsValid(testName, mRequiredProperties);
|
||||||
|
Log.i(TAG, "Running test " + testName + " with required properties: "
|
||||||
|
+ propertiesToString(mRequiredProperties));
|
||||||
|
}
|
||||||
|
|
||||||
|
private ArraySet<Property> getAllRequiredProperties(Description description) {
|
||||||
|
final ArraySet<Property> allRequiredProperties = new ArraySet<>();
|
||||||
|
RequiredProperties requiredProperties = description.getAnnotation(RequiredProperties.class);
|
||||||
|
if (requiredProperties != null) {
|
||||||
|
Collections.addAll(allRequiredProperties, requiredProperties.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Class<?> clazz = description.getTestClass();
|
||||||
|
clazz != null; clazz = clazz.getSuperclass()) {
|
||||||
|
requiredProperties = clazz.getDeclaredAnnotation(RequiredProperties.class);
|
||||||
|
if (requiredProperties == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (Property requiredProperty : requiredProperties.value()) {
|
||||||
|
if (!allRequiredProperties.contains(~requiredProperty.getValue())) {
|
||||||
|
allRequiredProperties.add(requiredProperty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return allRequiredProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertTestIsValid(String testName, ArraySet<Property> requiredProperies) {
|
||||||
|
if (requiredProperies == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final ArrayList<Property> unsupportedProperties = new ArrayList<>();
|
||||||
|
for (Property property : requiredProperies) {
|
||||||
|
if (!property.isSupported()) {
|
||||||
|
unsupportedProperties.add(property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Assume.assumeTrue("Unsupported properties: "
|
||||||
|
+ propertiesToString(unsupportedProperties), unsupportedProperties.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ArraySet<Property> getRequiredProperties() {
|
||||||
|
return mRequiredProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String propertiesToString(Iterable<Property> properties) {
|
||||||
|
return "[" + TextUtils.join(",", properties) + "]";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,14 +29,14 @@ public class HostsideNetworkCallbackTests extends HostsideNetworkTestCase {
|
|||||||
uninstallPackage(TEST_APP2_PKG, true);
|
uninstallPackage(TEST_APP2_PKG, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testOnBlockedStatusChanged_data_saver() throws Exception {
|
public void testOnBlockedStatusChanged_dataSaver() throws Exception {
|
||||||
runDeviceTests(TEST_PKG,
|
runDeviceTests(TEST_PKG,
|
||||||
TEST_PKG + ".NetworkCallbackTest", "testOnBlockedStatusChanged_data_saver");
|
TEST_PKG + ".NetworkCallbackTest", "testOnBlockedStatusChanged_dataSaver");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testOnBlockedStatusChanged_power_saver() throws Exception {
|
public void testOnBlockedStatusChanged_powerSaver() throws Exception {
|
||||||
runDeviceTests(TEST_PKG,
|
runDeviceTests(TEST_PKG,
|
||||||
TEST_PKG + ".NetworkCallbackTest", "testOnBlockedStatusChanged_power_saver");
|
TEST_PKG + ".NetworkCallbackTest", "testOnBlockedStatusChanged_powerSaver");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,8 @@ abstract class HostsideNetworkTestCase extends DeviceTestCase implements IAbiRec
|
|||||||
protected void installPackage(String apk) throws FileNotFoundException,
|
protected void installPackage(String apk) throws FileNotFoundException,
|
||||||
DeviceNotAvailableException {
|
DeviceNotAvailableException {
|
||||||
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mCtsBuild);
|
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mCtsBuild);
|
||||||
assertNull(getDevice().installPackage(buildHelper.getTestFile(apk), false));
|
assertNull(getDevice().installPackage(buildHelper.getTestFile(apk),
|
||||||
|
false /* reinstall */, true /* grantPermissions */));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void uninstallPackage(String packageName, boolean shouldSucceed)
|
protected void uninstallPackage(String packageName, boolean shouldSucceed)
|
||||||
|
|||||||
Reference in New Issue
Block a user