From cd7d17500171ff20a2d919a4e9d5de0399304d4d Mon Sep 17 00:00:00 2001 From: Alexander Scherbatiy Date: Thu, 19 Mar 2020 14:58:04 +0300 Subject: [PATCH] 8240604: Rewrite sun/management/jmxremote/bootstrap/CustomLauncherTest.java test to make binaries from source file Reviewed-by: iignatyev --- make/test/JtregNativeJdk.gmk | 5 +- .../bootstrap/CustomLauncherTest.java | 174 +++--------------- .../management/jmxremote/bootstrap/Makefile | 80 -------- .../bootstrap/{launcher.c => exelauncher.c} | 6 +- .../jmxremote/bootstrap/linux-amd64/launcher | Bin 8926 -> 0 bytes .../jmxremote/bootstrap/linux-i586/launcher | Bin 14569 -> 0 bytes .../bootstrap/solaris-amd64/launcher | Bin 12056 -> 0 bytes .../bootstrap/solaris-sparcv9/launcher | Bin 11656 -> 0 bytes 8 files changed, 29 insertions(+), 236 deletions(-) delete mode 100644 test/jdk/sun/management/jmxremote/bootstrap/Makefile rename test/jdk/sun/management/jmxremote/bootstrap/{launcher.c => exelauncher.c} (95%) delete mode 100644 test/jdk/sun/management/jmxremote/bootstrap/linux-amd64/launcher delete mode 100644 test/jdk/sun/management/jmxremote/bootstrap/linux-i586/launcher delete mode 100644 test/jdk/sun/management/jmxremote/bootstrap/solaris-amd64/launcher delete mode 100644 test/jdk/sun/management/jmxremote/bootstrap/solaris-sparcv9/launcher diff --git a/make/test/JtregNativeJdk.gmk b/make/test/JtregNativeJdk.gmk index d98016e0e65..e0541a89110 100644 --- a/make/test/JtregNativeJdk.gmk +++ b/make/test/JtregNativeJdk.gmk @@ -55,7 +55,7 @@ BUILD_JDK_JTREG_EXECUTABLES_CFLAGS_exeJliLaunchTest := \ # Platform specific setup ifeq ($(call isTargetOs, windows), true) - BUILD_JDK_JTREG_EXCLUDE += libDirectIO.c libInheritedChannel.c + BUILD_JDK_JTREG_EXCLUDE += libDirectIO.c libInheritedChannel.c exelauncher.c WIN_LIB_JAVA := $(SUPPORT_OUTPUTDIR)/native/java.base/libjava/java.lib BUILD_JDK_JTREG_LIBRARIES_LIBS_libstringPlatformChars := $(WIN_LIB_JAVA) @@ -69,14 +69,17 @@ else BUILD_JDK_JTREG_EXCLUDE += exerevokeall.c ifeq ($(call isTargetOs, linux), true) BUILD_JDK_JTREG_LIBRARIES_LIBS_libInheritedChannel := -ljava + BUILD_JDK_JTREG_EXECUTABLES_LIBS_exelauncher := -ldl else ifeq ($(call isTargetOs, solaris), true) BUILD_JDK_JTREG_LIBRARIES_LIBS_libInheritedChannel := -ljava -lsocket -lnsl + BUILD_JDK_JTREG_EXECUTABLES_LIBS_exelauncher := -lthread -ldl endif BUILD_JDK_JTREG_EXECUTABLES_LIBS_exeJliLaunchTest := -ljli BUILD_JDK_JTREG_EXECUTABLES_LIBS_exeCallerAccessTest := -ljvm endif ifeq ($(call isTargetOs, macosx), true) + BUILD_JDK_JTREG_EXCLUDE += exelauncher.c BUILD_JDK_JTREG_LIBRARIES_CFLAGS_libTestMainKeyWindow := -ObjC BUILD_JDK_JTREG_LIBRARIES_LIBS_libTestMainKeyWindow := -framework JavaVM \ -framework Cocoa -framework JavaNativeFoundation diff --git a/test/jdk/sun/management/jmxremote/bootstrap/CustomLauncherTest.java b/test/jdk/sun/management/jmxremote/bootstrap/CustomLauncherTest.java index 880edd756b0..5108549b96f 100644 --- a/test/jdk/sun/management/jmxremote/bootstrap/CustomLauncherTest.java +++ b/test/jdk/sun/management/jmxremote/bootstrap/CustomLauncherTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2020, 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 @@ -21,22 +21,16 @@ * questions. */ -import java.io.File; -import java.io.IOException; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; +import jdk.test.lib.Utils; +import jdk.test.lib.Platform; +import jdk.test.lib.process.ProcessTools; + import java.nio.file.Files; -import java.nio.file.LinkOption; import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.nio.file.attribute.PosixFilePermission; -import java.util.HashSet; -import java.util.Set; +import java.nio.file.Paths; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; -import jdk.test.lib.process.ProcessTools; - /** * @test * @bug 6434402 8004926 @@ -47,80 +41,35 @@ import jdk.test.lib.process.ProcessTools; * jdk.attach * jdk.management.agent/jdk.internal.agent * + * @requires (os.family == "linux" | os.family == "solaris") * @build TestManager TestApplication CustomLauncherTest - * @run main/othervm CustomLauncherTest + * @run main/othervm/native CustomLauncherTest */ public class CustomLauncherTest { - private static final String TEST_CLASSPATH = System.getProperty("test.class.path"); - private static final String TEST_JDK = System.getProperty("test.jdk"); - private static final String WORK_DIR = System.getProperty("user.dir"); - private static final String TEST_SRC = System.getProperty("test.src"); - private static final String OSNAME = System.getProperty("os.name"); - private static final String ARCH; - static { - // magic with os.arch - String osarch = System.getProperty("os.arch"); - switch (osarch) { - case "i386": - case "i486": - case "i586": - case "i686": - case "i786": - case "i886": - case "i986": { - ARCH = "i586"; - break; - } - case "x86_64": - case "amd64": { - ARCH = "amd64"; - break; - } - case "sparc": - ARCH = "sparcv9"; - break; - default: { - ARCH = osarch; - } - } - } + public static final String TEST_NATIVE_PATH = System.getProperty("test.nativepath"); public static void main(String[] args) throws Exception { - if (TEST_CLASSPATH == null || TEST_CLASSPATH.isEmpty()) { + if (".".equals(Utils.TEST_CLASS_PATH)) { System.out.println("Test is designed to be run from jtreg only"); return; } - if (getPlatform() == null) { - System.out.println("Test not designed to run on this operating " + - "system (" + OSNAME + "), skipping..."); - return; - } - - final FileSystem FS = FileSystems.getDefault(); - - Path libjvmPath = findLibjvm(FS); - if (libjvmPath == null) { - throw new Error("Unable to locate 'libjvm.so' in " + TEST_JDK); - } - + Path libjvm = Platform.jvmLibDir().resolve("libjvm.so"); Process serverPrc = null, clientPrc = null; try { - String[] launcher = getLauncher(); - - if (launcher == null) return; // launcher not available for the tested platform; skip + String launcher = getLauncher(); System.out.println("Starting custom launcher:"); System.out.println("========================="); - System.out.println(" launcher : " + launcher[0]); - System.out.println(" libjvm : " + libjvmPath.toString()); - System.out.println(" classpath : " + TEST_CLASSPATH); + System.out.println(" launcher : " + launcher); + System.out.println(" libjvm : " + libjvm); + System.out.println(" classpath : " + Utils.TEST_CLASS_PATH); ProcessBuilder server = new ProcessBuilder( - launcher[1], - libjvmPath.toString(), - TEST_CLASSPATH, + launcher, + libjvm.toString(), + Utils.TEST_CLASS_PATH, "TestApplication" ); @@ -148,7 +97,7 @@ public class CustomLauncherTest { ProcessBuilder client = ProcessTools.createJavaProcessBuilder( "-cp", - TEST_CLASSPATH, + Utils.TEST_CLASS_PATH, "--add-exports", "jdk.management.agent/jdk.internal.agent=ALL-UNNAMED", "TestManager", String.valueOf(serverPrc.pid()), @@ -182,87 +131,8 @@ public class CustomLauncherTest { } } - private static Path findLibjvm(FileSystem FS) { - Path libjvmPath = findLibjvm(FS.getPath(TEST_JDK, "lib")); - return libjvmPath; - } - - private static Path findLibjvm(Path libPath) { - // libjvm.so -> server/libjvm.so -> client/libjvm.so - Path libjvmPath = libPath.resolve("libjvm.so"); - if (isFileOk(libjvmPath)) { - return libjvmPath; - } - libjvmPath = libPath.resolve("server/libjvm.so"); - if (isFileOk(libjvmPath)) { - return libjvmPath; - } - libjvmPath = libPath.resolve("client/libjvm.so"); - if (isFileOk(libPath)) { - return libjvmPath; - } - - return null; - } - - private static boolean isFileOk(Path path) { - return Files.isRegularFile(path) && Files.isReadable(path); - } - - private static String getPlatform() { - String platform = null; - switch (OSNAME.toLowerCase()) { - case "linux": { - platform = "linux"; - break; - } - case "sunos": { - platform = "solaris"; - break; - } - default: { - platform = null; - } - } - - return platform; - } - - private static String[] getLauncher() throws IOException { - String platform = getPlatform(); - if (platform == null) { - return null; - } - - String launcher = TEST_SRC + File.separator + platform + "-" + ARCH + - File.separator + "launcher"; - - final FileSystem FS = FileSystems.getDefault(); - Path launcherPath = FS.getPath(launcher); - - final boolean hasLauncher = Files.isRegularFile(launcherPath, LinkOption.NOFOLLOW_LINKS)&& - Files.isReadable(launcherPath); - if (!hasLauncher) { - System.out.println("Launcher [" + launcher + "] does not exist. Skipping the test."); - return null; - } - - // It is impossible to store an executable file in the source control - // We need to copy the launcher to the working directory - // and set the executable flag - Path localLauncherPath = FS.getPath(WORK_DIR, "launcher"); - Files.copy(launcherPath, localLauncherPath, - StandardCopyOption.REPLACE_EXISTING); - if (!Files.isExecutable(localLauncherPath)) { - Set perms = new HashSet<>( - Files.getPosixFilePermissions( - localLauncherPath, - LinkOption.NOFOLLOW_LINKS - ) - ); - perms.add(PosixFilePermission.OWNER_EXECUTE); - Files.setPosixFilePermissions(localLauncherPath, perms); - } - return new String[] {launcher, localLauncherPath.toAbsolutePath().toString()}; + private static String getLauncher() { + Path launcherPath = Paths.get(TEST_NATIVE_PATH, "launcher"); + return launcherPath.toAbsolutePath().toString(); } } diff --git a/test/jdk/sun/management/jmxremote/bootstrap/Makefile b/test/jdk/sun/management/jmxremote/bootstrap/Makefile deleted file mode 100644 index 9e1fc922db6..00000000000 --- a/test/jdk/sun/management/jmxremote/bootstrap/Makefile +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright (c) 2006, 2007, 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. - -# -# This Makefile is used to generate versions of the launcher program for -# use by the CustomLauncherTest. The binaries are checked into SCCS -# so this Makefile is not used as part of test run. It is provided to -# make rebuilding the launcher binaries a relatively painless activity. -# - -# -# Edit the following to reflect the current build environment. -# -# Architecture being built (initially one of: solaris-sparc, solaris-i586, -# linux-i586. -# -PLATFORM=solaris -ARCH=sparc -OUTPUT_DIR =$(PLATFORM)-$(ARCH) - -# -# Path to C compiler -# -# As of 6/1/06: -# Solaris CC=/java/devtools/$(ARCH)/SUNWspro/SS11/bin/cc -# Linux CC=/usr/bin/gcc -# -CC=/java/devtools/$(ARCH)/SUNWspro/SS11/bin/cc - -# -# Include directory in JRE or JDK install -# -JINCLUDE=/java/re/jdk/1.6.0/latest/binaries/$(OUTPUT_DIR)/include - -# -# PLATFORM dependent flags -# -# On pre-Solaris 10, -lthread is required. -# -ifeq ($(PLATFORM), solaris) - PLATFORM_LIBS= -lthread -else - PLATFORM_LIBS= -endif - -# -# Targets -# -all: install - -$(PLATFORM): - mkdir $(OUTPUT_DIR) $(OUTPUT_DIR)/SCCS - -install: $(PLATFORM) - $(CC) -I$(JINCLUDE) -I$(JINCLUDE)/$(PLATFORM) \ - -o $(OUTPUT_DIR)/launcher launcher.c $(PLATFORM_LIBS) -ldl - -clean: - - -clobber: clean - rm $(OUTPUT_DIR)/launcher diff --git a/test/jdk/sun/management/jmxremote/bootstrap/launcher.c b/test/jdk/sun/management/jmxremote/bootstrap/exelauncher.c similarity index 95% rename from test/jdk/sun/management/jmxremote/bootstrap/launcher.c rename to test/jdk/sun/management/jmxremote/bootstrap/exelauncher.c index e11fea33584..46f30d9e157 100644 --- a/test/jdk/sun/management/jmxremote/bootstrap/launcher.c +++ b/test/jdk/sun/management/jmxremote/bootstrap/exelauncher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2020, 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 @@ -22,11 +22,11 @@ */ /* - * A minature launcher for use by CustomLauncherTest.sh. It sets + * A miniature launcher for use by CustomLauncherTest.java test. It sets * up the absolute minimal execution environment. */ #include -#include +#include #include #include "jni.h" diff --git a/test/jdk/sun/management/jmxremote/bootstrap/linux-amd64/launcher b/test/jdk/sun/management/jmxremote/bootstrap/linux-amd64/launcher deleted file mode 100644 index 6df223c91c716644ceeed126c2971c48969fa295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8926 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 F{tZumU3&lk diff --git a/test/jdk/sun/management/jmxremote/bootstrap/linux-i586/launcher b/test/jdk/sun/management/jmxremote/bootstrap/linux-i586/launcher deleted file mode 100644 index 072d8048f82fa42d9c082e667c23abbde687bdc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14569 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 B5zqht