Merge "Add tests for testing if [start|finish]Op is called or not"
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.server.connectivity;
|
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_ADMIN;
|
||||||
import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE;
|
import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE;
|
||||||
import static android.content.pm.UserInfo.FLAG_PRIMARY;
|
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.assertNotNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
import static org.junit.Assume.assumeTrue;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.ArgumentMatchers.argThat;
|
import static org.mockito.ArgumentMatchers.argThat;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.after;
|
||||||
import static org.mockito.Mockito.atLeastOnce;
|
import static org.mockito.Mockito.atLeastOnce;
|
||||||
import static org.mockito.Mockito.doAnswer;
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.doCallRealMethod;
|
import static org.mockito.Mockito.doCallRealMethod;
|
||||||
@@ -70,6 +73,7 @@ import android.net.InterfaceConfigurationParcel;
|
|||||||
import android.net.IpPrefix;
|
import android.net.IpPrefix;
|
||||||
import android.net.IpSecManager;
|
import android.net.IpSecManager;
|
||||||
import android.net.IpSecTunnelInterfaceResponse;
|
import android.net.IpSecTunnelInterfaceResponse;
|
||||||
|
import android.net.LinkAddress;
|
||||||
import android.net.LinkProperties;
|
import android.net.LinkProperties;
|
||||||
import android.net.LocalSocket;
|
import android.net.LocalSocket;
|
||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
@@ -86,6 +90,7 @@ import android.os.Build.VERSION_CODES;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.ConditionVariable;
|
import android.os.ConditionVariable;
|
||||||
import android.os.INetworkManagementService;
|
import android.os.INetworkManagementService;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.os.Process;
|
import android.os.Process;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
@@ -102,6 +107,7 @@ import com.android.internal.R;
|
|||||||
import com.android.internal.net.LegacyVpnInfo;
|
import com.android.internal.net.LegacyVpnInfo;
|
||||||
import com.android.internal.net.VpnConfig;
|
import com.android.internal.net.VpnConfig;
|
||||||
import com.android.internal.net.VpnProfile;
|
import com.android.internal.net.VpnProfile;
|
||||||
|
import com.android.modules.utils.build.SdkLevel;
|
||||||
import com.android.server.IpSecService;
|
import com.android.server.IpSecService;
|
||||||
import com.android.testutils.DevSdkIgnoreRule;
|
import com.android.testutils.DevSdkIgnoreRule;
|
||||||
import com.android.testutils.DevSdkIgnoreRunner;
|
import com.android.testutils.DevSdkIgnoreRunner;
|
||||||
@@ -118,6 +124,7 @@ import org.mockito.MockitoAnnotations;
|
|||||||
|
|
||||||
import java.io.BufferedWriter;
|
import java.io.BufferedWriter;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileDescriptor;
|
||||||
import java.io.FileWriter;
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.Inet4Address;
|
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
|
@Test
|
||||||
public void testSetPackageAuthorizationVpnService() throws Exception {
|
public void testSetPackageAuthorizationVpnService() throws Exception {
|
||||||
final Vpn vpn = createVpnAndSetupUidChecks();
|
final Vpn vpn = createVpnAndSetupUidChecks();
|
||||||
@@ -1197,6 +1279,32 @@ public class VpnTest {
|
|||||||
public boolean isInterfacePresent(final Vpn vpn, final String iface) {
|
public boolean isInterfacePresent(final Vpn vpn, final String iface) {
|
||||||
return true;
|
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) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user