8185541: Add back test cases for resource lookup from bootclasspath
authormchung
Wed, 02 Aug 2017 08:13:37 -0700
changeset 46055 b0170078a6c7
parent 46054 628e233b569c
child 46056 46c8ef3d3c25
8185541: Add back test cases for resource lookup from bootclasspath Reviewed-by: alanb
jdk/test/java/lang/ClassLoader/getResource/GetResource.java
jdk/test/java/lang/ClassLoader/getResource/GetResource.sh
--- 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"
-