/* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ @file:JvmName("TestPermissionUtil") package com.android.testutils import androidx.test.platform.app.InstrumentationRegistry import com.android.testutils.ExceptionUtils.ThrowingRunnable import com.android.testutils.ExceptionUtils.ThrowingSupplier /** * Run the specified [task] with the specified [permissions] obtained through shell * permission identity. * * Passing in an empty list of permissions can grant all shell permissions, but this is * discouraged as it also causes the process to temporarily lose non-shell permissions. */ fun runAsShell(vararg permissions: String, task: () -> T): T { val autom = InstrumentationRegistry.getInstrumentation().uiAutomation autom.adoptShellPermissionIdentity(*permissions) try { return task() } finally { autom.dropShellPermissionIdentity() } } /** * Convenience overload of [runAsShell] that uses a [ThrowingSupplier] for Java callers, when * only one/two/three permissions are needed. */ @JvmOverloads fun runAsShell( perm1: String, perm2: String = "", perm3: String = "", supplier: ThrowingSupplier ): T = runAsShell(*getNonEmptyVarargs(perm1, perm2, perm3)) { supplier.get() } /** * Convenience overload of [runAsShell] that uses a [ThrowingRunnable] for Java callers, when * only one/two/three permissions are needed. */ @JvmOverloads fun runAsShell( perm1: String, perm2: String = "", perm3: String = "", runnable: ThrowingRunnable ): Unit = runAsShell(*getNonEmptyVarargs(perm1, perm2, perm3)) { runnable.run() } /** * Get an array containing the first consecutive non-empty arguments out of three arguments. * * The first argument is assumed to be non-empty. */ private fun getNonEmptyVarargs(arg1: String, arg2: String, arg3: String): Array { return when { arg2 == "" -> arrayOf(arg1) arg3 == "" -> arrayOf(arg1, arg2) else -> arrayOf(arg1, arg2, arg3) } }