[Gradle|TestFramework] fix: made the tearDown more tolerant to failures in the setUp

GitOrigin-RevId: e6cfb03986d9ccaf181daf66f62a171b2db8f7c8
This commit is contained in:
Sergei Vorobyov
2024-03-29 14:21:33 +00:00
committed by intellij-monorepo-bot
parent 03e140a2da
commit fcdd70af41
3 changed files with 32 additions and 29 deletions
@@ -15,7 +15,11 @@ import org.junit.jupiter.api.AfterEach
abstract class GradleExecutionBaseTestCase : GradleProjectTestCase() {
private lateinit var executionFixture: GradleExecutionTestFixture
private var _executionFixture: GradleExecutionTestFixture? = null
private val executionFixture: GradleExecutionTestFixture
get() = requireNotNull(_executionFixture) {
"Gradle execution fixture wasn't setup. Please use [GradleBaseTestCase.test] function inside your tests."
}
fun getExecutionEnvironment(): ExecutionEnvironment {
return executionFixture.getExecutionEnvironment()
@@ -30,13 +34,14 @@ abstract class GradleExecutionBaseTestCase : GradleProjectTestCase() {
cleanupProjectBuildDirectory()
executionFixture = GradleExecutionTestFixtureImpl(project, projectRoot)
_executionFixture = GradleExecutionTestFixtureImpl(project, projectRoot)
executionFixture.setUp()
}
override fun tearDown() {
runAll(
{ executionFixture.tearDown() },
{ _executionFixture?.tearDown() },
{ _executionFixture = null },
{ cleanupProjectBuildDirectory() },
{ super.tearDown() },
)
@@ -11,28 +11,26 @@ import org.junit.jupiter.api.AfterAll
@GradleProjectTestApplication
abstract class GradleProjectBaseTestCase {
private var fixture: GradleProjectTestFixture? = null
private var _gradleFixture: GradleProjectTestFixture? = null
val gradleFixture: GradleProjectTestFixture
get() = requireNotNull(fixture) {
"Gradle fixture isn't setup. Please use [GradleBaseTestCase.test] function inside your tests."
get() = requireNotNull(_gradleFixture) {
"Gradle fixture wasn't setup. Please use [GradleBaseTestCase.test] function inside your tests."
}
open fun setUp() = Unit
open fun tearDown() = Unit
open fun patchFixtureBuilder(fixtureBuilder: GradleTestFixtureBuilder): GradleTestFixtureBuilder = fixtureBuilder
open fun test(gradleVersion: GradleVersion, fixtureBuilder: GradleTestFixtureBuilder, test: () -> Unit) {
val patchedBuilder = patchFixtureBuilder(fixtureBuilder)
fixture = getOrCreateGradleTestFixture(gradleVersion, patchedBuilder)
setUp()
runAll(
{ test() },
{
_gradleFixture = getOrCreateGradleTestFixture(gradleVersion, fixtureBuilder)
setUp()
test()
},
{ tearDown() },
{ rollbackOrDestroyGradleTestFixture(gradleFixture) },
{ fixture = null }
{ _gradleFixture?.let { rollbackOrDestroyGradleTestFixture(it) } },
{ _gradleFixture = null }
)
}
@@ -32,12 +32,18 @@ internal class GradleProjectTestFixtureImpl private constructor(
override val fileFixture: FileTestFixture
) : GradleProjectTestFixture {
private lateinit var _project: Project
private lateinit var testDisposable: Disposable
private var _testDisposable: Disposable? = null
private val testDisposable: Disposable
get() = requireNotNull(_testDisposable) {
"Gradle fixture wasn't setup. Please use [GradleBaseTestCase.test] function inside your tests."
}
private var _project: Project? = null
override val project: Project
get() = _project
get() = requireNotNull(_project) {
"Gradle fixture wasn't setup. Please use [GradleBaseTestCase.test] function inside your tests."
}
override val module: Module
get() = project.modules.single { it.name == project.name }
@@ -57,7 +63,7 @@ internal class GradleProjectTestFixtureImpl private constructor(
)
override fun setUp() {
testDisposable = Disposer.newDisposable()
_testDisposable = Disposer.newDisposable()
sdkFixture.setUp()
fileFixture.setUp()
@@ -65,21 +71,15 @@ internal class GradleProjectTestFixtureImpl private constructor(
installGradleProjectReloadWatcher()
_project = runBlocking { openProjectAsync(fileFixture.root) }
IndexingTestUtil.waitUntilIndexesAreReady(_project)
IndexingTestUtil.waitUntilIndexesAreReady(project)
}
override fun tearDown() {
runAll(
{ ApplicationManager.getApplication().serviceIfCreated<FileBasedIndexEx>()?.waitUntilIndicesAreInitialized() },
{ runBlocking { fileFixture.root.refreshAndAwait() } },
{
runBlocking {
if (this@GradleProjectTestFixtureImpl::_project.isInitialized) {
_project.closeProjectAsync()
}
}
},
{ Disposer.dispose(testDisposable) },
{ runBlocking { _project?.closeProjectAsync() } },
{ _testDisposable?.let { Disposer.dispose(it) } },
{ fileFixture.tearDown() },
{ sdkFixture.tearDown() }
)