aboutsummaryrefslogtreecommitdiff
path: root/jimfs/src/test/java/com/google/common/jimfs/JimfsWindowsLikeFileSystemTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'jimfs/src/test/java/com/google/common/jimfs/JimfsWindowsLikeFileSystemTest.java')
-rw-r--r--jimfs/src/test/java/com/google/common/jimfs/JimfsWindowsLikeFileSystemTest.java491
1 files changed, 491 insertions, 0 deletions
diff --git a/jimfs/src/test/java/com/google/common/jimfs/JimfsWindowsLikeFileSystemTest.java b/jimfs/src/test/java/com/google/common/jimfs/JimfsWindowsLikeFileSystemTest.java
new file mode 100644
index 0000000..a3b7ad2
--- /dev/null
+++ b/jimfs/src/test/java/com/google/common/jimfs/JimfsWindowsLikeFileSystemTest.java
@@ -0,0 +1,491 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.common.jimfs;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Ordering;
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystemException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.regex.PatternSyntaxException;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests a Windows-like file system through the public methods in {@link Files}.
+ *
+ * @author Colin Decker
+ */
+@RunWith(JUnit4.class)
+public class JimfsWindowsLikeFileSystemTest extends AbstractJimfsIntegrationTest {
+
+ @Override
+ protected FileSystem createFileSystem() {
+ return Jimfs.newFileSystem(
+ "win",
+ Configuration.windows().toBuilder()
+ .setRoots("C:\\", "E:\\")
+ .setAttributeViews("basic", "owner", "dos", "acl", "user")
+ .build());
+ }
+
+ @Test
+ public void testFileSystem() {
+ assertThat(fs.getSeparator()).isEqualTo("\\");
+ assertThat(fs.getRootDirectories())
+ .containsExactlyElementsIn(ImmutableSet.of(path("C:\\"), path("E:\\")))
+ .inOrder();
+ assertThat(fs.isOpen()).isTrue();
+ assertThat(fs.isReadOnly()).isFalse();
+ assertThat(fs.supportedFileAttributeViews())
+ .containsExactly("basic", "owner", "dos", "acl", "user");
+ assertThat(fs.provider()).isInstanceOf(JimfsFileSystemProvider.class);
+ }
+
+ @Test
+ public void testPaths() {
+ assertThatPath("C:\\").isAbsolute().and().hasRootComponent("C:\\").and().hasNoNameComponents();
+ assertThatPath("foo").isRelative().and().hasNameComponents("foo");
+ assertThatPath("foo\\bar").isRelative().and().hasNameComponents("foo", "bar");
+ assertThatPath("C:\\foo\\bar\\baz")
+ .isAbsolute()
+ .and()
+ .hasRootComponent("C:\\")
+ .and()
+ .hasNameComponents("foo", "bar", "baz");
+ }
+
+ @Test
+ public void testPaths_equalityIsCaseInsensitive() {
+ assertThatPath("C:\\").isEqualTo(path("c:\\"));
+ assertThatPath("foo").isEqualTo(path("FOO"));
+ }
+
+ @Test
+ public void testPaths_areSortedCaseInsensitive() {
+ Path p1 = path("a");
+ Path p2 = path("B");
+ Path p3 = path("c");
+ Path p4 = path("D");
+
+ assertThat(Ordering.natural().immutableSortedCopy(Arrays.asList(p3, p4, p1, p2)))
+ .isEqualTo(ImmutableList.of(p1, p2, p3, p4));
+
+ // would be p2, p4, p1, p3 if sorting were case sensitive
+ }
+
+ @Test
+ public void testPaths_withSlash() {
+ assertThatPath("foo/bar")
+ .isRelative()
+ .and()
+ .hasNameComponents("foo", "bar")
+ .and()
+ .isEqualTo(path("foo\\bar"));
+ assertThatPath("C:/foo/bar/baz")
+ .isAbsolute()
+ .and()
+ .hasRootComponent("C:\\")
+ .and()
+ .hasNameComponents("foo", "bar", "baz")
+ .and()
+ .isEqualTo(path("C:\\foo\\bar\\baz"));
+ assertThatPath("C:/foo\\bar/baz")
+ .isAbsolute()
+ .and()
+ .hasRootComponent("C:\\")
+ .and()
+ .hasNameComponents("foo", "bar", "baz")
+ .and()
+ .isEqualTo(path("C:\\foo\\bar\\baz"));
+ }
+
+ @Test
+ public void testPaths_resolve() {
+ assertThatPath(path("C:\\").resolve("foo\\bar"))
+ .isAbsolute()
+ .and()
+ .hasRootComponent("C:\\")
+ .and()
+ .hasNameComponents("foo", "bar");
+ assertThatPath(path("foo\\bar").resolveSibling("baz"))
+ .isRelative()
+ .and()
+ .hasNameComponents("foo", "baz");
+ assertThatPath(path("foo\\bar").resolve("C:\\one\\two"))
+ .isAbsolute()
+ .and()
+ .hasRootComponent("C:\\")
+ .and()
+ .hasNameComponents("one", "two");
+ }
+
+ @Test
+ public void testPaths_normalize() {
+ assertThatPath(path("foo\\bar\\..").normalize()).isRelative().and().hasNameComponents("foo");
+ assertThatPath(path("foo\\.\\bar\\..\\baz\\test\\.\\..\\stuff").normalize())
+ .isRelative()
+ .and()
+ .hasNameComponents("foo", "baz", "stuff");
+ assertThatPath(path("..\\..\\foo\\.\\bar").normalize())
+ .isRelative()
+ .and()
+ .hasNameComponents("..", "..", "foo", "bar");
+ assertThatPath(path("foo\\..\\..\\bar").normalize())
+ .isRelative()
+ .and()
+ .hasNameComponents("..", "bar");
+ assertThatPath(path("..\\.\\..").normalize()).isRelative().and().hasNameComponents("..", "..");
+ }
+
+ @Test
+ public void testPaths_relativize() {
+ assertThatPath(path("C:\\foo\\bar").relativize(path("C:\\foo\\bar\\baz")))
+ .isRelative()
+ .and()
+ .hasNameComponents("baz");
+ assertThatPath(path("C:\\foo\\bar\\baz").relativize(path("C:\\foo\\bar")))
+ .isRelative()
+ .and()
+ .hasNameComponents("..");
+ assertThatPath(path("C:\\foo\\bar\\baz").relativize(path("C:\\foo\\baz\\bar")))
+ .isRelative()
+ .and()
+ .hasNameComponents("..", "..", "baz", "bar");
+ assertThatPath(path("foo\\bar").relativize(path("foo")))
+ .isRelative()
+ .and()
+ .hasNameComponents("..");
+ assertThatPath(path("foo").relativize(path("foo\\bar")))
+ .isRelative()
+ .and()
+ .hasNameComponents("bar");
+
+ try {
+ Path unused = path("C:\\foo\\bar").relativize(path("bar"));
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ Path unused = path("bar").relativize(path("C:\\foo\\bar"));
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ @Test
+ public void testPaths_startsWith_endsWith() {
+ assertThat(path("C:\\foo\\bar").startsWith("C:\\")).isTrue();
+ assertThat(path("C:\\foo\\bar").startsWith("C:\\foo")).isTrue();
+ assertThat(path("C:\\foo\\bar").startsWith("C:\\foo\\bar")).isTrue();
+ assertThat(path("C:\\foo\\bar").endsWith("bar")).isTrue();
+ assertThat(path("C:\\foo\\bar").endsWith("foo\\bar")).isTrue();
+ assertThat(path("C:\\foo\\bar").endsWith("C:\\foo\\bar")).isTrue();
+ assertThat(path("C:\\foo\\bar").endsWith("C:\\foo")).isFalse();
+ assertThat(path("C:\\foo\\bar").startsWith("foo\\bar")).isFalse();
+ }
+
+ @Test
+ public void testPaths_toAbsolutePath() {
+ assertThatPath(path("C:\\foo\\bar").toAbsolutePath())
+ .isAbsolute()
+ .and()
+ .hasRootComponent("C:\\")
+ .and()
+ .hasNameComponents("foo", "bar")
+ .and()
+ .isEqualTo(path("C:\\foo\\bar"));
+
+ assertThatPath(path("foo\\bar").toAbsolutePath())
+ .isAbsolute()
+ .and()
+ .hasRootComponent("C:\\")
+ .and()
+ .hasNameComponents("work", "foo", "bar")
+ .and()
+ .isEqualTo(path("C:\\work\\foo\\bar"));
+ }
+
+ @Test
+ public void testPaths_toRealPath() throws IOException {
+ Files.createDirectories(path("C:\\foo\\bar"));
+ Files.createSymbolicLink(path("C:\\link"), path("C:\\"));
+
+ assertThatPath(path("C:\\link\\foo\\bar").toRealPath()).isEqualTo(path("C:\\foo\\bar"));
+
+ assertThatPath(path("").toRealPath()).isEqualTo(path("C:\\work"));
+ assertThatPath(path(".").toRealPath()).isEqualTo(path("C:\\work"));
+ assertThatPath(path("..").toRealPath()).isEqualTo(path("C:\\"));
+ assertThatPath(path("..\\..").toRealPath()).isEqualTo(path("C:\\"));
+ assertThatPath(path(".\\..\\.\\..").toRealPath()).isEqualTo(path("C:\\"));
+ assertThatPath(path(".\\..\\.\\..\\.").toRealPath()).isEqualTo(path("C:\\"));
+ }
+
+ @Test
+ public void testPaths_toUri() {
+ assertThat(fs.getPath("C:\\").toUri()).isEqualTo(URI.create("jimfs://win/C:/"));
+ assertThat(fs.getPath("C:\\foo").toUri()).isEqualTo(URI.create("jimfs://win/C:/foo"));
+ assertThat(fs.getPath("C:\\foo\\bar").toUri()).isEqualTo(URI.create("jimfs://win/C:/foo/bar"));
+ assertThat(fs.getPath("foo").toUri()).isEqualTo(URI.create("jimfs://win/C:/work/foo"));
+ assertThat(fs.getPath("foo\\bar").toUri()).isEqualTo(URI.create("jimfs://win/C:/work/foo/bar"));
+ assertThat(fs.getPath("").toUri()).isEqualTo(URI.create("jimfs://win/C:/work/"));
+ assertThat(fs.getPath(".\\..\\.").toUri()).isEqualTo(URI.create("jimfs://win/C:/work/./.././"));
+ }
+
+ @Test
+ public void testPaths_toUri_unc() {
+ assertThat(fs.getPath("\\\\host\\share\\").toUri())
+ .isEqualTo(URI.create("jimfs://win//host/share/"));
+ assertThat(fs.getPath("\\\\host\\share\\foo").toUri())
+ .isEqualTo(URI.create("jimfs://win//host/share/foo"));
+ assertThat(fs.getPath("\\\\host\\share\\foo\\bar").toUri())
+ .isEqualTo(URI.create("jimfs://win//host/share/foo/bar"));
+ }
+
+ @Test
+ public void testPaths_getFromUri() {
+ assertThatPath(Paths.get(URI.create("jimfs://win/C:/"))).isEqualTo(fs.getPath("C:\\"));
+ assertThatPath(Paths.get(URI.create("jimfs://win/C:/foo"))).isEqualTo(fs.getPath("C:\\foo"));
+ assertThatPath(Paths.get(URI.create("jimfs://win/C:/foo%20bar")))
+ .isEqualTo(fs.getPath("C:\\foo bar"));
+ assertThatPath(Paths.get(URI.create("jimfs://win/C:/foo/./bar")))
+ .isEqualTo(fs.getPath("C:\\foo\\.\\bar"));
+ assertThatPath(Paths.get(URI.create("jimfs://win/C:/foo/bar/")))
+ .isEqualTo(fs.getPath("C:\\foo\\bar"));
+ }
+
+ @Test
+ public void testPaths_getFromUri_unc() {
+ assertThatPath(Paths.get(URI.create("jimfs://win//host/share/")))
+ .isEqualTo(fs.getPath("\\\\host\\share\\"));
+ assertThatPath(Paths.get(URI.create("jimfs://win//host/share/foo")))
+ .isEqualTo(fs.getPath("\\\\host\\share\\foo"));
+ assertThatPath(Paths.get(URI.create("jimfs://win//host/share/foo%20bar")))
+ .isEqualTo(fs.getPath("\\\\host\\share\\foo bar"));
+ assertThatPath(Paths.get(URI.create("jimfs://win//host/share/foo/./bar")))
+ .isEqualTo(fs.getPath("\\\\host\\share\\foo\\.\\bar"));
+ assertThatPath(Paths.get(URI.create("jimfs://win//host/share/foo/bar/")))
+ .isEqualTo(fs.getPath("\\\\host\\share\\foo\\bar"));
+ }
+
+ @Test
+ public void testPathMatchers_glob() {
+ assertThatPath("bar").matches("glob:bar");
+ assertThatPath("bar").matches("glob:*");
+ assertThatPath("C:\\foo").doesNotMatch("glob:*");
+ assertThatPath("C:\\foo\\bar").doesNotMatch("glob:*");
+ assertThatPath("C:\\foo\\bar").matches("glob:**");
+ assertThatPath("C:\\foo\\bar").matches("glob:C:\\\\**");
+ assertThatPath("foo\\bar").doesNotMatch("glob:C:\\\\**");
+ assertThatPath("C:\\foo\\bar\\baz\\stuff").matches("glob:C:\\\\foo\\\\**");
+ assertThatPath("C:\\foo\\bar\\baz\\stuff").matches("glob:C:\\\\**\\\\stuff");
+ assertThatPath("C:\\foo").matches("glob:C:\\\\[a-z]*");
+ assertThatPath("C:\\Foo").matches("glob:C:\\\\[a-z]*");
+ assertThatPath("C:\\foo").matches("glob:C:\\\\[A-Z]*");
+ assertThatPath("C:\\Foo").matches("glob:C:\\\\[A-Z]*");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.java").matches("glob:**\\\\*.java");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.java").matches("glob:**\\\\*.{java,class}");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.class").matches("glob:**\\\\*.{java,class}");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.java").matches("glob:**\\\\*.*");
+
+ try {
+ fs.getPathMatcher("glob:**\\*.{java,class");
+ fail();
+ } catch (PatternSyntaxException expected) {
+ }
+ }
+
+ @Test
+ public void testPathMatchers_glob_alternateSeparators() {
+ // only need to test / in the glob pattern; tests above check that / in a path is changed to
+ // \ automatically
+ assertThatPath("C:\\foo").doesNotMatch("glob:*");
+ assertThatPath("C:\\foo\\bar").doesNotMatch("glob:*");
+ assertThatPath("C:\\foo\\bar").matches("glob:**");
+ assertThatPath("C:\\foo\\bar").matches("glob:C:/**");
+ assertThatPath("foo\\bar").doesNotMatch("glob:C:/**");
+ assertThatPath("C:\\foo\\bar\\baz\\stuff").matches("glob:C:/foo/**");
+ assertThatPath("C:\\foo\\bar\\baz\\stuff").matches("glob:C:/**/stuff");
+ assertThatPath("C:\\foo").matches("glob:C:/[a-z]*");
+ assertThatPath("C:\\Foo").matches("glob:C:/[a-z]*");
+ assertThatPath("C:\\foo").matches("glob:C:/[A-Z]*");
+ assertThatPath("C:\\Foo").matches("glob:C:/[A-Z]*");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.java").matches("glob:**/*.java");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.java").matches("glob:**/*.{java,class}");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.class").matches("glob:**/*.{java,class}");
+ assertThatPath("C:\\foo\\bar\\baz\\Stuff.java").matches("glob:**/*.*");
+
+ try {
+ fs.getPathMatcher("glob:**/*.{java,class");
+ fail();
+ } catch (PatternSyntaxException expected) {
+ }
+ }
+
+ @Test
+ public void testCreateFileOrDirectory_forNonExistentRootPath_fails() throws IOException {
+ try {
+ Files.createDirectory(path("Z:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.createFile(path("Z:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.createSymbolicLink(path("Z:\\"), path("foo"));
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
+ @Test
+ public void testCopyFile_toNonExistentRootPath_fails() throws IOException {
+ Files.createFile(path("foo"));
+ Files.createDirectory(path("bar"));
+
+ try {
+ Files.copy(path("foo"), path("Z:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.copy(path("bar"), path("Z:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
+ @Test
+ public void testMoveFile_toNonExistentRootPath_fails() throws IOException {
+ Files.createFile(path("foo"));
+ Files.createDirectory(path("bar"));
+
+ try {
+ Files.move(path("foo"), path("Z:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.move(path("bar"), path("Z:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
+ @Test
+ public void testDelete_directory_cantDeleteRoot() throws IOException {
+ // test with E:\ because it is empty
+ try {
+ Files.delete(path("E:\\"));
+ fail();
+ } catch (FileSystemException expected) {
+ assertThat(expected.getFile()).isEqualTo("E:\\");
+ assertThat(expected.getMessage()).contains("root");
+ }
+ }
+
+ @Test
+ public void testCreateFileOrDirectory_forExistingRootPath_fails() throws IOException {
+ try {
+ Files.createDirectory(path("E:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.createFile(path("E:\\"));
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.createSymbolicLink(path("E:\\"), path("foo"));
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
+ @Test
+ public void testCopyFile_toExistingRootPath_fails() throws IOException {
+ Files.createFile(path("foo"));
+ Files.createDirectory(path("bar"));
+
+ try {
+ Files.copy(path("foo"), path("E:\\"), REPLACE_EXISTING);
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.copy(path("bar"), path("E:\\"), REPLACE_EXISTING);
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
+ @Test
+ public void testMoveFile_toExistingRootPath_fails() throws IOException {
+ Files.createFile(path("foo"));
+ Files.createDirectory(path("bar"));
+
+ try {
+ Files.move(path("foo"), path("E:\\"), REPLACE_EXISTING);
+ fail();
+ } catch (IOException expected) {
+ }
+
+ try {
+ Files.move(path("bar"), path("E:\\"), REPLACE_EXISTING);
+ fail();
+ } catch (IOException expected) {
+ }
+ }
+
+ @Test
+ public void testMove_rootDirectory_fails() throws IOException {
+ try {
+ Files.move(path("E:\\"), path("Z:\\"));
+ fail();
+ } catch (FileSystemException expected) {
+ }
+
+ try {
+ Files.move(path("E:\\"), path("C:\\bar"));
+ fail();
+ } catch (FileSystemException expected) {
+ }
+ }
+}