diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ClassPathResourceTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ClassPathResourceTest.java deleted file mode 100644 index b6c778f1d4c..00000000000 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ClassPathResourceTest.java +++ /dev/null @@ -1,134 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 -// which is available at https://www.apache.org/licenses/LICENSE-2.0. -// -// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 -// ======================================================================== -// - -package org.eclipse.jetty.util.resource; - -import java.nio.file.Files; -import java.nio.file.Path; - -import org.eclipse.jetty.util.IO; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.empty; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assumptions.assumeFalse; - -public class ClassPathResourceTest -{ - private ResourceFactory.Closeable resourceFactory; - - @BeforeEach - public void beforeEach() - { - assertThat(FileSystemPool.INSTANCE.mounts(), empty()); - resourceFactory = ResourceFactory.closeable(); - } - - @AfterEach - public void afterEach() - { - IO.close(resourceFactory); - assertThat(FileSystemPool.INSTANCE.mounts(), empty()); - } - - /** - * Test a class path resource for existence. - */ - @Test - public void testClassPathResourceClassRelative() - { - final String classPathName = "Resource.class"; - - Resource resource = resourceFactory.newClassPathResource(classPathName); - - // A class path cannot be a directory - assertFalse(resource.isDirectory(), "Class path cannot be a directory."); - - // A class path must exist - assertTrue(resource.exists(), "Class path resource does not exist."); - } - - /** - * Test a class path resource for existence. - */ - @Test - public void testClassPathResourceClassAbsolute() - { - final String classPathName = "/org/eclipse/jetty/util/resource/Resource.class"; - - Resource resource = resourceFactory.newClassPathResource(classPathName); - - // A class path cannot be a directory - assertFalse(resource.isDirectory(), "Class path cannot be a directory."); - - // A class path must exist - assertTrue(resource.exists(), "Class path resource does not exist."); - } - - /** - * Test a class path resource for directories. - * - * @throws Exception failed test - */ - @Test - public void testClassPathResourceDirectory() throws Exception - { - // If the test runs in the module-path, resource "/" cannot be found. - assumeFalse(Resource.class.getModule().isNamed()); - - final String classPathName = "/"; - - Resource resource = resourceFactory.newClassPathResource(classPathName); - - // A class path must be a directory - assertTrue(resource.isDirectory(), "Class path must be a directory."); - - assertTrue(Files.isDirectory(resource.getPath()), "Class path returned file must be a directory."); - - // A class path must exist - assertTrue(resource.exists(), "Class path resource does not exist."); - } - - /** - * Test a class path resource for a file. - * - * @throws Exception failed test - */ - @Test - public void testClassPathResourceFile() throws Exception - { - final String fileName = "resource.txt"; - final String classPathName = "/" + fileName; - - // Will locate a resource in the class path - Resource resource = resourceFactory.newClassPathResource(classPathName); - - // A class path cannot be a directory - assertFalse(resource.isDirectory(), "Class path must be a directory."); - - assertTrue(resource != null); - - Path path = resource.getPath(); - - assertEquals(fileName, path.getFileName().toString(), "File name from class path is not equal."); - assertTrue(Files.isRegularFile(path), "File returned from class path should be a regular file."); - - // A class path must exist - assertTrue(resource.exists(), "Class path resource does not exist."); - } -} diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java index 945126595e1..5b467b92df4 100644 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java +++ b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/FileSystemResourceTest.java @@ -44,7 +44,6 @@ import org.hamcrest.Description; import org.hamcrest.Matcher; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -246,7 +245,6 @@ public class FileSystemResourceTest } @Test - @Disabled("Will be fixed in PR #8436") public void testAccessUniCodeFile() throws Exception { Path dir = workDir.getEmptyPathDir(); @@ -263,30 +261,34 @@ public class FileSystemResourceTest Resource base = ResourceFactory.root().newResource(subdir); - // Cannot use decoded Unicode - assertThrows(IllegalArgumentException.class, () -> base.resolve("swedish-å.txt")); - assertThrows(IllegalArgumentException.class, () -> base.resolve("swedish-ä.txt")); - assertThrows(IllegalArgumentException.class, () -> base.resolve("swedish-ö.txt")); + // Use decoded Unicode + Resource refD1 = base.resolve("swedish-å.txt"); + Resource refD2 = base.resolve("swedish-ä.txt"); + Resource refD3 = base.resolve("swedish-ö.txt"); + + assertTrue(refD1.exists(), "Ref D1 exists"); + assertTrue(refD2.exists(), "Ref D2 exists"); + assertTrue(refD3.exists(), "Ref D3 exists"); // Use encoded Unicode - Resource refA1 = base.resolve("swedish-%C3%A5.txt"); // swedish-å.txt - Resource refA2 = base.resolve("swedish-%C3%A4.txt"); // swedish-ä.txt - Resource refO1 = base.resolve("swedish-%C3%B6.txt"); // swedish-ö.txt + Resource refE1 = base.resolve("swedish-%C3%A5.txt"); // swedish-å.txt + Resource refE2 = base.resolve("swedish-%C3%A4.txt"); // swedish-ä.txt + Resource refE3 = base.resolve("swedish-%C3%B6.txt"); // swedish-ö.txt - assertThat("Ref A1 exists", refA1.exists(), is(true)); - assertThat("Ref A2 exists", refA2.exists(), is(true)); - assertThat("Ref O1 exists", refO1.exists(), is(true)); + assertTrue(refE1.exists(), "Ref E1 exists"); + assertTrue(refE2.exists(), "Ref E2 exists"); + assertTrue(refE3.exists(), "Ref E3 exists"); if (LINUX.isCurrentOs()) { - assertThat("Ref A1 alias", refA1.isAlias(), is(false)); - assertThat("Ref A2 alias", refA2.isAlias(), is(false)); - assertThat("Ref O1 alias", refO1.isAlias(), is(false)); + assertThat("Ref A1 alias", refE1.isAlias(), is(false)); + assertThat("Ref A2 alias", refE2.isAlias(), is(false)); + assertThat("Ref O1 alias", refE3.isAlias(), is(false)); } - assertThat("Ref A1 contents", toString(refA1), is("hi a-with-circle")); - assertThat("Ref A2 contents", toString(refA2), is("hi a-with-two-dots")); - assertThat("Ref O1 contents", toString(refO1), is("hi o-with-two-dots")); + assertThat("Ref A1 contents", toString(refE1), is("hi a-with-circle")); + assertThat("Ref A2 contents", toString(refE2), is("hi a-with-two-dots")); + assertThat("Ref O1 contents", toString(refE3), is("hi o-with-two-dots")); } /** diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JrtResourceTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JrtResourceTest.java deleted file mode 100644 index bbe391b3e56..00000000000 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JrtResourceTest.java +++ /dev/null @@ -1,59 +0,0 @@ -// -// ======================================================================== -// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 -// which is available at https://www.apache.org/licenses/LICENSE-2.0. -// -// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 -// ======================================================================== -// - -package org.eclipse.jetty.util.resource; - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.is; - -public class JrtResourceTest -{ - @BeforeEach - public void beforeEach() - { - assertThat(FileSystemPool.INSTANCE.mounts(), empty()); - } - - @AfterEach - public void afterEach() - { - assertThat(FileSystemPool.INSTANCE.mounts(), empty()); - } - - @Test - public void testResourceModule() - throws Exception - { - Resource resource = ResourceFactory.root().newResource("jrt:/java.base"); - - assertThat(resource.exists(), is(true)); - assertThat(resource.isDirectory(), is(true)); - assertThat(resource.length(), is(0L)); - } - - @Test - public void testResourceAllModules() - throws Exception - { - Resource resource = ResourceFactory.root().newResource("jrt:/"); - - assertThat(resource.exists(), is(true)); - assertThat(resource.isDirectory(), is(true)); - assertThat(resource.length(), is(0L)); - } -} diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JarResourceTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/MountedPathResourceTest.java similarity index 99% rename from jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JarResourceTest.java rename to jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/MountedPathResourceTest.java index 37ab6d16db4..133598b281d 100644 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/JarResourceTest.java +++ b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/MountedPathResourceTest.java @@ -43,7 +43,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @ExtendWith(WorkDirExtension.class) -public class JarResourceTest +public class MountedPathResourceTest { public WorkDir workDir; diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java index 02149468d7c..f3e51079560 100644 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java +++ b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/resource/ResourceTest.java @@ -14,11 +14,14 @@ package org.eclipse.jetty.util.resource; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URL; +import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.stream.Stream; @@ -27,11 +30,9 @@ import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.jupiter.WorkDir; import org.eclipse.jetty.toolchain.test.jupiter.WorkDirExtension; import org.eclipse.jetty.util.IO; -import org.eclipse.jetty.util.URIUtil; import org.hamcrest.Matchers; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assumptions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -43,11 +44,14 @@ import org.junit.jupiter.params.provider.MethodSource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.startsWith; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assumptions.assumeFalse; import static org.junit.jupiter.api.Assumptions.assumeTrue; @ExtendWith(WorkDirExtension.class) @@ -373,12 +377,163 @@ public class ResourceTest } @Test - @Disabled - public void testDotAlias() + public void testDotAliasDirExists(WorkDir workDir) throws IOException { - Resource resource = resourceFactory.newResource("/foo/bar"); - Resource same = resource.resolve("."); - assertNotNull(same); - assertTrue(same.isAlias()); + Path dir = workDir.getEmptyPathDir().resolve("foo/bar"); + FS.ensureDirExists(dir); + Resource resource = resourceFactory.newResource(dir); + Resource dot = resource.resolve("."); + assertNotNull(dot); + assertTrue(dot.exists()); + assertTrue(dot.isAlias(), "Reference to '.' is an alias to itself"); + assertTrue(Files.isSameFile(dot.getPath(), Paths.get(dot.getAlias()))); + } + + @Test + public void testDotAliasDirDoesNotExist(WorkDir workDir) + { + Path dir = workDir.getEmptyPathDir().resolve("foo/bar"); + // at this point we have a directory reference that does not exist + Resource resource = resourceFactory.newResource(dir); + Resource dot = resource.resolve("."); + assertNotNull(dot); + assertFalse(dot.exists()); + assertFalse(dot.isAlias(), "Reference to '.' is not an alias as directory doesn't exist"); + } + + @Test + public void testDotAliasFileExists(WorkDir workDir) throws IOException + { + Path dir = workDir.getEmptyPathDir().resolve("foo"); + FS.ensureDirExists(dir); + Path file = dir.resolve("bar.txt"); + FS.touch(file); + Resource resource = resourceFactory.newResource(file); + Resource dot = resource.resolve("."); + assertNotNull(dot); + assertTrue(dot.exists()); + assertTrue(dot.isAlias(), "Reference to '.' is an alias to itself"); + assertTrue(Files.isSameFile(dot.getPath(), Paths.get(dot.getAlias()))); + } + + @Test + public void testDotAliasFileDoesNotExists(WorkDir workDir) throws IOException + { + Path dir = workDir.getEmptyPathDir().resolve("foo"); + FS.ensureDirExists(dir); + Path file = dir.resolve("bar.txt"); + // at this point we have a file reference that does not exist + assertFalse(Files.exists(file)); + Resource resource = resourceFactory.newResource(file); + Resource dot = resource.resolve("."); + assertNotNull(dot); + assertFalse(dot.exists()); + assertFalse(dot.isAlias(), "Reference to '.' is not an alias as file doesn't exist"); + } + + @Test + public void testJrtResourceModule() + { + Resource resource = ResourceFactory.root().newResource("jrt:/java.base"); + + assertThat(resource.exists(), is(true)); + assertThat(resource.isDirectory(), is(true)); + assertThat(resource.length(), is(0L)); + } + + @Test + public void testJrtResourceAllModules() + { + Resource resource = ResourceFactory.root().newResource("jrt:/"); + + assertThat(resource.exists(), is(true)); + assertThat(resource.isDirectory(), is(true)); + assertThat(resource.length(), is(0L)); + } + + /** + * Test a class path resource for existence. + */ + @Test + public void testClassPathResourceClassRelative() + { + final String classPathName = "Resource.class"; + + Resource resource = resourceFactory.newClassPathResource(classPathName); + + // A class path cannot be a directory + assertFalse(resource.isDirectory(), "Class path cannot be a directory."); + + // A class path must exist + assertTrue(resource.exists(), "Class path resource does not exist."); + } + + /** + * Test a class path resource for existence. + */ + @Test + public void testClassPathResourceClassAbsolute() + { + final String classPathName = "/org/eclipse/jetty/util/resource/Resource.class"; + + Resource resource = resourceFactory.newClassPathResource(classPathName); + + // A class path cannot be a directory + assertFalse(resource.isDirectory(), "Class path cannot be a directory."); + + // A class path must exist + assertTrue(resource.exists(), "Class path resource does not exist."); + } + + /** + * Test a class path resource for directories. + * + * @throws Exception failed test + */ + @Test + public void testClassPathResourceDirectory() throws Exception + { + // If the test runs in the module-path, resource "/" cannot be found. + assumeFalse(Resource.class.getModule().isNamed()); + + final String classPathName = "/"; + + Resource resource = resourceFactory.newClassPathResource(classPathName); + + // A class path must be a directory + assertTrue(resource.isDirectory(), "Class path must be a directory."); + + assertTrue(Files.isDirectory(resource.getPath()), "Class path returned file must be a directory."); + + // A class path must exist + assertTrue(resource.exists(), "Class path resource does not exist."); + } + + /** + * Test a class path resource for a file. + * + * @throws Exception failed test + */ + @Test + public void testClassPathResourceFile() throws Exception + { + final String fileName = "resource.txt"; + final String classPathName = "/" + fileName; + + // Will locate a resource in the class path + Resource resource = resourceFactory.newClassPathResource(classPathName); + + // A class path cannot be a directory + assertFalse(resource.isDirectory(), "Class path must be a directory."); + + assertNotNull(resource); + + Path path = resource.getPath(); + + assertEquals(fileName, path.getFileName().toString(), "File name from class path is not equal."); + assertTrue(Files.isRegularFile(path), "File returned from class path should be a regular file."); + + // A class path must exist + assertTrue(resource.exists(), "Class path resource does not exist."); } }