/*
* 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.process;
import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.sonar.process.ProcessCommands.MAX_PROCESSES;
public class DefaultProcessCommandsTest {
private static final int PROCESS_NUMBER = 1;
@Rule
public TemporaryFolder temp = new TemporaryFolder();
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void fail_to_init_if_dir_does_not_exist() throws Exception {
File dir = temp.newFolder();
FileUtils.deleteQuietly(dir);
try {
DefaultProcessCommands.main(dir, PROCESS_NUMBER);
fail();
} catch (IllegalArgumentException e) {
assertThat(e).hasMessage("Not a valid directory: " + dir.getAbsolutePath());
}
}
@Test
public void main_clears_the_memory_space_of_the_specified_process_number() throws IOException {
File dir = temp.newFolder();
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
commands.setUp();
commands.setHttpUrl("bla");
commands.setOperational();
}
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
assertThat(commands.isUp()).isFalse();
assertThat(commands.getHttpUrl()).isEmpty();
assertThat(commands.isOperational()).isFalse();
}
}
@Test
public void secondary_does_not_clear_the_memory_space_of_the_specified_process_number() throws IOException {
File dir = temp.newFolder();
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
commands.setUp();
commands.setHttpUrl("bla");
commands.setOperational();
}
try (DefaultProcessCommands commands = DefaultProcessCommands.secondary(dir, PROCESS_NUMBER)) {
assertThat(commands.isUp()).isTrue();
assertThat(commands.getHttpUrl()).isEqualTo("bla");
assertThat(commands.isOperational()).isTrue();
}
}
@Test
public void child_process_update_the_mapped_memory() throws Exception {
File dir = temp.newFolder();
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
assertThat(commands.isUp()).isFalse();
commands.setUp();
assertThat(commands.isUp()).isTrue();
}
}
@Test
public void reset_clears_only_the_memory_space_of_specified_process_number() throws IOException {
File dir = temp.newFolder();
try (AllProcessesCommands commands = new AllProcessesCommands(dir)) {
for (int i = 0; i < MAX_PROCESSES; i++) {
commands.setOperational(i);
commands.setUp(i);
}
int resetProcess = 3;
DefaultProcessCommands.reset(dir, resetProcess);
for (int i = 0; i < MAX_PROCESSES; i++) {
assertThat(commands.isOperational(i)).isEqualTo(i != resetProcess);
assertThat(commands.isUp(i)).isEqualTo(i != resetProcess);
}
}
}
@Test
public void ask_for_stop() throws Exception {
File dir = temp.newFolder();
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
assertThat(commands.askedForStop()).isFalse();
commands.askForStop();
assertThat(commands.askedForStop()).isTrue();
}
}
@Test
public void ask_for_restart() throws Exception {
File dir = temp.newFolder();
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
assertThat(commands.askedForRestart()).isFalse();
commands.askForRestart();
assertThat(commands.askedForRestart()).isTrue();
}
}
@Test
public void acknowledgeAskForRestart_has_no_effect_when_no_restart_asked() throws Exception {
File dir = temp.newFolder();
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
assertThat(commands.askedForRestart()).isFalse();
commands.acknowledgeAskForRestart();
assertThat(commands.askedForRestart()).isFalse();
}
}
@Test
public void acknowledgeAskForRestart_resets_askForRestart_has_no_effect_when_no_restart_asked() throws Exception {
File dir = temp.newFolder();
try (DefaultProcessCommands commands = DefaultProcessCommands.main(dir, PROCESS_NUMBER)) {
commands.askForRestart();
assertThat(commands.askedForRestart()).isTrue();
commands.acknowledgeAskForRestart();
assertThat(commands.askedForRestart()).isFalse();
}
}
@Test
public void main_fails_if_processNumber_is_less_than_0() throws Exception {
int processNumber = -2;
expectProcessNumberNoValidIAE(processNumber);
try (DefaultProcessCommands main = DefaultProcessCommands.main(temp.newFolder(), processNumber)) {
}
}
@Test
public void main_fails_if_processNumber_is_higher_than_MAX_PROCESSES() throws Exception {
int processNumber = MAX_PROCESSES + 1;
expectProcessNumberNoValidIAE(processNumber);
try (DefaultProcessCommands main = DefaultProcessCommands.main(temp.newFolder(), processNumber)) {
}
}
@Test
public void main_fails_if_processNumber_is_MAX_PROCESSES() throws Exception {
int processNumber = MAX_PROCESSES;
expectProcessNumberNoValidIAE(processNumber);
try (DefaultProcessCommands main = DefaultProcessCommands.main(temp.newFolder(), processNumber)) {
}
}
@Test
public void secondary_fails_if_processNumber_is_less_than_0() throws Exception {
int processNumber = -2;
expectProcessNumberNoValidIAE(processNumber);
DefaultProcessCommands.secondary(temp.newFolder(), processNumber);
}
@Test
public void secondary_fails_if_processNumber_is_higher_than_MAX_PROCESSES() throws Exception {
int processNumber = MAX_PROCESSES + 1;
expectProcessNumberNoValidIAE(processNumber);
try (DefaultProcessCommands secondary = DefaultProcessCommands.secondary(temp.newFolder(), processNumber)) {
}
}
@Test
public void reset_fails_if_processNumber_is_less_than_0() throws Exception {
int processNumber = -2;
expectProcessNumberNoValidIAE(processNumber);
DefaultProcessCommands.reset(temp.newFolder(), processNumber);
}
@Test
public void reset_fails_if_processNumber_is_higher_than_MAX_PROCESSES() throws Exception {
int processNumber = MAX_PROCESSES + 1;
expectProcessNumberNoValidIAE(processNumber);
DefaultProcessCommands.reset(temp.newFolder(), processNumber);
}
private void expectProcessNumberNoValidIAE(int processNumber) {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("Process number " + processNumber + " is not valid");
}
}