From cb73ccd751c1e07304d4244c3e36d2c0d91abd51 Mon Sep 17 00:00:00 2001 From: Elena Shaverdova Date: Wed, 16 Oct 2024 23:18:00 +0200 Subject: [PATCH] Disable WorkspaceEntitiesLifecycleActivity in unit tests by default (cherry picked from commit 73934f5796d84186576ecc8b755f033dd24a7f9b) GitOrigin-RevId: 03ca9b870763aead7cfea780c1a081db8ac2966f --- .../com/intellij/util/indexing/IndexTest.java | 85 +++++++++++-------- .../WorkspaceEntitiesLifecycleActivity.kt | 9 +- .../WorkspaceEntityLifecycleSupporterUtils.kt | 45 ++++++++++ 3 files changed, 99 insertions(+), 40 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/util/indexing/IndexTest.java b/java/java-tests/testSrc/com/intellij/util/indexing/IndexTest.java index d2c6ca940dc0..805296732a00 100644 --- a/java/java-tests/testSrc/com/intellij/util/indexing/IndexTest.java +++ b/java/java-tests/testSrc/com/intellij/util/indexing/IndexTest.java @@ -87,7 +87,9 @@ import com.intellij.util.io.PersistentMapImpl; import com.intellij.util.ref.GCUtil; import com.intellij.util.ref.GCWatcher; import com.intellij.util.ui.UIUtil; +import com.intellij.workspaceModel.ide.impl.WorkspaceEntityLifecycleSupporterUtils; import com.siyeh.ig.JavaOverridingMethodUtil; +import kotlin.Unit; import org.intellij.lang.annotations.Language; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -547,7 +549,7 @@ public class IndexTest extends JavaCodeInsightFixtureTestCase { myFixture.addFileToProject("foo/Foo" + i + ".java", "package foo; class Foo" + i + " {}").getVirtualFile(); assertNotNull(JavaPsiFacade.getInstance(getProject()).findClass("foo.Foo" + i, scope)); String newName = "Bar" + i + ".java"; - WriteCommandAction.runWriteCommandAction(getProject(), (ThrowableComputable) () -> { + WriteCommandAction.runWriteCommandAction(getProject(), (ThrowableComputable)() -> { file.rename(this, newName); return null; }); @@ -597,12 +599,12 @@ public class IndexTest extends JavaCodeInsightFixtureTestCase { public void test_no_index_stamp_update_when_no_change_2() throws IOException { @Language("JAVA") String text0 = """ - class Main111 { - static void staticMethod(Object o) { - staticMethod(null); - } - } -"""; + class Main111 { + static void staticMethod(Object o) { + staticMethod(null); + } + } + """; final VirtualFile vFile = myFixture.configureByText(JavaFileType.INSTANCE, text0).getVirtualFile(); long stamp = FileBasedIndex.getInstance().getIndexModificationStamp(JavaNullMethodArgumentIndex.INDEX_ID, getProject()); JavaNullMethodArgumentIndex.MethodCallData data = new JavaNullMethodArgumentIndex.MethodCallData("staticMethod", 0); @@ -612,12 +614,12 @@ public class IndexTest extends JavaCodeInsightFixtureTestCase { assertEquals(files.iterator().next(), vFile); @Language("JAVA") final String text = """ - class Main { - static void staticMethod(Object o) { - staticMethod(null); - } - } -"""; + class Main { + static void staticMethod(Object o) { + staticMethod(null); + } + } + """; WriteAction.run(() -> VfsUtil.saveText(vFile, text)); PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); @@ -1438,40 +1440,51 @@ public class IndexTest extends JavaCodeInsightFixtureTestCase { }); } - public void test_indexes_should_be_wiped_after_scratch_removal() throws StorageException, IOException { - final VirtualFile file = - ScratchRootType.getInstance().createScratchFile(getProject(), "Foo.java", JavaLanguage.INSTANCE, "class Foo {}"); - int fileId = ((VirtualFileWithId)file).getId(); - deleteOnTearDown(file); + public void test_indexes_should_be_wiped_after_scratch_removal() { + WorkspaceEntityLifecycleSupporterUtils.INSTANCE.withAllEntitiesInWorkspaceFromProvidersDefinedOnEdt(getProject(), () -> { + final VirtualFile file = + ScratchRootType.getInstance().createScratchFile(getProject(), "Foo.java", JavaLanguage.INSTANCE, "class Foo {}"); + int fileId = ((VirtualFileWithId)file).getId(); + deleteOnTearDown(file); - FileBasedIndexImpl fileBasedIndex = (FileBasedIndexImpl)FileBasedIndex.getInstance(); - ID trigramId = TrigramIndex.INDEX_ID; + FileBasedIndexImpl fileBasedIndex = (FileBasedIndexImpl)FileBasedIndex.getInstance(); + ID trigramId = TrigramIndex.INDEX_ID; - fileBasedIndex.ensureUpToDate(trigramId, getProject(), GlobalSearchScope.everythingScope(getProject())); - assertNotEmpty(fileBasedIndex.getIndex(trigramId).getIndexedFileData(fileId).values()); + fileBasedIndex.ensureUpToDate(trigramId, getProject(), GlobalSearchScope.everythingScope(getProject())); + try { + assertNotEmpty(fileBasedIndex.getIndex(trigramId).getIndexedFileData(fileId).values()); - WriteCommandAction.runWriteCommandAction(getProject(), (ThrowableComputable)() -> { - file.delete(null); - return null; + WriteCommandAction.runWriteCommandAction(getProject(), (ThrowableComputable)() -> { + file.delete(null); + return null; + }); + fileBasedIndex.ensureUpToDate(trigramId, getProject(), GlobalSearchScope.everythingScope(getProject())); + assertEmpty(fileBasedIndex.getIndex(trigramId).getIndexedFileData(fileId).values()); + } + catch (StorageException | IOException e) { + throw new RuntimeException(e); + } + return Unit.INSTANCE; }); - fileBasedIndex.ensureUpToDate(trigramId, getProject(), GlobalSearchScope.everythingScope(getProject())); - assertEmpty(fileBasedIndex.getIndex(trigramId).getIndexedFileData(fileId).values()); } public void test_requestReindex() { - VirtualFile file = ScratchRootType.getInstance().createScratchFile(getProject(), "Foo.java", JavaLanguage.INSTANCE, "class Foo {}"); - deleteOnTearDown(file); + WorkspaceEntityLifecycleSupporterUtils.INSTANCE.withAllEntitiesInWorkspaceFromProvidersDefinedOnEdt(getProject(), () -> { + VirtualFile file = ScratchRootType.getInstance().createScratchFile(getProject(), "Foo.java", JavaLanguage.INSTANCE, "class Foo {}"); + deleteOnTearDown(file); - CountingFileBasedIndexExtension.registerCountingFileBasedIndex(getTestRootDisposable()); + CountingFileBasedIndexExtension.registerCountingFileBasedIndex(getTestRootDisposable()); - FileBasedIndex.getInstance().getFileData(CountingFileBasedIndexExtension.getINDEX_ID(), file, getProject()); - assertTrue(CountingFileBasedIndexExtension.getCOUNTER().get() > 0); + FileBasedIndex.getInstance().getFileData(CountingFileBasedIndexExtension.getINDEX_ID(), file, getProject()); + assertTrue(CountingFileBasedIndexExtension.getCOUNTER().get() > 0); - CountingFileBasedIndexExtension.getCOUNTER().set(0); - FileBasedIndex.getInstance().requestReindex(file); + CountingFileBasedIndexExtension.getCOUNTER().set(0); + FileBasedIndex.getInstance().requestReindex(file); - FileBasedIndex.getInstance().getFileData(CountingFileBasedIndexExtension.getINDEX_ID(), file, getProject()); - assertTrue(CountingFileBasedIndexExtension.getCOUNTER().get() > 0); + FileBasedIndex.getInstance().getFileData(CountingFileBasedIndexExtension.getINDEX_ID(), file, getProject()); + assertTrue(CountingFileBasedIndexExtension.getCOUNTER().get() > 0); + return Unit.INSTANCE; + }); } public void test_modified_excluded_file_not_present_in_index() throws StorageException, IOException { diff --git a/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntitiesLifecycleActivity.kt b/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntitiesLifecycleActivity.kt index f2bba4e3b9b3..a90950367f82 100644 --- a/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntitiesLifecycleActivity.kt +++ b/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntitiesLifecycleActivity.kt @@ -2,6 +2,7 @@ package com.intellij.workspaceModel.ide.impl import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.extensions.ExtensionNotApplicableException import com.intellij.openapi.extensions.ExtensionPointListener import com.intellij.openapi.extensions.PluginDescriptor import com.intellij.openapi.project.Project @@ -13,13 +14,13 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch private class WorkspaceEntitiesLifecycleActivity : ProjectActivity { - override suspend fun execute(project: Project) { + init { if (ApplicationManager.getApplication().isUnitTestMode) { - //todo GoGutterMarkerTest failed without it - ideally, we should setup project in tests without this activity - WorkspaceEntityLifecycleSupporterUtils.ensureAllEntitiesInWorkspaceAreAsProvidersDefined(project) - return + throw ExtensionNotApplicableException.create() } + } + override suspend fun execute(project: Project) { coroutineScope { WorkspaceEntityLifecycleSupporter.EP_NAME.addExtensionPointListener(this, object : ExtensionPointListener>> { override fun extensionAdded(extension: WorkspaceEntityLifecycleSupporter>, pluginDescriptor: PluginDescriptor) { diff --git a/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntityLifecycleSupporterUtils.kt b/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntityLifecycleSupporterUtils.kt index eec86cf3a0da..5c13ba130eeb 100644 --- a/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntityLifecycleSupporterUtils.kt +++ b/platform/projectModel-impl/src/com/intellij/workspaceModel/ide/impl/WorkspaceEntityLifecycleSupporterUtils.kt @@ -1,6 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.workspaceModel.ide.impl +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.backgroundWriteAction import com.intellij.openapi.components.serviceAsync import com.intellij.openapi.project.Project @@ -12,6 +13,7 @@ import com.intellij.platform.workspace.storage.MutableEntityStorage import com.intellij.platform.workspace.storage.WorkspaceEntity import com.intellij.platform.workspace.storage.toBuilder import org.jetbrains.annotations.ApiStatus +import org.jetbrains.annotations.TestOnly @ApiStatus.Internal object WorkspaceEntityLifecycleSupporterUtils { @@ -35,6 +37,49 @@ object WorkspaceEntityLifecycleSupporterUtils { builderRef.get()?.let { backgroundWriteAction { writeBuilder(workspaceModel, it) } } } + @TestOnly + fun withAllEntitiesInWorkspaceFromProvidersDefinedOnEdt(project: Project, block: () -> Unit) { + setUpAllEntitiesInWorkspaceFromProvidersDefinedOnEdt(project) + try { + block() + } + finally { + tearDownAllEntitiesInWorkspaceFromProvidersDefinedOnEdt(project) + } + } + + @TestOnly + fun setUpAllEntitiesInWorkspaceFromProvidersDefinedOnEdt(project: Project) { + val workspaceModel = WorkspaceModel.getInstance(project) + val snapshot = workspaceModel.currentSnapshot + val builderRef = Ref() + + WorkspaceEntityLifecycleSupporter.EP_NAME.forEachExtensionSafe { provider -> + ensureInitialized(project = project, provider = provider, snapshot = snapshot, builderRef = builderRef) + } + builderRef.get()?.let { ApplicationManager.getApplication().runWriteAction { writeBuilder(workspaceModel, it) } } + } + + @TestOnly + fun tearDownAllEntitiesInWorkspaceFromProvidersDefinedOnEdt(project: Project) { + val workspaceModel = WorkspaceModel.getInstance(project) + val snapshot = workspaceModel.currentSnapshot + val builderRef = Ref() + WorkspaceEntityLifecycleSupporter.EP_NAME.forEachExtensionSafe { provider -> + val entitiesIterator = snapshot.entities(provider.getEntityClass()).iterator() + if (entitiesIterator.hasNext()) { + var builder = builderRef.get() + if (builder == null) { + builder = snapshot.toBuilder() + builderRef.set(builder) + } + + entitiesIterator.forEach { builder.removeEntity(it) } + } + } + builderRef.get()?.let { ApplicationManager.getApplication().runWriteAction { writeBuilder(workspaceModel, it) } } + } + private fun writeBuilder(workspaceModel: WorkspaceModel, builder: MutableEntityStorage) { workspaceModel.updateProjectModel("ConstantEntitiesCheckActivity") { it.applyChangesFrom(builder)