From 0ae7e5bdcd2529ce45edd92717c503ead9de3e0c Mon Sep 17 00:00:00 2001 From: Remi NGUYEN VAN Date: Tue, 15 Jun 2021 16:11:01 +0900 Subject: [PATCH] Allow mocking permission in TetheringServiceTest The test will currently fail if it is run in a package that has ACCESS_NETWORK_STATE. Add utilities to mock permissions, and mock the ACCESS_NETWORK_STATE permission to be denied. Bug: 187935317 Test: atest TetheringServiceTest Change-Id: I8df5f2ac21bf0314098e8c2e5ba583676ae8ab38 --- .../tethering/MockTetheringService.java | 24 +++++++++++++++++++ .../tethering/TetheringServiceTest.java | 16 +++++++++---- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java index 071a290e65..4865e03c21 100644 --- a/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java +++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java @@ -25,12 +25,14 @@ import android.content.Intent; import android.net.ITetheringConnector; import android.os.Binder; import android.os.IBinder; +import android.util.ArrayMap; import androidx.annotation.NonNull; import androidx.annotation.Nullable; public class MockTetheringService extends TetheringService { private final Tethering mTethering = mock(Tethering.class); + private final ArrayMap mMockedPermissions = new ArrayMap<>(); @Override public IBinder onBind(Intent intent) { @@ -51,6 +53,15 @@ public class MockTetheringService extends TetheringService { return context.checkCallingOrSelfPermission(WRITE_SETTINGS) == PERMISSION_GRANTED; } + @Override + public int checkCallingOrSelfPermission(String permission) { + final Integer mocked = mMockedPermissions.getOrDefault(permission, null); + if (mocked != null) { + return mocked; + } + return super.checkCallingOrSelfPermission(permission); + } + public Tethering getTethering() { return mTethering; } @@ -68,5 +79,18 @@ public class MockTetheringService extends TetheringService { public MockTetheringService getService() { return MockTetheringService.this; } + + /** + * Mock a permission + * @param permission Permission to mock + * @param granted One of PackageManager.PERMISSION_*, or null to reset to default behavior + */ + public void setPermission(String permission, Integer granted) { + if (granted == null) { + mMockedPermissions.remove(permission); + } else { + mMockedPermissions.put(permission, granted); + } + } } } diff --git a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java index 941cd78a62..1b52f6efeb 100644 --- a/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java +++ b/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java @@ -19,6 +19,7 @@ package com.android.networkstack.tethering; import static android.Manifest.permission.ACCESS_NETWORK_STATE; import static android.Manifest.permission.TETHER_PRIVILEGED; import static android.Manifest.permission.WRITE_SETTINGS; +import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.net.TetheringManager.TETHERING_WIFI; import static android.net.TetheringManager.TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION; import static android.net.TetheringManager.TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION; @@ -50,6 +51,7 @@ import androidx.test.filters.SmallTest; import androidx.test.rule.ServiceTestRule; import androidx.test.runner.AndroidJUnit4; +import com.android.net.module.util.CollectionUtils; import com.android.networkstack.tethering.MockTetheringService.MockTetheringConnector; import org.junit.After; @@ -70,6 +72,7 @@ public final class TetheringServiceTest { @Rule public ServiceTestRule mServiceTestRule; private Tethering mTethering; private Intent mMockServiceIntent; + private MockTetheringConnector mMockConnector; private ITetheringConnector mTetheringConnector; private UiAutomation mUiAutomation; @@ -109,10 +112,9 @@ public final class TetheringServiceTest { mMockServiceIntent = new Intent( InstrumentationRegistry.getTargetContext(), MockTetheringService.class); - final MockTetheringConnector mockConnector = - (MockTetheringConnector) mServiceTestRule.bindService(mMockServiceIntent); - mTetheringConnector = mockConnector.getTetheringConnector(); - final MockTetheringService service = mockConnector.getService(); + mMockConnector = (MockTetheringConnector) mServiceTestRule.bindService(mMockServiceIntent); + mTetheringConnector = mMockConnector.getTetheringConnector(); + final MockTetheringService service = mMockConnector.getService(); mTethering = service.getTethering(); } @@ -144,12 +146,18 @@ public final class TetheringServiceTest { private void runTetheringCall(final TestTetheringCall test, String... permissions) throws Exception { + // Allow the test to run even if ACCESS_NETWORK_STATE was granted at the APK level + if (!CollectionUtils.contains(permissions, ACCESS_NETWORK_STATE)) { + mMockConnector.setPermission(ACCESS_NETWORK_STATE, PERMISSION_DENIED); + } + if (permissions.length > 0) mUiAutomation.adoptShellPermissionIdentity(permissions); try { when(mTethering.isTetheringSupported()).thenReturn(true); test.runTetheringCall(new TestTetheringResult()); } finally { mUiAutomation.dropShellPermissionIdentity(); + mMockConnector.setPermission(ACCESS_NETWORK_STATE, null); } }