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

Commit 863c453b authored by James Mattis's avatar James Mattis Committed by Automerger Merge Worker
Browse files

Merge "Unit tests for Multi-Default with Existing APIs" am: ed4288b1 am:...

Merge "Unit tests for Multi-Default with Existing APIs" am: ed4288b1 am: 372d3e68 am: 4b7b8545

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

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: Ibae6928e620a5029986b71b2cf13c3137d39be9d
parents 8e257383 4b7b8545
Loading
Loading
Loading
Loading
+347 −14
Original line number Original line Diff line number Diff line
@@ -424,7 +424,6 @@ public class ConnectivityServiceTest {
    @Mock EthernetManager mEthernetManager;
    @Mock EthernetManager mEthernetManager;
    @Mock NetworkPolicyManager mNetworkPolicyManager;
    @Mock NetworkPolicyManager mNetworkPolicyManager;
    @Mock KeyStore mKeyStore;
    @Mock KeyStore mKeyStore;
    @Mock IOnSetOemNetworkPreferenceListener mOnSetOemNetworkPreferenceListener;


    private ArgumentCaptor<ResolverParamsParcel> mResolverParamsParcelCaptor =
    private ArgumentCaptor<ResolverParamsParcel> mResolverParamsParcelCaptor =
            ArgumentCaptor.forClass(ResolverParamsParcel.class);
            ArgumentCaptor.forClass(ResolverParamsParcel.class);
@@ -1612,10 +1611,13 @@ public class ConnectivityServiceTest {
        }
        }
        switch (transport) {
        switch (transport) {
            case TRANSPORT_WIFI:
            case TRANSPORT_WIFI:
                assertEquals(mCm.getActiveNetwork(), mWiFiNetworkAgent.getNetwork());
                assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
                break;
                break;
            case TRANSPORT_CELLULAR:
            case TRANSPORT_CELLULAR:
                assertEquals(mCm.getActiveNetwork(), mCellNetworkAgent.getNetwork());
                assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork());
                break;
            case TRANSPORT_ETHERNET:
                assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork());
                break;
                break;
            default:
            default:
                break;
                break;
@@ -1624,6 +1626,7 @@ public class ConnectivityServiceTest {
        assertNotNull(mCm.getNetworkInfo(mCm.getActiveNetwork()));
        assertNotNull(mCm.getNetworkInfo(mCm.getActiveNetwork()));
        assertEquals(transportToLegacyType(transport),
        assertEquals(transportToLegacyType(transport),
                mCm.getNetworkInfo(mCm.getActiveNetwork()).getType());
                mCm.getNetworkInfo(mCm.getActiveNetwork()).getType());
        assertNotNull(mCm.getActiveNetworkInfoForUid(Process.myUid()));
        // Test getNetworkCapabilities(Network)
        // Test getNetworkCapabilities(Network)
        assertNotNull(mCm.getNetworkCapabilities(mCm.getActiveNetwork()));
        assertNotNull(mCm.getNetworkCapabilities(mCm.getActiveNetwork()));
        assertTrue(mCm.getNetworkCapabilities(mCm.getActiveNetwork()).hasTransport(transport));
        assertTrue(mCm.getNetworkCapabilities(mCm.getActiveNetwork()).hasTransport(transport));
@@ -9445,7 +9448,7 @@ public class ConnectivityServiceTest {
    }
    }


    private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid)
    private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid)
            throws PackageManager.NameNotFoundException {
            throws Exception {
        final ApplicationInfo applicationInfo = new ApplicationInfo();
        final ApplicationInfo applicationInfo = new ApplicationInfo();
        applicationInfo.uid = uid;
        applicationInfo.uid = uid;
        when(mPackageManager.getApplicationInfo(eq(packageName), anyInt()))
        when(mPackageManager.getApplicationInfo(eq(packageName), anyInt()))
@@ -9465,7 +9468,7 @@ public class ConnectivityServiceTest {


    private OemNetworkPreferences createDefaultOemNetworkPreferences(
    private OemNetworkPreferences createDefaultOemNetworkPreferences(
            @OemNetworkPreferences.OemNetworkPreference final int preference)
            @OemNetworkPreferences.OemNetworkPreference final int preference)
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Arrange PackageManager mocks
        // Arrange PackageManager mocks
        mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID);
        mockGetApplicationInfo(TEST_PACKAGE_NAME, TEST_PACKAGE_UID);


@@ -9490,7 +9493,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testOemNetworkRequestFactoryPreferenceOemPaid()
    public void testOemNetworkRequestFactoryPreferenceOemPaid()
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Expectations
        // Expectations
        final int expectedNumOfNris = 1;
        final int expectedNumOfNris = 1;
        final int expectedNumOfRequests = 3;
        final int expectedNumOfRequests = 3;
@@ -9519,7 +9522,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testOemNetworkRequestFactoryPreferenceOemPaidNoFallback()
    public void testOemNetworkRequestFactoryPreferenceOemPaidNoFallback()
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Expectations
        // Expectations
        final int expectedNumOfNris = 1;
        final int expectedNumOfNris = 1;
        final int expectedNumOfRequests = 2;
        final int expectedNumOfRequests = 2;
@@ -9545,7 +9548,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testOemNetworkRequestFactoryPreferenceOemPaidOnly()
    public void testOemNetworkRequestFactoryPreferenceOemPaidOnly()
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Expectations
        // Expectations
        final int expectedNumOfNris = 1;
        final int expectedNumOfNris = 1;
        final int expectedNumOfRequests = 1;
        final int expectedNumOfRequests = 1;
@@ -9568,7 +9571,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testOemNetworkRequestFactoryPreferenceOemPrivateOnly()
    public void testOemNetworkRequestFactoryPreferenceOemPrivateOnly()
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Expectations
        // Expectations
        final int expectedNumOfNris = 1;
        final int expectedNumOfNris = 1;
        final int expectedNumOfRequests = 1;
        final int expectedNumOfRequests = 1;
@@ -9592,7 +9595,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testOemNetworkRequestFactoryCreatesCorrectNumOfNris()
    public void testOemNetworkRequestFactoryCreatesCorrectNumOfNris()
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Expectations
        // Expectations
        final int expectedNumOfNris = 2;
        final int expectedNumOfNris = 2;


@@ -9619,7 +9622,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testOemNetworkRequestFactoryCorrectlySetsUids()
    public void testOemNetworkRequestFactoryCorrectlySetsUids()
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Arrange PackageManager mocks
        // Arrange PackageManager mocks
        final String testPackageName2 = "com.google.apps.dialer";
        final String testPackageName2 = "com.google.apps.dialer";
        final int testPackageNameUid2 = 456;
        final int testPackageNameUid2 = 456;
@@ -9650,7 +9653,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testOemNetworkRequestFactoryAddsPackagesToCorrectPreference()
    public void testOemNetworkRequestFactoryAddsPackagesToCorrectPreference()
            throws PackageManager.NameNotFoundException {
            throws Exception {
        // Expectations
        // Expectations
        final int expectedNumOfNris = 1;
        final int expectedNumOfNris = 1;
        final int expectedNumOfAppUids = 2;
        final int expectedNumOfAppUids = 2;
@@ -9692,7 +9695,7 @@ public class ConnectivityServiceTest {


    @Test
    @Test
    public void testSetOemNetworkPreferenceFailsForNonAutomotive()
    public void testSetOemNetworkPreferenceFailsForNonAutomotive()
            throws PackageManager.NameNotFoundException, RemoteException {
            throws Exception {
        mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, false);
        mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, false);
        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
                OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY;
                OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY;
@@ -9701,6 +9704,336 @@ public class ConnectivityServiceTest {
        assertThrows(UnsupportedOperationException.class,
        assertThrows(UnsupportedOperationException.class,
                () -> mService.setOemNetworkPreference(
                () -> mService.setOemNetworkPreference(
                        createDefaultOemNetworkPreferences(networkPref),
                        createDefaultOemNetworkPreferences(networkPref),
                        mOnSetOemNetworkPreferenceListener));
                        new TestOemListenerCallback()));
    }

    private void setOemNetworkPreferenceAgentConnected(final int transportType,
            final boolean connectAgent) throws Exception {
        switch(transportType) {
            // Corresponds to a metered cellular network. Will be used for the default network.
            case TRANSPORT_CELLULAR:
                if (!connectAgent) {
                    mCellNetworkAgent.disconnect();
                    break;
                }
                mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
                mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_METERED);
                mCellNetworkAgent.connect(true);
                break;
            // Corresponds to a restricted ethernet network with OEM_PAID/OEM_PRIVATE.
            case TRANSPORT_ETHERNET:
                if (!connectAgent) {
                    stopOemManagedNetwork();
                    break;
                }
                startOemManagedNetwork(true);
                break;
            // Corresponds to unmetered Wi-Fi.
            case TRANSPORT_WIFI:
                if (!connectAgent) {
                    mWiFiNetworkAgent.disconnect();
                    break;
                }
                mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
                mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED);
                mWiFiNetworkAgent.connect(true);
                break;
            default:
                throw new AssertionError("Unsupported transport type passed in.");

        }
        waitForIdle();
    }

    private void startOemManagedNetwork(final boolean isOemPaid) throws Exception {
        mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET);
        mEthernetNetworkAgent.addCapability(
                isOemPaid ? NET_CAPABILITY_OEM_PAID : NET_CAPABILITY_OEM_PRIVATE);
        mEthernetNetworkAgent.removeCapability(NET_CAPABILITY_NOT_RESTRICTED);
        mEthernetNetworkAgent.connect(true);
    }

    private void stopOemManagedNetwork() {
        mEthernetNetworkAgent.disconnect();
        waitForIdle();
    }

    private void verifyMultipleDefaultNetworksTracksCorrectly(
            final int expectedOemRequestsSize,
            @NonNull final Network expectedDefaultNetwork,
            @NonNull final Network expectedPerAppNetwork) {
        // The current test setup assumes two tracked default network requests; one for the default
        // network and the other for the OEM network preference being tested. This will be validated
        // each time to confirm it doesn't change under test.
        final int expectedDefaultNetworkRequestsSize = 2;
        assertEquals(expectedDefaultNetworkRequestsSize, mService.mDefaultNetworkRequests.size());
        for (final ConnectivityService.NetworkRequestInfo defaultRequest
                : mService.mDefaultNetworkRequests) {
            final Network defaultNetwork = defaultRequest.getSatisfier() == null
                    ? null : defaultRequest.getSatisfier().network();
            // If this is the default request.
            if (defaultRequest == mService.mDefaultRequest) {
                assertEquals(
                        expectedDefaultNetwork,
                        defaultNetwork);
                // Make sure this value doesn't change.
                assertEquals(1, defaultRequest.mRequests.size());
                continue;
            }
            assertEquals(expectedPerAppNetwork, defaultNetwork);
            assertEquals(expectedOemRequestsSize, defaultRequest.mRequests.size());
        }
    }

    private void setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest(
            @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup)
            throws Exception {
        final int testPackageNameUid = 123;
        final String testPackageName = "per.app.defaults.package";
        setupMultipleDefaultNetworksForOemNetworkPreferenceTest(
                networkPrefToSetup, testPackageNameUid, testPackageName);
    }

    private void setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(
            @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup)
            throws Exception {
        final int testPackageNameUid = Process.myUid();
        final String testPackageName = "per.app.defaults.package";
        setupMultipleDefaultNetworksForOemNetworkPreferenceTest(
                networkPrefToSetup, testPackageNameUid, testPackageName);
    }

    private void setupMultipleDefaultNetworksForOemNetworkPreferenceTest(
            @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup,
            final int testPackageUid, @NonNull final String testPackageName) throws Exception {
        // Only the default request should be included at start.
        assertEquals(1, mService.mDefaultNetworkRequests.size());

        final UidRangeParcel[] uidRanges =
                toUidRangeStableParcels(uidRangesForUid(testPackageUid));
        setupSetOemNetworkPreferenceForPreferenceTest(
                networkPrefToSetup, uidRanges, testPackageName);
    }

    private void setupSetOemNetworkPreferenceForPreferenceTest(
            @OemNetworkPreferences.OemNetworkPreference final int networkPrefToSetup,
            @NonNull final UidRangeParcel[] uidRanges,
            @NonNull final String testPackageName)
            throws Exception {
        mockHasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true);

        // These tests work off a single UID therefore using 'start' is valid.
        mockGetApplicationInfo(testPackageName, uidRanges[0].start);

        // Build OemNetworkPreferences object
        final OemNetworkPreferences pref = new OemNetworkPreferences.Builder()
                .addNetworkPreference(testPackageName, networkPrefToSetup)
                .build();

        // Act on ConnectivityService.setOemNetworkPreference()
        final TestOemListenerCallback mOnSetOemNetworkPreferenceTestListener =
                new TestOemListenerCallback();
        mService.setOemNetworkPreference(pref, mOnSetOemNetworkPreferenceTestListener);

        // Verify call returned successfully
        mOnSetOemNetworkPreferenceTestListener.expectOnComplete();
    }

    private static class TestOemListenerCallback implements IOnSetOemNetworkPreferenceListener {
        final CompletableFuture<Object> mDone = new CompletableFuture<>();

        @Override
        public void onComplete() {
            mDone.complete(new Object());
        }

        void expectOnComplete() throws Exception {
            try {
                mDone.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);
            } catch (TimeoutException e) {
                fail("Expected onComplete() not received after " + TIMEOUT_MS + " ms");
            }
        }

        @Override
        public IBinder asBinder() {
            return null;
        }
    }

    @Test
    public void testMultiDefaultGetActiveNetworkIsCorrect() throws Exception {
        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
                OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY;
        final int expectedOemPrefRequestSize = 1;

        // Setup the test process to use networkPref for their default network.
        setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref);

        // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID.
        // The active network for the default should be null at this point as this is a retricted
        // network.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true);
        verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize,
                null,
                mEthernetNetworkAgent.getNetwork());

        // Verify that the active network is correct
        verifyActiveNetwork(TRANSPORT_ETHERNET);
    }

    @Test
    public void testMultiDefaultIsActiveNetworkMeteredIsCorrect() throws Exception {
        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
                OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY;
        final int expectedOemPrefRequestSize = 1;

        // Setup the test process to use networkPref for their default network.
        setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref);

        // Returns true by default when no network is available.
        assertTrue(mCm.isActiveNetworkMetered());

        // Connect to an unmetered restricted network that will only be available to the OEM pref.
        mEthernetNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_ETHERNET);
        mEthernetNetworkAgent.addCapability(NET_CAPABILITY_OEM_PAID);
        mEthernetNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED);
        mEthernetNetworkAgent.removeCapability(NET_CAPABILITY_NOT_RESTRICTED);
        mEthernetNetworkAgent.connect(true);
        waitForIdle();

        verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize,
                null,
                mEthernetNetworkAgent.getNetwork());

        assertFalse(mCm.isActiveNetworkMetered());
    }

    @Test
    public void testPerAppDefaultRegisterDefaultNetworkCallback() throws Exception {
        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
                OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY;
        final int expectedOemPrefRequestSize = 1;
        final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback();

        // Register the default network callback before the pref is already set. This means that
        // the policy will be applied to the callback on setOemNetworkPreference().
        mCm.registerDefaultNetworkCallback(defaultNetworkCallback);
        defaultNetworkCallback.assertNoCallback();

        // Setup the test process to use networkPref for their default network.
        setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref);

        // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID.
        // The active nai for the default is null at this point as this is a restricted network.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true);
        verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize,
                null,
                mEthernetNetworkAgent.getNetwork());

        // At this point with a restricted network used, the available callback should trigger
        defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent);
        assertEquals(defaultNetworkCallback.getLastAvailableNetwork(),
                mEthernetNetworkAgent.getNetwork());

        // Now bring down the default network which should trigger a LOST callback.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false);

        // At this point, with no network is available, the lost callback should trigger
        defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent);

        // Confirm we can unregister without issues.
        mCm.unregisterNetworkCallback(defaultNetworkCallback);
    }

    @Test
    public void testPerAppDefaultRegisterDefaultNetworkCallbackAfterPrefSet() throws Exception {
        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
                OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY;
        final int expectedOemPrefRequestSize = 1;
        final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback();

        // Setup the test process to use networkPref for their default network.
        setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref);

        // Register the default network callback after the pref is already set. This means that
        // the policy will be applied to the callback on requestNetwork().
        mCm.registerDefaultNetworkCallback(defaultNetworkCallback);
        defaultNetworkCallback.assertNoCallback();

        // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID.
        // The active nai for the default is null at this point as this is a restricted network.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true);
        verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize,
                null,
                mEthernetNetworkAgent.getNetwork());

        // At this point with a restricted network used, the available callback should trigger
        defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mEthernetNetworkAgent);
        assertEquals(defaultNetworkCallback.getLastAvailableNetwork(),
                mEthernetNetworkAgent.getNetwork());

        // Now bring down the default network which should trigger a LOST callback.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false);

        // At this point, with no network is available, the lost callback should trigger
        defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mEthernetNetworkAgent);

        // Confirm we can unregister without issues.
        mCm.unregisterNetworkCallback(defaultNetworkCallback);
    }

    @Test
    public void testPerAppDefaultRegisterDefaultNetworkCallbackDoesNotFire() throws Exception {
        @OemNetworkPreferences.OemNetworkPreference final int networkPref =
                OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY;
        final int expectedOemPrefRequestSize = 1;
        final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback();
        final int userId = UserHandle.getUserId(Process.myUid());

        mCm.registerDefaultNetworkCallback(defaultNetworkCallback);
        defaultNetworkCallback.assertNoCallback();

        // Setup a process different than the test process to use the default network. This means
        // that the defaultNetworkCallback won't be tracked by the per-app policy.
        setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest(networkPref);

        // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID.
        // The active nai for the default is null at this point as this is a restricted network.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true);
        verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize,
                null,
                mEthernetNetworkAgent.getNetwork());

        // As this callback does not have access to the OEM_PAID network, it will not fire.
        defaultNetworkCallback.assertNoCallback();
        assertDefaultNetworkCapabilities(userId /* no networks */);

        // Bring up unrestricted cellular. This should now satisfy the default network.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true);
        verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize,
                mCellNetworkAgent.getNetwork(),
                mEthernetNetworkAgent.getNetwork());

        // At this point with an unrestricted network used, the available callback should trigger
        defaultNetworkCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
        assertEquals(defaultNetworkCallback.getLastAvailableNetwork(),
                mCellNetworkAgent.getNetwork());
        assertDefaultNetworkCapabilities(userId, mCellNetworkAgent);

        // Now bring down the per-app network.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false);

        // Since the callback didn't use the per-app network, no callback should fire.
        defaultNetworkCallback.assertNoCallback();

        // Now bring down the default network.
        setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false);

        // As this callback was tracking the default, this should now trigger.
        defaultNetworkCallback.expectCallback(CallbackEntry.LOST, mCellNetworkAgent);

        // Confirm we can unregister without issues.
        mCm.unregisterNetworkCallback(defaultNetworkCallback);
    }
    }
}
}