From 2c9709a42467b03cba1d721c5d873a420eea3874 Mon Sep 17 00:00:00 2001 From: Roshan Pius Date: Tue, 26 Nov 2019 06:40:00 -0800 Subject: WifiPermissionsUtil: Handle location mode check failures Wifi service is now again starting very early in the bootup sequence. Location service may not be ready to respond to it's public API calls from wifi during it's initialization sequence (seen in wifi-service & rtt-service initialization sequence). Handle any errors seen gracefully and fallback to the legacy Settings value to read the location mode setting of the device. The legacy settings value only reflects the location mode of the user 0, but this is ok early on in the bootup sequence since any user switches will happen after this. Bug: 144722612 Test: atest com.android.wifi Change-Id: I5df9cdffd14962847a8ab23ed54510fafa13a149 --- .../server/wifi/util/WifiPermissionsUtilTest.java | 31 ++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/util/WifiPermissionsUtilTest.java b/tests/wifitests/src/com/android/server/wifi/util/WifiPermissionsUtilTest.java index 9bd3fe6f6..7f6e1e1cd 100644 --- a/tests/wifitests/src/com/android/server/wifi/util/WifiPermissionsUtilTest.java +++ b/tests/wifitests/src/com/android/server/wifi/util/WifiPermissionsUtilTest.java @@ -27,6 +27,7 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -43,11 +44,13 @@ import android.net.NetworkStack; import android.os.Build; import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; import androidx.test.filters.SmallTest; import com.android.server.wifi.BinderUtil; import com.android.server.wifi.FakeWifiLog; +import com.android.server.wifi.FrameworkFacade; import com.android.server.wifi.WifiBaseTest; import com.android.server.wifi.WifiInjector; @@ -72,6 +75,7 @@ public class WifiPermissionsUtilTest extends WifiBaseTest { // Mock objects for testing @Mock private WifiPermissionsWrapper mMockPermissionsWrapper; @Mock private Context mMockContext; + @Mock private FrameworkFacade mMockFrameworkFacade; @Mock private PackageManager mMockPkgMgr; @Mock private ApplicationInfo mMockApplInfo; @Mock private AppOpsManager mMockAppOps; @@ -1207,6 +1211,32 @@ public class WifiPermissionsUtilTest extends WifiBaseTest { } } + /** + * Verify that we handle failures when trying to fetch location mode using LocationManager API. + * We should use the legacy setting to read the value if we encounter any failure. + */ + @Test + public void testIsLocationEnabledFallbackToLegacySetting() throws Exception { + mUid = OTHER_USER_UID; // do not really care about this value + setupTestCase(); + WifiPermissionsUtil codeUnderTest = new WifiPermissionsUtil(mMockPermissionsWrapper, + mMockContext, mMockUserManager, mWifiInjector); + doThrow(new RuntimeException()).when(mLocationManager).isLocationEnabledForUser(any()); + + when(mMockFrameworkFacade.getIntegerSetting( + any(), eq(Settings.Secure.LOCATION_MODE), anyInt())) + .thenReturn(Settings.Secure.LOCATION_MODE_OFF); + assertFalse(codeUnderTest.isLocationModeEnabled()); + + when(mMockFrameworkFacade.getIntegerSetting( + any(), eq(Settings.Secure.LOCATION_MODE), anyInt())) + .thenReturn(Settings.Secure.LOCATION_MODE_ON); + assertTrue(codeUnderTest.isLocationModeEnabled()); + + verify(mMockFrameworkFacade, times(2)).getIntegerSetting( + any(), eq(Settings.Secure.LOCATION_MODE), anyInt()); + } + private Answer createPermissionAnswer() { return new Answer() { @Override @@ -1250,6 +1280,7 @@ public class WifiPermissionsUtilTest extends WifiBaseTest { when(mMockContext.getSystemService(Context.USER_SERVICE)) .thenReturn(mMockUserManager); when(mWifiInjector.makeLog(anyString())).thenReturn(mWifiLog); + when(mWifiInjector.getFrameworkFacade()).thenReturn(mMockFrameworkFacade); when(mMockContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager); when(mMockContext.getPackageName()).thenReturn(TEST_WIFI_STACK_APK_NAME); } -- cgit v1.2.3