8150318: serviceability/dcmd/jvmti/LoadAgentDcmdTest.java - Could not find JDK_DIR/lib/x86_64/libinstrument.so
Summary: refactor test
Reviewed-by: jbachorik, sspitsyn
--- a/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java Wed Mar 02 08:41:02 2016 +0100
+++ b/hotspot/test/serviceability/dcmd/jvmti/LoadAgentDcmdTest.java Wed Mar 02 17:08:26 2016 +0300
@@ -22,6 +22,10 @@
*/
import java.io.*;
import java.nio.file.*;
+import java.util.jar.Attributes;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+import java.util.jar.Manifest;
import jdk.test.lib.*;
import jdk.test.lib.dcmd.*;
import org.testng.annotations.Test;
@@ -55,12 +59,7 @@
"'-Dtest.jdk=/path/to/jdk'.");
}
- Path libpath;
- if (Platform.isWindows()) {
- libpath = Paths.get(jdkPath, "bin", "instrument.dll");
- } else {
- libpath = Paths.get(jdkPath, "lib", Platform.getOsArch(), "libinstrument.so");
- }
+ Path libpath = Paths.get(jdkPath, Platform.jdkLibPath(), Platform.sharedObjectName("instrument"));
if (!libpath.toFile().exists()) {
throw new FileNotFoundException(
@@ -70,31 +69,62 @@
return libpath.toAbsolutePath().toString();
}
+
+ public void createJarFileForAgent()
+ throws IOException {
+
+ final String jarName = "agent.jar";
+ final String agentClass = "SimpleJvmtiAgent";
+
+ Manifest manifest = new Manifest();
+
+ manifest.getMainAttributes().put(
+ Attributes.Name.MANIFEST_VERSION, "1.0");
+
+ manifest.getMainAttributes().put(
+ new Attributes.Name("Agent-Class"), agentClass);
+
+ JarOutputStream target = null;
+
+ try {
+ target = new
+ JarOutputStream(new FileOutputStream(jarName), manifest);
+ JarEntry entry = new JarEntry(agentClass + ".class");
+ target.putNextEntry(entry);
+ target.closeEntry();
+ } finally {
+ target.close();
+ }
+ }
+
public void run(CommandExecutor executor) {
try{
- PrintWriter pw = new PrintWriter("MANIFEST.MF");
- pw.println("Agent-Class: SimpleJvmtiAgent");
- pw.close();
- ProcessBuilder pb = new ProcessBuilder();
- pb.command(new String[] { JDKToolFinder.getJDKTool("jar"),
- "cmf",
- "MANIFEST.MF",
- "agent.jar",
- "SimpleJvmtiAgent.class"});
- pb.start().waitFor();
+ createJarFileForAgent();
String libpath = getLibInstrumentPath();
+ OutputAnalyzer output = null;
- // Test 1: No argument
- OutputAnalyzer output = executor.execute("JVMTI.agent_load " +
- libpath + " agent.jar");
+ // Test 1: Native agent, no arguments
+ output = executor.execute("JVMTI.agent_load " +
+ libpath + " agent.jar");
output.stderrShouldBeEmpty();
- // Test 2: With argument
+ // Test 2: Native agent, with arguments
+ output = executor.execute("JVMTI.agent_load " +
+ libpath + " \"agent.jar=foo=bar\"");
+ output.stderrShouldBeEmpty();
+
+ // Test 3: Java agent, no arguments
output = executor.execute("JVMTI.agent_load " +
- libpath + " \"agent.jar=foo=bar\"");
+ "agent.jar");
output.stderrShouldBeEmpty();
+
+ // Test 4: Java agent, with arguments
+ output = executor.execute("JVMTI.agent_load " +
+ "\"agent.jar=foo=bar\"");
+ output.stderrShouldBeEmpty();
+
} catch (Exception e) {
throw new RuntimeException(e);
}
--- a/hotspot/test/serviceability/dcmd/jvmti/LoadJavaAgentDcmdTest.java Wed Mar 02 08:41:02 2016 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-import java.io.*;
-import jdk.test.lib.*;
-import jdk.test.lib.dcmd.*;
-import org.testng.annotations.Test;
-
-/*
- * Test to attach JVMTI java agent.
- *
- * @test
- * @bug 8147388
- * @library /testlibrary
- * @modules java.base/sun.misc
- * java.compiler
- * java.instrument
- * java.management
- * jdk.jvmstat/sun.jvmstat.monitor
- * @build ClassFileInstaller jdk.test.lib.* SimpleJvmtiAgent
- * @run main ClassFileInstaller SimpleJvmtiAgent
- * @run testng LoadJavaAgentDcmdTest
- */
-public class LoadJavaAgentDcmdTest {
- public void run(CommandExecutor executor) {
- try{
- PrintWriter pw = new PrintWriter("MANIFEST.MF");
- pw.println("Agent-Class: SimpleJvmtiAgent");
- pw.close();
-
- ProcessBuilder pb = new ProcessBuilder();
- pb.command(new String[] { JDKToolFinder.getJDKTool("jar"),
- "cmf",
- "MANIFEST.MF",
- "agent.jar",
- "SimpleJvmtiAgent.class"});
- pb.start().waitFor();
-
- // Test 1: No argument
- OutputAnalyzer output = executor.execute("JVMTI.agent_load " +
- "agent.jar");
- output.stderrShouldBeEmpty();
-
- // Test 2: With argument
- output = executor.execute("JVMTI.agent_load " +
- "\"agent.jar=foo=bar\"");
- output.stderrShouldBeEmpty();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- @Test
- public void jmx() throws Throwable {
- run(new JMXExecutor());
- }
-
- @Test
- public void cli() throws Throwable {
- run(new PidJcmdExecutor());
- }
-}
--- a/hotspot/test/testlibrary/jdk/test/lib/Platform.java Wed Mar 02 08:41:02 2016 +0100
+++ b/hotspot/test/testlibrary/jdk/test/lib/Platform.java Wed Mar 02 17:08:26 2016 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -203,4 +203,31 @@
public static boolean canAttachOSX() throws Exception {
return userName.equals("root");
}
+
+ /**
+ * return path to library inside jdk tree
+ */
+ public static String jdkLibPath() {
+ if (isWindows()) {
+ return "bin";
+ }
+ if (isOSX()) {
+ return "lib";
+ }
+
+ return "lib/" + getOsArch();
+ }
+
+ /**
+ * Build name of shared object according to platform rules
+ */
+ public static String sharedObjectName(String name) {
+ if (isWindows()) {
+ return name + ".dll";
+ }
+ if (isOSX()) {
+ return "lib" + name + ".dylib";
+ }
+ return "lib" + name + ".so";
+ }
}