org.sonar.application.AppFileSystemTest.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.application.AppFileSystemTest.java

Source

/*
 * SonarQube
 * Copyright (C) 2009-2017 SonarSource SA
 * mailto:info AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 3 of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.sonar.application;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import javax.annotation.CheckForNull;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.sonar.application.config.TestAppSettings;
import org.sonar.process.AllProcessesCommands;
import org.sonar.process.ProcessProperties;

import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.process.ProcessCommands.MAX_PROCESSES;

public class AppFileSystemTest {

    @Rule
    public TemporaryFolder temp = new TemporaryFolder();
    @Rule
    public ExpectedException expectedException = ExpectedException.none();

    private File homeDir;
    private File dataDir;
    private File tempDir;
    private File logsDir;
    private File webDir;
    private TestAppSettings settings = new TestAppSettings();
    private AppFileSystem underTest = new AppFileSystem(settings);

    @Before
    public void before() throws IOException {
        homeDir = temp.newFolder();
        dataDir = new File(homeDir, "data");
        tempDir = new File(homeDir, "temp");
        logsDir = new File(homeDir, "logs");
        webDir = new File(homeDir, "web");

        settings.getProps().set(ProcessProperties.PATH_HOME, homeDir.getAbsolutePath());
        settings.getProps().set(ProcessProperties.PATH_DATA, dataDir.getAbsolutePath());
        settings.getProps().set(ProcessProperties.PATH_TEMP, tempDir.getAbsolutePath());
        settings.getProps().set(ProcessProperties.PATH_LOGS, logsDir.getAbsolutePath());
        settings.getProps().set(ProcessProperties.PATH_WEB, webDir.getAbsolutePath());
    }

    @Test
    public void reset_creates_dirs_if_they_don_t_exist() throws Exception {
        assertThat(dataDir).doesNotExist();

        underTest.reset();

        assertThat(dataDir).exists().isDirectory();
        assertThat(logsDir).exists().isDirectory();
        assertThat(tempDir).exists().isDirectory();
        assertThat(webDir).exists().isDirectory();

        underTest.reset();

        assertThat(dataDir).exists().isDirectory();
        assertThat(logsDir).exists().isDirectory();
        assertThat(tempDir).exists().isDirectory();
        assertThat(webDir).exists().isDirectory();
    }

    @Test
    public void reset_deletes_content_of_temp_dir_but_not_temp_dir_itself_if_it_already_exists() throws Exception {
        assertThat(tempDir.mkdir()).isTrue();
        Object tempDirKey = getFileKey(tempDir);
        File fileInTempDir = new File(tempDir, "someFile.txt");
        assertThat(fileInTempDir.createNewFile()).isTrue();
        File subDirInTempDir = new File(tempDir, "subDir");
        assertThat(subDirInTempDir.mkdir()).isTrue();

        underTest.reset();

        assertThat(tempDir).exists();
        assertThat(fileInTempDir).doesNotExist();
        assertThat(subDirInTempDir).doesNotExist();
        assertThat(getFileKey(tempDir)).isEqualTo(tempDirKey);
    }

    @Test
    public void reset_deletes_content_of_temp_dir_but_not_sharedmemory_file() throws Exception {
        assertThat(tempDir.mkdir()).isTrue();
        File sharedmemory = new File(tempDir, "sharedmemory");
        assertThat(sharedmemory.createNewFile()).isTrue();
        FileUtils.write(sharedmemory, "toto");
        Object fileKey = getFileKey(sharedmemory);

        Object tempDirKey = getFileKey(tempDir);
        File fileInTempDir = new File(tempDir, "someFile.txt");
        assertThat(fileInTempDir.createNewFile()).isTrue();

        underTest.reset();

        assertThat(tempDir).exists();
        assertThat(fileInTempDir).doesNotExist();
        assertThat(getFileKey(tempDir)).isEqualTo(tempDirKey);
        assertThat(getFileKey(sharedmemory)).isEqualTo(fileKey);
        // content of sharedMemory file is reset
        assertThat(FileUtils.readFileToString(sharedmemory)).isNotEqualTo("toto");
    }

    @Test
    public void reset_cleans_the_sharedmemory_file() throws IOException {
        assertThat(tempDir.mkdir()).isTrue();
        try (AllProcessesCommands commands = new AllProcessesCommands(tempDir)) {
            for (int i = 0; i < MAX_PROCESSES; i++) {
                commands.create(i).setUp();
            }

            underTest.reset();

            for (int i = 0; i < MAX_PROCESSES; i++) {
                assertThat(commands.create(i).isUp()).isFalse();
            }
        }
    }

    @CheckForNull
    private static Object getFileKey(File fileInTempDir) throws IOException {
        Path path = Paths.get(fileInTempDir.toURI());
        BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
        return attrs.fileKey();
    }

    @Test
    public void reset_throws_ISE_if_data_dir_is_a_file() throws Exception {
        resetThrowsISEIfDirIsAFile(ProcessProperties.PATH_DATA);
    }

    @Test
    public void reset_throws_ISE_if_web_dir_is_a_file() throws Exception {
        resetThrowsISEIfDirIsAFile(ProcessProperties.PATH_WEB);
    }

    @Test
    public void reset_throws_ISE_if_logs_dir_is_a_file() throws Exception {
        resetThrowsISEIfDirIsAFile(ProcessProperties.PATH_LOGS);
    }

    @Test
    public void reset_throws_ISE_if_temp_dir_is_a_file() throws Exception {
        resetThrowsISEIfDirIsAFile(ProcessProperties.PATH_TEMP);
    }

    private void resetThrowsISEIfDirIsAFile(String property) throws IOException {
        File file = new File(homeDir, "zoom.store");
        assertThat(file.createNewFile()).isTrue();
        settings.getProps().set(property, file.getAbsolutePath());

        expectedException.expect(IllegalStateException.class);
        expectedException.expectMessage(
                "Property '" + property + "' is not valid, not a directory: " + file.getAbsolutePath());

        underTest.reset();
    }

    @Test
    public void fail_if_required_directory_is_a_file() throws Exception {
        // <home>/data is missing
        FileUtils.forceMkdir(webDir);
        FileUtils.forceMkdir(logsDir);
        FileUtils.touch(dataDir);

        expectedException.expect(IllegalStateException.class);
        expectedException.expectMessage(
                "Property 'sonar.path.data' is not valid, not a directory: " + dataDir.getAbsolutePath());

        underTest.reset();
    }

}