// Copyright © 2011-2014, Esko Luontola <www.orfjackal.net> // This software is released under the Apache License 2.0. // The license text is at http://www.apache.org/licenses/LICENSE-2.0 package fi.jumi.core.ipc.dirs; import fi.jumi.core.Timeouts; import org.junit.*; import org.junit.rules.*; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.*; import java.util.*; import static fi.jumi.core.util.PredicateMatchers.satisfies; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.junit.Assume.assumeTrue; public class UniqueDirectoriesTest { @Rule public final TemporaryFolder tempDir = new TemporaryFolder(); @Rule public final ExpectedException thrown = ExpectedException.none(); @Rule public final Timeout timeout = Timeouts.forUnitTest(); private Path baseDir; @Before public void setup() { baseDir = tempDir.getRoot().toPath(); } @Test public void creates_directories_under_the_parent_dir() throws IOException { Path dir = UniqueDirectories.createUniqueDir(baseDir, 123); assertThat("creates the directory", dir, satisfies(p -> Files.isDirectory(p))); assertThat("is child of parent dir", dir.getParent(), is(baseDir)); assertThat("name is based on the sequence number", dir.getFileName(), is(Paths.get("123"))); } @Test public void creates_parent_dirs_if_necessary() throws IOException { Path parentDir = baseDir.resolve("does/not/exist"); UniqueDirectories.createUniqueDir(parentDir, 123); assertThat("creates the parent dir", parentDir, satisfies(p -> Files.isDirectory(p))); } @Test public void will_retry_with_another_name_in_sequence_when_directory_already_exists() throws IOException { Files.createDirectory(baseDir.resolve("123")); Path dir = UniqueDirectories.createUniqueDir(baseDir, 123); assertThat("creates the directory", dir, satisfies(p -> Files.isDirectory(p))); assertThat("name is next in sequence", dir.getFileName(), is(Paths.get("124"))); } @Test public void will_fail_if_unable_to_create_the_directory_for_permission_or_other_reasons() throws IOException { assumeTrue("this test works only on POSIX compatible file systems", Files.getFileAttributeView(baseDir, PosixFileAttributeView.class) != null); Set<PosixFilePermission> noPermissions = new HashSet<>(); Files.setPosixFilePermissions(baseDir, noPermissions); assertThat("the file system did not let us change file permissions", Files.getPosixFilePermissions(baseDir), is(noPermissions)); thrown.expect(AccessDeniedException.class); UniqueDirectories.createUniqueDir(baseDir, 123); } @Test public void will_fail_if_unable_to_create_the_parent_directory() throws IOException { Path parent = Files.createFile(baseDir.resolve("not-a-directory")); thrown.expect(FileAlreadyExistsException.class); UniqueDirectories.createUniqueDir(parent, 123); } }