Merge changes Ieb7f33bc,I81b56862
* changes: Fix the legacy VPN tests that start racoon. Make testLegacyLockdownVpn more realistic.
This commit is contained in:
@@ -7168,6 +7168,13 @@ public class ConnectivityServiceTest {
|
||||
when(mKeyStore.get(Credentials.VPN + profileName)).thenReturn(encodedProfile);
|
||||
}
|
||||
|
||||
private void establishLegacyLockdownVpn() throws Exception {
|
||||
// The legacy lockdown VPN only supports userId 0.
|
||||
final Set<UidRange> ranges = Collections.singleton(UidRange.createForUser(PRIMARY_USER));
|
||||
mMockVpn.registerAgent(ranges);
|
||||
mMockVpn.connect(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLegacyLockdownVpn() throws Exception {
|
||||
mServiceContext.setPermission(
|
||||
@@ -7262,22 +7269,30 @@ public class ConnectivityServiceTest {
|
||||
mMockVpn.expectStartLegacyVpnRunner();
|
||||
b1 = expectConnectivityAction(TYPE_VPN, DetailedState.CONNECTED);
|
||||
ExpectedBroadcast b2 = expectConnectivityAction(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||
mMockVpn.establishForMyUid();
|
||||
establishLegacyLockdownVpn();
|
||||
callback.expectAvailableThenValidatedCallbacks(mMockVpn);
|
||||
defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn);
|
||||
NetworkCapabilities vpnNc = mCm.getNetworkCapabilities(mMockVpn.getNetwork());
|
||||
b1.expectBroadcast();
|
||||
b2.expectBroadcast();
|
||||
assertActiveNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.CONNECTED);
|
||||
assertNetworkInfo(TYPE_WIFI, DetailedState.DISCONNECTED);
|
||||
assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED);
|
||||
assertTrue(vpnNc.hasTransport(TRANSPORT_VPN));
|
||||
assertTrue(vpnNc.hasTransport(TRANSPORT_CELLULAR));
|
||||
assertFalse(vpnNc.hasTransport(TRANSPORT_WIFI));
|
||||
assertFalse(vpnNc.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||
|
||||
// Switch default network from cell to wifi. Expect VPN to disconnect and reconnect.
|
||||
final LinkProperties wifiLp = new LinkProperties();
|
||||
wifiLp.setInterfaceName("wlan0");
|
||||
wifiLp.addLinkAddress(new LinkAddress("192.0.2.163/25"));
|
||||
wifiLp.addRoute(new RouteInfo(new IpPrefix("0.0.0.0/0"), null, "wlan0"));
|
||||
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, wifiLp);
|
||||
final NetworkCapabilities wifiNc = new NetworkCapabilities();
|
||||
wifiNc.addTransportType(TRANSPORT_WIFI);
|
||||
wifiNc.addCapability(NET_CAPABILITY_NOT_METERED);
|
||||
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI, wifiLp, wifiNc);
|
||||
|
||||
b1 = expectConnectivityAction(TYPE_MOBILE, DetailedState.DISCONNECTED);
|
||||
// Wifi is CONNECTING because the VPN isn't up yet.
|
||||
@@ -7310,16 +7325,20 @@ public class ConnectivityServiceTest {
|
||||
// The VPN comes up again on wifi.
|
||||
b1 = expectConnectivityAction(TYPE_VPN, DetailedState.CONNECTED);
|
||||
b2 = expectConnectivityAction(TYPE_WIFI, DetailedState.CONNECTED);
|
||||
mMockVpn.establishForMyUid();
|
||||
establishLegacyLockdownVpn();
|
||||
callback.expectAvailableThenValidatedCallbacks(mMockVpn);
|
||||
defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn);
|
||||
b1.expectBroadcast();
|
||||
b2.expectBroadcast();
|
||||
|
||||
assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
|
||||
assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
|
||||
assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
|
||||
assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED);
|
||||
vpnNc = mCm.getNetworkCapabilities(mMockVpn.getNetwork());
|
||||
assertTrue(vpnNc.hasTransport(TRANSPORT_VPN));
|
||||
assertTrue(vpnNc.hasTransport(TRANSPORT_WIFI));
|
||||
assertFalse(vpnNc.hasTransport(TRANSPORT_CELLULAR));
|
||||
assertTrue(vpnNc.hasCapability(NET_CAPABILITY_NOT_METERED));
|
||||
|
||||
// Disconnect cell. Nothing much happens since it's not the default network.
|
||||
// Whenever LockdownVpnTracker is connected, it will send a connected broadcast any time any
|
||||
|
||||
@@ -49,6 +49,7 @@ import android.annotation.NonNull;
|
||||
import android.annotation.UserIdInt;
|
||||
import android.app.AppOpsManager;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
@@ -119,6 +120,7 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@@ -213,6 +215,8 @@ public class VpnTest {
|
||||
|
||||
when(mContext.getPackageName()).thenReturn(TEST_VPN_PKG);
|
||||
when(mContext.getOpPackageName()).thenReturn(TEST_VPN_PKG);
|
||||
when(mContext.getSystemServiceName(UserManager.class))
|
||||
.thenReturn(Context.USER_SERVICE);
|
||||
when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager);
|
||||
when(mContext.getSystemService(eq(Context.APP_OPS_SERVICE))).thenReturn(mAppOps);
|
||||
when(mContext.getSystemServiceName(NotificationManager.class))
|
||||
@@ -954,7 +958,14 @@ public class VpnTest {
|
||||
}
|
||||
|
||||
private Vpn startLegacyVpn(final Vpn vpn, final VpnProfile vpnProfile) throws Exception {
|
||||
setMockedUsers(primaryUser);
|
||||
// TODO(b/175883995): once these tests have been updated for the changes to the UserManager
|
||||
// API, remove this ad-hoc setup code and use setMockedUsers(primaryUser) again.
|
||||
// setMockedUsers(primaryUser);
|
||||
final ArrayList<UserInfo> users = new ArrayList<>();
|
||||
users.add(primaryUser);
|
||||
when(mUserManager.getAliveUsers()).thenReturn(users);
|
||||
when(mUserManager.getUserInfo(primaryUser.id)).thenReturn(primaryUser);
|
||||
when(mUserManager.canHaveRestrictedProfile()).thenReturn(false);
|
||||
|
||||
// Dummy egress interface
|
||||
final LinkProperties lp = new LinkProperties();
|
||||
@@ -997,14 +1008,12 @@ public class VpnTest {
|
||||
profile.ipsecIdentifier = "id";
|
||||
profile.ipsecSecret = "secret";
|
||||
profile.l2tpSecret = "l2tpsecret";
|
||||
|
||||
when(mConnectivityManager.getAllNetworks())
|
||||
.thenReturn(new Network[] { new Network(101) });
|
||||
|
||||
when(mConnectivityManager.registerNetworkAgent(any(), any(), any(), any(),
|
||||
anyInt(), any(), anyInt())).thenAnswer(invocation -> {
|
||||
// The runner has registered an agent and is now ready.
|
||||
legacyRunnerReady.open();
|
||||
return new Network(102);
|
||||
});
|
||||
anyInt(), any(), anyInt())).thenReturn(new Network(102));
|
||||
final Vpn vpn = startLegacyVpn(createVpn(primaryUser.id), profile);
|
||||
final TestDeps deps = (TestDeps) vpn.mDeps;
|
||||
try {
|
||||
@@ -1020,14 +1029,20 @@ public class VpnTest {
|
||||
"linkname", "vpn", "refuse-eap", "nodefaultroute", "usepeerdns",
|
||||
"idle", "1800", "mtu", "1270", "mru", "1270" },
|
||||
deps.mtpdArgs.get(10, TimeUnit.SECONDS));
|
||||
|
||||
// Now wait for the runner to be ready before testing for the route.
|
||||
legacyRunnerReady.block(10_000);
|
||||
// In this test the expected address is always v4 so /32
|
||||
ArgumentCaptor<LinkProperties> lpCaptor = ArgumentCaptor.forClass(LinkProperties.class);
|
||||
verify(mConnectivityManager, timeout(10_000)).registerNetworkAgent(any(), any(),
|
||||
lpCaptor.capture(), any(), anyInt(), any(), anyInt());
|
||||
|
||||
// In this test the expected address is always v4 so /32.
|
||||
// Note that the interface needs to be specified because RouteInfo objects stored in
|
||||
// LinkProperties objects always acquire the LinkProperties' interface.
|
||||
final RouteInfo expectedRoute = new RouteInfo(new IpPrefix(expectedAddr + "/32"),
|
||||
RouteInfo.RTN_THROW);
|
||||
assertTrue("Routes lack the expected throw route (" + expectedRoute + ") : "
|
||||
+ vpn.mConfig.routes,
|
||||
vpn.mConfig.routes.contains(expectedRoute));
|
||||
null, EGRESS_IFACE, RouteInfo.RTN_THROW);
|
||||
final List<RouteInfo> actualRoutes = lpCaptor.getValue().getRoutes();
|
||||
assertTrue("Expected throw route (" + expectedRoute + ") not found in " + actualRoutes,
|
||||
actualRoutes.contains(expectedRoute));
|
||||
} finally {
|
||||
// Now interrupt the thread, unblock the runner and clean up.
|
||||
vpn.mVpnRunner.exitVpnRunner();
|
||||
@@ -1082,6 +1097,11 @@ public class VpnTest {
|
||||
return mStateFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PendingIntent getIntentForStatusPanel(Context context) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendArgumentsToDaemon(
|
||||
final String daemon, final LocalSocket socket, final String[] arguments,
|
||||
|
||||
Reference in New Issue
Block a user