Merge "Add ContextUtils"

This commit is contained in:
Paul Hu 2021-11-26 06:53:23 +00:00 • committed by Gerrit Code Review
commit d2c8b5dbf0

View file

@ -0,0 +1,55 @@
/*
* 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("ContextUtils")
package com.android.testutils
import android.content.Context
import android.os.UserHandle
import org.mockito.AdditionalAnswers.delegatesTo
import org.mockito.ArgumentMatchers.any
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mockito.doAnswer
import org.mockito.Mockito.doReturn
import org.mockito.Mockito.mock
import java.util.function.BiConsumer
// Helper function so that Java doesn't have to pass a method that returns Unit
fun mockContextAsUser(context: Context, functor: BiConsumer<Context, UserHandle>? = null) =
mockContextAsUser(context) { c, h -> functor?.accept(c, h) }
/**
* Return a context with assigned user and delegate to original context.
*
* @param context the mock context to set up createContextAsUser on. After this function
* is called, client code can call createContextAsUser and expect a context that
* will return the correct user and userId.
*
* @param functor additional code to run on the created context-as-user instances, for example to
* set up further mocks on these contexts.
*/
fun mockContextAsUser(context: Context, functor: ((Context, UserHandle) -> Unit)? = null) {
doAnswer { invocation ->
val asUserContext = mock(Context::class.java, delegatesTo<Context>(context))
val user = invocation.arguments[0] as UserHandle
val userId = user.identifier
doReturn(user).`when`(asUserContext).user
doReturn(userId).`when`(asUserContext).userId
functor?.let { it(asUserContext, user) }
asUserContext
}.`when`(context).createContextAsUser(any(UserHandle::class.java), anyInt() /* flags */)
}