Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d66f3623 authored by Lorenzo Colitti's avatar Lorenzo Colitti Committed by Automerger Merge Worker
Browse files

Test a VPN with an underlying network that does not yet exist. am: 334a6634

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13425309

Change-Id: Iac0a5305600fc70e05de90e4552258a0225d7f94
parents 800dbab1 334a6634
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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
}
}
+56 −1
Original line number Original line Diff line number Diff line
@@ -336,6 +336,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;
@@ -1194,6 +1195,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);
@@ -1264,7 +1267,7 @@ public class ConnectivityServiceTest {


        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(systemProperties).when(deps).getSystemProperties();
        doReturn(systemProperties).when(deps).getSystemProperties();
        doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any());
        doReturn(mock(ProxyTracker.class)).when(deps).makeProxyTracker(any(), any());
@@ -5186,6 +5189,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();