From ae2964516ff5296a50b354b4c1283879a637dc0c Mon Sep 17 00:00:00 2001
From: Violette Roche-Montane <violette.roche-montane@forgerock.com>
Date: Thu, 06 Feb 2014 16:32:17 +0000
Subject: [PATCH] Checkpoint commit for OPENDJ-1306 - Added subcommand for Setup CLI. - Added logger. - Removed javacheckversion from model. The function is now in the Utils. - Added unit tests for subcommands.

---
 opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java         |  230 +++++++++++++++++-----------
 opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupLog.java         |  122 +++++++++++++++
 opendj-server/src/main/java/org/forgerock/opendj/server/setup/model/Model.java          |    8 -
 opendj-server/src/test/java/org/forgerock/opendj/server/setup/model/ModelTestCase.java  |   31 ---
 opendj-server/src/test/java/org/forgerock/opendj/server/setup/cli/SetupCliTestCase.java |   40 +++-
 5 files changed, 291 insertions(+), 140 deletions(-)

diff --git a/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java
index fde8762..b70e354 100644
--- a/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java
+++ b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupCli.java
@@ -26,9 +26,12 @@
 
 import static com.forgerock.opendj.cli.Utils.filterExitCode;
 import static com.forgerock.opendj.cli.Utils.LINE_SEPARATOR;
+import static com.forgerock.opendj.cli.Utils.checkJavaVersion;
 import static com.forgerock.opendj.cli.CliMessages.*;
 
+
 import java.io.PrintStream;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -36,64 +39,93 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.LocalizableMessageBuilder;
-import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
 
 import com.forgerock.opendj.cli.Argument;
 import com.forgerock.opendj.cli.ArgumentException;
-import com.forgerock.opendj.cli.ArgumentParser;
 import com.forgerock.opendj.cli.BooleanArgument;
+import com.forgerock.opendj.cli.CLIException;
 import com.forgerock.opendj.cli.CommonArguments;
 import com.forgerock.opendj.cli.ConsoleApplication;
 import com.forgerock.opendj.cli.FileBasedArgument;
 import com.forgerock.opendj.cli.IntegerArgument;
+import com.forgerock.opendj.cli.ReturnCode;
 import com.forgerock.opendj.cli.StringArgument;
+import com.forgerock.opendj.cli.SubCommand;
+import com.forgerock.opendj.cli.SubCommandArgumentParser;
 
 /**
  * This class implements the new CLI for OpenDJ3 setup.
  */
 public final class SetupCli extends ConsoleApplication {
 
-    ArgumentParser argParser;
+    /**
+     * Setup's logger.
+     */
+    private static final LocalizedLogger LOG = LocalizedLogger.getLoggerForThisClass();
 
-    BooleanArgument testOnly;
-    BooleanArgument cli;
-    BooleanArgument addBaseEntry;
-    BooleanArgument skipPortCheck;
-    BooleanArgument enableWindowsService;
-    BooleanArgument doNotStart;
-    BooleanArgument enableStartTLS;
-    BooleanArgument generateSelfSignedCertificate;
-    StringArgument hostName;
-    BooleanArgument usePkcs11;
-    FileBasedArgument directoryManagerPwdFile;
-    FileBasedArgument keyStorePasswordFile;
-    IntegerArgument ldapPort;
-    IntegerArgument adminConnectorPort;
-    IntegerArgument ldapsPort;
-    IntegerArgument jmxPort;
-    IntegerArgument sampleData;
-    StringArgument baseDN;
-    StringArgument importLDIF;
-    StringArgument rejectedImportFile;
-    StringArgument skippedImportFile;
-    StringArgument directoryManagerDN;
-    StringArgument directoryManagerPwdString;
-    StringArgument useJavaKeyStore;
-    StringArgument useJCEKS;
-    StringArgument usePkcs12;
-    StringArgument keyStorePassword;
-    StringArgument certNickname;
-    StringArgument progName;
-    IntegerArgument connectTimeout = null;
-    BooleanArgument acceptLicense;
+    /**
+     * TODO remove that after implementation in config.
+     *
+     * @return The installation path.
+     */
+    static final String getInstallationPath() {
+        return "/home/violette/OpenDJ-3.0.0/";
+    }
+
+    /**
+     * TODO remove that after implementation in config.
+     *
+     * @return The instance path.
+     */
+    static final String getInstancePath() {
+        return "/home/violette/OpenDJ-3.0.0/";
+    }
+
+
+    private SubCommandArgumentParser argParser;
+
+    private BooleanArgument cli;
+    private BooleanArgument addBaseEntry;
+    private BooleanArgument skipPortCheck;
+    private BooleanArgument enableWindowsService;
+    private BooleanArgument doNotStart;
+    private BooleanArgument enableStartTLS;
+    private BooleanArgument generateSelfSignedCertificate;
+    private StringArgument hostName;
+    private BooleanArgument usePkcs11;
+    private FileBasedArgument directoryManagerPwdFile;
+    private FileBasedArgument keyStorePasswordFile;
+    private IntegerArgument ldapPort;
+    private IntegerArgument adminConnectorPort;
+    private IntegerArgument ldapsPort;
+    private IntegerArgument jmxPort;
+    private IntegerArgument sampleData;
+    private StringArgument baseDN;
+    private StringArgument importLDIF;
+    private StringArgument rejectedImportFile;
+    private StringArgument skippedImportFile;
+    private StringArgument directoryManagerDN;
+    private StringArgument directoryManagerPwdString;
+    private StringArgument useJavaKeyStore;
+    private StringArgument useJCEKS;
+    private StringArgument usePkcs12;
+    private StringArgument keyStorePassword;
+    private StringArgument certNickname;
+    private IntegerArgument connectTimeout = null;
+    private BooleanArgument acceptLicense;
+
+    // Sub-commands
+    private SubCommand createDirectoryServer;
+    private SubCommand createProxy;
 
     // Register the global arguments.
-    BooleanArgument noPrompt;
-    BooleanArgument quietMode;
-    BooleanArgument verbose;
-    StringArgument propertiesFile;
-    BooleanArgument noPropertiesFile;
-    BooleanArgument showUsage;
+    private BooleanArgument noPrompt;
+    private BooleanArgument quietMode;
+    private BooleanArgument verbose;
+    private StringArgument propertiesFile;
+    private BooleanArgument noPropertiesFile;
+    private BooleanArgument showUsage;
 
     private SetupCli() {
         // Nothing to do.
@@ -117,16 +149,22 @@
 
     /** Create the command-line argument parser for use with this program. */
     int run(final String[] args) {
+        // TODO SetupLog.initLogFileHandler();
+
         try {
-            argParser = new ArgumentParser("Setup", INFO_SETUP_TITLE.get(), true, false, 0, 0, INFO_SETUP_DESCRIPTION
-                    .get().toString());
+            checkJavaVersion();
+        } catch (CLIException e) {
+            println(e.getMessageObject());
+            return ReturnCode.JAVA_VERSION_INCOMPATIBLE.get();
+        }
 
+        try {
+            argParser = new SubCommandArgumentParser("setup", INFO_SETUP_DESCRIPTION.get(), true);
             initializeArguments();
-
         } catch (ArgumentException e) {
             final LocalizableMessage message = ERR_CANNOT_INITIALIZE_ARGS.get(e.getMessage());
             println(message);
-            return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
+            return ReturnCode.CLIENT_SIDE_PARAM_ERROR.get();
         }
 
         // Parse the command-line arguments provided to this program.
@@ -135,12 +173,12 @@
 
             if (argParser.usageOrVersionDisplayed()) {
                 // If we should just display usage or version information, then print it and exit.
-                return ResultCode.SUCCESS.intValue();
+                return ReturnCode.SUCCESS.get();
             }
         } catch (final ArgumentException e) {
             final LocalizableMessage message = ERR_ERROR_PARSING_ARGS.get(e.getMessage());
             println(message);
-            return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
+            return ReturnCode.CLIENT_SIDE_PARAM_ERROR.get();
         }
 
         // Verifying provided informations.
@@ -151,25 +189,22 @@
             checkImportDataArguments(errorMessages);
             checkSecurityArguments(errorMessages);
             if (errorMessages.size() > 0) {
-                throw new ArgumentException(ERR_CANNOT_INITIALIZE_ARGS.get(getMessageFromCollection(errorMessages,
-                        LINE_SEPARATOR)));
+                throw new ArgumentException(ERR_CANNOT_INITIALIZE_ARGS.get(
+                        getMessageFromCollection(errorMessages, LINE_SEPARATOR)));
             }
         } catch (final ArgumentException e) {
             println(e.getMessageObject());
-            return ResultCode.CLIENT_SIDE_PARAM_ERROR.intValue();
+            return ReturnCode.CLIENT_SIDE_PARAM_ERROR.get();
         }
 
         // Starts setup process.
-
-        return ResultCode.SUCCESS.intValue();
+        return ReturnCode.SUCCESS.get();
     }
 
     private void initializeArguments() throws ArgumentException {
 
         // Options.
         acceptLicense = CommonArguments.getAcceptLicense();
-
-        testOnly = CommonArguments.getTestOnly();
         cli = CommonArguments.getCLI();
         baseDN = CommonArguments.getBaseDN();
         addBaseEntry = CommonArguments.getAddBaseEntry();
@@ -197,44 +232,57 @@
         keyStorePassword = CommonArguments.getKeyStorePassword();
         keyStorePasswordFile = CommonArguments.getKeyStorePasswordFile();
         certNickname = CommonArguments.getCertNickName();
+        connectTimeout = CommonArguments.getConnectTimeOut(30000);
 
         // Utility Input Output Options.
         noPrompt = CommonArguments.getNoPrompt();
         quietMode = CommonArguments.getQuiet();
         verbose = CommonArguments.getVerbose();
-        propertiesFile = CommonArguments.getPropertiesFileArgument();
-        noPropertiesFile = CommonArguments.getNoPropertiesFileArgument();
+        propertiesFile = CommonArguments.getPropertiesFile();
+        noPropertiesFile = CommonArguments.getNoPropertiesFile();
         showUsage = CommonArguments.getShowUsage();
 
         // Register global arguments.
-        argParser.addArgument(testOnly);
-        argParser.addArgument(cli);
-        argParser.addArgument(baseDN);
-        argParser.addArgument(addBaseEntry);
-        argParser.addArgument(importLDIF);
-        argParser.addArgument(rejectedImportFile);
-        argParser.addArgument(skippedImportFile);
-        argParser.addArgument(sampleData);
-        argParser.addArgument(ldapPort);
-        argParser.addArgument(adminConnectorPort);
-        argParser.addArgument(jmxPort);
-        argParser.addArgument(skipPortCheck);
-        argParser.addArgument(directoryManagerDN);
-        argParser.addArgument(directoryManagerPwdString);
-        argParser.addArgument(directoryManagerPwdFile);
-        argParser.addArgument(enableWindowsService);
-        argParser.addArgument(doNotStart);
-        argParser.addArgument(enableStartTLS);
-        argParser.addArgument(ldapsPort);
-        argParser.addArgument(generateSelfSignedCertificate);
-        argParser.addArgument(hostName);
-        argParser.addArgument(usePkcs11);
-        argParser.addArgument(useJavaKeyStore);
-        argParser.addArgument(useJCEKS);
-        argParser.addArgument(usePkcs12);
-        argParser.addArgument(keyStorePassword);
-        argParser.addArgument(keyStorePasswordFile);
-        argParser.addArgument(certNickname);
+        argParser.addGlobalArgument(cli);
+        argParser.addGlobalArgument(baseDN);
+        argParser.addGlobalArgument(addBaseEntry);
+        argParser.addGlobalArgument(importLDIF);
+        argParser.addGlobalArgument(rejectedImportFile);
+        argParser.addGlobalArgument(skippedImportFile);
+        argParser.addGlobalArgument(sampleData);
+        argParser.addGlobalArgument(ldapPort);
+        argParser.addGlobalArgument(adminConnectorPort);
+        argParser.addGlobalArgument(jmxPort);
+        argParser.addGlobalArgument(skipPortCheck);
+        argParser.addGlobalArgument(directoryManagerDN);
+        argParser.addGlobalArgument(directoryManagerPwdString);
+        argParser.addGlobalArgument(directoryManagerPwdFile);
+        argParser.addGlobalArgument(enableWindowsService);
+        argParser.addGlobalArgument(doNotStart);
+        argParser.addGlobalArgument(enableStartTLS);
+        argParser.addGlobalArgument(ldapsPort);
+        argParser.addGlobalArgument(generateSelfSignedCertificate);
+        argParser.addGlobalArgument(hostName);
+        argParser.addGlobalArgument(usePkcs11);
+        argParser.addGlobalArgument(useJavaKeyStore);
+        argParser.addGlobalArgument(useJCEKS);
+        argParser.addGlobalArgument(usePkcs12);
+        argParser.addGlobalArgument(keyStorePassword);
+        argParser.addGlobalArgument(keyStorePasswordFile);
+        argParser.addGlobalArgument(certNickname);
+        argParser.addGlobalArgument(connectTimeout);
+
+        //Sub-commands && their arguments
+        final ArrayList<SubCommand> subCommandList = new ArrayList<SubCommand>(2);
+        createDirectoryServer = new SubCommand(argParser, "create-directory-server",
+                INFO_SETUP_SUBCOMMAND_CREATE_DIRECTORY_SERVER.get());
+        // TODO to complete.
+        createProxy = new SubCommand(argParser, "create-proxy",
+                INFO_SETUP_SUBCOMMAND_CREATE_PROXY.get());
+        subCommandList.add(createDirectoryServer);
+        subCommandList.add(createProxy);
+
+        argParser.setUsageGroupArgument(showUsage, subCommandList);
 
         // Register the global arguments.
         argParser.addArgument(showUsage);
@@ -286,6 +334,15 @@
     }
 
     /**
+     * Returns whether the command was launched to setup proxy or not.
+     *
+     * @return <CODE>true</CODE> if the command was launched to setup a proxy and <CODE>false</CODE> otherwise.
+     */
+    public boolean isCreateProxy() {
+        return (argParser.getSubCommand("create-proxy") != null);
+    }
+
+    /**
      * Checks that there are no conflicts with the provided ports (like if the user provided the same port for different
      * protocols).
      *
@@ -322,11 +379,8 @@
                 }
             }
         } catch (ArgumentException ae) {
-            // TODO log that
-            /*
-             * logger.error(LocalizableMessage.raw("Unexpected error.  " +
-             * "Assuming that it is caused by a previous parsing issue: " + ae, ae));
-             */
+            LOG.error(LocalizableMessage.raw("Unexpected error. "
+                    + "Assuming that it is caused by a previous parsing issue: " + ae, ae));
         }
     }
 
diff --git a/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupLog.java b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupLog.java
new file mode 100644
index 0000000..b030e6f
--- /dev/null
+++ b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/cli/SetupLog.java
@@ -0,0 +1,122 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
+ * or http://forgerock.org/license/CDDLv1.0.html.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at legal-notices/CDDLv1_0.txt.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information:
+ *      Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ *
+ *      Copyright 2014 ForgeRock AS
+ */
+
+package org.forgerock.opendj.server.setup.cli;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.text.SimpleDateFormat;
+import java.util.logging.FileHandler;
+import java.util.logging.Formatter;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.Logger;
+
+import com.forgerock.opendj.cli.CLIException;
+import com.forgerock.opendj.cli.CliMessages;
+
+/**
+ * Creates a historical log about the setup. If file does not exist an attempt will be made to create it.
+ */
+final class SetupLog {
+
+    static private File logFile = null;
+    static private FileHandler fileHandler = null;
+    final static String LOGNAME = "setup.log";
+
+    private SetupLog() {
+        //  Nothing to do.
+    }
+    /**
+     * Creates a new file handler for writing log messages into {@value #LOGNAME} file.
+     */
+    static void initLogFileHandler() {
+        final Logger logger = Logger.getLogger(SetupCli.class.getName());
+
+        final String space = " ";
+
+        if (logFile == null) {
+            logFile = new File(new StringBuilder(SetupCli.getInstallationPath()).append(File.separator).append(LOGNAME)
+                    .toString());
+        }
+        try {
+            fileHandler = new FileHandler(logFile.getCanonicalPath(), true);
+        } catch (IOException e) {
+            logger.severe(e.getMessage());
+        }
+        fileHandler.setFormatter(new Formatter() {
+            /** {@inheritDoc} */
+            @Override
+            public String format(LogRecord record) {
+                // Format the log ~like the errors logger.
+                StringBuffer sb = new StringBuffer();
+                final SimpleDateFormat dateFormat = new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss Z]");
+                sb.append(dateFormat.format(record.getMillis())).append(space);
+                sb.append("category=SETUP").append(space).append("sq=").append(record.getSequenceNumber())
+                        .append(space).append("severity=").append(record.getLevel().toString().toUpperCase());
+                sb.append(space).append("src=").append(record.getSourceClassName()).append(space)
+                        .append(record.getSourceMethodName()).append("\n");
+                sb.append(space).append("msg=").append(record.getMessage()).append("\n");
+                return sb.toString();
+            }
+        });
+        logger.setLevel(Level.CONFIG);
+        logger.addHandler(fileHandler);
+
+        logger.setUseParentHandlers(false);
+        // Log Config info.
+        logger.info("**** Setup of OpenDJ3 started ****");
+        logger.info(CliMessages.INFO_INSTALLATION_DIRECTORY.get(SetupCli.getInstallationPath()).toString());
+        logger.info(CliMessages.INFO_INSTANCE_DIRECTORY.get(SetupCli.getInstancePath()).toString());
+    }
+
+    /**
+     * Returns the print stream of the current logger.
+     *
+     * @return the print stream of the current logger.
+     * @throws CLIException
+     *             If the file defined by the logger is not found or invalid.
+     */
+    static PrintStream getPrintStream() throws CLIException {
+        try {
+            return new PrintStream(new FileOutputStream(logFile, true));
+        } catch (FileNotFoundException e) {
+            throw new CLIException(CliMessages.ERR_INVALID_LOG_FILE.get(e.getMessage()));
+        }
+    }
+
+    /**
+     * Gets the name of the log file.
+     *
+     * @return File representing the log file
+     */
+    static public File getLogFile() {
+        return logFile;
+    }
+}
diff --git a/opendj-server/src/main/java/org/forgerock/opendj/server/setup/model/Model.java b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/model/Model.java
index 843b4ff..99a7420 100644
--- a/opendj-server/src/main/java/org/forgerock/opendj/server/setup/model/Model.java
+++ b/opendj-server/src/main/java/org/forgerock/opendj/server/setup/model/Model.java
@@ -259,14 +259,6 @@
         this.installationPath = installationPath;
     }
 
-    void checkJavaVersion() throws ConfigException {
-        final String version = System.getProperty("java.specification.version");
-        if (!(Float.valueOf(version) >= 1.6)) {
-            // TODO change exception : original was IncompatibleVersionException
-            throw new ConfigException(LocalizableMessage.raw("invalid java version" + version));
-        }
-    }
-
     /**
      * Creates a basic data store model configuration for setup.
      */
diff --git a/opendj-server/src/test/java/org/forgerock/opendj/server/setup/cli/SetupCliTestCase.java b/opendj-server/src/test/java/org/forgerock/opendj/server/setup/cli/SetupCliTestCase.java
index b13dd2f..0b1225d 100644
--- a/opendj-server/src/test/java/org/forgerock/opendj/server/setup/cli/SetupCliTestCase.java
+++ b/opendj-server/src/test/java/org/forgerock/opendj/server/setup/cli/SetupCliTestCase.java
@@ -40,6 +40,7 @@
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
+import com.forgerock.opendj.cli.ReturnCode;
 import com.forgerock.opendj.cli.Utils;
 
 /**
@@ -52,7 +53,12 @@
     Object[][] createValidArguments() throws Exception {
         Object[][] data = new Object[][] {
             { args("--help"),
-              expectedErrOutput(LocalizableMessage.raw("Command options:")) }, };
+                expectedErrOutput(INFO_SETUP_DESCRIPTION.get()) },
+            { args("--cli", "create-directory-server", "--doNotStart", "--ldapPort", "1389",
+                "--adminConnectorPort", "4444",
+                "-D", "cn=Directory Manager", "-w", "password", "-b", "dc=example,dc=com",
+                "-a"), expectedErrOutput(LocalizableMessage.EMPTY) },
+        };
         return data;
     }
 
@@ -61,7 +67,7 @@
         Object[][] data = new Object[][] {
             { args("-c"),
                 expectedErrOutput(
-                        ERR_ERROR_PARSING_ARGS.get(ERR_ARGPARSER_NO_ARGUMENT_WITH_SHORT_ID.get("c"))) },
+                        ERR_ERROR_PARSING_ARGS.get(ERR_SUBCMDPARSER_NO_GLOBAL_ARGUMENT_FOR_SHORT_ID.get("c"))) },
             { args("-N"), expectedErrOutput(ERR_ERROR_PARSING_ARGS.get(
                     ERR_ARGPARSER_NO_VALUE_FOR_ARGUMENT_WITH_SHORT_ID.get("N"))) },
         };
@@ -74,7 +80,7 @@
             { args("--cli", "--doNotStart", "--ldapPort", "1389", "--adminConnectorPort", "4444",
                     "-D", "cn=Directory Manager", "-w", "password", "-b", "dc=example,dc=com",
                     "-a"),
-                expectedErrOutput(LocalizableMessage.EMPTY) },
+                null },
         };
         return data;
     }
@@ -109,7 +115,7 @@
     }
     // @formatter:on
 
-    /*@Test(dataProvider = "validArguments")
+    @Test(dataProvider = "validArguments")
     public void testRunValidArguments(String[] arguments, LocalizableMessage expectedErrOutput) throws Exception {
         run(arguments, true, expectedErrOutput);
     }
@@ -117,17 +123,24 @@
     @Test(dataProvider = "invalidArguments")
     public void testRunInvalidArguments(String[] arguments, LocalizableMessage expectedErrOutput) throws Exception {
         run(arguments, false, expectedErrOutput);
-    }*/
+    }
+
+    @Test(dataProvider = "validPorts")
+    public void testcheckValidProvidedPorts(String[] arguments, LocalizableMessage expectedErrOutput) throws Exception {
+        run(arguments, true, expectedErrOutput);
+    }
 
     @Test(dataProvider = "invalidPorts")
-    public void testcheckProvidedPorts(String[] arguments, LocalizableMessage expectedErrOutput) throws Exception {
+    public void testcheckInvalidProvidedPorts(String[] arguments, LocalizableMessage expectedErrOutput)
+            throws Exception {
         run(arguments, false, expectedErrOutput);
     }
 
-    private void run(String[] arguments, boolean expectsResults, LocalizableMessage expectedErrOutput)
+    private void run(final String[] arguments, final boolean shouldSucceed, final LocalizableMessage expectedErrOutput)
             throws UnsupportedEncodingException {
         PrintStream outStream = null;
         PrintStream errStream = null;
+        int resultCode = 0;
         try {
             ByteArrayOutputStream out = new ByteArrayOutputStream();
             outStream = new PrintStream(out);
@@ -135,19 +148,21 @@
             errStream = new PrintStream(err);
 
             final SetupCli setup = new SetupCli(outStream, errStream);
-            setup.run(arguments);
+            resultCode = setup.run(arguments);
 
-            if (expectsResults) {
-                assertThat(out.size()).isGreaterThan(0);
-                assertThat(out.toString("UTF-8")).contains(wrapText(expectedErrOutput, MAX_LINE_WIDTH));
+            if (shouldSucceed) {
+                if (expectedErrOutput != null) {
+                    assertThat(out.toString("UTF-8")).contains(wrapText(expectedErrOutput, MAX_LINE_WIDTH));
+                }
+                assertThat(resultCode).isEqualTo(ReturnCode.SUCCESS.get());
             } else {
+                assertThat(resultCode).isNotEqualTo(ReturnCode.SUCCESS.get());
                 assertThat(out.size()).isEqualTo(0);
                 assertThat(err.size()).isGreaterThan(0);
                 final String errorMsg = err.toString("UTF-8").replaceAll(Utils.LINE_SEPARATOR, " ");
                 final String expectedMsg = expectedErrOutput.toString().replaceAll(Utils.LINE_SEPARATOR, " ");
                 assertTrue(errorMsg.contains(expectedMsg), errorMsg + "\n >---< \n" + expectedMsg);
             }
-
         } finally {
             closeSilently(outStream, errStream);
         }
@@ -162,5 +177,4 @@
     private LocalizableMessage expectedErrOutput(LocalizableMessage val) {
         return val;
     }
-
 }
diff --git a/opendj-server/src/test/java/org/forgerock/opendj/server/setup/model/ModelTestCase.java b/opendj-server/src/test/java/org/forgerock/opendj/server/setup/model/ModelTestCase.java
index 649b612..ea9134b 100644
--- a/opendj-server/src/test/java/org/forgerock/opendj/server/setup/model/ModelTestCase.java
+++ b/opendj-server/src/test/java/org/forgerock/opendj/server/setup/model/ModelTestCase.java
@@ -396,35 +396,4 @@
         assertTrue(ds.hasLicense());
         ds.validate();
     }
-
-    /**
-     * Performs security checks.
-     *
-     * @throws ConfigException
-     *             If a configuration exception occurs.
-     */
-    @Test()
-    public void testCheckJavaVersion() throws ConfigException {
-        final Model ds = new DataStoreModel();
-        ds.checkJavaVersion();
-    }
-
-    /**
-     * Performs security checks. In this case, java version is invalid.
-     *
-     * @throws ConfigException
-     *             If a configuration exception occurs.
-     */
-    @Test(expectedExceptions = Exception.class)
-    public void testInvalidJavaVersion() throws Exception {
-        final Model ds = new DataStoreModel();
-        final String original = System.getProperty("java.specification.version");
-        System.setProperty("java.specification.version", "1.5");
-        try {
-            ds.checkJavaVersion();
-        } finally {
-            System.setProperty("java.specification.version", original);
-        }
-
-    }
 }

--
Gitblit v1.10.0