diff --git a/java/java-tests/testData/vfs/sample.jar b/java/java-tests/testData/vfs/sample.jar deleted file mode 100644 index acbe629b519d..000000000000 Binary files a/java/java-tests/testData/vfs/sample.jar and /dev/null differ diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/ClsResolveTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/ClsResolveTest.java new file mode 100644 index 000000000000..f038cc73a83b --- /dev/null +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/ClsResolveTest.java @@ -0,0 +1,102 @@ +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.java.codeInsight; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ContentEntry; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.fixtures.*; +import com.intellij.testFramework.fixtures.impl.LightTempDirTestFixtureImpl; +import com.intellij.testFramework.rules.TempDirectory; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.implementation.StubMethod; +import net.bytebuddy.jar.asm.Opcodes; +import org.jetbrains.annotations.NotNull; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.jar.JarOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import static com.intellij.testFramework.EdtTestUtil.runInEdtAndWait; + +public class ClsResolveTest { + @Rule public TempDirectory tempDir = new TempDirectory(); + + private JavaCodeInsightTestFixture myFixture; + + @Before + public void setUp() throws Exception { + Path jar = generateMutantJar(); + DefaultLightProjectDescriptor descriptor = new DefaultLightProjectDescriptor() { + @Override + public void configureModule(@NotNull Module module, @NotNull ModifiableRootModel model, @NotNull ContentEntry contentEntry) { + super.configureModule(module, model, contentEntry); + PsiTestUtil.addLibrary(model, "mutant", jar.getParent().toString(), jar.getFileName().toString()); + } + }; + TestFixtureBuilder builder = IdeaTestFixtureFactory.getFixtureFactory().createLightFixtureBuilder(descriptor); + myFixture = JavaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(builder.getFixture(), new LightTempDirTestFixtureImpl(true)); + myFixture.setUp(); + } + + // + private Path generateMutantJar() { + try { + Path file = tempDir.newFile("mutant.jar").toPath(); + try (JarOutputStream jar = new JarOutputStream(Files.newOutputStream(file))) { + writeEntry(jar, "mutant1/aB.class", classBytes("mutant1.aB", "m1")); + writeEntry(jar, "mutant1/ab.class", classBytes("mutant1.ab", "m2")); + writeEntry(jar, "MUTANT2/C.class", classBytes("MUTANT2.C", "m3")); + writeEntry(jar, "mutant2/D.class", classBytes("mutant2.D", "m4")); + } + return file; + } + catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private static void writeEntry(ZipOutputStream zip, String name, byte[] data) throws IOException { + ZipEntry entry = new ZipEntry(name); + zip.putNextEntry(entry); + zip.write(data); + zip.closeEntry(); + } + + private static byte[] classBytes(String name, String method) { + return new ByteBuddy() + .subclass(Object.class).modifiers(Opcodes.ACC_PUBLIC).name(name) + .defineMethod(method, void.class, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC).intercept(StubMethod.INSTANCE) + .make().getBytes(); + } + // + + @After + public void tearDown() throws Exception { + myFixture.tearDown(); + myFixture = null; + } + + @Test + public void resolveIntoMutantJar() { + runInEdtAndWait(() -> { + myFixture.configureByText( + "test.java", + "class test {{\n" + + " mutant1.aB.m1();\n" + + " mutant1.ab.m2();\n" + + " MUTANT2.C.m3();\n" + + " mutant2.D.m4();\n" + + "}}"); + myFixture.checkHighlighting(); + }); + } +} \ No newline at end of file diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/JarFileSystemTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/JarFileSystemTest.java index 06544af0691e..3bbdf5bde69e 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/JarFileSystemTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/local/JarFileSystemTest.java @@ -3,7 +3,6 @@ package com.intellij.openapi.vfs.local; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; -import com.intellij.openapi.application.ex.PathManagerEx; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileAttributes; import com.intellij.openapi.util.io.FileUtil; @@ -18,7 +17,6 @@ import com.intellij.openapi.vfs.newvfs.BulkFileListener; import com.intellij.openapi.vfs.newvfs.events.VFileContentChangeEvent; import com.intellij.openapi.vfs.newvfs.events.VFileEvent; import com.intellij.testFramework.PlatformTestUtil; -import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.fixtures.BareTestFixtureTestCase; import com.intellij.testFramework.rules.TempDirectory; import com.intellij.util.containers.ContainerUtil; @@ -231,6 +229,11 @@ public class JarFileSystemTest extends BareTestFixtureTestCase { writeEntry(zip, "a/b"); writeEntry(zip, "a/b/c.txt"); writeEntry(zip, "x\\y\\z.txt"); + writeEntry(zip, "/x/f.txt"); + writeEntry(zip, "d1/aB"); + writeEntry(zip, "d1/ab"); + writeEntry(zip, "D2/f1"); + writeEntry(zip, "d2/f2"); } String rootPath = FileUtil.toSystemIndependentName(testZip.getPath()) + JarFileSystem.JAR_SEPARATOR; @@ -247,7 +250,8 @@ public class JarFileSystemTest extends BareTestFixtureTestCase { return true; } }); - assertThat(entries).containsExactlyInAnyOrder("a/", "a/b/", "a/b/c.txt", "x/", "x/y/", "x/y/z.txt"); + assertThat(entries).containsExactlyInAnyOrder( + "a/", "a/b/", "a/b/c.txt", "x/", "x/y/", "x/f.txt", "x/y/z.txt", "d1/", "d1/aB", "d1/ab", "D2/", "D2/f1", "d2/", "d2/f2"); } private static void writeEntry(ZipOutputStream zip, String name) throws IOException { @@ -301,19 +305,6 @@ public class JarFileSystemTest extends BareTestFixtureTestCase { } } - @Test - public void testCrazyJarWithDuplicateEntriesMustNotCrashAnything() { - String jarPath = PathManagerEx.getTestDataPath() + "/vfs/sample.jar"; - VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByPath(jarPath); - assertNotNull(vFile); - - VirtualFile jarRoot = JarFileSystem.getInstance().getRootByLocal(vFile); - assertNotNull(jarRoot); - String[] children = JarFileSystem.getInstance().list(jarRoot); - assertEquals("com", UsefulTestCase.assertOneElement(children)); - assertEquals("Hello.class", UsefulTestCase.assertOneElement(JarFileSystem.getInstance().list(jarRoot.findFileByRelativePath("com")))); - } - @NotNull private static VirtualFile findByPath(String path) { VirtualFile file = JarFileSystem.getInstance().findFileByPath(path);