From 184a4207f60c2255486c28b45724c71738d087b7 Mon Sep 17 00:00:00 2001 From: Rebecca Silberstein Date: Thu, 30 Mar 2017 15:54:55 -0700 Subject: WifiServiceImpl: test setWifiEnabled Before adding mode checks, add unit tests to check current behavior. Bug: 36358238 Test: frameworks/opt/net/wifi/tests/wifitests/runtests.sh Change-Id: I8de27f2bceebb589b173d91d79dfa3a5afe6a675 Merged-In: I8de27f2bceebb589b173d91d79dfa3a5afe6a675 --- .../android/server/wifi/WifiServiceImplTest.java | 68 ++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index 4cdd0f684..5ffe30d50 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java @@ -67,6 +67,7 @@ public class WifiServiceImplTest { private static final String TAG = "WifiServiceImplTest"; private static final int DEFAULT_VERBOSE_LOGGING = 0; + private static final String TEST_PACKAGE_NAME = "TestPackage"; @Mock Context mContext; @Mock WifiInjector mWifiInjector; @@ -230,6 +231,73 @@ public class WifiServiceImplTest { .dump(any(FileDescriptor.class), any(PrintWriter.class), any(String[].class)); } + + /** + * Verify that wifi can be enabled by a caller with WIFI_STATE_CHANGE permission when wifi is + * off (no hotspot, no airplane mode). + */ + @Test + public void testSetWifiEnabledSuccess() throws Exception { + when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** + * Verify that the CMD_TOGGLE_WIFI message won't be sent if wifi is already on. + */ + @Test + public void testSetWifiEnabledNoToggle() throws Exception { + when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(false); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); + verify(mWifiController, never()).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** + * Verify a SecurityException is thrown if a caller does not have the correct permission to + * toggle wifi. + */ + @Test(expected = SecurityException.class) + public void testSetWifiEnableWithoutPermission() throws Exception { + doThrow(new SecurityException()).when(mContext) + .enforceCallingOrSelfPermission(eq(android.Manifest.permission.CHANGE_WIFI_STATE), + eq("WifiService")); + mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true); + } + + /** + * Verify that wifi can be disabled by a caller with WIFI_STATE_CHANGE permission when wifi is + * on. + */ + @Test + public void testSetWifiDisabledSuccess() throws Exception { + when(mSettingsStore.handleWifiToggled(eq(false))).thenReturn(true); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false)); + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** + * Verify that CMD_TOGGLE_WIFI message won't be sent if wifi is already off. + */ + @Test + public void testSetWifiDisabledNoToggle() throws Exception { + when(mSettingsStore.handleWifiToggled(eq(false))).thenReturn(false); + assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false)); + verify(mWifiController, never()).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** + * Verify a SecurityException is thrown if a caller does not have the correct permission to + * toggle wifi. + */ + @Test(expected = SecurityException.class) + public void testSetWifiDisabledWithoutPermission() throws Exception { + doThrow(new SecurityException()).when(mContext) + .enforceCallingOrSelfPermission(eq(android.Manifest.permission.CHANGE_WIFI_STATE), + eq("WifiService")); + mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false); + } + /** * Ensure unpermitted callers cannot write the SoftApConfiguration. * -- cgit v1.2.3 From 05d6ff7612ee795daf3a6fd0ee5a99e01c7a8685 Mon Sep 17 00:00:00 2001 From: Rebecca Silberstein Date: Sun, 2 Apr 2017 22:12:48 -0700 Subject: WifiServiceImpl: check calls to enable wifi When the user has entered softap mode, apps should not be able to toggle wifi on. This leaves the user with unexpected behavior. This CL adds checks for softap mode to make sure only Settings and SysUI (Quick and QuickQuick settings) can toggle wifi on. Bug: 36358238 Test: manually Test: frameworks/opt/net/wifi/tests/wifitests/runtests.sh Test: frameworks/base/wifi/tests/runtests.sh Test: wifi integration tests Change-Id: I114757324b529a43c411dc8a01afcb05a23489ee Merged-In: I114757324b529a43c411dc8a01afcb05a23489ee --- .../android/server/wifi/WifiServiceImplTest.java | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java index 5ffe30d50..93ee8ea9a 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java @@ -33,6 +33,7 @@ import android.content.Context; import android.content.res.Resources; import android.net.IpConfiguration; import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiManager; import android.os.Handler; import android.os.HandlerThread; import android.os.IPowerManager; @@ -67,7 +68,10 @@ public class WifiServiceImplTest { private static final String TAG = "WifiServiceImplTest"; private static final int DEFAULT_VERBOSE_LOGGING = 0; + private static final String ANDROID_SYSTEM_PACKAGE = "android"; private static final String TEST_PACKAGE_NAME = "TestPackage"; + private static final String SETTINGS_PACKAGE_NAME = "com.android.settings"; + private static final String SYSUI_PACKAGE_NAME = "com.android.systemui"; @Mock Context mContext; @Mock WifiInjector mWifiInjector; @@ -238,6 +242,7 @@ public class WifiServiceImplTest { */ @Test public void testSetWifiEnabledSuccess() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED); when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true); assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); @@ -248,6 +253,7 @@ public class WifiServiceImplTest { */ @Test public void testSetWifiEnabledNoToggle() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED); when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(false); assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); verify(mWifiController, never()).sendMessage(eq(CMD_WIFI_TOGGLED)); @@ -263,6 +269,40 @@ public class WifiServiceImplTest { .enforceCallingOrSelfPermission(eq(android.Manifest.permission.CHANGE_WIFI_STATE), eq("WifiService")); mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true); + verify(mWifiStateMachine, never()).syncGetWifiApState(); + } + + /** + * Verify that a call from Settings can enable wifi if we are in softap mode. + */ + @Test + public void testSetWifiEnabledFromSettingsWhenApEnabled() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_ENABLED); + when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true); + assertTrue(mWifiServiceImpl.setWifiEnabled(SETTINGS_PACKAGE_NAME, true)); + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** + * Verify that a call from SysUI can enable wifi if we are in softap mode. + */ + @Test + public void testSetWifiEnabledFromSysUiWhenApEnabled() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_ENABLED); + when(mSettingsStore.handleWifiToggled(eq(true))).thenReturn(true); + assertTrue(mWifiServiceImpl.setWifiEnabled(SYSUI_PACKAGE_NAME, true)); + verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); + } + + /** + * Verify that a call from an app cannot enable wifi if we are in softap mode. + */ + @Test + public void testSetWifiEnabledFromAppFailsWhenApEnabled() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_ENABLED); + assertFalse(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, true)); + verify(mSettingsStore, never()).handleWifiToggled(anyBoolean()); + verify(mWifiController, never()).sendMessage(eq(CMD_WIFI_TOGGLED)); } /** @@ -271,6 +311,7 @@ public class WifiServiceImplTest { */ @Test public void testSetWifiDisabledSuccess() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED); when(mSettingsStore.handleWifiToggled(eq(false))).thenReturn(true); assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false)); verify(mWifiController).sendMessage(eq(CMD_WIFI_TOGGLED)); @@ -281,6 +322,7 @@ public class WifiServiceImplTest { */ @Test public void testSetWifiDisabledNoToggle() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED); when(mSettingsStore.handleWifiToggled(eq(false))).thenReturn(false); assertTrue(mWifiServiceImpl.setWifiEnabled(TEST_PACKAGE_NAME, false)); verify(mWifiController, never()).sendMessage(eq(CMD_WIFI_TOGGLED)); @@ -292,6 +334,7 @@ public class WifiServiceImplTest { */ @Test(expected = SecurityException.class) public void testSetWifiDisabledWithoutPermission() throws Exception { + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED); doThrow(new SecurityException()).when(mContext) .enforceCallingOrSelfPermission(eq(android.Manifest.permission.CHANGE_WIFI_STATE), eq("WifiService")); @@ -387,6 +430,8 @@ public class WifiServiceImplTest { when(mSettingsStore.handleWifiToggled(true)).thenReturn(true); when(mSettingsStore.isWifiToggleEnabled()).thenReturn(true); when(mWifiStateMachine.syncGetWifiState()).thenReturn(WIFI_STATE_DISABLED); + when(mWifiStateMachine.syncGetWifiApState()).thenReturn(WifiManager.WIFI_AP_STATE_DISABLED); + when(mContext.getPackageName()).thenReturn(ANDROID_SYSTEM_PACKAGE); mWifiServiceImpl.checkAndStartWifi(); verify(mWifiController).start(); verify(mWifiController).sendMessage(CMD_WIFI_TOGGLED); -- cgit v1.2.3