< prev index next >
test/java/lang/ClassLoader/getResource/GetResource.java
Print this page
*** 1,7 ****
/*
! * 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.
--- 1,7 ----
/*
! * 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 19,33 ****
* 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.net.URL;
public class GetResource {
private static final String RESOURCE_NAME = "test.properties";
! 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);
if (!url.toString().endsWith(expect)) {
throw new RuntimeException(url + " != expected resource " + expect);
--- 19,67 ----
* 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
+ * @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";
! 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);
if (!url.toString().endsWith(expect)) {
throw new RuntimeException(url + " != expected resource " + expect);
*** 37,42 ****
--- 71,171 ----
System.out.println("getSystemResource found: " + url);
if (!url.toString().endsWith(expect)) {
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);
+ }
+
}
< prev index next >