This is an automated email from the ASF dual-hosted git repository.

pauls pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-launcher.git


The following commit(s) were added to refs/heads/master by this push:
     new fcd3c09  SLING-10187 - Provide a Dockerfile that delegates all env 
vars to sling launcher (#18)
fcd3c09 is described below

commit fcd3c092ed4a417049a4afa3d1a191ef46293698
Author: Stefan Bischof <[email protected]>
AuthorDate: Tue Mar 16 17:41:10 2021 +0100

    SLING-10187 - Provide a Dockerfile that delegates all env vars to sling 
launcher (#18)
---
 pom.xml                                            |  45 +++++
 src/main/docker/Dockerfile                         |  55 ++++++
 .../sling/feature/launcher/impl/Bootstrap.java     |   1 +
 .../apache/sling/feature/launcher/impl/Main.java   |  69 +++++++-
 .../sling/feature/launcher/impl/MainTest.java      | 191 ++++++++++++++++++---
 5 files changed, 332 insertions(+), 29 deletions(-)

diff --git a/pom.xml b/pom.xml
index e16c2a0..43a137f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -166,4 +166,49 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    
+    <profiles>
+        <profile>
+            <id>container</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-jar-plugin</artifactId>
+                    </plugin>
+                    <plugin>
+                        <groupId>io.fabric8</groupId>
+                        <artifactId>docker-maven-plugin</artifactId>
+                        <version>0.34.1</version>
+                        <configuration>
+                            <images>
+                                <image>
+                                    
<name>apache/sling-feature-launcher:${project.version}</name>
+                                    <build>
+                                        <tags>
+                                            <tag>latest</tag>
+                                            <tag>${project.version}</tag>
+                                        </tags>
+                                         <dockerFileDir>.</dockerFileDir>
+                                         <assembly>
+                                              
<descriptorRef>artifact</descriptorRef>
+                                         </assembly>
+                                    </build>
+                                </image>
+                            </images>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>docker:build</id>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>build</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
 </project>
diff --git a/src/main/docker/Dockerfile b/src/main/docker/Dockerfile
new file mode 100644
index 0000000..0a1e947
--- /dev/null
+++ b/src/main/docker/Dockerfile
@@ -0,0 +1,55 @@
+# -----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# -----------------------------------------------------------------------------
+
+#Base
+FROM adoptopenjdk/openjdk11:alpine-slim
+LABEL maintainer [email protected]
+
+#ENV for Sling
+ENV ARTIFACT_CLASH=
+ENV CONFIG_CLASH=
+ENV REPOSITORY_URLS=
+ENV CACHE_DIR=
+ENV FRAMEWORK_PROPERTIES=
+ENV FEATURE_FILES=
+ENV HOME_DIR=
+ENV VARIABLE_VALUES=
+ENV EXTENSION_CONFIGURATION=
+ENV FELIX_FRAMEWORK_VERSION=
+ENV OSGI_FRAMEWORK_ARTIFACT=
+ENV VERBOSE=warn
+
+#ENV for java
+ENV JAVA_OPTS=
+ENV JAVA_CP=/opt/run/launcher.jar
+
+WORKDIR /opt/run
+RUN addgroup -S launcher && adduser -S launcher -G launcher && \
+ chown -R launcher:launcher /opt/run
+
+USER launcher
+
+# copy the packaged jar file into our docker image
+COPY maven/${project.artifactId}-${project.version}.jar /opt/run/launcher.jar
+
+#maybe cleanup
+#RUN echo "rm -rf launcherecho "rm -rf launcher \n"
+
+# set the startup command to execute the jar
+CMD java $JAVA_OPTS -cp $JAVA_CP org.apache.sling.feature.launcher.impl.Main 
-cenv -C $ARTIFACT_CLASH -CC $CONFIG_CLASH -c $CACHE_DIR -D 
$FRAMEWORK_PROPERTIES -f $FEATURE_FILES -p $HOME_DIR -u $REPOSITORY_URLS -V 
$VARIABLE_VALUES -ec $EXTENSION_CONFIGURATION -fv $FELIX_FRAMEWORK_VERSION -fa 
$OSGI_FRAMEWORK_ARTIFACT -v $VERBOSE
diff --git 
a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java 
b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
index 2008940..77a7db3 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Bootstrap.java
@@ -198,6 +198,7 @@ public class Bootstrap {
                 
this.config.addFeatureFiles(application.toURI().toURL().toString());
             }
             else {
+                Main.printHelp();
                 throw new IllegalStateException("No feature(s) to launch found 
and none where specified");
             }
             return FeatureProcessor.createApplication(this.logger, 
this.config, artifactManager, loadedFeatures);
diff --git a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java 
b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
index 3d5fcc9..e8386bf 100644
--- a/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
+++ b/src/main/java/org/apache/sling/feature/launcher/impl/Main.java
@@ -17,6 +17,7 @@
 package org.apache.sling.feature.launcher.impl;
 
 import java.io.File;
+import java.io.PrintWriter;
 import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -70,8 +71,12 @@ public class Main {
 
     public static final String OPT_ARTICACT_CLASH = "C";
 
+    public static final String OPT_PRINT_CONTAINER_ENV_HELP = "cenv";
+
     private static Logger LOGGER;
 
+    private static Options options;
+
     private static Logger LOG() {
 
         if (LOGGER == null) {
@@ -131,7 +136,8 @@ public class Main {
      * Parse the command line parameters and update a configuration object.
      * 
      * @param args Command line parameters
-     * @return Configuration object.
+     * @param config Configuration object
+     * @return Options object.
      */
     protected static void parseArgs(final LauncherConfig config, final 
String[] args) {
 
@@ -222,7 +228,13 @@ public class Main {
                 .numberOfArgs(1)
                 .build();
 
-        final Options options = new Options().addOption(artifactClashOverride)
+        final Option printInsideContainerHelp = 
Option.builder(OPT_PRINT_CONTAINER_ENV_HELP)
+              
+                .desc("print additional help information for container env 
vars.")
+                .optionalArg(true)
+                .build();
+        
+               options = new Options().addOption(artifactClashOverride)
                 .addOption(configClashOverride)
                 .addOption(repoOption)
                 .addOption(featureOption)
@@ -233,8 +245,10 @@ public class Main {
                 .addOption(homeOption)
                 .addOption(extensionConfiguration)
                 .addOption(frameworkVersionOption)
-                .addOption(frameworkArtifactOption);
+                .addOption(frameworkArtifactOption)
+                .addOption(printInsideContainerHelp);
 
+        
         final CommandLineParser clp = new DefaultParser();
         try {
             final CommandLine cl = clp.parse(options, args);
@@ -295,13 +309,56 @@ public class Main {
         } catch (final ParseException pe) {
             Main.LOG().error("Unable to parse command line: {}", 
pe.getMessage(), pe);
 
-            HelpFormatter formatter = new HelpFormatter();
-            formatter.printHelp("launcher", options);
+            printHelp();
 
             System.exit(1);
         }
     }
 
+    static void printHelp() {
+
+        if (options == null) {
+            return;
+        }
+        HelpFormatter formatter = new HelpFormatter();
+        formatter.printHelp("launcher", options);
+        if (options.getOption(OPT_PRINT_CONTAINER_ENV_HELP) != null) {
+
+            try (PrintWriter writer = new PrintWriter(System.out);) {
+
+                writer.println("");
+                writer.println(
+                        "If you are running sling-feature-launcher as an 
container please use env vars.");
+                writer.println("");
+
+                writer.println(" cli-arg  -  container ENV variable");
+                writer.println("-------------------------------------");
+                writer.println(" -" + OPT_ARTICACT_CLASH + "       -  
ARTIFACT_CLASH");
+                writer.println(" -" + OPT_CONFIG_CLASH + "      -  
CONFIG_CLASH");
+                writer.println(" -" + OPT_CACHE_DIR + "       -  CACHE_DIR");
+                writer.println(" -" + OPT_FRAMEWORK_PROPERTIES + "       -  
FRAMEWORK_PROPERTIES");
+                writer.println(" -" + OPT_FEATURE_FILES + "       -  
FEATURE_FILES");
+                writer.println(" -" + OPT_HOME_DIR + "       -  HOME_DIR");
+                writer.println(" -" + OPT_REPOSITORY_URLS + "       -  
REPOSITORY_URLS");
+                writer.println(" -" + OPT_VARIABLE_VALUES + "       -  
VARIABLE_VALUES");
+                writer.println(
+                        " -" + OPT_EXTENSION_CONFIGURATION + "      -  
EXTENSION_CONFIGURATION");
+                writer.println(
+                        " -" + OPT_FELIX_FRAMEWORK_VERSION + "      -  
FELIX_FRAMEWORK_VERSION");
+                writer.println(
+                        " -" + OPT_OSGI_FRAMEWORK_ARTIFACT + "      -  
OSGI_FRAMEWORK_ARTIFACT");
+                writer.println(" -" + OPT_VERBOSE + "       -  VERBOSE");
+
+                writer.println("");
+                writer.println("Java options could be set using the env var 
'JAVA_OPTS'");
+                writer.println(
+                        "Classpath could be changed using the env var 
'JAVA_CP' (default:`/opt/run/launcher.jar`)");
+                writer.flush();
+            }
+        }
+
+    }
+
     public static void main(final String[] args) {
 
         // setup logging
@@ -312,8 +369,8 @@ public class Main {
 
         // check if launcher has already been created
         final LauncherConfig launcherConfig = new LauncherConfig();
-        parseArgs(launcherConfig, args);
 
+        parseArgs(launcherConfig, args);
         final Bootstrap bootstrap = new Bootstrap(launcherConfig, Main.LOG());
         bootstrap.run();
     }
diff --git a/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java 
b/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java
index fad9f3f..13f3431 100644
--- a/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java
+++ b/src/test/java/org/apache/sling/feature/launcher/impl/MainTest.java
@@ -20,17 +20,70 @@ import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+import java.security.Permission;
 import java.util.AbstractMap;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.Options;
 import org.apache.sling.feature.ArtifactId;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class MainTest {
 
+    protected static class SystemExitException extends SecurityException {
+
+        private static final long serialVersionUID = 1L;
+
+        public final int status;
+
+        public SystemExitException(int status) {
+
+            super("NoExit");
+            this.status = status;
+        }
+    }
+
+    private static class NoSystemExitSecurityManager extends SecurityManager {
+
+        @Override
+        public void checkPermission(Permission perm) {
+
+            // allow anything.
+        }
+
+        @Override
+        public void checkPermission(Permission perm, Object context) {
+
+            // allow anything.
+        }
+
+        @Override
+        public void checkExit(int status) {
+
+            super.checkExit(status);
+            throw new SystemExitException(status);
+        }
+    }
+
+    @BeforeClass
+    public static void setUp() throws Exception {
+
+        System.setSecurityManager(new NoSystemExitSecurityManager());
+    }
+
+    @AfterClass
+    public static void tearDown() throws Exception {
+
+        System.setSecurityManager(null);
+    }
+
     @Test
     public void testSplitCommandlineArgs() {
 
@@ -65,15 +118,24 @@ public class MainTest {
     }
 
     @Test
+    public void testParseContainer() {
+
+        Options os = mock(Options.class);
+        Option o = mock(Option.class);
+        when(os.getOption(Main.OPT_PRINT_CONTAINER_ENV_HELP)).thenReturn(o);
+
+    }
+
+    @Test
     public void testParseVerbose() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-v", "debug" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_VERBOSE, "debug" });
         assertEquals("debug", 
System.getProperty("org.slf4j.simpleLogger.defaultLogLevel"));
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-v" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_VERBOSE });
         assertEquals("debug", 
System.getProperty("org.slf4j.simpleLogger.defaultLogLevel"));
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-v", "warn" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_VERBOSE, "warn" });
         assertEquals("warn", 
System.getProperty("org.slf4j.simpleLogger.defaultLogLevel"));
 
     }
@@ -81,10 +143,10 @@ public class MainTest {
     @Test
     public void testParseHome() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-p" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_HOME_DIR });
 
         LauncherConfig config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-p", "foo" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_HOME_DIR, "foo" 
});
         assertEquals("foo", config.getHomeDirectory().toString());
 
     }
@@ -92,10 +154,10 @@ public class MainTest {
     @Test
     public void testParseCacheDir() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-c" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_CACHE_DIR });
 
         LauncherConfig config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-c", "foo" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_CACHE_DIR, "foo" 
});
         assertEquals("foo", config.getCacheDirectory().toString());
 
     }
@@ -103,10 +165,11 @@ public class MainTest {
     @Test
     public void testParseFelixFwVersion() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-fv" });
+        Main.parseArgs(noActionAllowesConfig,
+                new String[] { "-" + Main.OPT_FELIX_FRAMEWORK_VERSION });
 
         LauncherConfig config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-fv", "foo" });
+        Main.parseArgs(config, new String[] { "-" + 
Main.OPT_FELIX_FRAMEWORK_VERSION, "foo" });
         assertEquals("foo", config.getFrameworkVersion().toString());
 
     }
@@ -114,30 +177,100 @@ public class MainTest {
     @Test
     public void testParseOSGiFwArtifact() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-fa" });
+        Main.parseArgs(noActionAllowesConfig,
+                new String[] { "-" + Main.OPT_OSGI_FRAMEWORK_ARTIFACT });
 
         LauncherConfig config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-fa", "foo" });
+        Main.parseArgs(config, new String[] { "-" + 
Main.OPT_OSGI_FRAMEWORK_ARTIFACT, "foo" });
         assertEquals("foo", config.getFrameworkArtifact());
 
     }
 
     @Test
+    public void testParse_Config_Clash() {
+
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_CONFIG_CLASH });
+
+        LauncherConfig config = new LauncherConfig();
+        // -C and -CC may have a conflict
+        // Main.parseArgs(config, new String[] { "-" + Main.OPT_CONFIG_CLASH + 
"a=1",
+        //         "-" + Main.OPT_CONFIG_CLASH + "b=2" });
+        //
+        // assertTrue(config.getConfigClashOverrides().containsKey("a"));
+        // assertEquals("1", config.getConfigClashOverrides().get("a"));
+        // assertTrue(config.getConfigClashOverrides().containsKey("b"));
+        // assertEquals("2", config.getConfigClashOverrides().get("b"));
+
+        config = new LauncherConfig();
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_CONFIG_CLASH, 
"a", "1",
+                "-" + Main.OPT_CONFIG_CLASH, "b", "2" });
+
+        assertTrue(config.getConfigClashOverrides().containsKey("a"));
+        assertEquals("1", config.getConfigClashOverrides().get("a"));
+        assertTrue(config.getConfigClashOverrides().containsKey("b"));
+        assertEquals("2", config.getConfigClashOverrides().get("b"));
+
+    }
+
+    @Test
+    public void testParse_OptVarVal() {
+
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_VARIABLE_VALUES });
+
+        LauncherConfig config = new LauncherConfig();
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_VARIABLE_VALUES + 
"a=1",
+                "-" + Main.OPT_VARIABLE_VALUES + "b=2" });
+
+        assertTrue(config.getVariables().containsKey("a"));
+        assertEquals("1", config.getVariables().get("a"));
+        assertTrue(config.getVariables().containsKey("b"));
+        assertEquals("2", config.getVariables().get("b"));
+
+        config = new LauncherConfig();
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_VARIABLE_VALUES, 
"a", "1",
+                "-" + Main.OPT_VARIABLE_VALUES, "b", "2" });
+
+        assertTrue(config.getVariables().containsKey("a"));
+        assertEquals("1", config.getVariables().get("a"));
+        assertTrue(config.getVariables().containsKey("b"));
+        assertEquals("2", config.getVariables().get("b"));
+
+    }
+
+    @Test
+    public void testParse_FW_Prop() {
+
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_FRAMEWORK_PROPERTIES });
+
+        LauncherConfig config = new LauncherConfig();
+        Main.parseArgs(config, new String[] { "-" + 
Main.OPT_FRAMEWORK_PROPERTIES + "a=1",
+                "-" + Main.OPT_FRAMEWORK_PROPERTIES + "b=2" });
+
+        
assertTrue(config.getInstallation().getFrameworkProperties().containsKey("a"));
+        assertEquals("1", 
config.getInstallation().getFrameworkProperties().get("a"));
+
+        
assertTrue(config.getInstallation().getFrameworkProperties().containsKey("b"));
+        assertEquals("2", 
config.getInstallation().getFrameworkProperties().get("b"));
+    }
+
+    @Test
     public void testParse_Artifact_Clash() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-C" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_ARTICACT_CLASH });
 
         LauncherConfig config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-C", "foo:bar:1" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_ARTICACT_CLASH, 
"foo:bar:1" });
         
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:1")));
 
         config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-C", "foo:bar:1", "foo:bar:2" 
});
+        Main.parseArgs(config,
+                new String[] { "-" + Main.OPT_ARTICACT_CLASH, "foo:bar:1", 
"foo:bar:2" });
         
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:1")));
         
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:2")));
 
         config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-C", "foo:bar:1", "-C", 
"foo:bar:2" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_ARTICACT_CLASH, 
"foo:bar:1",
+                "-" + Main.OPT_ARTICACT_CLASH, "foo:bar:2" });
         
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:1")));
         
assertTrue(config.getArtifactClashOverrides().contains(ArtifactId.parse("foo:bar:2")));
 
@@ -146,18 +279,19 @@ public class MainTest {
     @Test
     public void testParse_RepoUrls() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-u" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_REPOSITORY_URLS });
 
         LauncherConfig config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-u", "foo" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_REPOSITORY_URLS, 
"foo" });
         assertArrayEquals(config.getRepositoryUrls(), new Object[] { "foo" });
 
         config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-u", "foo", "bar" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_REPOSITORY_URLS, 
"foo", "bar" });
         assertArrayEquals(config.getRepositoryUrls(), new Object[] { "foo", 
"bar" });
 
         config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-u", "foo", "-u", "bar" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_REPOSITORY_URLS, 
"foo",
+                "-" + Main.OPT_REPOSITORY_URLS, "bar" });
         assertArrayEquals(config.getRepositoryUrls(), new Object[] { "foo", 
"bar" });
 
     }
@@ -165,22 +299,33 @@ public class MainTest {
     @Test
     public void testParse_FeatureFiles() {
 
-        Main.parseArgs(noActionAllowesConfig, new String[] { "-f" });
+        Main.parseArgs(noActionAllowesConfig, new String[] { "-" + 
Main.OPT_FEATURE_FILES });
 
         LauncherConfig config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-f", "foo" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_FEATURE_FILES, 
"foo" });
         assertTrue(config.getFeatureFiles().contains("foo"));
 
         config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-f", "foo", "bar" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_FEATURE_FILES, 
"foo", "bar" });
         assertTrue(config.getFeatureFiles().contains("foo"));
         assertTrue(config.getFeatureFiles().contains("bar"));
 
         config = new LauncherConfig();
-        Main.parseArgs(config, new String[] { "-f", "foo", "-f", "bar" });
+        Main.parseArgs(config, new String[] { "-" + Main.OPT_FEATURE_FILES, 
"foo",
+                "-" + Main.OPT_FEATURE_FILES, "bar" });
         assertTrue(config.getFeatureFiles().contains("foo"));
         assertTrue(config.getFeatureFiles().contains("bar"));
 
     }
 
+    @Test
+    public void testMain_main() {
+
+        try {
+            Main.main(new String[] {});
+        } catch (SystemExitException e) {
+            assertEquals("Exit status", 1, e.status);
+        }
+
+    }
 }

Reply via email to