diff options
author | Roshan Pius <rpius@google.com> | 2017-02-10 08:59:50 -0800 |
---|---|---|
committer | Roshan Pius <rpius@google.com> | 2017-02-14 12:08:33 -0800 |
commit | 7c0ec884188660f72977c8a80366049705c48ffa (patch) | |
tree | 3311ad4fc34601ba398e9a7de0d2de15cb23eb7b /tests/wifitests/src/com | |
parent | f180b0109b3fce79609b03ae2f7fbeff02d96b80 (diff) | |
download | android_frameworks_opt_net_wifi-7c0ec884188660f72977c8a80366049705c48ffa.tar.gz android_frameworks_opt_net_wifi-7c0ec884188660f72977c8a80366049705c48ffa.tar.bz2 android_frameworks_opt_net_wifi-7c0ec884188660f72977c8a80366049705c48ffa.zip |
SupplicantStaIfaceHal: Implement connect/roam to network
This is the port of the existing methods from WifiSupplicantControl.
Bug: 33383725
Test: Unit tests
Change-Id: Icd0f23c1239beae05769ec99c93f84a4c1db16c4
Diffstat (limited to 'tests/wifitests/src/com')
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java b/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java index e80b81ef5..52d5a28c3 100644 --- a/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java +++ b/tests/wifitests/src/com/android/server/wifi/SupplicantStaIfaceHalTest.java @@ -25,6 +25,9 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.test.MockAnswerUtil; @@ -53,6 +56,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -66,6 +70,9 @@ public class SupplicantStaIfaceHalTest { put(2, "ssid2"); put(3, "ssid3"); }}; + private static final int EXISTING_SUPPLICANT_NETWORK_ID = 2; + private static final int ROAM_NETWORK_ID = 4; + private static final String ROAM_BSSID = "fa:45:23:23:12:12"; @Mock IServiceManager mServiceManagerMock; @Mock ISupplicant mISupplicantMock; @Mock ISupplicantIface mISupplicantIfaceMock; @@ -362,6 +369,134 @@ public class SupplicantStaIfaceHalTest { } /** + * Tests connection to a specified network without triggering disconnect. + */ + @Test + public void testConnectWithNoDisconnectAndEmptyExistingNetworks() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + executeAndValidateConnectSequence(0, false, false); + } + + /** + * Tests connection to a specified network without triggering disconnect. + */ + @Test + public void testConnectWithNoDisconnectAndSingleExistingNetwork() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + executeAndValidateConnectSequence(0, true, false); + } + + /** + * Tests connection to a specified network, with a triggered disconnect. + */ + @Test + public void testConnectWithDisconnectAndSingleExistingNetwork() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + executeAndValidateConnectSequence(0, false, true); + } + + /** + * Tests connection to a specified network failure due to network add. + */ + @Test + public void testConnectFailureDueToNetworkAddFailure() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + setupMocksForConnectSequence(false); + doAnswer(new MockAnswerUtil.AnswerWithArguments() { + public void answer(ISupplicantStaIface.addNetworkCallback cb) throws RemoteException { + cb.onValues(mStatusFailure, mock(ISupplicantStaNetwork.class)); + return; + } + }).when(mISupplicantStaIfaceMock).addNetwork( + any(ISupplicantStaIface.addNetworkCallback.class)); + + assertFalse(mDut.connectToNetwork(new WifiConfiguration(), false)); + } + + /** + * Tests connection to a specified network failure due to network save. + */ + @Test + public void testConnectFailureDueToNetworkSaveFailure() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + setupMocksForConnectSequence(false); + + when(mSupplicantStaNetworkMock.saveWifiConfiguration(any(WifiConfiguration.class))) + .thenReturn(false); + + assertFalse(mDut.connectToNetwork(new WifiConfiguration(), false)); + } + + /** + * Tests connection to a specified network failure due to network select. + */ + @Test + public void testConnectFailureDueToNetworkSelectFailure() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + setupMocksForConnectSequence(false); + + when(mSupplicantStaNetworkMock.select()).thenReturn(false); + + assertFalse(mDut.connectToNetwork(new WifiConfiguration(), false)); + } + + /** + * Tests roaming to the same network as the currently connected one. + */ + @Test + public void testRoamToSameNetwork() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + executeAndValidateRoamSequence(true); + } + + /** + * Tests roaming to a different network. + */ + @Test + public void testRoamToDifferentNetwork() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + executeAndValidateRoamSequence(false); + } + + /** + * Tests roaming failure because of unable to set bssid. + */ + @Test + public void testRoamFailureDueToBssidSet() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + int connectedNetworkId = 5; + executeAndValidateConnectSequence(connectedNetworkId, false, false); + when(mSupplicantStaNetworkMock.setBssid(anyString())).thenReturn(false); + + WifiConfiguration roamingConfig = new WifiConfiguration(); + roamingConfig.networkId = connectedNetworkId; + roamingConfig.getNetworkSelectionStatus().setNetworkSelectionBSSID("45:34:23:23:ab:ed"); + assertFalse(mDut.roamToNetwork(roamingConfig)); + } + + /** + * Tests roaming failure because of unable to reassociate. + */ + @Test + public void testRoamFailureDueToReassociate() throws Exception { + executeAndValidateInitializationSequence(false, false, false); + int connectedNetworkId = 5; + executeAndValidateConnectSequence(connectedNetworkId, false, false); + + doAnswer(new MockAnswerUtil.AnswerWithArguments() { + public SupplicantStatus answer() throws RemoteException { + return mStatusFailure; + } + }).when(mISupplicantStaIfaceMock).reassociate(); + when(mSupplicantStaNetworkMock.setBssid(anyString())).thenReturn(true); + + WifiConfiguration roamingConfig = new WifiConfiguration(); + roamingConfig.networkId = connectedNetworkId; + roamingConfig.getNetworkSelectionStatus().setNetworkSelectionBSSID("45:34:23:23:ab:ed"); + assertFalse(mDut.roamToNetwork(roamingConfig)); + } + + /** * Calls.initialize(), mocking various call back answers and verifying flow, asserting for the * expected result. Verifies if ISupplicantStaIface manager is initialized or reset. * Each of the arguments will cause a different failure mode when set true. @@ -455,4 +590,121 @@ public class SupplicantStaIfaceHalTest { } } } + + /** + * Setup mocks for connect sequence. + */ + private void setupMocksForConnectSequence(final boolean haveExistingNetwork) throws Exception { + final int existingNetworkId = EXISTING_SUPPLICANT_NETWORK_ID; + doAnswer(new MockAnswerUtil.AnswerWithArguments() { + public SupplicantStatus answer() throws RemoteException { + return mStatusSuccess; + } + }).when(mISupplicantStaIfaceMock).disconnect(); + doAnswer(new MockAnswerUtil.AnswerWithArguments() { + public void answer(ISupplicantStaIface.listNetworksCallback cb) throws RemoteException { + if (haveExistingNetwork) { + cb.onValues(mStatusSuccess, new ArrayList<>(Arrays.asList(existingNetworkId))); + } else { + cb.onValues(mStatusSuccess, new ArrayList<>()); + } + } + }).when(mISupplicantStaIfaceMock) + .listNetworks(any(ISupplicantStaIface.listNetworksCallback.class)); + doAnswer(new MockAnswerUtil.AnswerWithArguments() { + public SupplicantStatus answer(int id) throws RemoteException { + return mStatusSuccess; + } + }).when(mISupplicantStaIfaceMock).removeNetwork(eq(existingNetworkId)); + doAnswer(new MockAnswerUtil.AnswerWithArguments() { + public void answer(ISupplicantStaIface.addNetworkCallback cb) throws RemoteException { + cb.onValues(mStatusSuccess, mock(ISupplicantStaNetwork.class)); + return; + } + }).when(mISupplicantStaIfaceMock).addNetwork( + any(ISupplicantStaIface.addNetworkCallback.class)); + when(mSupplicantStaNetworkMock.saveWifiConfiguration(any(WifiConfiguration.class))) + .thenReturn(true); + when(mSupplicantStaNetworkMock.select()).thenReturn(true); + } + + /** + * Helper function to validate the connect sequence. + */ + private void validateConnectSequence( + final boolean haveExistingNetwork, boolean shouldDisconnect, int numNetworkAdditions) + throws Exception { + if (shouldDisconnect) { + verify(mISupplicantStaIfaceMock).disconnect(); + } + if (haveExistingNetwork) { + verify(mISupplicantStaIfaceMock).removeNetwork(anyInt()); + } + verify(mISupplicantStaIfaceMock, times(numNetworkAdditions)) + .addNetwork(any(ISupplicantStaIface.addNetworkCallback.class)); + verify(mSupplicantStaNetworkMock, times(numNetworkAdditions)) + .saveWifiConfiguration(any(WifiConfiguration.class)); + verify(mSupplicantStaNetworkMock, times(numNetworkAdditions)).select(); + } + + /** + * Helper function to execute all the actions to perform connection to the network. + * + * @param newFrameworkNetworkId Framework Network Id of the new network to connect. + * @param haveExistingNetwork Removes the existing network. + * @param shouldDisconnect Should trigger disconnect before connecting. + */ + private void executeAndValidateConnectSequence( + final int newFrameworkNetworkId, final boolean haveExistingNetwork, + boolean shouldDisconnect) throws Exception { + setupMocksForConnectSequence(haveExistingNetwork); + WifiConfiguration config = new WifiConfiguration(); + config.networkId = newFrameworkNetworkId; + assertTrue(mDut.connectToNetwork(config, shouldDisconnect)); + validateConnectSequence(haveExistingNetwork, shouldDisconnect, 1); + } + + /** + * Setup mocks for roam sequence. + */ + private void setupMocksForRoamSequence(String roamBssid) throws Exception { + doAnswer(new MockAnswerUtil.AnswerWithArguments() { + public SupplicantStatus answer() throws RemoteException { + return mStatusSuccess; + } + }).when(mISupplicantStaIfaceMock).reassociate(); + when(mSupplicantStaNetworkMock.setBssid(eq(roamBssid))).thenReturn(true); + } + + /** + * Helper function to execute all the actions to perform roaming to the network. + * + * @param sameNetwork Roam to the same network or not. + */ + private void executeAndValidateRoamSequence(boolean sameNetwork) throws Exception { + int connectedNetworkId = ROAM_NETWORK_ID; + String roamBssid = ROAM_BSSID; + int roamNetworkId; + if (sameNetwork) { + roamNetworkId = connectedNetworkId; + } else { + roamNetworkId = connectedNetworkId + 1; + } + executeAndValidateConnectSequence(connectedNetworkId, false, true); + setupMocksForRoamSequence(roamBssid); + + WifiConfiguration roamingConfig = new WifiConfiguration(); + roamingConfig.networkId = roamNetworkId; + roamingConfig.getNetworkSelectionStatus().setNetworkSelectionBSSID(roamBssid); + assertTrue(mDut.roamToNetwork(roamingConfig)); + + if (!sameNetwork) { + validateConnectSequence(false, false, 2); + verify(mSupplicantStaNetworkMock, never()).setBssid(anyString()); + verify(mISupplicantStaIfaceMock, never()).reassociate(); + } else { + verify(mSupplicantStaNetworkMock).setBssid(eq(roamBssid)); + verify(mISupplicantStaIfaceMock).reassociate(); + } + } } |