diff --git a/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileTests.java b/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileTests.java index 0aaaaee16..53b0ffeae 100644 --- a/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileTests.java +++ b/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileTests.java @@ -2,16 +2,20 @@ package org.cryptomator.filesystem.invariants; import static org.cryptomator.common.test.matcher.OptionalMatcher.presentOptionalWithValueThat; import static org.cryptomator.filesystem.invariants.matchers.InstantMatcher.inRangeInclusiveWithTolerance; +import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertThat; import static org.junit.Assume.assumeThat; import java.io.UncheckedIOException; +import java.nio.ByteBuffer; import java.time.Instant; import org.cryptomator.filesystem.File; import org.cryptomator.filesystem.FileSystem; import org.cryptomator.filesystem.Folder; +import org.cryptomator.filesystem.WritableFile; import org.cryptomator.filesystem.invariants.FileSystemFactories.FileSystemFactory; import org.cryptomator.filesystem.invariants.WaysToObtainAFile.WayToObtainAFile; import org.cryptomator.filesystem.invariants.WaysToObtainAFolder.WayToObtainAFolder; @@ -158,4 +162,48 @@ public class FileTests { System.out.println(wayToObtainANonExistingFile.fileWithName(fileSystem, FILE_NAME).lastModified()); } + @Theory + public void testCanNotOpenFileWhichExistsAsFolderForReading(FileSystemFactory fileSystemFactory, WayToObtainAFile wayToObtainANonExistingFile, WayToObtainAFolder wayToObtainAnExistingFolder) { + assumeThat(wayToObtainANonExistingFile.returnedFilesExist(), is(false)); + assumeThat(wayToObtainAnExistingFolder.returnedFoldersExist(), is(true)); + FileSystem fileSystem = fileSystemFactory.create(); + File file = wayToObtainANonExistingFile.fileWithName(fileSystem, FILE_NAME); + wayToObtainAnExistingFolder.folderWithName(fileSystem, FILE_NAME); + + thrown.expect(UncheckedIOException.class); + + file.openReadable(); + } + + @Theory + public void testCanNotCreateFileWhichExistsAsFolderByWriting(FileSystemFactory fileSystemFactory, WayToObtainAFile wayToObtainANonExistingFile, WayToObtainAFolder wayToObtainAnExistingFolder) { + assumeThat(wayToObtainANonExistingFile.returnedFilesExist(), is(false)); + assumeThat(wayToObtainAnExistingFolder.returnedFoldersExist(), is(true)); + + // TODO implement checks in CryptoFileSystem to avoid creation of a file and folder with equal names + assumeThat(fileSystemFactory.toString(), not(containsString("Crypto"))); + + FileSystem fileSystem = fileSystemFactory.create(); + File file = wayToObtainANonExistingFile.fileWithName(fileSystem, FILE_NAME); + wayToObtainAnExistingFolder.folderWithName(fileSystem, FILE_NAME); + + thrown.expect(UncheckedIOException.class); + + try (WritableFile writable = file.openWritable()) { + ByteBuffer buffer = ByteBuffer.allocate(1); + writable.write(buffer); + } + } + + @Theory + public void testCanNotReadFromNonExistingFile(FileSystemFactory fileSystemFactory, WayToObtainAFile wayToObtainANonExistingFile) { + assumeThat(wayToObtainANonExistingFile.returnedFilesExist(), is(false)); + FileSystem fileSystem = fileSystemFactory.create(); + File file = wayToObtainANonExistingFile.fileWithName(fileSystem, FILE_NAME); + + thrown.expect(UncheckedIOException.class); + + file.openReadable(); + } + }