changeset 1782:5345e379a7a6

Exempt help invocations from setup hook. Reviewed-by: aazores Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2015-September/015911.html PR2615
author Severin Gehwolf <sgehwolf@redhat.com>
date Wed, 09 Sep 2015 12:50:27 +0200
parents 3227fa662692
children 1de39fd67cbc
files distribution/tools/verify-bash-completion.sh launcher/src/main/java/com/redhat/thermostat/launcher/internal/LauncherImpl.java launcher/src/test/java/com/redhat/thermostat/launcher/internal/LauncherImplTest.java
diffstat 3 files changed, 54 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/distribution/tools/verify-bash-completion.sh	Thu Sep 10 11:51:45 2015 +0200
+++ b/distribution/tools/verify-bash-completion.sh	Wed Sep 09 12:50:27 2015 +0200
@@ -63,12 +63,8 @@
 
 function __init {
     USER_THERMOSTAT_HOME="$TARGET/bash-completion-test-user-home"
-    echo "Skipping initial thermostat setup..."
-    mkdir -p $USER_THERMOSTAT_HOME/data
     echo "Exporting custom home..."
     export USER_THERMOSTAT_HOME
-    touch ${USER_THERMOSTAT_HOME}/data/setup-complete.stamp
-
     echo "Checking that help works..."
     ${TARGET}/image/bin/thermostat help >/dev/null
 
--- a/launcher/src/main/java/com/redhat/thermostat/launcher/internal/LauncherImpl.java	Thu Sep 10 11:51:45 2015 +0200
+++ b/launcher/src/main/java/com/redhat/thermostat/launcher/internal/LauncherImpl.java	Wed Sep 09 12:50:27 2015 +0200
@@ -41,7 +41,9 @@
 import java.io.PrintStream;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -87,11 +89,18 @@
  */
 public class LauncherImpl implements Launcher {
 
+    private static final Set<String> HELP_SET;
     private static final String HELP_COMMAND_NAME = "help";
+    private static final String HELP_OPTION = "--help";
 
     private static final Translate<LocaleResources> t = LocaleResources.createLocalizer();
     private static final Logger logger = LoggingUtils.getLogger(LauncherImpl.class);
 
+    static {
+        HELP_SET = new HashSet<>();
+        HELP_SET.add(HELP_COMMAND_NAME);
+        HELP_SET.add(HELP_OPTION);
+    }
     private final AtomicInteger usageCount = new AtomicInteger(0);
     private final BundleContext context;
     private final BundleManager registry;
@@ -156,7 +165,7 @@
                 cmdCtxFactory.getConsole().getOutput().println(coreVersion.getVersionInfo());
             } else {
                 // With web-always-on we need to make sure that the setup ran.
-                if (isThermostatConfigured()) {
+                if (isSomeHelpInvocation(args) || isThermostatConfigured()) {
                     logger.log(Level.FINE, "Running command without setup interception.");
                     runCommandFromArguments(args, listeners, inShell);
                 } else {
@@ -186,6 +195,15 @@
         }
     }
     
+    private boolean isSomeHelpInvocation(String[] args) {
+        for (String arg: args) {
+            if (HELP_SET.contains(arg)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void runSetupThenInterceptedCommand(String[] originalCmdArgs) {
         String origCmdArgs = convertOriginalArgsToString(originalCmdArgs);
         String[] setupArgs = { "setup",
@@ -272,7 +290,7 @@
 
     private void runCommand(String cmdName, String[] cmdArgs, Collection<ActionListener<ApplicationState>> listeners, boolean inShell) {
         // treat 'foo --help' as 'help foo'
-        if (!cmdName.equals(HELP_COMMAND_NAME) && Arrays.asList(cmdArgs).contains("--help")) {
+        if (!cmdName.equals(HELP_COMMAND_NAME) && Arrays.asList(cmdArgs).contains(HELP_OPTION)) {
             runCommand(HELP_COMMAND_NAME, new String[] { cmdName } , listeners, inShell);
             return;
         }
--- a/launcher/src/test/java/com/redhat/thermostat/launcher/internal/LauncherImplTest.java	Thu Sep 10 11:51:45 2015 +0200
+++ b/launcher/src/test/java/com/redhat/thermostat/launcher/internal/LauncherImplTest.java	Wed Sep 09 12:50:27 2015 +0200
@@ -36,6 +36,7 @@
 
 package com.redhat.thermostat.launcher.internal;
 
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -48,11 +49,9 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.List;
-import java.util.Objects;
 import java.util.concurrent.ExecutorService;
 import java.util.logging.Handler;
 import java.util.logging.Level;
@@ -61,8 +60,6 @@
 
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -154,6 +151,7 @@
     private CurrentEnvironment environment;
     private CommonPaths paths;
 
+    @SuppressWarnings("unchecked")
     @Before
     public void setUp() throws CommandInfoNotFoundException, BundleException, IOException {
         setupCommandContextFactory();
@@ -611,6 +609,7 @@
 
     @Test
     public void verifyListenersAdded() {
+        @SuppressWarnings("unchecked")
         ActionListener<ApplicationState> listener = mock(ActionListener.class);
         Collection<ActionListener<ApplicationState>> listeners = new ArrayList<>();
         listeners.add(listener);
@@ -692,7 +691,7 @@
     @Test
     public void verifyOriginalCmdArgsArePassedOnToSetup() {
         String[] argsList = new String[] { "list-vms", "--dbUrl=foo" };
-        List<Pair<String[], Boolean>> resultList = doOriginalCmdArgsArePassedOnToSetupTest(argsList);
+        List<Pair<String[], Boolean>> resultList = runAsUnconfiguredThermostat(argsList);
         assertEquals("Expected to run only setup", 1, resultList.size());
         Pair<String[], Boolean> actual = resultList.get(0);
         assertFalse("Expected to run outside shell", actual.getSecond());
@@ -703,7 +702,7 @@
     @Test
     public void verifyOriginalCmdArgsArePassedOnToSetup2() {
         String[] argsList = new String[] { "web-storage-service" };
-        List<Pair<String[], Boolean>> resultList = doOriginalCmdArgsArePassedOnToSetupTest(argsList);
+        List<Pair<String[], Boolean>> resultList = runAsUnconfiguredThermostat(argsList);
         assertEquals("Expected to run only setup", 1, resultList.size());
         Pair<String[], Boolean> actual = resultList.get(0);
         assertFalse("Expected to run outside shell", actual.getSecond());
@@ -711,7 +710,35 @@
         assertArrayEquals(expectedList, actual.getFirst());
     }
     
-    private List<Pair<String[], Boolean>> doOriginalCmdArgsArePassedOnToSetupTest(String[] args) {
+    /*
+     * Bash completion uses help which expects help to always run
+     * (no setup required).
+     */
+    @Test
+    public void verifyHelpIsNotRunThroughSetupHook() {
+        String[] argsList = new String[] { "help" };
+        
+        List<Pair<String[], Boolean>> resultList = runAsUnconfiguredThermostat(argsList);
+        assertEquals("Expected to run only help", 1, resultList.size());
+        Pair<String[], Boolean> actual = resultList.get(0);
+        assertFalse("Expected to run outside shell", actual.getSecond());
+        String[] expectedList = new String[] { "help" };
+        assertArrayEquals(expectedList, actual.getFirst());
+    }
+    
+    @Test
+    public void verifyCommandHelpOptionIsNotRunThroughSetupHook() {
+        String[] argsList = new String[] { "web-storage-service", "--help" };
+        
+        List<Pair<String[], Boolean>> resultList = runAsUnconfiguredThermostat(argsList);
+        assertEquals("Expected to run only web-storage-service --help", 1, resultList.size());
+        Pair<String[], Boolean> actual = resultList.get(0);
+        assertFalse("Expected to run outside shell", actual.getSecond());
+        String[] expectedList = new String[] { "web-storage-service", "--help" };
+        assertArrayEquals(expectedList, actual.getFirst());
+    }
+    
+    private List<Pair<String[], Boolean>> runAsUnconfiguredThermostat(String[] args) {
         CommonPaths setupPaths = mock(CommonPaths.class);
         File mockFile = mock(File.class);
         when(mockFile.exists()).thenReturn(false);
@@ -736,13 +763,6 @@
         return runList;
     }
     
-    private void assertArrayEquals(String[] expected, String[] actual) {
-        assertTrue(expected.length == actual.length);
-        for (int i = 0; i < expected.length; i++) {
-            assertEquals(expected[i], actual[i]);
-        }
-    }
-    
     private static class TestLogHandler extends Handler {
         
         private boolean loggedThermostatHome;