diff --git a/jdk/test/java/lang/ClassLoader/getResource/GetResource.java b/jdk/test/java/lang/ClassLoader/getResource/GetResource.java index 1eb62d0bf242a04ad8a6d075cb8f36f667bfc5b3..8a8d6bb8eb425158a43fea1d22721d2a449ee6f5 100644 --- a/jdk/test/java/lang/ClassLoader/getResource/GetResource.java +++ b/jdk/test/java/lang/ClassLoader/getResource/GetResource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, 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,11 +21,45 @@ * questions. */ +/* + * @test + * @bug 6760902 + * @library /lib/testlibrary + * @build jdk.testlibrary.ProcessTools + * @run testng GetResource + * @summary Empty path on bootclasspath is not default to current working + * directory for both class lookup and resource lookup whereas + * empty path on classpath is default to current working directory. + */ + +import java.io.File; +import java.io.IOException; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; +import static jdk.testlibrary.ProcessTools.*; + +import org.testng.annotations.BeforeTest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; public class GetResource { + private static final Path CWD = Paths.get(System.getProperty("user.dir")); + private static final String DIR_A = "a"; + private static final String DIR_B = "b"; + private static final String RESOURCE_NAME = "test.properties"; - public static void main(String[] args) { + private static final String GETRESOURCE_CLASS = "GetResource.class"; + + public static void main(String... args) { String expect = args[0] + "/" + RESOURCE_NAME; URL url = GetResource.class.getResource(RESOURCE_NAME); System.out.println("getResource found: " + url); @@ -39,4 +73,99 @@ public class GetResource { throw new RuntimeException(url + " != expected resource " + expect); } } + + @BeforeTest + public void setup() throws IOException { + // setup two directories "a" and "b" + // each directory contains both test.properties and this test class + Path testSrc = Paths.get(System.getProperty("test.src")); + Path testClasses = Paths.get(System.getProperty("test.classes")); + + Files.createDirectories(Paths.get(DIR_A)); + Files.createDirectories(Paths.get(DIR_B)); + + Files.copy(testSrc.resolve(RESOURCE_NAME), + Paths.get(DIR_A, RESOURCE_NAME)); + Files.copy(testSrc.resolve(RESOURCE_NAME), + Paths.get(DIR_B, RESOURCE_NAME)); + + Files.copy(testClasses.resolve(GETRESOURCE_CLASS), + Paths.get(DIR_A, GETRESOURCE_CLASS)); + Files.copy(testClasses.resolve(GETRESOURCE_CLASS), + Paths.get(DIR_B, GETRESOURCE_CLASS)); + } + + private String concat(String... dirs) { + return Stream.of(dirs).collect(Collectors.joining(File.pathSeparator)); + } + + @DataProvider + public Object[][] options() { + return new Object[][] { + new Object[] { List.of("-Xbootclasspath/a:a"), "a"}, + new Object[] { List.of("-Xbootclasspath/a:b"), "b"}, + new Object[] { List.of("-Xbootclasspath/a:" + concat("a", "b")), "a"}, + new Object[] { List.of("-Xbootclasspath/a:" + concat("b", "a")), "b"}, + + new Object[] { List.of("-cp", "a"), "a"}, + new Object[] { List.of("-cp", "b"), "b"}, + new Object[] { List.of("-cp", concat("a", "b")), "a"}, + new Object[] { List.of("-cp", concat("b", "a")), "b"}, + }; + } + + @Test(dataProvider = "options") + public void test(List options, String expected) throws Throwable { + runTest(CWD, options, expected); + } + + @DataProvider + public Object[][] dirA() { + String dirB = ".." + File.separator + "b"; + return new Object[][] { + new Object[] { List.of("-Xbootclasspath/a:."), "a"}, + + // "b" is the expected result when JDK-8185540 is resolved + new Object[] { List.of("-Xbootclasspath/a:" + dirB), "a"}, + // empty path in first element + new Object[] { List.of("-Xbootclasspath/a:" + File.pathSeparator + dirB), "a"}, + + new Object[] { List.of("-cp", File.pathSeparator), "a"}, + new Object[] { List.of("-cp", dirB), "b"}, + new Object[] { List.of("-cp", File.pathSeparator + dirB), "a"}, + }; + } + + @Test(dataProvider = "dirA") + public void testCurrentDirA(List options, String expected) throws Throwable { + // current working directory is "a" + runTest(CWD.resolve(DIR_A), options, expected); + } + + private void runTest(Path dir, List options, String expected) + throws Throwable + { + String javapath = JDKToolFinder.getJDKTool("java"); + + List cmdLine = new ArrayList<>(); + cmdLine.add(javapath); + options.forEach(cmdLine::add); + + cmdLine.add("GetResource"); + cmdLine.add(expected); + + System.out.println("Command line: " + cmdLine); + ProcessBuilder pb = + new ProcessBuilder(cmdLine.stream().toArray(String[]::new)); + + // change working directory + pb.directory(dir.toFile()); + + // remove CLASSPATH environment variable + Map env = pb.environment(); + String value = env.remove("CLASSPATH"); + + executeCommand(pb).shouldHaveExitValue(0); + } + } diff --git a/jdk/test/java/lang/ClassLoader/getResource/GetResource.sh b/jdk/test/java/lang/ClassLoader/getResource/GetResource.sh deleted file mode 100644 index fc365dbd01402e3d5819dacc25296b2dfb355091..0000000000000000000000000000000000000000 --- a/jdk/test/java/lang/ClassLoader/getResource/GetResource.sh +++ /dev/null @@ -1,104 +0,0 @@ -# -# Copyright (c) 2014, 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. -# - -# @test -# @bug 6760902 -# @summary Empty path on bootclasspath is not default to current working -# directory for both class lookup and resource lookup whereas -# empty path on classpath is default to current working directory. -# -# @run shell GetResource.sh - -if [ -z "$TESTJAVA" ]; then - if [ $# -lt 1 ]; then exit 1; fi - TESTJAVA="$1"; shift - COMPILEJAVA="${TESTJAVA}" - TESTSRC="`pwd`" - TESTCLASSES="`pwd`" -fi - -# set platform-specific variables -OS=`uname -s` -case "$OS" in - Windows*) - PS=";" - ;; - CYGWIN* ) - PS=";" - TESTCLASSES=`/usr/bin/cygpath -a -s -m ${TESTCLASSES}` - ;; - * ) - PS=":" - ;; -esac - -echo TESTSRC=${TESTSRC} -echo TESTCLASSES=${TESTCLASSES} -echo TESTJAVA=${TESTJAVA} -echo "" - -${COMPILEJAVA}/bin/javac ${TESTJAVACOPTS} ${TESTTOOLVMOPTS} \ - -d ${TESTCLASSES} \ - ${TESTSRC}/GetResource.java || exit 10 - -setup() { - dest=${TESTCLASSES}/$1 - rm -rf $dest - mkdir $dest - cp ${TESTSRC}/test.properties $dest - cp ${TESTCLASSES}/GetResource.class $dest -} - - -count=0 -runTest() { - expected=$1; - vmoption=$2; shift; shift - count=`expr $count+1` - echo "Test $count : $vmoption $@" - ${TESTJAVA}/bin/java ${TESTVMOPTS} "$vmoption" $@ \ - GetResource $expected || exit $count -} - -# run test -setup "a" -setup "b" - -cd ${TESTCLASSES} -DIR=`pwd` - -# Expected -classpath -runTest "a" -cp a -runTest "a" -cp "a${PS}b" -runTest "b" -cp b -runTest "b" -cp "b${PS}a" - -cd ${DIR}/a - -# no -classpath -runTest "a" -cp "${PS}" -runTest "b" -cp "../b" - -# Test empty path in classpath default to current working directory -runTest "a" -cp "${PS}../b" -