diff --git a/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt b/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt index 81b95104e287..83955896944b 100644 --- a/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt +++ b/platform/testFramework/src/com/intellij/testFramework/FixtureRule.kt @@ -32,6 +32,7 @@ import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.impl.VirtualFilePointerTracker +import com.intellij.platform.backend.workspace.WorkspaceModelCache import com.intellij.project.TestProjectManager import com.intellij.project.stateStore import com.intellij.util.containers.forEachGuaranteed @@ -432,11 +433,17 @@ private inline fun closeOpenedProjectsIfFailImpl(closeProject: Project.() -> private fun Project.closeProject(save: Boolean = false) { invokeAndWaitIfNeeded { + if (save) { + saveWorkspaceModel() + } ProjectManagerEx.getInstanceEx().forceCloseProject(this, save = save) } } suspend fun Project.closeProjectAsync(save: Boolean = false) { + if (save) { + saveWorkspaceModel() + } ProjectManagerEx.getInstanceEx().forceCloseProjectAsync(this, save = save) } @@ -579,6 +586,14 @@ suspend fun createOrLoadProject( createOrLoadProject(projectPath = file, loadComponentState = loadComponentState, options = options, task = task) } +private fun Project.saveWorkspaceModel() { + val workspaceModelCache = WorkspaceModelCache.getInstance(this) + requireNotNull(workspaceModelCache) { + "WorkspaceModelCache should be enabled explicitly if you need to save the project in tests." + } + workspaceModelCache.saveCacheNow() +} + private suspend fun createOrLoadProject(projectPath: Path, loadComponentState: Boolean, options: OpenProjectTask, diff --git a/plugins/gradle/java/testSources/setup/GradleCreateProjectTest.kt b/plugins/gradle/java/testSources/setup/GradleCreateProjectTest.kt index cb189d3b3cb8..19f312587448 100644 --- a/plugins/gradle/java/testSources/setup/GradleCreateProjectTest.kt +++ b/plugins/gradle/java/testSources/setup/GradleCreateProjectTest.kt @@ -6,9 +6,12 @@ import com.intellij.ide.projectWizard.generators.BuildSystemJavaNewProjectWizard import com.intellij.ide.wizard.NewProjectWizardBaseData.Companion.baseData import com.intellij.idea.IJIgnore import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil +import com.intellij.openapi.util.Disposer +import com.intellij.openapi.util.use import com.intellij.testFramework.useProjectAsync import com.intellij.testFramework.utils.module.assertModules import com.intellij.testFramework.withProjectAsync +import com.intellij.workspaceModel.ide.impl.WorkspaceModelCacheImpl import kotlinx.coroutines.runBlocking import org.jetbrains.plugins.gradle.service.project.wizard.GradleJavaNewProjectWizardData.Companion.javaGradleData import org.jetbrains.plugins.gradle.service.project.wizard.GradleNewProjectWizardStep.GradleDsl @@ -20,8 +23,8 @@ import org.junit.jupiter.api.Test class GradleCreateProjectTest : GradleCreateProjectTestCase() { @Test - fun `test project create`() { - runBlocking { + fun `test project re-create`() = runBlocking { + Disposer.newDisposable().use { disposable -> val projectInfo = projectInfo("project") { withJavaBuildFile() withSettingsFile { @@ -36,6 +39,8 @@ class GradleCreateProjectTest : GradleCreateProjectTestCase() { withJavaBuildFile() } } + + WorkspaceModelCacheImpl.forceEnableCaching(disposable) createProjectByWizard(projectInfo) .useProjectAsync(save = true) { project -> assertProjectState(project, projectInfo) diff --git a/plugins/gradle/java/testSources/setup/GradleOpenProjectTest.kt b/plugins/gradle/java/testSources/setup/GradleOpenProjectTest.kt index 79389e0c71b5..0b2f0057437e 100644 --- a/plugins/gradle/java/testSources/setup/GradleOpenProjectTest.kt +++ b/plugins/gradle/java/testSources/setup/GradleOpenProjectTest.kt @@ -3,6 +3,8 @@ package org.jetbrains.plugins.gradle.setup import com.intellij.codeHighlighting.HighlightDisplayLevel import com.intellij.openapi.application.writeAction +import com.intellij.openapi.util.Disposer +import com.intellij.openapi.util.use import com.intellij.openapi.vfs.writeText import com.intellij.profile.codeInspection.InspectionProfileManager import com.intellij.profile.codeInspection.ProjectInspectionProfileManager @@ -10,6 +12,7 @@ import com.intellij.testFramework.PlatformTestUtil import com.intellij.testFramework.useProjectAsync import com.intellij.testFramework.utils.module.assertModules import com.intellij.testFramework.utils.vfs.createFile +import com.intellij.workspaceModel.ide.impl.WorkspaceModelCacheImpl import kotlinx.coroutines.runBlocking import org.jetbrains.plugins.gradle.settings.GradleSettings import org.junit.jupiter.api.Assertions @@ -45,13 +48,14 @@ class GradleOpenProjectTest : GradleOpenProjectTestCase() { } @Test - fun `test project re-open`() { - runBlocking { + fun `test project re-open`() = runBlocking { + Disposer.newDisposable().use { disposable -> val projectInfo = getComplexProjectInfo("project") val linkedProjectInfo = getComplexProjectInfo("linked_project") initProject(projectInfo) initProject(linkedProjectInfo) + WorkspaceModelCacheImpl.forceEnableCaching(disposable) openProject("project") .useProjectAsync(save = true) { assertProjectState(it, projectInfo) @@ -67,13 +71,14 @@ class GradleOpenProjectTest : GradleOpenProjectTestCase() { } @Test - fun `test project re-import deprecation`() { - runBlocking { + fun `test project re-import deprecation`() = runBlocking { + Disposer.newDisposable().use { disposable -> val projectInfo = getComplexProjectInfo("project") val linkedProjectInfo = getComplexProjectInfo("linked_project") initProject(projectInfo) initProject(linkedProjectInfo) + WorkspaceModelCacheImpl.forceEnableCaching(disposable) openProject("project") .useProjectAsync(save = true) { assertProjectState(it, projectInfo) diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testFramework/fixtures/impl/GradleProjectTestFixtureImpl.kt b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testFramework/fixtures/impl/GradleProjectTestFixtureImpl.kt index 2c0def5691b3..2eb7c2a8bd09 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testFramework/fixtures/impl/GradleProjectTestFixtureImpl.kt +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/testFramework/fixtures/impl/GradleProjectTestFixtureImpl.kt @@ -9,11 +9,13 @@ import com.intellij.openapi.observable.operation.core.whenOperationStarted import com.intellij.openapi.project.Project import com.intellij.openapi.project.modules import com.intellij.openapi.util.Disposer +import com.intellij.openapi.util.use import com.intellij.openapi.vfs.VirtualFile import com.intellij.testFramework.* import com.intellij.testFramework.common.runAll import com.intellij.testFramework.fixtures.SdkTestFixture import com.intellij.util.indexing.FileBasedIndexEx +import com.intellij.workspaceModel.ide.impl.WorkspaceModelCacheImpl import kotlinx.coroutines.runBlocking import org.gradle.util.GradleVersion import org.jetbrains.plugins.gradle.service.project.wizard.util.generateGradleWrapper @@ -65,6 +67,7 @@ internal class GradleProjectTestFixtureImpl private constructor( override fun setUp() { _testDisposable = Disposer.newDisposable() + WorkspaceModelCacheImpl.forceEnableCaching(testDisposable) sdkFixture.setUp() fileFixture.setUp() diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenSetupProjectTest.kt b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenSetupProjectTest.kt index abd85f95300a..2121cda50208 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenSetupProjectTest.kt +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MavenSetupProjectTest.kt @@ -7,6 +7,7 @@ import com.intellij.openapi.project.getProjectCacheFileName import com.intellij.openapi.util.registry.Registry import com.intellij.testFramework.openProjectAsync import com.intellij.testFramework.useProjectAsync +import com.intellij.workspaceModel.ide.impl.WorkspaceModelCacheImpl import kotlinx.coroutines.runBlocking import org.jetbrains.idea.maven.project.MavenProjectsManager import org.junit.Test @@ -39,7 +40,6 @@ class MavenSetupProjectTest : MavenSetupProjectTestCase() { openProjectAsync(projectInfo.projectFile) }.useProjectAsync { assertProjectState(it, projectInfo) - } } @@ -50,7 +50,6 @@ class MavenSetupProjectTest : MavenSetupProjectTestCase() { importProjectActionAsync(projectInfo.projectFile) }.useProjectAsync { assertProjectState(it, projectInfo) - } } @@ -97,6 +96,8 @@ class MavenSetupProjectTest : MavenSetupProjectTestCase() { fun `test project re-open`() = runBlocking { val projectInfo = generateProject("A") val linkedProjectInfo = generateProject("L") + + WorkspaceModelCacheImpl.forceEnableCaching(testRootDisposable) waitForImport { openProjectAsync(projectInfo.projectFile) }.useProjectAsync(save = true) { @@ -137,6 +138,8 @@ class MavenSetupProjectTest : MavenSetupProjectTestCase() { runBlocking { val projectInfo = ProjectInfo(projectPom, "project", "m (1)", "M (2)") + + WorkspaceModelCacheImpl.forceEnableCaching(testRootDisposable) waitForImport { openProjectAsync(projectInfo.projectFile) }.useProjectAsync(save = true) { @@ -154,6 +157,7 @@ class MavenSetupProjectTest : MavenSetupProjectTestCase() { val projectInfo = generateProject("A") val linkedProjectInfo = generateProject("L") + WorkspaceModelCacheImpl.forceEnableCaching(testRootDisposable) waitForImport { openProjectAsync(projectInfo.projectFile) }.useProjectAsync(save = true) { @@ -175,25 +179,26 @@ class MavenSetupProjectTest : MavenSetupProjectTestCase() { val projectInfo = generateProject("A") MavenProjectLegacyImporter.setAnswerToDeleteObsoleteModulesQuestion(true) - val p1 = openProjectAsync(projectInfo.projectFile) - p1.useProjectAsync(true) { - // initial state: workspace import is disabled, has not been forced yet - val mavenProjectsManager = MavenProjectsManager.getInstance(it) - mavenProjectsManager.importingSettings.isWorkspaceImportForciblyTurnedOn = false - waitForImportWithinTimeout(it) { - mavenProjectsManager.importingSettings.isWorkspaceImportEnabled = false - Unit - } - } + WorkspaceModelCacheImpl.forceEnableCaching(testRootDisposable) - val p2 = openProjectAsync(projectInfo.projectFile) - p2.useProjectAsync(true) { - // check that workspace import has been forced - val mavenProjectsManager = MavenProjectsManager.getInstance(it) - assertTrue(mavenProjectsManager.importingSettings.isWorkspaceImportEnabled) - // user still chooses legacy import - mavenProjectsManager.importingSettings.isWorkspaceImportEnabled = false - } + openProjectAsync(projectInfo.projectFile) + .useProjectAsync(save = true) { + // initial state: workspace import is disabled, has not been forced yet + val mavenProjectsManager = MavenProjectsManager.getInstance(it) + mavenProjectsManager.importingSettings.isWorkspaceImportForciblyTurnedOn = false + waitForImportWithinTimeout(it) { + mavenProjectsManager.importingSettings.isWorkspaceImportEnabled = false + } + } + + openProjectAsync(projectInfo.projectFile) + .useProjectAsync(save = true) { + // check that workspace import has been forced + val mavenProjectsManager = MavenProjectsManager.getInstance(it) + assertTrue(mavenProjectsManager.importingSettings.isWorkspaceImportEnabled) + // user still chooses legacy import + mavenProjectsManager.importingSettings.isWorkspaceImportEnabled = false + } val projectFileDir = projectInfo.projectFile.parent.toNioPath() val moduleFilePath = appSystemDir @@ -211,11 +216,11 @@ class MavenSetupProjectTest : MavenSetupProjectTestCase() { assertTrue("Module file is empty", Files.size(moduleFilePath) > 0) } - val p3 = openProjectAsync(projectInfo.projectFile) - p3.useProjectAsync(true) { - // check that workspace import has not been forced twice - val mavenProjectsManager = MavenProjectsManager.getInstance(it) - assertFalse(mavenProjectsManager.importingSettings.isWorkspaceImportEnabled) - } + openProjectAsync(projectInfo.projectFile) + .useProjectAsync(save = true) { + // check that workspace import has not been forced twice + val mavenProjectsManager = MavenProjectsManager.getInstance(it) + assertFalse(mavenProjectsManager.importingSettings.isWorkspaceImportEnabled) + } } } \ No newline at end of file