Merge "Adding tests for temporary and renewable trust" into tm-dev

This commit is contained in:
Jacob Hobbie
2022-03-17 22:55:53 +00:00
committed by Android (Google) Code Review
6 changed files with 160 additions and 8 deletions

View File

@@ -198,6 +198,8 @@ public class TrustAgentWrapper {
// Fall through.
case MSG_REVOKE_TRUST:
mTrusted = false;
mTrustable = false;
mWaitingForTrustableDowngrade = false;
mDisplayTrustGrantedMessage = false;
mMessage = null;
mHandler.removeMessages(MSG_TRUST_TIMEOUT);

View File

@@ -68,6 +68,16 @@
<action android:name="android.service.trust.TrustAgentService" />
</intent-filter>
</service>
<service
android:name=".TemporaryAndRenewableTrustAgent"
android:exported="true"
android:label="Test Agent"
android:permission="android.permission.BIND_TRUST_AGENT">
<intent-filter>
<action android:name="android.service.trust.TrustAgentService" />
</intent-filter>
</service>
</application>
<!-- self-instrumenting test package. -->

View File

@@ -60,7 +60,6 @@ class GrantAndRevokeTrustTest {
@Test
fun sleepingDeviceWithoutGrantLocksDevice() {
uiDevice.sleep()
await()
lockStateTrackingRule.assertLocked()
}
@@ -69,7 +68,6 @@ class GrantAndRevokeTrustTest {
fun grantKeepsDeviceUnlocked() {
trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 10000, 0)
uiDevice.sleep()
await()
lockStateTrackingRule.assertUnlocked()
}
@@ -80,7 +78,6 @@ class GrantAndRevokeTrustTest {
await()
uiDevice.sleep()
trustAgentRule.agent.revokeTrust()
await()
lockStateTrackingRule.assertLocked()
}

View File

@@ -24,7 +24,6 @@ import android.trust.test.lib.TrustAgentRule
import android.util.Log
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
import org.junit.rules.RuleChain
@@ -52,9 +51,8 @@ class LockUserTest {
fun lockUser_locksTheDevice() {
Log.i(TAG, "Locking user")
trustAgentRule.agent.lockUser()
await()
assertThat(lockStateTrackingRule.lockState.locked).isTrue()
lockStateTrackingRule.assertLocked()
}
companion object {

View File

@@ -0,0 +1,124 @@
/*
* Copyright (C) 2022 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.
*/
package android.trust.test
import android.service.trust.TrustAgentService.FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE
import android.trust.BaseTrustAgentService
import android.trust.TrustTestActivity
import android.trust.test.lib.LockStateTrackingRule
import android.trust.test.lib.ScreenLockRule
import android.trust.test.lib.TrustAgentRule
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.uiautomator.UiDevice
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.RuleChain
import org.junit.runner.RunWith
/**
* Test for testing revokeTrust & grantTrust for renewable trust.
*
* atest TrustTests:TemporaryAndRenewableTrustTest
*/
@RunWith(AndroidJUnit4::class)
class TemporaryAndRenewableTrustTest {
private val uiDevice = UiDevice.getInstance(getInstrumentation())
private val activityScenarioRule = ActivityScenarioRule(TrustTestActivity::class.java)
private val lockStateTrackingRule = LockStateTrackingRule()
private val trustAgentRule = TrustAgentRule<TemporaryAndRenewableTrustAgent>()
@get:Rule
val rule: RuleChain = RuleChain
.outerRule(activityScenarioRule)
.around(ScreenLockRule())
.around(lockStateTrackingRule)
.around(trustAgentRule)
@Before
fun manageTrust() {
trustAgentRule.agent.setManagingTrust(true)
}
// This test serves a baseline for Grant tests, verifying that the default behavior of the
// device is to lock when put to sleep
@Test
fun sleepingDeviceWithoutGrantLocksDevice() {
uiDevice.sleep()
lockStateTrackingRule.assertLocked()
}
@Test
fun grantTrustLockedDevice_deviceStaysLocked() {
uiDevice.sleep()
lockStateTrackingRule.assertLocked()
trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 0, FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE)
uiDevice.wakeUp()
lockStateTrackingRule.assertLocked()
}
@Test
fun grantTrustUnlockedDevice_deviceLocksOnScreenOff() {
trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 0, FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE)
uiDevice.sleep()
lockStateTrackingRule.assertLocked()
}
@Test
fun grantTrustLockedDevice_grantTrustOnLockedDeviceUnlocksDevice() {
trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 0, FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE)
uiDevice.sleep()
lockStateTrackingRule.assertLocked()
trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 0, FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE)
uiDevice.wakeUp()
lockStateTrackingRule.assertUnlocked()
}
@Test
fun grantTrustLockedDevice_revokeTrustPreventsSubsequentUnlock() {
trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 0, FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE)
uiDevice.sleep()
lockStateTrackingRule.assertLocked()
trustAgentRule.agent.revokeTrust()
await(500)
uiDevice.wakeUp()
await(500)
trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 0, FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE)
lockStateTrackingRule.assertLocked()
}
companion object {
private const val TAG = "TemporaryAndRenewableTrustTest"
private const val GRANT_MESSAGE = "granted by test"
private fun await(millis: Long) = Thread.sleep(millis)
}
}
class TemporaryAndRenewableTrustAgent : BaseTrustAgentService()

View File

@@ -52,8 +52,29 @@ class LockStateTrackingRule : TestRule {
}
}
fun assertLocked() = assertThat(lockState.locked).isTrue()
fun assertUnlocked() = assertThat(lockState.locked).isFalse()
fun assertLocked() {
val maxWaits = 50
var waitCount = 0
while ((lockState.locked == false) && waitCount < maxWaits) {
Log.i(TAG, "phone still locked, wait 50ms more ($waitCount)")
Thread.sleep(50)
waitCount++
}
assertThat(lockState.locked).isTrue()
}
fun assertUnlocked() {
val maxWaits = 50
var waitCount = 0
while ((lockState.locked == true) && waitCount < maxWaits) {
Log.i(TAG, "phone still unlocked, wait 50ms more ($waitCount)")
Thread.sleep(50)
waitCount++
}
assertThat(lockState.locked).isFalse()
}
inner class Listener : TrustListener {
override fun onTrustChanged(