diff --git a/main/shortening-layer/src/main/java/org/cryptomator/shortening/ShorteningFileSystem.java b/main/shortening-layer/src/main/java/org/cryptomator/shortening/ShorteningFileSystem.java index 3923d1837..ce7d7a899 100644 --- a/main/shortening-layer/src/main/java/org/cryptomator/shortening/ShorteningFileSystem.java +++ b/main/shortening-layer/src/main/java/org/cryptomator/shortening/ShorteningFileSystem.java @@ -1,21 +1,19 @@ package org.cryptomator.shortening; -import java.util.Optional; - import org.cryptomator.filesystem.FileSystem; import org.cryptomator.filesystem.Folder; +/** + * Filesystem implementation, that shortens filenames when they reach a certain threshold (inclusive). + * Shortening is done by SHA1-hashing those files, so a threshold below the length of the hashed files makes no sense. + * Hashes are then mapped back to the original filenames by storing metadata files inside the given metadataRoot. + */ public class ShorteningFileSystem extends ShorteningFolder implements FileSystem { public ShorteningFileSystem(Folder root, Folder metadataRoot, int threshold) { super(null, root, "", metadataRoot, new FilenameShortener(metadataRoot, threshold)); } - @Override - public Optional parent() { - return Optional.empty(); - } - @Override public boolean exists() { return true; diff --git a/main/shortening-layer/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java b/main/shortening-layer/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java index 0917fb2d6..0cf131fc3 100644 --- a/main/shortening-layer/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java +++ b/main/shortening-layer/src/test/java/org/cryptomator/shortening/ShorteningFileSystemTest.java @@ -2,6 +2,7 @@ package org.cryptomator.shortening; import java.io.UncheckedIOException; import java.nio.ByteBuffer; +import java.time.Instant; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -47,6 +48,41 @@ public class ShorteningFileSystemTest { Assert.assertTrue(correspondingMetadataFile.exists()); } + @Test + public void testMoveLongFolders() { + final FileSystem underlyingFs = new InMemoryFileSystem(); + final Folder metadataRoot = underlyingFs.folder("m"); + final FileSystem fs = new ShorteningFileSystem(underlyingFs, metadataRoot, 10); + + final Folder shortNamedFolder = fs.folder("test"); + shortNamedFolder.create(FolderCreateMode.FAIL_IF_PARENT_IS_MISSING); + Assert.assertFalse(metadataRoot.children().findAny().isPresent()); + + final Folder longNamedFolder = fs.folder("morethantenchars"); + shortNamedFolder.moveTo(longNamedFolder); + Assert.assertTrue(metadataRoot.children().findAny().isPresent()); + } + + @Test + public void testMoveLongFiles() throws UncheckedIOException, TimeoutException { + final FileSystem underlyingFs = new InMemoryFileSystem(); + final Folder metadataRoot = underlyingFs.folder("m"); + final FileSystem fs = new ShorteningFileSystem(underlyingFs, metadataRoot, 10); + + final File shortNamedFolder = fs.file("test"); + try (WritableFile file = shortNamedFolder.openWritable(1, TimeUnit.MILLISECONDS)) { + file.write(ByteBuffer.wrap("hello world".getBytes())); + } + Assert.assertFalse(metadataRoot.children().findAny().isPresent()); + + final File longNamedFolder = fs.file("morethantenchars"); + try (WritableFile src = shortNamedFolder.openWritable(1, TimeUnit.MILLISECONDS); // + WritableFile dst = longNamedFolder.openWritable(1, TimeUnit.MILLISECONDS)) { + src.moveTo(dst); + } + Assert.assertTrue(metadataRoot.children().findAny().isPresent()); + } + @Test public void testDeflateAndInflateFolder() { final FileSystem underlyingFs = new InMemoryFileSystem(); @@ -82,11 +118,15 @@ public class ShorteningFileSystemTest { } @Test - public void testPassthroughShortNamedFiles() throws UncheckedIOException, TimeoutException { + public void testPassthroughShortNamedFiles() throws UncheckedIOException, TimeoutException, InterruptedException { final FileSystem underlyingFs = new InMemoryFileSystem(); final Folder metadataRoot = underlyingFs.folder("m"); final FileSystem fs = new ShorteningFileSystem(underlyingFs, metadataRoot, 10); + final Instant testStart = Instant.now(); + + Thread.sleep(1); + // of folders: underlyingFs.folder("foo").folder("bar").create(FolderCreateMode.INCLUDING_PARENTS); Assert.assertTrue(fs.folder("foo").folder("bar").exists()); @@ -100,6 +140,7 @@ public class ShorteningFileSystemTest { file.read(buf); Assert.assertEquals("hello world", new String(buf.array())); } + Assert.assertTrue(fs.folder("foo").file("test1.txt").lastModified().isAfter(testStart)); // to underlying: try (WritableFile file = fs.folder("foo").file("test2.txt").openWritable(1, TimeUnit.MILLISECONDS)) { @@ -110,6 +151,7 @@ public class ShorteningFileSystemTest { file.read(buf); Assert.assertEquals("hello world", new String(buf.array())); } + Assert.assertTrue(fs.folder("foo").file("test2.txt").lastModified().isAfter(testStart)); } }