|
| 1 | +package datadog.trace.bootstrap; |
| 2 | + |
| 3 | +import static org.junit.jupiter.api.Assertions.assertFalse; |
| 4 | +import static org.junit.jupiter.api.Assertions.assertTrue; |
| 5 | + |
| 6 | +import org.junit.jupiter.api.AfterEach; |
| 7 | +import org.junit.jupiter.api.BeforeEach; |
| 8 | +import org.junit.jupiter.api.Test; |
| 9 | +import org.junit.jupiter.params.ParameterizedTest; |
| 10 | +import org.junit.jupiter.params.provider.ValueSource; |
| 11 | + |
| 12 | +class AgentBootstrapAbortOnJdkToolTest { |
| 13 | + |
| 14 | + private String savedModuleMain; |
| 15 | + private String savedJavaCommand; |
| 16 | + |
| 17 | + @BeforeEach |
| 18 | + void saveAndClearProperties() { |
| 19 | + savedModuleMain = System.clearProperty("jdk.module.main"); |
| 20 | + savedJavaCommand = System.clearProperty("sun.java.command"); |
| 21 | + } |
| 22 | + |
| 23 | + @AfterEach |
| 24 | + void restoreProperties() { |
| 25 | + restoreProperty("jdk.module.main", savedModuleMain); |
| 26 | + restoreProperty("sun.java.command", savedJavaCommand); |
| 27 | + } |
| 28 | + |
| 29 | + private static void restoreProperty(String key, String previousValue) { |
| 30 | + if (previousValue == null) { |
| 31 | + System.clearProperty(key); |
| 32 | + } else { |
| 33 | + System.setProperty(key, previousValue); |
| 34 | + } |
| 35 | + } |
| 36 | + |
| 37 | + @Test |
| 38 | + void notAJdkToolWhenNoPropertiesSet() { |
| 39 | + assertFalse(AgentBootstrap.isJdkTool()); |
| 40 | + } |
| 41 | + |
| 42 | + @Test |
| 43 | + void notAJdkToolWhenCommandIsNotAKnownTool() { |
| 44 | + System.setProperty("sun.java.command", "com.example.MyApplication"); |
| 45 | + assertFalse(AgentBootstrap.isJdkTool()); |
| 46 | + } |
| 47 | + |
| 48 | + @Test |
| 49 | + void notAJdkToolWhenModuleMainIsNotAKnownTool() { |
| 50 | + System.setProperty("jdk.module.main", "com.example.myapp"); |
| 51 | + assertFalse(AgentBootstrap.isJdkTool()); |
| 52 | + } |
| 53 | + |
| 54 | + @ParameterizedTest |
| 55 | + @ValueSource( |
| 56 | + strings = { |
| 57 | + // Standard JDK 9+ module-based tools |
| 58 | + "java.base", // keytool |
| 59 | + "jdk.compiler", // javac |
| 60 | + "jdk.jartool", // jar |
| 61 | + "jdk.javadoc", // javadoc |
| 62 | + "jdk.jcmd", // jcmd |
| 63 | + "jdk.jconsole", // jconsole |
| 64 | + "jdk.jshell", // jshell |
| 65 | + "jdk.jfr", // jfr (JDK 9+) |
| 66 | + // OpenJ9 / Semeru 11+ module-based tools |
| 67 | + "openj9.dtfj", // jextract, jpackcore |
| 68 | + "openj9.dtfjview", // jdmpview |
| 69 | + "openj9.traceformat", // traceformat |
| 70 | + }) |
| 71 | + void isJdkToolByModuleMain(String moduleMain) { |
| 72 | + System.setProperty("jdk.module.main", moduleMain); |
| 73 | + assertTrue(AgentBootstrap.isJdkTool()); |
| 74 | + } |
| 75 | + |
| 76 | + @ParameterizedTest |
| 77 | + @ValueSource( |
| 78 | + strings = { |
| 79 | + // IBM J9 JDK 8 specific tool main classes |
| 80 | + "com.ibm.crypto.tools.KeyTool", // keytool |
| 81 | + "com.ibm.security.krb5.internal.tools.Kinit", // kinit |
| 82 | + "com.ibm.security.krb5.internal.tools.Klist", // klist |
| 83 | + "com.ibm.security.krb5.internal.tools.Ktab", // ktab |
| 84 | + "com.ibm.jvm.dtfjview.DTFJView", // jdmpview |
| 85 | + "com.ibm.jvm.j9.dump.extract.Main", // jextract |
| 86 | + "com.ibm.gsk.ikeyman.Ikeyman", // ikeyman |
| 87 | + "com.ibm.gsk.ikeyman.ikeycmd", // ikeycmd |
| 88 | + "com.ibm.CosNaming.TransientNameServer", // tnameserv |
| 89 | + "com.ibm.idl.toJavaPortable.Compile", // idlj |
| 90 | + // OpenJ9 / Semeru 8 specific tool main classes (OpenJ9 reimplementation of HotSpot tools) |
| 91 | + "openj9.tools.attach.diagnostics.tools.Jcmd", // jcmd |
| 92 | + "openj9.tools.attach.diagnostics.tools.Jps", // jps |
| 93 | + "openj9.tools.attach.diagnostics.tools.Jstat", // jstat |
| 94 | + "openj9.tools.attach.diagnostics.tools.Jmap", // jmap |
| 95 | + "openj9.tools.attach.diagnostics.tools.Jstack", // jstack |
| 96 | + "com.ibm.jvm.TraceFormat", // traceformat |
| 97 | + // Standard JDK 8 tool main classes (Corretto 8 / OpenJDK 8) |
| 98 | + "sun.tools.jar.Main", // jar |
| 99 | + "com.sun.tools.javac.Main", // javac |
| 100 | + "com.sun.tools.javadoc.Main", // javadoc |
| 101 | + "com.sun.tools.javap.Main", // javap |
| 102 | + "com.sun.tools.javah.Main", // javah |
| 103 | + "sun.security.tools.keytool.Main", // keytool |
| 104 | + "sun.security.tools.jarsigner.Main", // jarsigner |
| 105 | + "sun.security.tools.policytool.PolicyTool", // policytool |
| 106 | + "com.sun.tools.example.debug.tty.TTY", // jdb |
| 107 | + "com.sun.tools.jdeps.Main", // jdeps |
| 108 | + "sun.rmi.rmic.Main", // rmic |
| 109 | + "sun.rmi.registry.RegistryImpl", // rmiregistry |
| 110 | + "sun.rmi.server.Activation", // rmid |
| 111 | + "com.sun.tools.extcheck.Main", // extcheck |
| 112 | + "sun.tools.serialver.SerialVer", // serialver |
| 113 | + "sun.tools.native2ascii.Main", // native2ascii |
| 114 | + "com.sun.tools.internal.ws.WsGen", // wsgen |
| 115 | + "com.sun.tools.internal.ws.WsImport", // wsimport |
| 116 | + "com.sun.tools.internal.xjc.Driver", // xjc |
| 117 | + "com.sun.tools.internal.jxc.SchemaGenerator", // schemagen |
| 118 | + "com.sun.tools.script.shell.Main", // jrunscript |
| 119 | + "sun.tools.jconsole.JConsole", // jconsole |
| 120 | + "sun.applet.Main", // appletviewer |
| 121 | + "com.sun.corba.se.impl.naming.cosnaming.TransientNameServer", // tnameserv |
| 122 | + "com.sun.tools.corba.se.idl.toJavaPortable.Compile", // idlj |
| 123 | + "com.sun.corba.se.impl.activation.ORBD", // orbd |
| 124 | + "com.sun.corba.se.impl.activation.ServerTool", // servertool |
| 125 | + "sun.tools.jps.Jps", // jps |
| 126 | + "sun.tools.jstack.JStack", // jstack |
| 127 | + "sun.tools.jmap.JMap", // jmap |
| 128 | + "sun.tools.jinfo.JInfo", // jinfo |
| 129 | + "com.sun.tools.hat.Main", // jhat |
| 130 | + "sun.tools.jstat.Jstat", // jstat |
| 131 | + "sun.tools.jstatd.Jstatd", // jstatd |
| 132 | + "sun.tools.jcmd.JCmd", // jcmd |
| 133 | + "jdk.jfr.internal.tool.Main", // jfr (OpenJDK 8u262+ backport) |
| 134 | + "sun.jvm.hotspot.jdi.SADebugServer", // jsadebugd |
| 135 | + "jdk.nashorn.tools.Shell", // jjs (Nashorn JS shell, JDK 8) |
| 136 | + "sun.jvm.hotspot.HSDB", // hsdb (HotSpot SA GUI debugger, JDK 8) |
| 137 | + "sun.jvm.hotspot.CLHSDB", // clhsdb (HotSpot SA command-line debugger, JDK 8) |
| 138 | + }) |
| 139 | + void isJdkToolByCommand(String mainClass) { |
| 140 | + System.setProperty("sun.java.command", mainClass); |
| 141 | + assertTrue(AgentBootstrap.isJdkTool()); |
| 142 | + } |
| 143 | + |
| 144 | + @Test |
| 145 | + void isJdkToolWhenCommandIncludesArguments() { |
| 146 | + System.setProperty("sun.java.command", "com.ibm.crypto.tools.KeyTool -list -v"); |
| 147 | + assertTrue(AgentBootstrap.isJdkTool()); |
| 148 | + } |
| 149 | +} |
0 commit comments