diff --git a/test/jdk/java/net/httpclient/FilePublisher/FilePublisherPermsTest.java b/test/jdk/java/net/httpclient/FilePublisher/FilePublisherPermsTest.java deleted file mode 100644 index bafe1496a86..00000000000 --- a/test/jdk/java/net/httpclient/FilePublisher/FilePublisherPermsTest.java +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (c) 2020, 2024, 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 8235459 - * @summary Confirm that HttpRequest.BodyPublishers#ofFile(Path) - * works as expected - * @library /test/lib /test/jdk/java/net/httpclient/lib - * @build jdk.httpclient.test.lib.common.HttpServerAdapters jdk.test.lib.net.SimpleSSLContext - * SecureZipFSProvider - * @run testng/othervm FilePublisherPermsTest - */ - -import jdk.test.lib.net.SimpleSSLContext; -import org.testng.annotations.AfterTest; -import org.testng.annotations.BeforeTest; -import org.testng.annotations.DataProvider; -import org.testng.annotations.Test; - -import javax.net.ssl.SSLContext; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpRequest.BodyPublisher; -import java.net.http.HttpRequest.BodyPublishers; -import java.net.http.HttpResponse; -import java.nio.file.FileSystem; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; -import java.security.*; -import java.util.Map; -import jdk.httpclient.test.lib.common.HttpServerAdapters; - -import static java.lang.System.out; -import static java.net.http.HttpClient.Builder.NO_PROXY; -import static java.net.http.HttpClient.Version.HTTP_1_1; -import static java.net.http.HttpClient.Version.HTTP_2; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; - -public class FilePublisherPermsTest implements HttpServerAdapters { - - SSLContext sslContext; - HttpServerAdapters.HttpTestServer httpTestServer; // HTTP/1.1 [ 4 servers ] - HttpServerAdapters.HttpTestServer httpsTestServer; // HTTPS/1.1 - HttpServerAdapters.HttpTestServer http2TestServer; // HTTP/2 ( h2c ) - HttpServerAdapters.HttpTestServer https2TestServer; // HTTP/2 ( h2 ) - String httpURI; - String httpsURI; - String http2URI; - String https2URI; - - FileSystem zipFs; - static Path zipFsPath; - static Path defaultFsPath; - - String policyFile; - - // Default file system set up - static final String DEFAULT_FS_MSG = "default fs"; - - private Path defaultFsFile() throws Exception { - var file = Path.of("defaultFile.txt"); - if (Files.notExists(file)) { - Files.createFile(file); - Files.writeString(file, DEFAULT_FS_MSG); - } - assertEquals(Files.readString(file), DEFAULT_FS_MSG); - return file; - } - - @DataProvider(name = "defaultFsData") - public Object[][] defaultFsData() { - return new Object[][]{ - { httpURI, defaultFsPath }, - { httpsURI, defaultFsPath }, - { http2URI, defaultFsPath }, - { https2URI, defaultFsPath }, - { httpURI, defaultFsPath }, - { httpsURI, defaultFsPath }, - { http2URI, defaultFsPath }, - { https2URI, defaultFsPath }, - }; - } - - @Test(dataProvider = "defaultFsData") - public void testDefaultFs(String uriString, Path path) - throws Exception { - out.printf("\n\n--- testDefaultFs(%s, %s): starting\n", - uriString, path); - BodyPublisher bodyPublisher = BodyPublishers.ofFile(path); - send(uriString, bodyPublisher); - } - - // Zip File system set up - static final String ZIP_FS_MSG = "zip fs"; - - static FileSystem newZipFs(Path zipFile) throws Exception { - return FileSystems.newFileSystem(zipFile, Map.of("create", "true")); - } - - static FileSystem newSecureZipFs(Path zipFile) throws Exception { - FileSystem fs = newZipFs(zipFile); - return new SecureZipFSProvider(fs.provider()).newFileSystem(fs); - } - - static Path zipFsFile(FileSystem fs) throws Exception { - var file = fs.getPath("fileInZip.txt"); - if (Files.notExists(file)) { - Files.createFile(file); - Files.writeString(file, ZIP_FS_MSG); - } - assertEquals(Files.readString(file), ZIP_FS_MSG); - return file; - } - - @DataProvider(name = "zipFsData") - public Object[][] zipFsData() { - return new Object[][]{ - { httpURI, zipFsPath }, - { httpsURI, zipFsPath }, - { http2URI, zipFsPath }, - { https2URI, zipFsPath }, - { httpURI, zipFsPath }, - { httpsURI, zipFsPath }, - { http2URI, zipFsPath }, - { https2URI, zipFsPath }, - }; - } - - @Test(dataProvider = "zipFsData") - public void testZipFs(String uriString, Path path) throws Exception { - out.printf("\n\n--- testZipFsCustomPerm(%s, %s): starting\n", uriString, path); - BodyPublisher bodyPublisher = BodyPublishers.ofFile(path); - send(uriString, bodyPublisher); - } - - @Test - public void testFileNotFound() throws Exception { - out.printf("\n\n--- testFileNotFound(): starting\n"); - var zipPath = Path.of("fileNotFound.zip"); - try (FileSystem fs = newZipFs(zipPath)) { - Path fileInZip = zipFsFile(fs); - Files.deleteIfExists(fileInZip); - BodyPublishers.ofFile(fileInZip); - fail(); - } catch (FileNotFoundException e) { - out.println("Caught expected: " + e); - } - var path = Path.of("fileNotFound.txt"); - try { - Files.deleteIfExists(path); - BodyPublishers.ofFile(path); - fail(); - } catch (FileNotFoundException e) { - out.println("Caught expected: " + e); - } - } - - private void send(String uriString, BodyPublisher bodyPublisher) - throws Exception { - HttpClient client = HttpClient.newBuilder() - .proxy(NO_PROXY) - .sslContext(sslContext) - .build(); - var req = HttpRequest.newBuilder(URI.create(uriString)) - .POST(bodyPublisher) - .build(); - client.send(req, HttpResponse.BodyHandlers.discarding()); - } - - - static class HttpEchoHandler implements HttpServerAdapters.HttpTestHandler { - @Override - public void handle(HttpServerAdapters.HttpTestExchange t) throws IOException { - try (InputStream is = t.getRequestBody(); - OutputStream os = t.getResponseBody()) { - byte[] bytes = is.readAllBytes(); - t.sendResponseHeaders(200, bytes.length); - os.write(bytes); - } - } - } - - @BeforeTest - public void setup() throws Exception { - sslContext = new SimpleSSLContext().get(); - if (sslContext == null) - throw new AssertionError("Unexpected null sslContext"); - - zipFs = newSecureZipFs(Path.of("file.zip")); - zipFsPath = zipFsFile(zipFs); - defaultFsPath = defaultFsFile(); - - httpTestServer = HttpServerAdapters.HttpTestServer.create(HTTP_1_1); - httpTestServer.addHandler( - new FilePublisherPermsTest.HttpEchoHandler(), "/http1/echo"); - httpURI = "http://" + httpTestServer.serverAuthority() + "/http1/echo"; - - httpsTestServer = HttpServerAdapters.HttpTestServer.create(HTTP_1_1, sslContext); - httpsTestServer.addHandler( - new FilePublisherPermsTest.HttpEchoHandler(), "/https1/echo"); - httpsURI = "https://" + httpsTestServer.serverAuthority() + "/https1/echo"; - - http2TestServer = HttpServerAdapters.HttpTestServer.create(HTTP_2); - http2TestServer.addHandler( - new FilePublisherPermsTest.HttpEchoHandler(), "/http2/echo"); - http2URI = "http://" + http2TestServer.serverAuthority() + "/http2/echo"; - - https2TestServer = HttpServerAdapters.HttpTestServer.create(HTTP_2, sslContext); - https2TestServer.addHandler( - new FilePublisherPermsTest.HttpEchoHandler(), "/https2/echo"); - https2URI = "https://" + https2TestServer.serverAuthority() + "/https2/echo"; - - httpTestServer.start(); - httpsTestServer.start(); - http2TestServer.start(); - https2TestServer.start(); - } - - @AfterTest - public void teardown() throws Exception { - httpTestServer.stop(); - httpsTestServer.stop(); - http2TestServer.stop(); - https2TestServer.stop(); - zipFs.close(); - } -} diff --git a/test/jdk/java/net/httpclient/FilePublisher/SecureZipFSProvider.java b/test/jdk/java/net/httpclient/FilePublisher/SecureZipFSProvider.java deleted file mode 100644 index 00f532ba47c..00000000000 --- a/test/jdk/java/net/httpclient/FilePublisher/SecureZipFSProvider.java +++ /dev/null @@ -1,446 +0,0 @@ -/* - * Copyright (c) 2020, 2024, 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. - */ - -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.channels.FileChannel; -import java.nio.channels.SeekableByteChannel; -import java.nio.file.AccessMode; -import java.nio.file.CopyOption; -import java.nio.file.DirectoryStream; -import java.nio.file.FileStore; -import java.nio.file.FileSystem; -import java.nio.file.LinkOption; -import java.nio.file.OpenOption; -import java.nio.file.Path; -import java.nio.file.PathMatcher; -import java.nio.file.ProviderMismatchException; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; -import java.nio.file.attribute.BasicFileAttributes; -import java.nio.file.attribute.FileAttribute; -import java.nio.file.attribute.FileAttributeView; -import java.nio.file.attribute.UserPrincipalLookupService; -import java.nio.file.spi.FileSystemProvider; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -public class SecureZipFSProvider extends FileSystemProvider { - private final ConcurrentHashMap map = - new ConcurrentHashMap<>(); - private final FileSystemProvider defaultProvider; - - public SecureZipFSProvider(FileSystemProvider provider) { - defaultProvider = provider; - } - - @Override - public String getScheme() { - return "jar"; - } - - public FileSystem newFileSystem(FileSystem fs) { - return map.computeIfAbsent(fs, (sfs) -> - new SecureZipFS(this, fs)); - } - - @Override - public FileSystem newFileSystem(URI uri, Map env) - throws IOException { - FileSystem fs = defaultProvider.newFileSystem(uri, env); - return map.computeIfAbsent(fs, (sfs) -> - new SecureZipFS(this, fs) - ); - } - - @Override - public FileSystem getFileSystem(URI uri) { - return map.get(defaultProvider.getFileSystem(uri)); - } - - @Override - public Path getPath(URI uri) { - Path p = defaultProvider.getPath(uri); - return map.get(defaultProvider.getFileSystem(uri)).wrap(p); - } - - @Override - public InputStream newInputStream(Path path, OpenOption... options) - throws IOException { - Path p = toTestPath(path).unwrap(); - return defaultProvider.newInputStream(p, options); - } - - @Override - public SeekableByteChannel newByteChannel(Path path, - Set options, - FileAttribute... attrs) - throws IOException { - Path p = toTestPath(path).unwrap(); - return defaultProvider.newByteChannel(p, options, attrs); - } - - @Override - public FileChannel newFileChannel(Path path, - Set options, - FileAttribute... attrs) - throws IOException { - Path p = toTestPath(path).unwrap(); - return defaultProvider.newFileChannel(p, options, attrs); - } - - - @Override - public DirectoryStream newDirectoryStream(Path dir, - DirectoryStream.Filter filter) { - throw new RuntimeException("not implemented"); - } - - @Override - public void createDirectory(Path dir, FileAttribute... attrs) - throws IOException { - Path p = toTestPath(dir).unwrap(); - defaultProvider.createDirectory(p, attrs); - } - - @Override - public void delete(Path path) throws IOException { - Path p = toTestPath(path).unwrap(); - defaultProvider.delete(p); - } - - @Override - public void copy(Path source, Path target, CopyOption... options) - throws IOException { - Path sp = toTestPath(source).unwrap(); - Path tp = toTestPath(target).unwrap(); - defaultProvider.copy(sp, tp, options); - } - - @Override - public void move(Path source, Path target, CopyOption... options) - throws IOException { - Path sp = toTestPath(source).unwrap(); - Path tp = toTestPath(target).unwrap(); - defaultProvider.move(sp, tp, options); - } - - @Override - public boolean isSameFile(Path path, Path path2) - throws IOException { - Path p = toTestPath(path).unwrap(); - Path p2 = toTestPath(path2).unwrap(); - return defaultProvider.isSameFile(p, p2); - } - - @Override - public boolean isHidden(Path path) throws IOException { - Path p = toTestPath(path).unwrap(); - return defaultProvider.isHidden(p); - } - - @Override - public FileStore getFileStore(Path path) throws IOException { - Path p = toTestPath(path).unwrap(); - return defaultProvider.getFileStore(p); - } - - @Override - public void checkAccess(Path path, AccessMode... modes) throws IOException { - Path p = toTestPath(path).unwrap(); - defaultProvider.checkAccess(p, modes); - } - - @Override - public V getFileAttributeView(Path path, - Class type, - LinkOption... options) { - Path p = toTestPath(path).unwrap(); - return defaultProvider.getFileAttributeView(p, type, options); - } - - @Override - public A readAttributes(Path path, - Class type, - LinkOption... options) - throws IOException { - Path p = toTestPath(path).unwrap(); - return defaultProvider.readAttributes(p, type, options); - } - - @Override - public Map readAttributes(Path path, - String attributes, - LinkOption... options) - throws IOException { - Path p = toTestPath(path).unwrap(); - return defaultProvider.readAttributes(p, attributes, options); - } - - @Override - public void setAttribute(Path path, String attribute, - Object value, LinkOption... options) - throws IOException { - Path p = toTestPath(path).unwrap(); - defaultProvider.setAttribute(p, attribute, options); - } - - // Checks that the given file is a TestPath - static TestPath toTestPath(Path obj) { - if (obj == null) - throw new NullPointerException(); - if (!(obj instanceof TestPath)) - throw new ProviderMismatchException(); - return (TestPath) obj; - } - - static class SecureZipFS extends FileSystem { - private final SecureZipFSProvider provider; - private final FileSystem delegate; - - public SecureZipFS(SecureZipFSProvider provider, FileSystem delegate) { - this.provider = provider; - this.delegate = delegate; - } - - Path wrap(Path path) { - return (path != null) ? new TestPath(this, path) : null; - } - - Path unwrap(Path wrapper) { - if (wrapper == null) - throw new NullPointerException(); - if (!(wrapper instanceof TestPath)) - throw new ProviderMismatchException(); - return ((TestPath) wrapper).unwrap(); - } - - @Override - public FileSystemProvider provider() { - return provider; - } - - @Override - public void close() throws IOException { - delegate.close(); - } - - @Override - public boolean isOpen() { - return delegate.isOpen(); - } - - @Override - public boolean isReadOnly() { - return delegate.isReadOnly(); - } - - @Override - public String getSeparator() { - return delegate.getSeparator(); - } - - @Override - public Iterable getRootDirectories() { - return delegate.getRootDirectories(); - } - - @Override - public Iterable getFileStores() { - return delegate.getFileStores(); - } - - @Override - public Set supportedFileAttributeViews() { - return delegate.supportedFileAttributeViews(); - } - - @Override - public Path getPath(String first, String... more) { - return wrap(delegate.getPath(first, more)); - } - - @Override - public PathMatcher getPathMatcher(String syntaxAndPattern) { - return delegate.getPathMatcher(syntaxAndPattern); - } - - @Override - public UserPrincipalLookupService getUserPrincipalLookupService() { - return delegate.getUserPrincipalLookupService(); - } - - @Override - public WatchService newWatchService() throws IOException { - return delegate.newWatchService(); - } - } - - static class TestPath implements Path { - private final SecureZipFS fs; - private final Path delegate; - - TestPath(SecureZipFS fs, Path delegate) { - this.fs = fs; - this.delegate = delegate; - } - - Path unwrap() { - return delegate; - } - - @Override - public SecureZipFS getFileSystem() { - return fs; - } - - @Override - public boolean isAbsolute() { - return delegate.isAbsolute(); - } - - @Override - public Path getRoot() { - return fs.wrap(delegate.getRoot()); - } - - @Override - public Path getFileName() { - return fs.wrap(delegate.getFileName()); - } - - @Override - public Path getParent() { - return fs.wrap(delegate.getParent()); - } - - @Override - public int getNameCount() { - return delegate.getNameCount(); - } - - @Override - public Path getName(int index) { - return fs.wrap(delegate.getName(index)); - } - - @Override - public Path subpath(int beginIndex, int endIndex) { - return fs.wrap(delegate.subpath(beginIndex, endIndex)); - } - - @Override - public boolean startsWith(Path other) { - return delegate.startsWith(other); - } - - @Override - public boolean endsWith(Path other) { - return delegate.endsWith(other); - } - - @Override - public Path normalize() { - return fs.wrap(delegate.normalize()); - } - - @Override - public Path resolve(Path other) { - return fs.wrap(delegate.resolve(fs.wrap(other))); - } - - @Override - public Path relativize(Path other) { - return fs.wrap(delegate.relativize(fs.wrap(other))); - } - - @Override - public URI toUri() { - String ssp = delegate.toUri().getSchemeSpecificPart(); - return URI.create(fs.provider().getScheme() + ":" + ssp); - } - - @Override - public Path toAbsolutePath() { - return fs.wrap(delegate.toAbsolutePath()); - } - - @Override - public Path toRealPath(LinkOption... options) throws IOException { - return fs.wrap(delegate.toRealPath(options)); - } - - @Override - public WatchKey register(WatchService watcher, - WatchEvent.Kind[] events, - WatchEvent.Modifier... modifiers) - throws IOException { - return delegate.register(watcher, events, modifiers); - } - - @Override - public Iterator iterator() { - final Iterator itr = delegate.iterator(); - return new Iterator<>() { - @Override - public boolean hasNext() { - return itr.hasNext(); - } - - @Override - public Path next() { - return fs.wrap(itr.next()); - } - - @Override - public void remove() { - itr.remove(); - } - }; - } - - @Override - public int compareTo(Path other) { - return delegate.compareTo(fs.unwrap(other)); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - public boolean equals(Object other) { - return other instanceof TestPath && delegate.equals(fs.unwrap((TestPath) other)); - } - - @Override - public String toString() { - return delegate.toString(); - } - } -} diff --git a/test/jdk/java/net/httpclient/FilePublisher/FilePublisherTest.java b/test/jdk/java/net/httpclient/FilePublisherTest.java similarity index 100% rename from test/jdk/java/net/httpclient/FilePublisher/FilePublisherTest.java rename to test/jdk/java/net/httpclient/FilePublisherTest.java