From e7346a85710d422b533ac41f81cd8ac78496647b Mon Sep 17 00:00:00 2001 From: Stephane Gamard Date: Mon, 11 Aug 2014 15:56:09 +0200 Subject: [PATCH] SONAR-4898 - Created ProcessWrapper tests in sonar-process-test --- .../org/sonar/application/DummyOkApp.java | 14 ++- server/process/sonar-process-test/pom.xml | 3 +- .../sonar/application/ProcessWrapperTest.java | 96 ++++++++++++++----- .../org/sonar/process/ProcessWrapper.java | 2 +- 4 files changed, 88 insertions(+), 27 deletions(-) diff --git a/server/process/sonar-dummy-app/src/main/java/org/sonar/application/DummyOkApp.java b/server/process/sonar-dummy-app/src/main/java/org/sonar/application/DummyOkApp.java index 99adbd03125..74925472e97 100644 --- a/server/process/sonar-dummy-app/src/main/java/org/sonar/application/DummyOkApp.java +++ b/server/process/sonar-dummy-app/src/main/java/org/sonar/application/DummyOkApp.java @@ -30,23 +30,35 @@ public class DummyOkApp extends MonitoredProcess { private static final Logger LOGGER = LoggerFactory.getLogger(DummyOkApp.class); + private boolean isReady = false; + private boolean isRunning = true; + protected DummyOkApp(Props props) throws Exception { super(props); } @Override protected void doStart() { + isReady = true; LOGGER.info("Starting Dummy OK Process"); + while (isRunning) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + isRunning = false; + } + } } @Override protected void doTerminate() { LOGGER.info("Terminating Dummy OK Process"); + this.isRunning = false; } @Override protected boolean doIsReady() { - return false; + return isReady; } public static void main(String[] args) throws Exception { diff --git a/server/process/sonar-process-test/pom.xml b/server/process/sonar-process-test/pom.xml index a02d03da5c2..195a02f8fd6 100644 --- a/server/process/sonar-process-test/pom.xml +++ b/server/process/sonar-process-test/pom.xml @@ -101,7 +101,8 @@ sonar-dummy-app ${project.version} jar - ${project.build.directory}/dummyApp + ${project.build.testOutputDirectory} + sonar-dummy-app.jar diff --git a/server/process/sonar-process-test/src/test/java/org/sonar/application/ProcessWrapperTest.java b/server/process/sonar-process-test/src/test/java/org/sonar/application/ProcessWrapperTest.java index 98a38678be9..597fd3308fa 100644 --- a/server/process/sonar-process-test/src/test/java/org/sonar/application/ProcessWrapperTest.java +++ b/server/process/sonar-process-test/src/test/java/org/sonar/application/ProcessWrapperTest.java @@ -19,50 +19,98 @@ */ package org.sonar.application; +import org.apache.commons.io.FileUtils; +import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.sonar.process.MonitoredProcess; +import org.sonar.process.ProcessWrapper; +import java.io.File; import java.io.IOException; import java.net.ServerSocket; +import static org.fest.assertions.Assertions.assertThat; +import static org.fest.assertions.Fail.fail; + + public class ProcessWrapperTest { + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + + private static final String DUMMY_OK_APP = "org.sonar.application.DummyOkApp"; + int freePort; + File dummyAppJar; + Process proc; @Before public void setup() throws IOException { ServerSocket socket = new ServerSocket(0); freePort = socket.getLocalPort(); socket.close(); + + dummyAppJar = FileUtils.toFile(getClass().getResource("/sonar-dummy-app.jar")); } + @After + public void tearDown(){ + if(proc != null){ + proc.destroy(); + } + } @Test - public void has_dummy_app(){ - + public void has_dummy_app() { + assertThat(dummyAppJar).isFile(); + assertThat(dummyAppJar).exists(); + } + + private void assertCanStart(ProcessWrapper process) { + assertThat(process.execute()).isTrue(); + proc = process.process(); } + private void assertCanBeReady(ProcessWrapper process) throws InterruptedException { + int count = 0; + while(!process.isReady() && count<5) { + Thread.sleep(500); + } + assertThat(process.getProcessMXBean().isReady()).isTrue(); + } -// @Test -// @Ignore("Not a good idea to assert on # of VMs") -// public void process_should_run() throws IOException, MalformedObjectNameException, InterruptedException { -// -// LocalVirtualMachine.getAllVirtualMachines().size(); -// int VMcount = LocalVirtualMachine.getAllVirtualMachines().size(); -// -// System.out.println("LocalVirtualMachine.getAllVirtualMachines() = " + LocalVirtualMachine.getAllVirtualMachines()); -// -// RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); -// ProcessWrapper wrapper = wrapper = new ProcessWrapper(ProcessTest.TestProcess.class.getName(), -// Collections.EMPTY_MAP, "TEST", freePort, runtime.getClassPath()); -// -// assertThat(wrapper).isNotNull(); -// assertThat(wrapper.isReady()).isTrue(); -// -// assertThat(LocalVirtualMachine.getAllVirtualMachines().size()).isEqualTo(VMcount + 1); -// -// wrapper.stop(); -// assertThat(LocalVirtualMachine.getAllVirtualMachines().size()).isEqualTo(VMcount); -// -// } + private void assertPing(ProcessWrapper process){ + long now = System.currentTimeMillis(); + long ping = process.getProcessMXBean().ping(); + assertThat(ping - now).isLessThan(3000L); + } + + + @Test + public void execute_dummy_app() throws Exception { + + ProcessWrapper process = new ProcessWrapper("DummyOkApp") + .addProperty(MonitoredProcess.NAME_PROPERTY, "DummyOkApp") + .addClasspath(dummyAppJar.getAbsolutePath()) + .setWorkDir(temp.getRoot()) + .setJmxPort(freePort) + .setClassName(DUMMY_OK_APP); + + assertThat(process.isAlive()).isFalse(); + assertCanStart(process); + process.start(); + assertCanBeReady(process); + assertThat(process.isAlive()).isTrue(); + assertPing(process); + process.terminate(); + try { + assertPing(process); + fail(); + } catch (Exception e){ + + } + } } \ No newline at end of file diff --git a/server/process/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java b/server/process/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java index 12e59cd8f06..4753c2b471d 100644 --- a/server/process/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java +++ b/server/process/sonar-process/src/main/java/org/sonar/process/ProcessWrapper.java @@ -119,7 +119,7 @@ public class ProcessWrapper extends Thread implements Terminable { } @CheckForNull - Process process() { + public Process process() { return process; } -- 2.39.5