Merge "Add tests for testing if [start|finish]Op is called or not"

This commit is contained in:
Lucas Lin
2021-11-01 08:33:36 +00:00
committed by Gerrit Code Review

View File

@@ -16,6 +16,7 @@
package com.android.server.connectivity;
import static android.Manifest.permission.BIND_VPN_SERVICE;
import static android.content.pm.UserInfo.FLAG_ADMIN;
import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE;
import static android.content.pm.UserInfo.FLAG_PRIMARY;
@@ -31,12 +32,14 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
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.anyString;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.after;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doCallRealMethod;
@@ -70,6 +73,7 @@ import android.net.InterfaceConfigurationParcel;
import android.net.IpPrefix;
import android.net.IpSecManager;
import android.net.IpSecTunnelInterfaceResponse;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.LocalSocket;
import android.net.Network;
@@ -86,6 +90,7 @@ import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.ConditionVariable;
import android.os.INetworkManagementService;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
@@ -102,6 +107,7 @@ import com.android.internal.R;
import com.android.internal.net.LegacyVpnInfo;
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnProfile;
import com.android.modules.utils.build.SdkLevel;
import com.android.server.IpSecService;
import com.android.testutils.DevSdkIgnoreRule;
import com.android.testutils.DevSdkIgnoreRunner;
@@ -118,6 +124,7 @@ import org.mockito.MockitoAnnotations;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Inet4Address;
@@ -850,6 +857,81 @@ public class VpnTest {
}
}
@Test
public void testStartOpAndFinishOpWillBeCalledWhenPlatformVpnIsOnAndOff() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN);
when(mVpnProfileStore.get(vpn.getProfileNameForPackage(TEST_VPN_PKG)))
.thenReturn(mVpnProfile.encode());
vpn.startVpnProfile(TEST_VPN_PKG);
verify(mAppOps).noteOpNoThrow(
eq(AppOpsManager.OPSTR_ACTIVATE_PLATFORM_VPN),
eq(Process.myUid()),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
verify(mAppOps).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER),
eq(Process.myUid()),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
// Add a small delay to make sure that startOp is only called once.
verify(mAppOps, after(100).times(1)).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER),
eq(Process.myUid()),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
// Check that the startOp is not called with OPSTR_ESTABLISH_VPN_SERVICE.
verify(mAppOps, never()).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_SERVICE),
eq(Process.myUid()),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
vpn.stopVpnProfile(TEST_VPN_PKG);
// Add a small delay to double confirm that startOp is only called once.
verify(mAppOps, after(100)).finishOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_MANAGER),
eq(Process.myUid()),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */);
}
@Test
public void testStartOpWithSeamlessHandover() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
final Vpn vpn = createVpnAndSetupUidChecks(AppOpsManager.OPSTR_ACTIVATE_VPN);
assertTrue(vpn.prepare(TEST_VPN_PKG, null, VpnManager.TYPE_VPN_SERVICE));
final VpnConfig config = new VpnConfig();
config.user = "VpnTest";
config.addresses.add(new LinkAddress("192.0.2.2/32"));
config.mtu = 1450;
final ResolveInfo resolveInfo = new ResolveInfo();
final ServiceInfo serviceInfo = new ServiceInfo();
serviceInfo.permission = BIND_VPN_SERVICE;
resolveInfo.serviceInfo = serviceInfo;
when(mPackageManager.resolveService(any(), anyInt())).thenReturn(resolveInfo);
when(mContext.bindServiceAsUser(any(), any(), anyInt(), any())).thenReturn(true);
vpn.establish(config);
verify(mAppOps, times(1)).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_SERVICE),
eq(Process.myUid()),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
// Call establish() twice with the same config, it should match seamless handover case and
// startOp() shouldn't be called again.
vpn.establish(config);
verify(mAppOps, times(1)).startOp(
eq(AppOpsManager.OPSTR_ESTABLISH_VPN_SERVICE),
eq(Process.myUid()),
eq(TEST_VPN_PKG),
eq(null) /* attributionTag */,
eq(null) /* message */);
}
@Test
public void testSetPackageAuthorizationVpnService() throws Exception {
final Vpn vpn = createVpnAndSetupUidChecks();
@@ -1197,6 +1279,32 @@ public class VpnTest {
public boolean isInterfacePresent(final Vpn vpn, final String iface) {
return true;
}
@Override
public ParcelFileDescriptor adoptFd(Vpn vpn, int mtu) {
return new ParcelFileDescriptor(new FileDescriptor());
}
@Override
public int jniCreate(Vpn vpn, int mtu) {
// Pick a random positive number as fd to return.
return 345;
}
@Override
public String jniGetName(Vpn vpn, int fd) {
return TEST_IFACE_NAME;
}
@Override
public int jniSetAddresses(Vpn vpn, String interfaze, String addresses) {
if (addresses == null) return 0;
// Return the number of addresses.
return addresses.split(" ").length;
}
@Override
public void setBlocking(FileDescriptor fd, boolean blocking) {}
}
/**