From 54ba59001aee817ee4420d137ae5ae2beba13bc4 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Mon, 22 Sep 2014 23:43:05 +0200 Subject: [PATCH] SONAR-4898 add some tests --- .../java/org/sonar/process/StopWatcher.java | 2 +- .../main/java/org/sonar/application/App.java | 8 +- .../java/org/sonar/application/AppTest.java | 84 +++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/server/sonar-process/src/main/java/org/sonar/process/StopWatcher.java b/server/sonar-process/src/main/java/org/sonar/process/StopWatcher.java index b7b4ffa15d8..2441a193748 100644 --- a/server/sonar-process/src/main/java/org/sonar/process/StopWatcher.java +++ b/server/sonar-process/src/main/java/org/sonar/process/StopWatcher.java @@ -55,7 +55,7 @@ public class StopWatcher extends Thread { } } - void stopWatching() { + public void stopWatching() { watching = false; } } diff --git a/sonar-application/src/main/java/org/sonar/application/App.java b/sonar-application/src/main/java/org/sonar/application/App.java index c051e2f1c8d..bba2dd73069 100644 --- a/sonar-application/src/main/java/org/sonar/application/App.java +++ b/sonar-application/src/main/java/org/sonar/application/App.java @@ -41,6 +41,7 @@ import java.util.Properties; public class App implements Stoppable { private final Monitor monitor; + private StopWatcher stopWatcher = null; public App() { this(Monitor.create()); @@ -55,7 +56,8 @@ public class App implements Stoppable { // stop application when file /app.stop is created File tempDir = props.nonNullValueAsFile("sonar.path.temp"); ProcessCommands commands = new ProcessCommands(tempDir, "app"); - new StopWatcher(commands, this).start(); + stopWatcher = new StopWatcher(commands, this); + stopWatcher.start(); } monitor.start(createCommands(props)); monitor.awaitTermination(); @@ -113,6 +115,10 @@ public class App implements Stoppable { app.start(props); } + StopWatcher getStopWatcher() { + return stopWatcher; + } + @Override public void stopAsync() { monitor.stopAsync(); diff --git a/sonar-application/src/test/java/org/sonar/application/AppTest.java b/sonar-application/src/test/java/org/sonar/application/AppTest.java index b89ab7dd982..32d1f2969c4 100644 --- a/sonar-application/src/test/java/org/sonar/application/AppTest.java +++ b/sonar-application/src/test/java/org/sonar/application/AppTest.java @@ -23,11 +23,19 @@ import org.apache.commons.io.FilenameUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import org.mockito.ArgumentCaptor; +import org.sonar.process.Props; +import org.sonar.process.monitor.JavaCommand; +import org.sonar.process.monitor.Monitor; import java.io.File; import java.io.IOException; +import java.util.List; +import java.util.Properties; import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; public class AppTest { @@ -43,4 +51,80 @@ public class AppTest { .startsWith(FilenameUtils.normalize(homeDir.getAbsolutePath(), true)); } + @Test + public void do_not_watch_stop_file_by_default() throws Exception { + Monitor monitor = mock(Monitor.class); + App app = new App(monitor); + app.start(initDefaultProps()); + + assertThat(app.getStopWatcher()).isNull(); + } + + @Test + public void watch_stop_file() throws Exception { + Monitor monitor = mock(Monitor.class); + App app = new App(monitor); + Props props = initDefaultProps(); + props.set("sonar.enableStopCommand", "true"); + app.start(props); + + assertThat(app.getStopWatcher()).isNotNull(); + assertThat(app.getStopWatcher().isAlive()).isTrue(); + + app.getStopWatcher().stopWatching(); + app.getStopWatcher().interrupt(); + } + + @Test + public void start_elasticsearch_and_tomcat_by_default() throws Exception { + Monitor monitor = mock(Monitor.class); + App app = new App(monitor); + Props props = initDefaultProps(); + app.start(props); + + Class> listClass = (Class>)(Class)List.class; + ArgumentCaptor> argument = ArgumentCaptor.forClass(listClass); + verify(monitor).start(argument.capture()); + + assertThat(argument.getValue()).onProperty("key").containsOnly("search", "web"); + } + + @Test + public void do_not_start_tomcat_if_elasticsearch_single_node() throws Exception { + Monitor monitor = mock(Monitor.class); + App app = new App(monitor); + Props props = initDefaultProps(); + props.set("sonar.cluster.master", "x.y.z"); + app.start(props); + + Class> listClass = (Class>)(Class)List.class; + ArgumentCaptor> argument = ArgumentCaptor.forClass(listClass); + verify(monitor).start(argument.capture()); + + assertThat(argument.getValue()).onProperty("key").containsOnly("search"); + } + + @Test + public void add_custom_jdbc_driver_to_tomcat_classpath() throws Exception { + Monitor monitor = mock(Monitor.class); + App app = new App(monitor); + Props props = initDefaultProps(); + props.set("sonar.jdbc.driverPath", "oracle/ojdbc6.jar"); + app.start(props); + + Class> listClass = (Class>)(Class)List.class; + ArgumentCaptor> argument = ArgumentCaptor.forClass(listClass); + verify(monitor).start(argument.capture()); + + assertThat(argument.getValue().get(1).getClasspath()).contains("oracle/ojdbc6.jar"); + } + + private Props initDefaultProps() throws IOException { + Props props = new Props(new Properties()); + DefaultSettings.init(props); + props.set("sonar.path.home", temp.newFolder().getAbsolutePath()); + props.set("sonar.path.temp", temp.newFolder().getAbsolutePath()); + props.set("sonar.path.logs", temp.newFolder().getAbsolutePath()); + return props; + } } -- 2.39.5