package com.github.marschall.memoryfilesystem; import static java.nio.charset.StandardCharsets.US_ASCII; import static java.nio.file.StandardOpenOption.CREATE_NEW; import static java.nio.file.StandardOpenOption.WRITE; import static org.junit.Assert.assertNotNull; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.Map; import java.util.jar.JarOutputStream; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; public class ZipFileSystemInteropabilityTest { @Rule public final FileSystemRule rule = new FileSystemRule(); @Test public void createZipFileSystem() throws IOException { FileSystem memoryFileSystem = this.rule.getFileSystem(); Map<String, String> env = Collections.singletonMap("create", "true"); URI uri = URI.create("zipfs:" + memoryFileSystem.getPath("/file.zip").toUri()); try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) { try (BufferedWriter writer = Files.newBufferedWriter(zipfs.getPath("hello.txt"), US_ASCII, CREATE_NEW, WRITE)) { writer.write("world"); } } } @Test @Ignore("broken") public void createNestedZips() throws IOException { FileSystem memoryFileSystem = this.rule.getFileSystem(); Map<String, String> env = Collections.singletonMap("create", "false"); Path outerZip = memoryFileSystem.getPath("/file.zip"); try (OutputStream stream = new JarOutputStream(Files.newOutputStream(outerZip, CREATE_NEW, WRITE))) { // nothing, just create an empty jar } URI uri = URI.create("zipfs:" + outerZip.toUri()); try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) { Path innerZip = zipfs.getPath("hello.zip"); try (OutputStream stream = new JarOutputStream(Files.newOutputStream(innerZip, CREATE_NEW, WRITE))) { // nothing, just create an empty jar } Map<String, String> env2 = Collections.singletonMap("create", "false"); // locate file system by using the syntax // defined in java.net.JarURLConnection URI uri2 = URI.create("zipfs:" + innerZip.toUri()); try (FileSystem zipfs2 = FileSystems.newFileSystem(uri2, env2)) { try (BufferedWriter writer = Files.newBufferedWriter(zipfs2.getPath("hello.txt"), US_ASCII, CREATE_NEW, WRITE)) { writer.write("world"); } } } } @Test @Ignore("broken upstream") public void jarToUriRegression() throws IOException { Path jarFolder = Files.createTempDirectory("jartest"); try { Path jarFile = jarFolder.resolve("test.jar"); try { Map<String, String> env = Collections.singletonMap("create", "true"); URI uri = URI.create("jar:" + jarFile.toUri()); try (FileSystem jarfs = FileSystems.newFileSystem(uri, env)) { Path p = jarfs.getPath("hello.txt"); assertNotNull(Paths.get(p.toUri())); } } finally { Files.delete(jarFile); } } finally { Files.delete(jarFolder); } } @Test public void jarToUriRegressionFixed() throws IOException { Path jarFile = Files.createTempFile(null, ".jar"); try (OutputStream stream = new JarOutputStream(Files.newOutputStream(jarFile))) { // nothing, just create an empty jar } try { Map<String, String> env = Collections.singletonMap("create", "false"); URI uri = URI.create("jar:" + jarFile.toUri()); try (FileSystem jarfs = FileSystems.newFileSystem(uri, env)) { Path p = jarfs.getPath("hello.txt"); assertNotNull(Paths.get(p.toUri())); } } finally { Files.delete(jarFile); } } @Test @Ignore("broken upstream") public void nestesJarsRegression() throws IOException { Path outerJar = Files.createTempFile("outer", ".jar"); try (OutputStream stream = new JarOutputStream(Files.newOutputStream(outerJar))) { // nothing, just create an empty jar } try { Map<String, String> outerEnv = Collections.singletonMap("create", "false"); URI outerUri = URI.create("jar:" + outerJar.toUri()); try (FileSystem jarfs = FileSystems.newFileSystem(outerUri, outerEnv)) { Path innerJar = jarfs.getPath("inner.jar"); try (OutputStream stream = new JarOutputStream(Files.newOutputStream(innerJar, CREATE_NEW, WRITE))) { // nothing, just create an empty jar } Map<String, String> innerEnv = Collections.singletonMap("create", "false"); URI innerUri = URI.create("jar:" + innerJar.toUri()); try (FileSystem zipfs2 = FileSystems.newFileSystem(innerUri, innerEnv)) { try (BufferedWriter writer = Files.newBufferedWriter(zipfs2.getPath("hello.txt"), US_ASCII, CREATE_NEW, WRITE)) { writer.write("world"); } } } } finally { Files.delete(outerJar); } } }