diff --git a/Tethering/src/com/android/networkstack/tethering/Tethering.java b/Tethering/src/com/android/networkstack/tethering/Tethering.java index 5a0c5b0cff..2c91d100ec 100644 --- a/Tethering/src/com/android/networkstack/tethering/Tethering.java +++ b/Tethering/src/com/android/networkstack/tethering/Tethering.java @@ -1079,9 +1079,14 @@ public class Tethering { } } + @VisibleForTesting + SparseArray getActiveTetheringRequests() { + return mActiveTetheringRequests; + } + @VisibleForTesting boolean isTetheringActive() { - return mActiveTetheringRequests.size() > 0; + return getTetheredIfaces().length > 0; } @VisibleForTesting diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java index 37a4d90a72..0a37f54aaa 100644 --- a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java +++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java @@ -52,6 +52,7 @@ import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; import static com.android.net.module.util.Inet4AddressUtils.intToInet4AddressHTH; +import static com.android.networkstack.tethering.Tethering.UserRestrictionActionListener; import static com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE; import static com.android.networkstack.tethering.UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES; @@ -735,9 +736,12 @@ public class TetheringTest { initTetheringUpstream(upstreamState); // Emulate pressing the USB tethering button in Settings UI. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB), null); + final TetheringRequestParcel request = createTetheringRequestParcel(TETHERING_USB); + mTethering.startTethering(request, null); mLooper.dispatchAll(); verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); + assertEquals(1, mTethering.getActiveTetheringRequests().size()); + assertEquals(request, mTethering.getActiveTetheringRequests().get(TETHERING_USB)); mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true); } @@ -1174,20 +1178,26 @@ public class TetheringTest { verifyNoMoreInteractions(mNetd); } + private UserRestrictionActionListener makeUserRestrictionActionListener( + final Tethering tethering, final boolean currentDisallow, final boolean nextDisallow) { + final Bundle newRestrictions = new Bundle(); + newRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, nextDisallow); + when(mUserManager.getUserRestrictions()).thenReturn(newRestrictions); + + final UserRestrictionActionListener ural = + new UserRestrictionActionListener(mUserManager, tethering, mNotificationUpdater); + ural.mDisallowTethering = currentDisallow; + return ural; + } + private void runUserRestrictionsChange( boolean currentDisallow, boolean nextDisallow, boolean isTetheringActive, int expectedInteractionsWithShowNotification) throws Exception { - final Bundle newRestrictions = new Bundle(); - newRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, nextDisallow); final Tethering mockTethering = mock(Tethering.class); when(mockTethering.isTetheringActive()).thenReturn(isTetheringActive); - when(mUserManager.getUserRestrictions()).thenReturn(newRestrictions); - - final Tethering.UserRestrictionActionListener ural = - new Tethering.UserRestrictionActionListener( - mUserManager, mockTethering, mNotificationUpdater); - ural.mDisallowTethering = currentDisallow; + final UserRestrictionActionListener ural = + makeUserRestrictionActionListener(mockTethering, currentDisallow, nextDisallow); ural.onUserRestrictionsChanged(); verify(mNotificationUpdater, times(expectedInteractionsWithShowNotification)) @@ -1256,6 +1266,27 @@ public class TetheringTest { expectedInteractionsWithShowNotification); } + @Test + public void testUntetherUsbWhenRestrictionIsOn() { + // Start usb tethering and check that usb interface is tethered. + final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState(); + runUsbTethering(upstreamState); + assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME); + assertTrue(mTethering.isTetheringActive()); + assertEquals(0, mTethering.getActiveTetheringRequests().size()); + + final Tethering.UserRestrictionActionListener ural = makeUserRestrictionActionListener( + mTethering, false /* currentDisallow */, true /* nextDisallow */); + + ural.onUserRestrictionsChanged(); + mLooper.dispatchAll(); + + // Verify that restriction notification has showed to user. + verify(mNotificationUpdater, times(1)).notifyTetheringDisabledByRestriction(); + // Verify that usb tethering has been disabled. + verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NONE); + } + private class TestTetheringEventCallback extends ITetheringEventCallback.Stub { private final ArrayList mActualUpstreams = new ArrayList<>(); private final ArrayList mTetheringConfigs =