diff --git a/tests/unit/java/com/android/server/ConnectivityServiceTest.java b/tests/unit/java/com/android/server/ConnectivityServiceTest.java index 3507050bed..d0cdf20386 100644 --- a/tests/unit/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/unit/java/com/android/server/ConnectivityServiceTest.java @@ -7857,8 +7857,8 @@ public class ConnectivityServiceTest { mMockVpn.disconnect(); } - @Test - public void testIsActiveNetworkMeteredOverVpnSpecifyingUnderlyingNetworks() throws Exception { + @Test + public void testIsActiveNetworkMeteredOverVpnSpecifyingUnderlyingNetworks() throws Exception { // Returns true by default when no network is available. assertTrue(mCm.isActiveNetworkMetered()); mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR); @@ -8423,6 +8423,52 @@ public class ConnectivityServiceTest { mCm.unregisterNetworkCallback(vpnDefaultCallbackAsUid); } + @Test + public void testVpnExcludesOwnUid() throws Exception { + // required for registerDefaultNetworkCallbackForUid. + mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED); + + // Connect Wi-Fi. + mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(true /* validated */); + + // Connect a VPN that excludes its UID from its UID ranges. + final LinkProperties lp = new LinkProperties(); + lp.setInterfaceName(VPN_IFNAME); + final int myUid = Process.myUid(); + final Set ranges = new ArraySet<>(); + ranges.add(new UidRange(0, myUid - 1)); + ranges.add(new UidRange(myUid + 1, UserHandle.PER_USER_RANGE - 1)); + mMockVpn.setUnderlyingNetworks(new Network[]{mWiFiNetworkAgent.getNetwork()}); + mMockVpn.establish(lp, myUid, ranges); + + // Wait for validation before registering callbacks. + waitForIdle(); + + final int otherUid = myUid + 1; + final Handler h = new Handler(ConnectivityThread.getInstanceLooper()); + final TestNetworkCallback otherUidCb = new TestNetworkCallback(); + final TestNetworkCallback defaultCb = new TestNetworkCallback(); + final TestNetworkCallback perUidCb = new TestNetworkCallback(); + registerDefaultNetworkCallbackAsUid(otherUidCb, otherUid); + mCm.registerDefaultNetworkCallback(defaultCb, h); + doAsUid(Process.SYSTEM_UID, + () -> mCm.registerDefaultNetworkCallbackForUid(myUid, perUidCb, h)); + + otherUidCb.expectAvailableCallbacksValidated(mMockVpn); + // BUG (b/195265065): the default network for the VPN app is actually Wi-Fi, not the VPN. + defaultCb.expectAvailableCallbacksValidated(mMockVpn); + perUidCb.expectAvailableCallbacksValidated(mMockVpn); + // getActiveNetwork is not affected by this bug. + assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetworkForUid(myUid + 1)); + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); + assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(myUid)); + + doAsUid(otherUid, () -> mCm.unregisterNetworkCallback(otherUidCb)); + mCm.unregisterNetworkCallback(defaultCb); + doAsUid(Process.SYSTEM_UID, () -> mCm.unregisterNetworkCallback(perUidCb)); + } + private void setupLegacyLockdownVpn() { final String profileName = "testVpnProfile"; final byte[] profileTag = profileName.getBytes(StandardCharsets.UTF_8);