Test a VPN with an underlying network that does not yet exist.
This test checks that if a VPN declares an underlying network that does not exist, the capabilities of that network are applied to the VPN as soon as the network starts to exist. Bug: 173331190 Test: test-only change Change-Id: Icc0701cb4cea7d91f7738c1e426e94cd26686b74
This commit is contained in:
@@ -35,4 +35,5 @@ class TestNetIdManager : NetIdManager() {
|
|||||||
private val nextId = AtomicInteger(MAX_NET_ID)
|
private val nextId = AtomicInteger(MAX_NET_ID)
|
||||||
override fun reserveNetId() = nextId.decrementAndGet()
|
override fun reserveNetId() = nextId.decrementAndGet()
|
||||||
override fun releaseNetId(id: Int) = Unit
|
override fun releaseNetId(id: Int) = Unit
|
||||||
|
fun peekNextNetId() = nextId.get() - 1
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -339,6 +339,7 @@ public class ConnectivityServiceTest {
|
|||||||
private INetworkPolicyListener mPolicyListener;
|
private INetworkPolicyListener mPolicyListener;
|
||||||
private WrappedMultinetworkPolicyTracker mPolicyTracker;
|
private WrappedMultinetworkPolicyTracker mPolicyTracker;
|
||||||
private HandlerThread mAlarmManagerThread;
|
private HandlerThread mAlarmManagerThread;
|
||||||
|
private TestNetIdManager mNetIdManager;
|
||||||
|
|
||||||
@Mock IIpConnectivityMetrics mIpConnectivityMetrics;
|
@Mock IIpConnectivityMetrics mIpConnectivityMetrics;
|
||||||
@Mock IpConnectivityMetrics.Logger mMetricsService;
|
@Mock IpConnectivityMetrics.Logger mMetricsService;
|
||||||
@@ -1207,6 +1208,8 @@ public class ConnectivityServiceTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
|
mNetIdManager = new TestNetIdManager();
|
||||||
|
|
||||||
mContext = InstrumentationRegistry.getContext();
|
mContext = InstrumentationRegistry.getContext();
|
||||||
|
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
@@ -1277,7 +1280,7 @@ public class ConnectivityServiceTest {
|
|||||||
doNothing().when(mSystemProperties).setTcpInitRwnd(anyInt());
|
doNothing().when(mSystemProperties).setTcpInitRwnd(anyInt());
|
||||||
final ConnectivityService.Dependencies deps = mock(ConnectivityService.Dependencies.class);
|
final ConnectivityService.Dependencies deps = mock(ConnectivityService.Dependencies.class);
|
||||||
doReturn(mCsHandlerThread).when(deps).makeHandlerThread();
|
doReturn(mCsHandlerThread).when(deps).makeHandlerThread();
|
||||||
doReturn(new TestNetIdManager()).when(deps).makeNetIdManager();
|
doReturn(mNetIdManager).when(deps).makeNetIdManager();
|
||||||
doReturn(mNetworkStack).when(deps).getNetworkStack();
|
doReturn(mNetworkStack).when(deps).getNetworkStack();
|
||||||
doReturn(mSystemProperties).when(deps).getSystemProperties();
|
doReturn(mSystemProperties).when(deps).getSystemProperties();
|
||||||
doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any());
|
doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any());
|
||||||
@@ -5231,6 +5234,58 @@ public class ConnectivityServiceTest {
|
|||||||
assertTrue(lp.getDnsServers().containsAll(dnsServers));
|
assertTrue(lp.getDnsServers().containsAll(dnsServers));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testVpnConnectDisconnectUnderlyingNetwork() throws Exception {
|
||||||
|
final TestNetworkCallback callback = new TestNetworkCallback();
|
||||||
|
final NetworkRequest request = new NetworkRequest.Builder()
|
||||||
|
.removeCapability(NET_CAPABILITY_NOT_VPN).build();
|
||||||
|
|
||||||
|
mCm.registerNetworkCallback(request, callback);
|
||||||
|
|
||||||
|
// Bring up a VPN that specifies an underlying network that does not exist yet.
|
||||||
|
// Note: it's sort of meaningless for a VPN app to declare a network that doesn't exist yet,
|
||||||
|
// (and doing so is difficult without using reflection) but it's good to test that the code
|
||||||
|
// behaves approximately correctly.
|
||||||
|
final int uid = Process.myUid();
|
||||||
|
final TestNetworkAgentWrapper
|
||||||
|
vpnNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_VPN);
|
||||||
|
final ArraySet<UidRange> ranges = new ArraySet<>();
|
||||||
|
ranges.add(new UidRange(uid, uid));
|
||||||
|
|
||||||
|
final Network wifiNetwork = new Network(mNetIdManager.peekNextNetId());
|
||||||
|
mMockVpn.setNetworkAgent(vpnNetworkAgent);
|
||||||
|
mMockVpn.setUids(ranges);
|
||||||
|
mMockVpn.setUnderlyingNetworks(new Network[]{wifiNetwork});
|
||||||
|
vpnNetworkAgent.connect(false);
|
||||||
|
mMockVpn.connect();
|
||||||
|
callback.expectAvailableCallbacksUnvalidated(vpnNetworkAgent);
|
||||||
|
assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork())
|
||||||
|
.hasTransport(TRANSPORT_VPN));
|
||||||
|
assertFalse(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork())
|
||||||
|
.hasTransport(TRANSPORT_WIFI));
|
||||||
|
|
||||||
|
// Make that underlying network connect, and expect to see its capabilities immediately
|
||||||
|
// reflected in the VPN's capabilities.
|
||||||
|
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
|
||||||
|
assertEquals(wifiNetwork, mWiFiNetworkAgent.getNetwork());
|
||||||
|
mWiFiNetworkAgent.connect(false);
|
||||||
|
callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
|
||||||
|
callback.expectCallback(CallbackEntry.NETWORK_CAPS_UPDATED, vpnNetworkAgent);
|
||||||
|
assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork())
|
||||||
|
.hasTransport(TRANSPORT_VPN));
|
||||||
|
assertTrue(mCm.getNetworkCapabilities(vpnNetworkAgent.getNetwork())
|
||||||
|
.hasTransport(TRANSPORT_WIFI));
|
||||||
|
|
||||||
|
// Disconnect the network, and expect to see the VPN capabilities change accordingly.
|
||||||
|
mWiFiNetworkAgent.disconnect();
|
||||||
|
callback.expectCallback(CallbackEntry.LOST, mWiFiNetworkAgent);
|
||||||
|
callback.expectCapabilitiesThat(vpnNetworkAgent, (nc) ->
|
||||||
|
nc.getTransportTypes().length == 1 && nc.hasTransport(TRANSPORT_VPN));
|
||||||
|
|
||||||
|
vpnNetworkAgent.disconnect();
|
||||||
|
mCm.unregisterNetworkCallback(callback);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testVpnNetworkActive() throws Exception {
|
public void testVpnNetworkActive() throws Exception {
|
||||||
final int uid = Process.myUid();
|
final int uid = Process.myUid();
|
||||||
|
|||||||
Reference in New Issue
Block a user