From dd9b794e5ce926b9d898f50b67be9eb1d00d44b7 Mon Sep 17 00:00:00 2001 From: lucaslin Date: Thu, 2 Jun 2022 23:40:16 +0800 Subject: [PATCH] Verify if the VPN app has been added into power save whilte list Bug: 234104087 Test: atest FrameworksNetTests:VpnTest Change-Id: I2aa99b8ea8dbe668a45782f50a4a0ac82e72b7a2 (cherry picked from commit 802fa5d0ec0642573951e93e7106f3b809ac4aff) Merged-In: I2aa99b8ea8dbe668a45782f50a4a0ac82e72b7a2 --- .../android/server/connectivity/VpnTest.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/tests/unit/java/com/android/server/connectivity/VpnTest.java b/tests/unit/java/com/android/server/connectivity/VpnTest.java index 11fbcb9e70..eb35469a43 100644 --- a/tests/unit/java/com/android/server/connectivity/VpnTest.java +++ b/tests/unit/java/com/android/server/connectivity/VpnTest.java @@ -45,6 +45,7 @@ import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; @@ -111,6 +112,7 @@ import android.os.ConditionVariable; import android.os.INetworkManagementService; import android.os.Looper; import android.os.ParcelFileDescriptor; +import android.os.PowerWhitelistManager; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; @@ -129,6 +131,7 @@ import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnProfile; import com.android.internal.util.HexDump; import com.android.modules.utils.build.SdkLevel; +import com.android.server.DeviceIdleInternal; import com.android.server.IpSecService; import com.android.server.vcn.util.PersistableBundleUtils; import com.android.testutils.DevSdkIgnoreRule; @@ -235,6 +238,7 @@ public class VpnTest { @Mock private ConnectivityManager mConnectivityManager; @Mock private IpSecService mIpSecService; @Mock private VpnProfileStore mVpnProfileStore; + @Mock DeviceIdleInternal mDeviceIdleInternal; private final VpnProfile mVpnProfile; private IpSecManager mIpSecManager; @@ -408,6 +412,12 @@ public class VpnTest { disallow); } + private void verifyPowerSaveTempWhitelistApp(String packageName) { + verify(mDeviceIdleInternal).addPowerSaveTempWhitelistApp(anyInt(), eq(packageName), + anyLong(), anyInt(), eq(false), eq(PowerWhitelistManager.REASON_VPN), + eq("VpnManager event")); + } + @Test public void testGetAlwaysAndOnGetLockDown() throws Exception { final Vpn vpn = createVpn(primaryUser.id); @@ -1144,6 +1154,8 @@ public class VpnTest { verifyPlatformVpnIsActivated(TEST_VPN_PKG); vpn.stopVpnProfile(TEST_VPN_PKG); verifyPlatformVpnIsDeactivated(TEST_VPN_PKG); + verifyPowerSaveTempWhitelistApp(TEST_VPN_PKG); + reset(mDeviceIdleInternal); // CATEGORY_EVENT_DEACTIVATED_BY_USER is not an error event, so both of errorClass and // errorCode won't be set. verifyVpnManagerEvent(sessionKey1, VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER, @@ -1155,6 +1167,8 @@ public class VpnTest { verifyPlatformVpnIsActivated(TEST_VPN_PKG); vpn.prepare(TEST_VPN_PKG, "com.new.vpn" /* newPackage */, TYPE_VPN_PLATFORM); verifyPlatformVpnIsDeactivated(TEST_VPN_PKG); + verifyPowerSaveTempWhitelistApp(TEST_VPN_PKG); + reset(mDeviceIdleInternal); // CATEGORY_EVENT_DEACTIVATED_BY_USER is not an error event, so both of errorClass and // errorCode won't be set. verifyVpnManagerEvent(sessionKey2, VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER, @@ -1170,6 +1184,8 @@ public class VpnTest { // Enable VPN always-on for PKGS[1]. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false /* lockdown */, null /* lockdownAllowlist */)); + verifyPowerSaveTempWhitelistApp(PKGS[1]); + reset(mDeviceIdleInternal); verifyVpnManagerEvent(null /* sessionKey */, VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, -1 /* errorClass */, -1 /* errorCode */, new VpnProfileState(VpnProfileState.STATE_DISCONNECTED, @@ -1178,6 +1194,8 @@ public class VpnTest { // Enable VPN lockdown for PKGS[1]. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], true /* lockdown */, null /* lockdownAllowlist */)); + verifyPowerSaveTempWhitelistApp(PKGS[1]); + reset(mDeviceIdleInternal); verifyVpnManagerEvent(null /* sessionKey */, VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, -1 /* errorClass */, -1 /* errorCode */, new VpnProfileState(VpnProfileState.STATE_DISCONNECTED, @@ -1186,6 +1204,8 @@ public class VpnTest { // Disable VPN lockdown for PKGS[1]. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false /* lockdown */, null /* lockdownAllowlist */)); + verifyPowerSaveTempWhitelistApp(PKGS[1]); + reset(mDeviceIdleInternal); verifyVpnManagerEvent(null /* sessionKey */, VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, -1 /* errorClass */, -1 /* errorCode */, new VpnProfileState(VpnProfileState.STATE_DISCONNECTED, @@ -1194,6 +1214,8 @@ public class VpnTest { // Disable VPN always-on. assertTrue(vpn.setAlwaysOnPackage(null, false /* lockdown */, null /* lockdownAllowlist */)); + verifyPowerSaveTempWhitelistApp(PKGS[1]); + reset(mDeviceIdleInternal); verifyVpnManagerEvent(null /* sessionKey */, VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, -1 /* errorClass */, -1 /* errorCode */, new VpnProfileState(VpnProfileState.STATE_DISCONNECTED, @@ -1202,6 +1224,8 @@ public class VpnTest { // Enable VPN always-on for PKGS[1] again. assertTrue(vpn.setAlwaysOnPackage(PKGS[1], false /* lockdown */, null /* lockdownAllowlist */)); + verifyPowerSaveTempWhitelistApp(PKGS[1]); + reset(mDeviceIdleInternal); verifyVpnManagerEvent(null /* sessionKey */, VpnManager.CATEGORY_EVENT_ALWAYS_ON_STATE_CHANGED, -1 /* errorClass */, -1 /* errorCode */, new VpnProfileState(VpnProfileState.STATE_DISCONNECTED, @@ -1210,6 +1234,8 @@ public class VpnTest { // Enable VPN always-on for PKGS[2]. assertTrue(vpn.setAlwaysOnPackage(PKGS[2], false /* lockdown */, null /* lockdownAllowlist */)); + verifyPowerSaveTempWhitelistApp(PKGS[2]); + reset(mDeviceIdleInternal); // PKGS[1] is replaced with PKGS[2]. // Pass 2 VpnProfileState objects to verifyVpnManagerEvent(), the first one is sent to // PKGS[1] to notify PKGS[1] that the VPN always-on is disabled, the second one is sent to @@ -1310,6 +1336,8 @@ public class VpnTest { final IkeSessionCallback ikeCb = captor.getValue(); ikeCb.onClosedWithException(exception); + verifyPowerSaveTempWhitelistApp(TEST_VPN_PKG); + reset(mDeviceIdleInternal); verifyVpnManagerEvent(sessionKey, category, errorType, errorCode, null /* profileState */); if (errorType == VpnManager.ERROR_CLASS_NOT_RECOVERABLE) { verify(mConnectivityManager, timeout(TEST_TIMEOUT_MS)) @@ -1532,7 +1560,7 @@ public class VpnTest { } } - private static final class TestDeps extends Vpn.Dependencies { + private final class TestDeps extends Vpn.Dependencies { public final CompletableFuture racoonArgs = new CompletableFuture(); public final CompletableFuture mtpdArgs = new CompletableFuture(); public final File mStateFile; @@ -1661,6 +1689,11 @@ public class VpnTest { @Override public void setBlocking(FileDescriptor fd, boolean blocking) {} + + @Override + public DeviceIdleInternal getDeviceIdleInternal() { + return mDeviceIdleInternal; + } } /**