]> source.dussan.org Git - sonar-scanner-cli.git/commitdiff
SONARUNNER-137 Do not stop after error in interactive mode
authorJulien HENRY <julien.henry@sonarsource.com>
Mon, 29 Jun 2015 15:16:28 +0000 (17:16 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Mon, 29 Jun 2015 15:16:28 +0000 (17:16 +0200)
sonar-runner-cli/src/main/java/org/sonar/runner/cli/Main.java
sonar-runner-cli/src/main/java/org/sonar/runner/cli/Shutdown.java
sonar-runner-cli/src/test/java/org/sonar/runner/cli/MainTest.java

index 3552fbcd3e18b755567ef678566099e87471526b..6971bc6f86e148cb71780bbd985fc4a977cd6097 100644 (file)
@@ -71,13 +71,10 @@ public class Main {
       init(p);
       runner.start();
 
-      runAnalysis(stats, p);
-
       if (cli.isInteractive()) {
-        while (waitForUser()) {
-          stats = new Stats().start();
-          runAnalysis(stats, p);
-        }
+        interactiveLoop(p);
+      } else {
+        runAnalysis(stats, p);
       }
     } catch (Exception e) {
       displayExecutionResult(stats, "FAILURE");
@@ -89,6 +86,18 @@ public class Main {
     shutdown.exit(Exit.SUCCESS);
   }
 
+  private void interactiveLoop(Properties p) throws IOException {
+    do {
+      Stats stats = new Stats().start();
+      try {
+        runAnalysis(stats, p);
+      } catch (Exception e) {
+        displayExecutionResult(stats, "FAILURE");
+        showError("Error during Sonar runner execution", e, cli.isDisplayStackTrace());
+      }
+    } while (waitForUser());
+  }
+
   private void init(Properties p) throws IOException {
     SystemInfo.print();
     if (cli.isDisplayVersionOnly()) {
@@ -118,13 +127,19 @@ public class Main {
       return false;
     }
 
-    Logs.info("<Press enter to restart analysis>");
+    System.out.println("");
+    System.out.println("<Press enter to restart analysis or Ctrl+C to exit the interactive mode>");
     String line = inputReader.readLine();
     shutdown.signalReady(false);
 
     return line != null;
   }
 
+  // Visible for testing
+  void setInputReader(BufferedReader inputReader) {
+    this.inputReader = inputReader;
+  }
+
   private static void displayExecutionResult(Stats stats, String resultMsg) {
     Logs.info("------------------------------------------------------------------------");
     Logs.info("EXECUTION " + resultMsg);
index 857faacd35d5fdd3071bb481d3cb8e3b8cf207ec..de5341a13c5983a3a9e738eb98e03c9968bb7b7c 100644 (file)
@@ -30,7 +30,6 @@ class Shutdown {
   private boolean exiting = false;
   private Object lock = new Object();
   private Exit exit;
-  private Thread t;
 
   Shutdown(Exit exit) {
     this(exit, DEFAULT_MAX_WAIT);
@@ -51,7 +50,6 @@ class Shutdown {
 
   void signalReady(boolean ready) {
     synchronized (lock) {
-      System.out.println("READY: " + ready);
       this.isReady = ready;
       lock.notifyAll();
     }
index 4ae594d6a9f1f02954b1966619c4087bdab14390..5b7d8fec7691ba3bb25177bbd45bf1017ef6dd7a 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.runner.cli;
 
+import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -76,7 +77,7 @@ public class MainTest {
   }
 
   @Test
-  public void should_fail_on_error() {
+  public void should_stop_on_error() {
     EmbeddedRunner runner = mock(EmbeddedRunner.class);
     doThrow(new IllegalStateException("Error")).when(runner).runAnalysis(any(Properties.class));
     when(runnerFactory.create(any(Properties.class))).thenReturn(runner);
@@ -84,9 +85,29 @@ public class MainTest {
     Main main = new Main(exit, cli, conf, runnerFactory);
     main.execute();
 
+    verify(runner).stop();
     verify(exit).exit(Exit.ERROR);
   }
 
+  @Test
+  public void should_not_stop_on_error_in_interactive_mode() throws Exception {
+    EmbeddedRunner runner = mock(EmbeddedRunner.class);
+    doThrow(new IllegalStateException("Error")).when(runner).runAnalysis(any(Properties.class));
+    when(runnerFactory.create(any(Properties.class))).thenReturn(runner);
+    when(cli.isInteractive()).thenReturn(true);
+
+    Main main = new Main(exit, cli, conf, runnerFactory);
+    BufferedReader inputReader = mock(BufferedReader.class);
+    when(inputReader.readLine()).thenReturn("");
+    when(exit.shouldExit()).thenReturn(false).thenReturn(true);
+    main.setInputReader(inputReader);
+    main.execute();
+
+    verify(runner, times(2)).runAnalysis(any(Properties.class));
+    verify(runner).stop();
+    verify(exit).exit(Exit.SUCCESS);
+  }
+
   @Test
   public void should_only_display_version() throws IOException {