fi.jumi.launcher.daemon.DirBasedStewardTest.java Source code

Java tutorial

Introduction

Here is the source code for fi.jumi.launcher.daemon.DirBasedStewardTest.java

Source

// 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.launcher.daemon;

import org.apache.commons.io.FileUtils;
import org.junit.*;
import org.junit.rules.*;

import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.FileTime;
import java.util.*;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;

public class DirBasedStewardTest {

    @Rule
    public final TemporaryFolder tempDir = new TemporaryFolder();

    @Rule
    public final ExpectedException thrown = ExpectedException.none();

    private static final String expectedName = "daemon-1.2.3.jar";
    private final byte[] expectedContent = new byte[] { 1, 2, 3 };
    private final StubDaemonJar stubDaemonJar = new StubDaemonJar(expectedName, expectedContent);

    private Path jumiHome;
    private DirBasedSteward steward;

    @Before
    public void setup() throws IOException {
        jumiHome = tempDir.newFolder("jumiHome").toPath();
        steward = new DirBasedSteward(stubDaemonJar);
    }

    // Daemon directory

    @Test
    public void creates_a_daemon_directory() {
        Path daemonDir = steward.createDaemonDir(jumiHome);

        assertThat("should be under $JUMI_HOME/daemons", daemonDir.getParent(), is(jumiHome.resolve("daemons")));
        assertThat("should be a directory", Files.isDirectory(daemonDir), is(true));
    }

    @Test
    public void concurrently_created_daemons_will_always_get_their_own_daemon_directories() {
        List<Path> daemonDirs = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            daemonDirs.add(steward.createDaemonDir(jumiHome));
        }

        Set<Path> uniqueDaemonDirs = new HashSet<>(daemonDirs);
        assertThat("unique daemon dirs", uniqueDaemonDirs.size(), is(daemonDirs.size()));
    }

    @Test
    public void throws_exception_if_cannot_create_daemon_directory() throws IOException {
        Path parentDir = steward.createDaemonDir(jumiHome).getParent();
        FileUtils.deleteDirectory(parentDir.toFile());

        Files.createFile(parentDir); // prevents it from creating the daemon directory

        thrown.expect(RuntimeException.class);
        thrown.expectMessage("Unable to create daemon directory");
        thrown.expectCause(instanceOf(FileAlreadyExistsException.class));
        steward.createDaemonDir(jumiHome);
    }

    // Daemon JAR

    @Test
    public void copies_the_embedded_daemon_JAR_to_the_settings_dir() throws IOException {
        Path daemonJar = steward.getDaemonJar(jumiHome);

        assertThat(daemonJar.getFileName().toString(), is(expectedName));
        assertThat(FileUtils.readFileToByteArray(daemonJar.toFile()), is(expectedContent));
    }

    @Test
    public void does_not_copy_the_daemon_JAR_if_it_has_already_been_copied() throws IOException {
        FileTime lastModified1 = Files.getLastModifiedTime(steward.getDaemonJar(jumiHome));
        FileTime lastModified2 = Files.getLastModifiedTime(steward.getDaemonJar(jumiHome));

        assertThat(lastModified2, is(lastModified1));
    }

    @Test
    public void overwrites_an_existing_daemon_JAR_that_has_difference_file_size() throws IOException {
        overwriteWithFileOfSize(expectedContent.length + 1, steward.getDaemonJar(jumiHome));

        Path daemonJar = steward.getDaemonJar(jumiHome);

        assertThat(FileUtils.readFileToByteArray(daemonJar.toFile()), is(expectedContent));
    }

    private static void overwriteWithFileOfSize(int fileSize, Path path) throws IOException {
        Files.write(path, new byte[fileSize]);
    }

    private static class StubDaemonJar implements DaemonJar {
        private final String name;
        private final byte[] content;

        private StubDaemonJar(String name, byte[] content) {
            this.name = name;
            this.content = content;
        }

        @Override
        public String getDaemonJarName() {
            return name;
        }

        @Override
        public InputStream getDaemonJarAsStream() {
            return new ByteArrayInputStream(content);
        }
    }
}