From 06dcab2ee1a5d1293c9142f40cb65b52ffa2a5d6 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Fri, 14 Jul 2017 12:00:30 -0700 Subject: WifiStateMachine: Dont repeatedly call sendExplicitlySelected Use the last selected network timestamp (WifiConfigManager.getLastSelectedTimestamp) to limit the invocation of NetworkAgent.sendExplicitlySelected. The current expiration is set at 30 seconds to prevent the user from receiving notifications about lack of internet connectivity repeatedly on the same network. Bug: 62503737 Test: Added a unit test for the helper function. Ideally would have wanted to use a mock WifiNetworkAgent and capture the interaction on it, but because of the way WSM is designed currently, it's impossible to use a WifiInjector to mock it out. Change-Id: I342b617769141c3e8071e5aba89efebe42c97390 Merged-In: I342b617769141c3e8071e5aba89efebe42c97390 --- .../android/server/wifi/WifiStateMachineTest.java | 69 +++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java index fc2cda443..10d6460ab 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiStateMachineTest.java @@ -345,6 +345,7 @@ public class WifiStateMachineTest { @Mock IpManager mIpManager; @Mock TelephonyManager mTelephonyManager; @Mock WrongPasswordNotifier mWrongPasswordNotifier; + @Mock Clock mClock; public WifiStateMachineTest() throws Exception { } @@ -386,6 +387,7 @@ public class WifiStateMachineTest { when(mWifiInjector.getWifiNative()).thenReturn(mWifiNative); when(mWifiInjector.getSelfRecovery()).thenReturn(mSelfRecovery); when(mWifiInjector.makeTelephonyManager()).thenReturn(mTelephonyManager); + when(mWifiInjector.getClock()).thenReturn(mClock); when(mWifiNative.setupForClientMode()) .thenReturn(Pair.create(WifiNative.SETUP_SUCCESS, mClientInterface)); @@ -2026,7 +2028,7 @@ public class WifiStateMachineTest { verify(mWifiNative, never()).resetTxPowerLimit(); } - /* + /** * Verifies that a network disconnection event will result in WifiStateMachine invoking * {@link WifiConfigManager#removeAllEphemeralOrPasspointConfiguredNetworks()} to remove * any ephemeral or passpoint networks from it's internal database. @@ -2036,4 +2038,69 @@ public class WifiStateMachineTest { disconnect(); verify(mWifiConfigManager).removeAllEphemeralOrPasspointConfiguredNetworks(); } + + /** + * Test that the helper method + * {@link WifiStateMachine#shouldEvaluateWhetherToSendExplicitlySelected(WifiConfiguration)} + * returns true when we connect to the last selected network before expiration of + * {@link WifiStateMachine#LAST_SELECTED_NETWORK_EXPIRATION_AGE_MILLIS}. + */ + @Test + public void testShouldEvaluateWhetherToSendExplicitlySelected_SameNetworkNotExpired() { + long lastSelectedTimestamp = 45666743454L; + int lastSelectedNetworkId = 5; + + when(mClock.getElapsedSinceBootMillis()).thenReturn( + lastSelectedTimestamp + + WifiStateMachine.LAST_SELECTED_NETWORK_EXPIRATION_AGE_MILLIS - 1); + when(mWifiConfigManager.getLastSelectedTimeStamp()).thenReturn(lastSelectedTimestamp); + when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(lastSelectedNetworkId); + + WifiConfiguration currentConfig = new WifiConfiguration(); + currentConfig.networkId = lastSelectedNetworkId; + assertTrue(mWsm.shouldEvaluateWhetherToSendExplicitlySelected(currentConfig)); + } + + /** + * Test that the helper method + * {@link WifiStateMachine#shouldEvaluateWhetherToSendExplicitlySelected(WifiConfiguration)} + * returns false when we connect to the last selected network after expiration of + * {@link WifiStateMachine#LAST_SELECTED_NETWORK_EXPIRATION_AGE_MILLIS}. + */ + @Test + public void testShouldEvaluateWhetherToSendExplicitlySelected_SameNetworkExpired() { + long lastSelectedTimestamp = 45666743454L; + int lastSelectedNetworkId = 5; + + when(mClock.getElapsedSinceBootMillis()).thenReturn( + lastSelectedTimestamp + + WifiStateMachine.LAST_SELECTED_NETWORK_EXPIRATION_AGE_MILLIS + 1); + when(mWifiConfigManager.getLastSelectedTimeStamp()).thenReturn(lastSelectedTimestamp); + when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(lastSelectedNetworkId); + + WifiConfiguration currentConfig = new WifiConfiguration(); + currentConfig.networkId = lastSelectedNetworkId; + assertFalse(mWsm.shouldEvaluateWhetherToSendExplicitlySelected(currentConfig)); + } + + /** + * Test that the helper method + * {@link WifiStateMachine#shouldEvaluateWhetherToSendExplicitlySelected(WifiConfiguration)} + * returns false when we connect to a different network to the last selected network. + */ + @Test + public void testShouldEvaluateWhetherToSendExplicitlySelected_DifferentNetwork() { + long lastSelectedTimestamp = 45666743454L; + int lastSelectedNetworkId = 5; + + when(mClock.getElapsedSinceBootMillis()).thenReturn( + lastSelectedTimestamp + + WifiStateMachine.LAST_SELECTED_NETWORK_EXPIRATION_AGE_MILLIS - 1); + when(mWifiConfigManager.getLastSelectedTimeStamp()).thenReturn(lastSelectedTimestamp); + when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(lastSelectedNetworkId); + + WifiConfiguration currentConfig = new WifiConfiguration(); + currentConfig.networkId = lastSelectedNetworkId - 1; + assertFalse(mWsm.shouldEvaluateWhetherToSendExplicitlySelected(currentConfig)); + } } -- cgit v1.2.3