diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 36e92d53eb886..e5fc4b1d17756 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -885,6 +885,7 @@ public class Tethering extends BaseNetworkObserver { } if (!TextUtils.isEmpty(ifname)) { + maybeTrackNewInterfaceLocked(ifname, ConnectivityManager.TETHERING_WIFI); changeInterfaceState(ifname, ipServingMode); } else { mLog.e(String.format( @@ -1804,7 +1805,10 @@ public class Tethering extends BaseNetworkObserver { mLog.log(iface + " is not a tetherable iface, ignoring"); return; } + maybeTrackNewInterfaceLocked(iface, interfaceType); + } + private void maybeTrackNewInterfaceLocked(final String iface, int interfaceType) { // If we have already started a TISM for this interface, skip. if (mTetherStates.containsKey(iface)) { mLog.log("active iface (" + iface + ") reported as added, ignoring"); diff --git a/tests/net/java/com/android/server/connectivity/TetheringTest.java b/tests/net/java/com/android/server/connectivity/TetheringTest.java index 2137e557cd0cf..ab874ce2cc505 100644 --- a/tests/net/java/com/android/server/connectivity/TetheringTest.java +++ b/tests/net/java/com/android/server/connectivity/TetheringTest.java @@ -261,32 +261,51 @@ public class TetheringTest { mIntents.remove(bcast); } - @Test - public void failingLocalOnlyHotspotLegacyApBroadcast() throws Exception { + public void failingLocalOnlyHotspotLegacyApBroadcast( + boolean emulateInterfaceStatusChanged) throws Exception { when(mConnectivityManager.isTetheringSupported()).thenReturn(true); // Emulate externally-visible WifiManager effects, causing the // per-interface state machine to start up, and telling us that // hotspot mode is to be started. - mTethering.interfaceStatusChanged(mTestIfname, true); + if (emulateInterfaceStatusChanged) { + mTethering.interfaceStatusChanged(mTestIfname, true); + } sendWifiApStateChanged(WIFI_AP_STATE_ENABLED); mLooper.dispatchAll(); - verify(mConnectivityManager, atLeastOnce()).isTetheringSupported(); - verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_AVAILABLE_TETHER); + // If, and only if, Tethering received an interface status changed + // then it creates a TetherInterfaceStateMachine and sends out a + // broadcast indicating that the interface is "available". + if (emulateInterfaceStatusChanged) { + verify(mConnectivityManager, atLeastOnce()).isTetheringSupported(); + verifyTetheringBroadcast(mTestIfname, ConnectivityManager.EXTRA_AVAILABLE_TETHER); + } verifyNoMoreInteractions(mConnectivityManager); verifyNoMoreInteractions(mNMService); verifyNoMoreInteractions(mWifiManager); } @Test - public void workingLocalOnlyHotspotEnrichedApBroadcast() throws Exception { + public void failingLocalOnlyHotspotLegacyApBroadcastWithIfaceStatusChanged() throws Exception { + failingLocalOnlyHotspotLegacyApBroadcast(true); + } + + @Test + public void failingLocalOnlyHotspotLegacyApBroadcastSansIfaceStatusChanged() throws Exception { + failingLocalOnlyHotspotLegacyApBroadcast(false); + } + + public void workingLocalOnlyHotspotEnrichedApBroadcast( + boolean emulateInterfaceStatusChanged) throws Exception { when(mConnectivityManager.isTetheringSupported()).thenReturn(true); // Emulate externally-visible WifiManager effects, causing the // per-interface state machine to start up, and telling us that // hotspot mode is to be started. - mTethering.interfaceStatusChanged(mTestIfname, true); + if (emulateInterfaceStatusChanged) { + mTethering.interfaceStatusChanged(mTestIfname, true); + } sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, mTestIfname, IFACE_IP_MODE_LOCAL_ONLY); mLooper.dispatchAll(); @@ -330,6 +349,17 @@ public class TetheringTest { mTethering.getLastTetherError(mTestIfname)); } + @Test + public void workingLocalOnlyHotspotEnrichedApBroadcastWithIfaceChanged() throws Exception { + workingLocalOnlyHotspotEnrichedApBroadcast(true); + } + + @Test + public void workingLocalOnlyHotspotEnrichedApBroadcastSansIfaceChanged() throws Exception { + workingLocalOnlyHotspotEnrichedApBroadcast(false); + } + + // TODO: Test with and without interfaceStatusChanged(). @Test public void failingWifiTetheringLegacyApBroadcast() throws Exception { when(mConnectivityManager.isTetheringSupported()).thenReturn(true); @@ -357,6 +387,7 @@ public class TetheringTest { verifyNoMoreInteractions(mWifiManager); } + // TODO: Test with and without interfaceStatusChanged(). @Test public void workingWifiTetheringEnrichedApBroadcast() throws Exception { when(mConnectivityManager.isTetheringSupported()).thenReturn(true); @@ -437,6 +468,7 @@ public class TetheringTest { mTethering.getLastTetherError(mTestIfname)); } + // TODO: Test with and without interfaceStatusChanged(). @Test public void failureEnablingIpForwarding() throws Exception { when(mConnectivityManager.isTetheringSupported()).thenReturn(true);