Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88f57870 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add missing permission tests for VibratorManagerService" into sc-dev am: a6c75050

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13582567

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I97d7da78bae81e9693cb97c2d6209d703fdecb31
parents 4548724b a6c75050
Loading
Loading
Loading
Loading
+14 −0
Original line number Original line Diff line number Diff line
@@ -38,6 +38,20 @@
        }
        }
      ]
      ]
    },
    },
    {
      "name": "FrameworkPermissionTests",
      "options": [
        {
          "include-annotation": "android.platform.test.annotations.Presubmit"
        },
        {
          "exclude-annotation": "androidx.test.filters.FlakyTest"
        },
        {
          "exclude-annotation": "org.junit.Ignore"
        }
      ]
    },
    {
    {
      "name": "FrameworksServicesTests",
      "name": "FrameworksServicesTests",
      "options": [
      "options": [
+7 −2
Original line number Original line Diff line number Diff line
@@ -13,9 +13,14 @@ android_test {
    srcs: ["src/**/*.java"],
    srcs: ["src/**/*.java"],
    libs: [
    libs: [
        "android.test.runner",
        "android.test.runner",
        "telephony-common",
        "android.test.base",
        "android.test.base",
        "telephony-common",
    ],
    static_libs: [
        "androidx.test.runner",
        "junit",
        "platform-test-annotations",
    ],
    ],
    static_libs: ["junit"],
    platform_apis: true,
    platform_apis: true,
    test_suites: ["device-tests"],
}
}
+3 −2
Original line number Original line Diff line number Diff line
@@ -24,9 +24,10 @@


    <!--
    <!--
    The test declared in this instrumentation can be run via this command
    The test declared in this instrumentation can be run via this command
    "adb shell am instrument -w com.android.framework.permission.tests/android.test.InstrumentationTestRunner"
    $ adb shell am instrument \
       -w com.android.framework.permission.tests/androidx.test.runner.AndroidJUnitRunner
    -->
    -->
    <instrumentation android:name="android.test.InstrumentationTestRunner"
    <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
                     android:targetPackage="com.android.framework.permission.tests"
                     android:targetPackage="com.android.framework.permission.tests"
                     android:label="Tests for private API framework permissions"/>
                     android:label="Tests for private API framework permissions"/>


+106 −40
Original line number Original line Diff line number Diff line
@@ -16,69 +16,135 @@


package com.android.framework.permission.tests;
package com.android.framework.permission.tests;


import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;

import static junit.framework.Assert.fail;

import android.Manifest;
import android.content.Context;
import android.content.Context;
import android.os.Binder;
import android.os.Binder;
import android.os.CombinedVibrationEffect;
import android.os.CombinedVibrationEffect;
import android.os.IBinder;
import android.os.IVibratorManagerService;
import android.os.IVibratorManagerService;
import android.os.IVibratorStateListener;
import android.os.Process;
import android.os.Process;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.VibrationAttributes;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.VibrationEffect;
import android.test.suitebuilder.annotation.SmallTest;
import android.platform.test.annotations.Presubmit;


import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;




/**
/**
 * Verify that Hardware apis cannot be called without required permissions.
 * Verify that Hardware apis cannot be called without required permissions.
 */
 */
@SmallTest
@Presubmit
public class VibratorManagerServicePermissionTest extends TestCase {
@RunWith(JUnit4.class)
public class VibratorManagerServicePermissionTest {

    private static final String PACKAGE_NAME = "com.android.framework.permission.tests";
    private static final CombinedVibrationEffect EFFECT =
            CombinedVibrationEffect.createSynced(
                    VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
    private static final VibrationAttributes ATTRS = new VibrationAttributes.Builder()
            .setUsage(VibrationAttributes.USAGE_ALARM)
            .build();

    @Rule
    public ExpectedException exceptionRule = ExpectedException.none();


    private IVibratorManagerService mVibratorService;
    private IVibratorManagerService mVibratorService;


    @Override
    @Before
    protected void setUp() throws Exception {
    public void setUp() throws Exception {
        mVibratorService = IVibratorManagerService.Stub.asInterface(
        mVibratorService = IVibratorManagerService.Stub.asInterface(
                ServiceManager.getService(Context.VIBRATOR_MANAGER_SERVICE));
                ServiceManager.getService(Context.VIBRATOR_MANAGER_SERVICE));
    }
    }


    /**
    @After
     * Test that calling {@link android.os.IVibratorManagerService#vibrate(int, String,
    public void cleanUp() {
     * CombinedVibrationEffect, VibrationAttributes, String, IBinder)} requires permissions.
        getInstrumentation().getUiAutomation().dropShellPermissionIdentity();
     * <p>Tests permission:
     * {@link android.Manifest.permission#VIBRATE}
     */
    public void testVibrate() throws RemoteException {
        try {
            CombinedVibrationEffect effect =
                    CombinedVibrationEffect.createSynced(
                            VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
            VibrationAttributes attrs = new VibrationAttributes.Builder()
                    .setUsage(VibrationAttributes.USAGE_ALARM)
                    .build();
            mVibratorService.vibrate(Process.myUid(), null, effect, attrs,
                    "testVibrate", new Binder());
            fail("vibrate did not throw SecurityException as expected");
        } catch (SecurityException e) {
            // expected
    }
    }

    @Test
    public void testIsVibratingFails() throws RemoteException {
        expectSecurityException("ACCESS_VIBRATOR_STATE");
        mVibratorService.isVibrating(1);
    }
    }


    /**
    @Test
     * Test that calling {@link android.os.IVibratorManagerService#cancelVibrate(IBinder)} requires
    public void testRegisterVibratorStateListenerFails() throws RemoteException {
     * permissions.
        expectSecurityException("ACCESS_VIBRATOR_STATE");
     * <p>Tests permission:
        IVibratorStateListener listener = new IVibratorStateListener.Stub() {
     * {@link android.Manifest.permission#VIBRATE}
            @Override
     */
            public void onVibrating(boolean vibrating) {
    public void testCancelVibrate() throws RemoteException {
                fail("Listener callback was not expected.");
        try {
            }
        };
        mVibratorService.registerVibratorStateListener(1, listener);
    }

    @Test
    public void testUnregisterVibratorStateListenerFails() throws RemoteException {
        expectSecurityException("ACCESS_VIBRATOR_STATE");
        mVibratorService.unregisterVibratorStateListener(1, null);
    }

    @Test
    public void testSetAlwaysOnEffectFails() throws RemoteException {
        expectSecurityException("VIBRATE_ALWAYS_ON");
        mVibratorService.setAlwaysOnEffect(Process.myUid(), PACKAGE_NAME, 1, EFFECT, ATTRS);
    }

    @Test
    public void testVibrateWithoutPermissionFails() throws RemoteException {
        expectSecurityException("VIBRATE");
        mVibratorService.vibrate(Process.myUid(), PACKAGE_NAME, EFFECT, ATTRS, "testVibrate",
                new Binder());
    }

    @Test
    public void testVibrateWithVibratePermissionAndSameProcessUidIsAllowed()
            throws RemoteException {
        getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
                Manifest.permission.VIBRATE);
        mVibratorService.vibrate(Process.myUid(), PACKAGE_NAME, EFFECT, ATTRS, "testVibrate",
                new Binder());
    }

    @Test
    public void testVibrateWithVibratePermissionAndDifferentUidsFails() throws RemoteException {
        expectSecurityException("UPDATE_APP_OPS_STATS");
        getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
                Manifest.permission.VIBRATE);
        mVibratorService.vibrate(Process.SYSTEM_UID, "android", EFFECT, ATTRS, "testVibrate",
                new Binder());
    }

    @Test
    public void testVibrateWithAllPermissionsAndDifferentUidsIsAllowed() throws RemoteException {
        getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
                Manifest.permission.VIBRATE,
                Manifest.permission.UPDATE_APP_OPS_STATS);
        mVibratorService.vibrate(Process.SYSTEM_UID, "android", EFFECT, ATTRS, "testVibrate",
                new Binder());
    }

    @Test
    public void testCancelVibrateFails() throws RemoteException {
        expectSecurityException("VIBRATE");
        mVibratorService.cancelVibrate(new Binder());
        mVibratorService.cancelVibrate(new Binder());
            fail("cancelVibrate did not throw SecurityException as expected");
        } catch (SecurityException e) {
            // expected
    }
    }

    private void expectSecurityException(String expectedPermission) {
        exceptionRule.expect(SecurityException.class);
        exceptionRule.expectMessage("permission." + expectedPermission);
    }
    }
}
}