--- a/jdk/test/java/lang/ClassLoader/getResource/GetResource.java Tue Aug 01 16:08:17 2017 -0700
+++ b/jdk/test/java/lang/ClassLoader/getResource/GetResource.java Wed Aug 02 08:13:37 2017 -0700
@@ -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 @@
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<String> 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<String> options, String expected) throws Throwable {
+ // current working directory is "a"
+ runTest(CWD.resolve(DIR_A), options, expected);
+ }
+
+ private void runTest(Path dir, List<String> options, String expected)
+ throws Throwable
+ {
+ String javapath = JDKToolFinder.getJDKTool("java");
+
+ List<String> 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<String,String> env = pb.environment();
+ String value = env.remove("CLASSPATH");
+
+ executeCommand(pb).shouldHaveExitValue(0);
+ }
+
}
--- a/jdk/test/java/lang/ClassLoader/getResource/GetResource.sh Tue Aug 01 16:08:17 2017 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -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"
-