Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
8315241: (fs) Move toRealPath tests in java/nio/file/Path/Misc.java t…
…o separate JUnit 5 test Reviewed-by: rriggs
- Loading branch information
Brian Burkhalter
committed
Aug 30, 2023
1 parent
8e4cda0
commit dd64a4a
Showing
2 changed files
with
193 additions
and
143 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,191 @@ | ||
/* | ||
* Copyright (c) 2023, 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 8295753 | ||
* @summary Verify correct operation of Path.toRealPath | ||
* @library .. /test/lib | ||
* @build ToRealPath jdk.test.lib.Platform | ||
* @run junit ToRealPath | ||
*/ | ||
|
||
import java.io.IOException; | ||
import java.io.UncheckedIOException; | ||
import java.nio.file.Files; | ||
import java.nio.file.Path; | ||
|
||
import jdk.test.lib.Platform; | ||
|
||
import org.junit.jupiter.api.AfterAll; | ||
import org.junit.jupiter.api.Test; | ||
import org.junit.jupiter.api.condition.EnabledIf; | ||
import org.junit.jupiter.api.condition.EnabledOnOs; | ||
import org.junit.jupiter.api.condition.OS; | ||
|
||
import static java.nio.file.LinkOption.*; | ||
import static org.junit.jupiter.api.Assertions.*; | ||
|
||
public class ToRealPath { | ||
static final boolean SUPPORTS_LINKS; | ||
static final Path DIR; | ||
static final Path SUBDIR; | ||
static final Path FILE; | ||
static final Path LINK; | ||
|
||
static { | ||
try { | ||
DIR = TestUtil.createTemporaryDirectory(); | ||
SUBDIR = Files.createDirectory(DIR.resolve("subdir")); | ||
FILE = Files.createFile(DIR.resolve("foo")); | ||
LINK = DIR.resolve("link"); | ||
SUPPORTS_LINKS = TestUtil.supportsLinks(DIR); | ||
} catch (IOException e) { | ||
throw new UncheckedIOException(e); | ||
} | ||
}; | ||
|
||
public boolean supportsLinks() { | ||
return SUPPORTS_LINKS; | ||
} | ||
|
||
@Test | ||
public void locateSameFile() throws IOException { | ||
assertTrue(Files.isSameFile(FILE.toRealPath(), | ||
FILE.toRealPath(NOFOLLOW_LINKS))); | ||
} | ||
|
||
@Test | ||
public void failNotExist() { | ||
Path doesNotExist = DIR.resolve("DoesNotExist"); | ||
assertThrows(IOException.class, () -> doesNotExist.toRealPath()); | ||
} | ||
|
||
@Test | ||
public void failNotExistNoFollow() { | ||
Path doesNotExist = DIR.resolve("DoesNotExist"); | ||
assertThrows(IOException.class, | ||
() -> doesNotExist.toRealPath(NOFOLLOW_LINKS)); | ||
} | ||
|
||
@EnabledIf("supportsLinks") | ||
@Test | ||
public void shouldResolveLinks() throws IOException { | ||
Path resolvedFile = FILE; | ||
if (Platform.isWindows()) { | ||
// Path::toRealPath does not work with environments using the | ||
// legacy subst mechanism. This is a workaround to keep the | ||
// test working if 'dir' points to a location on a subst drive. | ||
// See JDK-8213216. | ||
// | ||
Path tempLink = DIR.resolve("tempLink"); | ||
Files.createSymbolicLink(tempLink, DIR.toAbsolutePath()); | ||
Path resolvedDir = tempLink.toRealPath(); | ||
Files.delete(tempLink); | ||
resolvedFile = resolvedDir.resolve(FILE.getFileName()); | ||
} | ||
|
||
Files.createSymbolicLink(LINK, resolvedFile.toAbsolutePath()); | ||
assertTrue(LINK.toRealPath().equals(resolvedFile.toRealPath())); | ||
Files.delete(LINK); | ||
} | ||
|
||
@Test | ||
@EnabledIf("supportsLinks") | ||
public void shouldNotResolveLinks() throws IOException { | ||
Files.createSymbolicLink(LINK, FILE.toAbsolutePath()); | ||
assertEquals(LINK.toRealPath(NOFOLLOW_LINKS).getFileName(), | ||
LINK.getFileName()); | ||
Files.delete(LINK); | ||
} | ||
|
||
@Test | ||
public void eliminateDot() throws IOException { | ||
assertEquals(DIR.resolve(".").toRealPath(), | ||
DIR.toRealPath()); | ||
} | ||
|
||
@Test | ||
public void eliminateDotNoFollow() throws IOException { | ||
assertEquals(DIR.resolve(".").toRealPath(NOFOLLOW_LINKS), | ||
DIR.toRealPath(NOFOLLOW_LINKS)); | ||
} | ||
|
||
@Test | ||
public void eliminateDots() throws IOException { | ||
assertEquals(SUBDIR.resolve("..").toRealPath(), | ||
DIR.toRealPath()); | ||
} | ||
|
||
@Test | ||
public void eliminateDotsNoFollow() throws IOException { | ||
assertEquals(SUBDIR.resolve("..").toRealPath(NOFOLLOW_LINKS), | ||
DIR.toRealPath(NOFOLLOW_LINKS)); | ||
} | ||
|
||
@Test | ||
@EnabledOnOs(OS.MAC) | ||
public final void macOSTests() throws IOException { | ||
// theTarget = dir/subdir/theTarget | ||
Path theTarget = Path.of(SUBDIR.toString(), "theTarget"); | ||
Files.createFile(theTarget); | ||
|
||
// dir/theLink -> dir/subdir | ||
Path theLink = Path.of(DIR.toString(), "theLink"); | ||
Files.createSymbolicLink(theLink, SUBDIR); | ||
|
||
// thePath = dir/thelink/thetarget (all lower case) | ||
Path thePath = Path.of(DIR.toString(), "thelink", "thetarget"); | ||
Path noFollow = thePath.toRealPath(NOFOLLOW_LINKS); | ||
int nc = noFollow.getNameCount(); | ||
|
||
// Real path should retain case as dir/theLink/theTarget | ||
assertEquals(noFollow.getName(nc - 2), Path.of("theLink")); | ||
assertEquals(noFollow.getName(nc - 1), Path.of("theTarget")); | ||
assertEquals(noFollow.toString(), | ||
Path.of(DIR.toString(), "theLink", "theTarget").toString()); | ||
|
||
// Test where a link is preceded by ".." in the path | ||
Path superBeforeLink = | ||
Path.of(SUBDIR.toString(), "..", "thelink", "thetarget"); | ||
noFollow = superBeforeLink.toRealPath(NOFOLLOW_LINKS); | ||
nc = noFollow.getNameCount(); | ||
assertEquals(noFollow.getName(nc - 2), Path.of("theLink")); | ||
assertEquals(noFollow.getName(nc - 1), Path.of("theTarget")); | ||
|
||
// Test where a link is followed by ".." in the path | ||
Path linkBeforeSuper = | ||
Path.of(DIR.toString(), "thelink", "..", "subdir", "thetarget"); | ||
noFollow = linkBeforeSuper.toRealPath(NOFOLLOW_LINKS); | ||
nc = noFollow.getNameCount(); | ||
assertEquals(noFollow.getName(nc - 4), Path.of("theLink")); | ||
assertEquals(noFollow.getName(nc - 1), Path.of("theTarget")); | ||
|
||
Files.delete(theTarget); | ||
} | ||
|
||
@AfterAll | ||
public static void cleanup() throws IOException { | ||
Files.delete(SUBDIR); | ||
Files.delete(FILE); | ||
} | ||
} |
dd64a4a
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Review
Issues
dd64a4a
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/backport jdk21u-dev
dd64a4a
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@GoeLin the backport was successfully created on the branch backport-GoeLin-dd64a4a4 in my personal fork of openjdk/jdk21u-dev. To create a pull request with this backport targeting openjdk/jdk21u-dev:master, just click the following link:
➡️ Create pull request
The title of the pull request is automatically filled in correctly and below you find a suggestion for the pull request body:
If you need to update the source branch of the pull then run the following commands in a local clone of your personal fork of openjdk/jdk21u-dev: