diff --git a/.idea/libraries/intellij_coverage.xml b/.idea/libraries/intellij_coverage.xml index a9c4c5364424..9c3a66c64d44 100644 --- a/.idea/libraries/intellij_coverage.xml +++ b/.idea/libraries/intellij_coverage.xml @@ -1,8 +1,8 @@ - + - + diff --git a/.idea/libraries/intellij_test_discovery.xml b/.idea/libraries/intellij_test_discovery.xml index 5e0dc0ad6632..c6a6560030bf 100644 --- a/.idea/libraries/intellij_test_discovery.xml +++ b/.idea/libraries/intellij_test_discovery.xml @@ -1,8 +1,8 @@ - + - + diff --git a/plugins/junit5_rt_tests/test/com/intellij/testDiscovery/TestDiscoveryJUnitIntegrationTest.java b/plugins/junit5_rt_tests/test/com/intellij/testDiscovery/TestDiscoveryJUnitIntegrationTest.java index b49796339f07..a0b703949d4c 100644 --- a/plugins/junit5_rt_tests/test/com/intellij/testDiscovery/TestDiscoveryJUnitIntegrationTest.java +++ b/plugins/junit5_rt_tests/test/com/intellij/testDiscovery/TestDiscoveryJUnitIntegrationTest.java @@ -36,6 +36,7 @@ import java.util.Set; import java.util.stream.Collectors; // TODO parametrize by 1) junit version 2) TD protocol +// TODO get agent from sources public class TestDiscoveryJUnitIntegrationTest extends JUnitAbstractIntegrationTest { private static final String myJUnitVersion = "4.12"; private CompilerTester myCompilerTester; @@ -84,6 +85,11 @@ public class TestDiscoveryJUnitIntegrationTest extends JUnitAbstractIntegrationT assertTestDiscoveryIndex("Person", "getName", t("PersonTest1", "testPersonName"), t("PersonTest2", "testPersonName")); } + public void testClassLoaderMagic() throws Exception { + runTestConfiguration(findClass(myModule, "Test")); + assertTestDiscoveryIndex("Magic", "abracadabra", t("Test", "testClassLoaderMagic")); + } + public void _testConstructor() throws Exception { runTestConfiguration(findClass(myModule, "PersonTest")); assertTestDiscoveryIndex("Person", "", t("PersonTest", "testPerson")); diff --git a/plugins/junit5_rt_tests/testData/integration/testDiscovery/classLoaderMagic/src/MyClassLoader.java b/plugins/junit5_rt_tests/testData/integration/testDiscovery/classLoaderMagic/src/MyClassLoader.java new file mode 100644 index 000000000000..049ac87dfed3 --- /dev/null +++ b/plugins/junit5_rt_tests/testData/integration/testDiscovery/classLoaderMagic/src/MyClassLoader.java @@ -0,0 +1,51 @@ +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; + +public class MyClassLoader extends ClassLoader { + + public MyClassLoader(ClassLoader extClassLoader) { + super(extClassLoader); + } + + public static void main(String[] args) throws Exception { + doMagic(ClassLoader.getSystemClassLoader().getParent()); + } + + public static void doMagic(ClassLoader extClassLoader) throws Exception { + byte[] bytes = getMagicClassBytes(); + MyClassLoader classLoader = new MyClassLoader(extClassLoader); + classLoader.defineClass("Magic", bytes, 0, bytes.length); + Class magic = classLoader.loadClass("Magic"); + Method abracadabra = magic.getDeclaredMethod("abracadabra"); + abracadabra.setAccessible(true); + abracadabra.invoke(null); + } + + private static byte[] getMagicClassBytes() throws IOException { + InputStream is = getSystemClassLoader().getResourceAsStream("Magic.class"); + try { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + + int nRead; + byte[] data = new byte[16384]; + + while ((nRead = is.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + + buffer.flush(); + return buffer.toByteArray(); + } + finally { + is.close(); + } + } +} + +class Magic { + public static void abracadabra() { + System.out.println("abracadabra"); + } +} \ No newline at end of file diff --git a/plugins/junit5_rt_tests/testData/integration/testDiscovery/classLoaderMagic/test/Test.java b/plugins/junit5_rt_tests/testData/integration/testDiscovery/classLoaderMagic/test/Test.java new file mode 100644 index 000000000000..558d83166f82 --- /dev/null +++ b/plugins/junit5_rt_tests/testData/integration/testDiscovery/classLoaderMagic/test/Test.java @@ -0,0 +1,9 @@ +public class Test { + @org.junit.Test + public void testClassLoaderMagic() throws Exception { + ClassLoader cl = ClassLoader.getSystemClassLoader().getParent(); + org.junit.Assert.assertTrue(cl.getClass().getName().contains("ExtClassLoader")); + org.junit.Assert.assertTrue(Class.forName("com.intellij.rt.coverage.data.TestDiscoveryProjectData").getClassLoader() == null); + MyClassLoader.doMagic(cl); + } +} \ No newline at end of file