1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
/*
* Copyright (c) 2008, 2022, 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 4313887 7006126 8142968 8178380 8183320 8210112 8266345 8263940
* @modules jdk.jartool
* @library /test/lib
* @build SetDefaultProvider TestProvider m/* jdk.test.lib.process.ProcessTools
* @run testng/othervm SetDefaultProvider
* @summary Runs tests with -Djava.nio.file.spi.DefaultFileSystemProvider set on
* the command line to override the default file system provider
*/
import java.io.File;
import java.io.IOException;
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.spi.ToolProvider;
import java.util.stream.Stream;
import jdk.test.lib.process.ProcessTools;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
@Test
public class SetDefaultProvider {
private static final String SET_DEFAULT_FSP =
"-Djava.nio.file.spi.DefaultFileSystemProvider=TestProvider";
private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar")
.orElseThrow(() ->
new RuntimeException("jar tool not found")
);
private static Path createTempDirectory(String prefix) throws IOException {
Path testDir = Paths.get(System.getProperty("test.dir", "."));
return Files.createTempDirectory(testDir, prefix);
}
/**
* Test override of default FileSystemProvider with the main application
* on the class path.
*/
public void testClassPath() throws Exception {
String moduleClasses = moduleClasses();
String testClasses = System.getProperty("test.classes");
String classpath = moduleClasses + File.pathSeparator + testClasses;
int exitValue = exec(SET_DEFAULT_FSP, "-cp", classpath, "p.Main");
assertEquals(exitValue, 0);
}
/**
* Test override of default FileSystemProvider with a
* FileSystemProvider jar and the main application on the class path.
*/
public void testClassPathWithFileSystemProviderJar() throws Exception {
String testClasses = System.getProperty("test.classes");
Path jar = Path.of("testFileSystemProvider.jar");
Files.deleteIfExists(jar);
createFileSystemProviderJar(jar, Path.of(testClasses));
String classpath = jar + File.pathSeparator + testClasses
+ File.separator + "modules" + File.separator + "m";
int exitValue = exec(SET_DEFAULT_FSP, "-cp", classpath, "p.Main");
assertEquals(exitValue, 0);
}
/**
* Creates a JAR containing the FileSystemProvider used to override the
* default FileSystemProvider
*/
private void createFileSystemProviderJar(Path jar, Path dir) throws IOException {
List<String> args = new ArrayList<>();
args.add("--create");
args.add("--file=" + jar);
try (Stream<Path> stream = Files.list(dir)) {
List<String> paths = stream
.map(path -> path.getFileName().toString())
.filter(f -> f.startsWith("TestProvider"))
.toList();
for(var p : paths) {
args.add("-C");
args.add(dir.toString());
args.add(p);
}
}
int ret = JAR_TOOL.run(System.out, System.out, args.toArray(new String[0]));
assertEquals(ret, 0);
}
/**
* Test override of default FileSystemProvider with the main application
* on the class path and a SecurityManager enabled.
*/
public void testClassPathWithSecurityManager() throws Exception {
String moduleClasses = moduleClasses();
String testClasses = System.getProperty("test.classes");
String classpath = moduleClasses + File.pathSeparator + testClasses;
String policyFile = System.getProperty("test.src", ".")
+ File.separator + "fs.policy";
int exitValue = exec(SET_DEFAULT_FSP, "-cp", classpath,
"-Dtest.classes=" + testClasses, "-Djava.security.manager",
"-Djava.security.policy==" + policyFile, "p.Main");
assertEquals(exitValue, 0);
}
/**
* Test override of default FileSystemProvider with the main application
* on the module path as an exploded module.
*/
public void testExplodedModule() throws Exception {
String modulePath = System.getProperty("jdk.module.path");
int exitValue = exec(SET_DEFAULT_FSP, "-p", modulePath, "-m", "m/p.Main");
assertEquals(exitValue, 0);
}
/**
* Test override of default FileSystemProvider with the main application
* on the module path as a modular JAR.
*/
public void testModularJar() throws Exception {
String jarFile = createModularJar();
int exitValue = exec(SET_DEFAULT_FSP, "-p", jarFile, "-m", "m/p.Main");
assertEquals(exitValue, 0);
}
/**
* Test override of default FileSystemProvider where the main application
* is a module that is patched by an exploded patch.
*/
public void testExplodedModuleWithExplodedPatch() throws Exception {
Path patchdir = createTempDirectory("patch");
String modulePath = System.getProperty("jdk.module.path");
int exitValue = exec(SET_DEFAULT_FSP,
"--patch-module", "m=" + patchdir,
"-p", modulePath,
"-m", "m/p.Main");
assertEquals(exitValue, 0);
}
/**
* Test override of default FileSystemProvider where the main application
* is a module that is patched by an exploded patch.
*/
public void testExplodedModuleWithJarPatch() throws Exception {
Path patchdir = createTempDirectory("patch");
Files.createDirectory(patchdir.resolve("m.properties"));
Path patch = createJarFile(patchdir);
String modulePath = System.getProperty("jdk.module.path");
int exitValue = exec(SET_DEFAULT_FSP,
"--patch-module", "m=" + patch,
"-p", modulePath,
"-m", "m/p.Main");
assertEquals(exitValue, 0);
}
/**
* Returns the directory containing the classes for module "m".
*/
private String moduleClasses() {
String mp = System.getProperty("jdk.module.path");
for (String dir : mp.split(File.pathSeparator)) {
Path m = Paths.get(dir, "m");
if (Files.exists(m)) return m.toString();
}
fail();
return null;
}
/**
* Creates a modular JAR containing module "m".
*/
private String createModularJar() throws Exception {
Path dir = Paths.get(moduleClasses());
Path jar = createJarFile(dir);
return jar.toString();
}
/**
* Creates a JAR file containing the entries in the given file tree.
*/
private Path createJarFile(Path dir) throws Exception {
Path jar = createTempDirectory("tmp").resolve("m.jar");
String[] args = { "--create", "--file=" + jar, "-C", dir.toString(), "." };
int ret = JAR_TOOL.run(System.out, System.out, args);
assertEquals(ret, 0);
return jar;
}
/**
* Invokes the java launcher with the given arguments, returning the exit code.
*/
private int exec(String... args) throws Exception {
return ProcessTools.executeTestJava(args)
.outputTo(System.out)
.errorTo(System.out)
.getExitValue();
}
}
|