IDEA-340613 [Gradle|TestFramework] fix: reuse JUnit 5 waiting logic for the platform async activities

GitOrigin-RevId: c8f10565571195da8281818505382bae2172372a
This commit is contained in:
Sergei Vorobyov
2024-03-18 19:23:20 +01:00
committed by intellij-monorepo-bot
parent 5d2aa3fa9b
commit d7314ef4d1
7 changed files with 102 additions and 65 deletions

View File

@@ -28,7 +28,7 @@ internal class TestApplicationExtension : BeforeAllCallback, AfterEachCallback {
}
@TestOnly
private fun ExtensionContext.testApplication(): Result<Unit> {
fun ExtensionContext.testApplication(): Result<Unit> {
val store = root.getStore(ExtensionContext.Namespace.GLOBAL)
val resource = store.getOrComputeIfAbsent("application") {
TestApplicationResource(initTestApplication())

View File

@@ -1,22 +1,14 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gradle.testFramework
import com.intellij.openapi.application.invokeAndWaitIfNeeded
import com.intellij.openapi.roots.impl.libraries.LibraryTableTracker
import com.intellij.openapi.vfs.impl.VirtualFilePointerTracker
import com.intellij.testFramework.SdkLeakTracker
import com.intellij.testFramework.common.runAll
import com.intellij.testFramework.fixtures.BareTestFixture
import com.intellij.testFramework.fixtures.IdeaTestFixture
import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory
import org.gradle.util.GradleVersion
import org.jetbrains.plugins.gradle.testFramework.fixtures.GradleProjectTestFixture
import org.jetbrains.plugins.gradle.testFramework.fixtures.tracker.ESListenerLeakTracker
import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradleTestApplication
import org.jetbrains.plugins.gradle.testFramework.util.onFailureCatching
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.BeforeAll
@GradleTestApplication
abstract class GradleProjectBaseTestCase {
private var fixture: GradleProjectTestFixture? = null
@@ -46,31 +38,13 @@ abstract class GradleProjectBaseTestCase {
companion object {
private lateinit var applicationFixture: ApplicationFixture
private lateinit var listenerLeakTracker: ESListenerLeakTracker
private val initializedFixtures = LinkedHashSet<FixtureId>()
private val fixtures = LinkedHashMap<FixtureId, GradleProjectTestFixture>()
@JvmStatic
@BeforeAll
fun setUpGradleBaseTestCase() {
applicationFixture = ApplicationFixture()
applicationFixture.setUp()
listenerLeakTracker = ESListenerLeakTracker()
listenerLeakTracker.setUp()
}
@JvmStatic
@AfterAll
fun tearDownGradleBaseTestCase() {
runAll(
{ destroyAllGradleFixtures() },
{ listenerLeakTracker.tearDown() },
{ applicationFixture.tearDown() }
)
destroyAllGradleFixtures()
}
private fun getOrCreateGradleTestFixture(gradleVersion: GradleVersion, builder: GradleTestFixtureBuilder): GradleProjectTestFixture {
@@ -114,35 +88,4 @@ abstract class GradleProjectBaseTestCase {
private fun GradleProjectTestFixture.getFixtureId() =
FixtureId(projectName, gradleVersion)
}
/**
* @see com.intellij.testFramework.junit5.TestApplication
*/
private class ApplicationFixture : IdeaTestFixture {
private lateinit var bareFixture: BareTestFixture
private lateinit var virtualFilePointerTracker: VirtualFilePointerTracker
private lateinit var libraryLeakTracker: LibraryTableTracker
private lateinit var sdkLeakTracker: SdkLeakTracker
override fun setUp() {
bareFixture = IdeaTestFixtureFactory.getFixtureFactory()
.createBareFixture()
bareFixture.setUp()
virtualFilePointerTracker = VirtualFilePointerTracker()
libraryLeakTracker = LibraryTableTracker()
sdkLeakTracker = SdkLeakTracker()
}
override fun tearDown() {
runAll(
{ invokeAndWaitIfNeeded { sdkLeakTracker.checkForJdkTableLeaks() } },
{ libraryLeakTracker.assertDisposed() },
{ virtualFilePointerTracker.assertPointersAreDisposed() },
{ bareFixture.tearDown() }
)
}
}
}

View File

@@ -0,0 +1,17 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gradle.testFramework.fixtures.application
import org.jetbrains.annotations.TestOnly
import org.junit.jupiter.api.extension.ExtendWith
/**
* @see com.intellij.testFramework.junit5.TestApplication
*/
@TestOnly
@Target(AnnotationTarget.CLASS)
@ExtendWith(
GradleTestApplicationExtension::class,
GradleTestApplicationLeakTrackerExtension::class,
)
annotation class GradleTestApplication {
}

View File

@@ -0,0 +1,24 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gradle.testFramework.fixtures.application
import com.intellij.openapi.application.ApplicationManager
import com.intellij.testFramework.common.cleanApplicationState
import com.intellij.testFramework.junit5.impl.testApplication
import org.jetbrains.annotations.TestOnly
import org.junit.jupiter.api.extension.AfterAllCallback
import org.junit.jupiter.api.extension.BeforeAllCallback
import org.junit.jupiter.api.extension.ExtensionContext
/**
* @see com.intellij.testFramework.junit5.impl.TestApplicationExtension
*/
@TestOnly
class GradleTestApplicationExtension : BeforeAllCallback, AfterAllCallback {
override fun beforeAll(context: ExtensionContext) {
context.testApplication().getOrThrow()
}
override fun afterAll(context: ExtensionContext) {
ApplicationManager.getApplication().cleanApplicationState()
}
}

View File

@@ -0,0 +1,53 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.plugins.gradle.testFramework.fixtures.application
import com.intellij.openapi.application.invokeAndWaitIfNeeded
import com.intellij.openapi.roots.impl.libraries.LibraryTableTracker
import com.intellij.openapi.vfs.impl.VirtualFilePointerTracker
import com.intellij.testFramework.SdkLeakTracker
import com.intellij.testFramework.common.runAll
import org.jetbrains.annotations.TestOnly
import org.jetbrains.plugins.gradle.testFramework.fixtures.tracker.ExternalSystemListenerLeakTracker
import org.junit.jupiter.api.extension.AfterAllCallback
import org.junit.jupiter.api.extension.BeforeAllCallback
import org.junit.jupiter.api.extension.ExtensionContext
/**
* @see com.intellij.testFramework.junit5.impl.TestApplicationLeakTrackerExtension
*/
@TestOnly
class GradleTestApplicationLeakTrackerExtension : BeforeAllCallback, AfterAllCallback {
companion object {
private const val LEAK_TRACKERS_KEY = "Gradle application-level leak trackers"
}
override fun beforeAll(context: ExtensionContext) {
context.getStore(ExtensionContext.Namespace.GLOBAL)
.put(LEAK_TRACKERS_KEY, GradleLeakTrackers())
}
override fun afterAll(context: ExtensionContext) {
context.getStore(ExtensionContext.Namespace.GLOBAL)
.get(LEAK_TRACKERS_KEY, GradleLeakTrackers::class.java)
.checkNothingLeaked()
}
@TestOnly
private class GradleLeakTrackers {
val sdkLeakTracker = SdkLeakTracker()
val libraryLeakTracker = LibraryTableTracker()
val virtualFilePointerTracker = VirtualFilePointerTracker()
val externalSystemListenerLeakTracker = ExternalSystemListenerLeakTracker()
fun checkNothingLeaked() {
runAll(
{ externalSystemListenerLeakTracker.tearDown() },
{ invokeAndWaitIfNeeded { sdkLeakTracker.checkForJdkTableLeaks() } },
{ libraryLeakTracker.assertDisposed() },
{ virtualFilePointerTracker.assertPointersAreDisposed() },
)
}
}
}

View File

@@ -23,7 +23,7 @@ import org.gradle.util.GradleVersion
import org.jetbrains.plugins.gradle.service.project.open.linkAndRefreshGradleProject
import org.jetbrains.plugins.gradle.testFramework.fixtures.GradleTestFixture
import org.jetbrains.plugins.gradle.testFramework.fixtures.GradleTestFixtureFactory
import org.jetbrains.plugins.gradle.testFramework.fixtures.tracker.ESListenerLeakTracker
import org.jetbrains.plugins.gradle.testFramework.fixtures.tracker.ExternalSystemListenerLeakTracker
import org.jetbrains.plugins.gradle.testFramework.fixtures.tracker.OperationLeakTracker
import org.jetbrains.plugins.gradle.util.GradleConstants
import org.jetbrains.plugins.gradle.util.getGradleProjectReloadOperation
@@ -35,7 +35,7 @@ class GradleTestFixtureImpl(
override val gradleVersion: GradleVersion,
) : GradleTestFixture {
private lateinit var listenerLeakTracker: ESListenerLeakTracker
private lateinit var listenerLeakTracker: ExternalSystemListenerLeakTracker
private lateinit var reloadLeakTracker: OperationLeakTracker
private lateinit var testDisposable: Disposable
@@ -48,7 +48,7 @@ class GradleTestFixtureImpl(
override lateinit var gradleJvm: String
override fun setUp() {
listenerLeakTracker = ESListenerLeakTracker()
listenerLeakTracker = ExternalSystemListenerLeakTracker()
listenerLeakTracker.setUp()
reloadLeakTracker = OperationLeakTracker { getGradleProjectReloadOperation(it) }

View File

@@ -5,7 +5,7 @@ import com.intellij.openapi.externalSystem.service.remote.ExternalSystemProgress
import com.intellij.testFramework.common.runAll
import com.intellij.testFramework.fixtures.IdeaTestFixture
class ESListenerLeakTracker : IdeaTestFixture {
class ExternalSystemListenerLeakTracker : IdeaTestFixture {
override fun setUp() = Unit