[SB Refactor] Move InstantTaskExecutorRule to its own file so it can be

used by other tests.

Any tests that are exercising the `view.repeatWhenAttached` method need
to use this rule; otherwise, we'll get `IllegalStateException: should
be called from the main thread.` error. Moving the rule to its own file
lets us better import it for other tests.

Test: atest RepeatWhenAttachedTest
Bug: 238425913
Change-Id: Icab6b63b419a3898a8be35f16c06a8a3d09db4e2
This commit is contained in:
Caitlin Cassidy
2022-08-22 19:12:54 +00:00
committed by Caitlin Shkuratov
parent db2c8323ef
commit 180c089d6d
2 changed files with 57 additions and 38 deletions

View File

@@ -0,0 +1,57 @@
/*
* 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 com.android.systemui.lifecycle
import androidx.arch.core.executor.ArchTaskExecutor
import androidx.arch.core.executor.TaskExecutor
import org.junit.rules.TestWatcher
import org.junit.runner.Description
/**
* Test rule that makes ArchTaskExecutor main thread assertions pass. There is one such assert
* in LifecycleRegistry.
*/
class InstantTaskExecutorRule : TestWatcher() {
// TODO(b/240620122): This is a copy of
// androidx/arch/core/executor/testing/InstantTaskExecutorRule which should be replaced
// with a dependency on the real library once b/ is cleared.
override fun starting(description: Description) {
super.starting(description)
ArchTaskExecutor.getInstance()
.setDelegate(
object : TaskExecutor() {
override fun executeOnDiskIO(runnable: Runnable) {
runnable.run()
}
override fun postToMainThread(runnable: Runnable) {
runnable.run()
}
override fun isMainThread(): Boolean {
return true
}
}
)
}
override fun finished(description: Description) {
super.finished(description)
ArchTaskExecutor.getInstance().setDelegate(null)
}
}

View File

@@ -20,8 +20,6 @@ package com.android.systemui.lifecycle
import android.testing.TestableLooper.RunWithLooper
import android.view.View
import android.view.ViewTreeObserver
import androidx.arch.core.executor.ArchTaskExecutor
import androidx.arch.core.executor.TaskExecutor
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.test.filters.SmallTest
@@ -35,8 +33,6 @@ import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestWatcher
import org.junit.runner.Description
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.mockito.Mock
@@ -282,38 +278,4 @@ class RepeatWhenAttachedTest : SysuiTestCase() {
_invocations.add(Invocation(lifecycleOwner))
}
}
/**
* Test rule that makes ArchTaskExecutor main thread assertions pass. There is one such assert
* in LifecycleRegistry.
*/
class InstantTaskExecutorRule : TestWatcher() {
// TODO(b/240620122): This is a copy of
// androidx/arch/core/executor/testing/InstantTaskExecutorRule which should be replaced
// with a dependency on the real library once b/ is cleared.
override fun starting(description: Description) {
super.starting(description)
ArchTaskExecutor.getInstance()
.setDelegate(
object : TaskExecutor() {
override fun executeOnDiskIO(runnable: Runnable) {
runnable.run()
}
override fun postToMainThread(runnable: Runnable) {
runnable.run()
}
override fun isMainThread(): Boolean {
return true
}
}
)
}
override fun finished(description: Description) {
super.finished(description)
ArchTaskExecutor.getInstance().setDelegate(null)
}
}
}