IGNITE-7485 tests added for parsing CommandHandler arguments
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6d926a77 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6d926a77 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6d926a77 Branch: refs/heads/ignite-7485-2 Commit: 6d926a7726b768ebaef3630ef8cae835c0d1c374 Parents: ee446b4 Author: macrergate <[email protected]> Authored: Tue Jan 23 17:19:24 2018 +0300 Committer: macrergate <[email protected]> Committed: Tue Jan 23 17:19:24 2018 +0300 ---------------------------------------------------------------------- .../internal/commandline/CommandHandler.java | 336 +++++++++++++------ .../commandline/CommandHandlerParsingTest.java | 117 +++++++ .../testsuites/IgniteUtilSelfTestSuite.java | 2 + 3 files changed, 347 insertions(+), 108 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6d926a77/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java index 702624d..9b10d5c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java @@ -46,6 +46,7 @@ import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskArg; import org.apache.ignite.internal.visor.baseline.VisorBaselineTaskResult; import org.apache.ignite.plugin.security.SecurityCredentials; import org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider; +import org.jetbrains.annotations.NotNull; import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR; import static org.apache.ignite.internal.IgniteVersionUtils.COPYRIGHT; @@ -60,10 +61,10 @@ import static org.apache.ignite.internal.visor.baseline.VisorBaselineOperation.V */ public class CommandHandler { /** */ - private static final String DFLT_HOST = "127.0.0.1"; + static final String DFLT_HOST = "127.0.0.1"; /** */ - private static final String DFLT_PORT = "11211"; + static final String DFLT_PORT = "11211"; /** */ private static final String CMD_HELP = "--help"; @@ -73,24 +74,19 @@ public class CommandHandler { /** */ private static final String CMD_PORT = "--port"; - /** */ - private static final String CMD_LOGIN = "--login"; + static final String CMD_ACTIVATE = "--activate"; /** */ private static final String CMD_PASSWORD = "--password"; - /** */ - private static final String CMD_ACTIVATE = "--activate"; - + static final String CMD_DEACTIVATE = "--deactivate"; /** */ - private static final String CMD_DEACTIVATE = "--deactivate"; - + static final String CMD_STATE = "--state"; /** */ - private static final String CMD_STATE = "--state"; - + static final String CMD_BASE_LINE = "--baseline"; /** */ - private static final String CMD_BASE_LINE = "--baseline"; + private static final String CMD_USER = "--user"; /** */ private static final String BASELINE_ADD = "add"; @@ -166,25 +162,13 @@ public class CommandHandler { } /** - * Print command usage. - * - * @param desc Command description. - * @param cmd Command. - */ - private void usage(String desc, String cmd) { - log(desc); - log(" control.sh [--host HOST_OR_IP] [--port PORT] [--login LOGIN] [--password PASSWORD] " + cmd); - nl(); - } - - /** * Extract next argument. * * @param it Arguments iterator. * @param err Error message. * @return Next argument value. */ - private String nextArg(Iterator<String> it, String err) { + private static String nextArg(Iterator<String> it, String err) { if (it.hasNext()) { String arg = it.next(); @@ -198,6 +182,103 @@ public class CommandHandler { } /** + * Parses and validates arguments + * + * @param rawArgs array of arguments + * @return Arguments bean + * @throws IllegalArgumentException in case arguments aren't valid + */ + @NotNull static Arguments parseAndValidate(String... rawArgs) { + + String host = DFLT_HOST; + + String port = DFLT_PORT; + + String user = null; + + String pwd = null; + + String baselineAct = ""; + + String baselineArgs = ""; + + List<String> commands = new ArrayList<>(); + + Iterator<String> it = Arrays.asList(rawArgs).iterator(); + + while (it.hasNext()) { + String str = it.next().toLowerCase(); + + switch (str) { + case CMD_HOST: + host = nextArg(it, "Expected host name"); + break; + + case CMD_PORT: + port = nextArg(it, "Expected port number"); + + try { + int p = Integer.parseInt(port); + + if (p <= 0 || p > 65535) + throw new IllegalArgumentException("Invalid value for port: " + port); + } + catch (NumberFormatException ignored) { + throw new IllegalArgumentException("Invalid value for port: " + port); + } + break; + + case CMD_USER: + user = nextArg(it, "Expected user name"); + break; + + case CMD_PASSWORD: + pwd = nextArg(it, "Expected password"); + break; + + case CMD_ACTIVATE: + case CMD_DEACTIVATE: + case CMD_STATE: + commands.add(str); + break; + + case CMD_BASE_LINE: + commands.add(CMD_BASE_LINE); + + if (it.hasNext()) { + baselineAct = it.next().toLowerCase(); + + if (BASELINE_ADD.equals(baselineAct) || BASELINE_REMOVE.equals(baselineAct) || + BASELINE_SET.equals(baselineAct) || BASELINE_SET_VERSION.equals(baselineAct)) + baselineArgs = nextArg(it, "Expected baseline arguments"); + else + throw new IllegalArgumentException("Unexpected argument for " + CMD_BASE_LINE + ": " + + baselineAct); + } + + } + } + + int sz = commands.size(); + + if (sz < 1) + throw new IllegalArgumentException("No action was specified"); + + if (sz > 1) + throw new IllegalArgumentException("Only one action can be specified, but found: " + sz); + + String cmd = commands.get(0); + + boolean hasUsr = F.isEmpty(user); + boolean hasPwd = F.isEmpty(pwd); + + if (hasUsr != hasPwd) + throw new IllegalArgumentException("Both user and password should be specified"); + + return new Arguments(cmd, host, port, user, pwd, baselineAct, baselineArgs); + } + + /** * Activate cluster. * * @param client Client. @@ -509,19 +590,31 @@ public class CommandHandler { } /** + * Print command usage. + * + * @param desc Command description. + * @param cmd Command. + */ + private void usage(String desc, String cmd) { + log(desc); + log(" control.sh [--host HOST_OR_IP] [--port PORT] [--user USER] [--password PASSWORD] " + cmd); + nl(); + } + + /** * Parse and execute command. * - * @param args Arguments to parse and execute. + * @param rawArgs Arguments to parse and execute. * @return Exit code. */ - public int execute(String... args) { + public int execute(String... rawArgs) { log("Control utility [ver. " + ACK_VER_STR + "]"); log(COPYRIGHT); log("User: " + System.getProperty("user.name")); log(DELIM); try { - if (F.isEmpty(args) || (args.length == 1 && CMD_HELP.equalsIgnoreCase(args[0]))){ + if (F.isEmpty(rawArgs) || (rawArgs.length == 1 && CMD_HELP.equalsIgnoreCase(rawArgs[0]))) { log("This utility can do the following commands:"); usage(" Activate cluster:", CMD_ACTIVATE); @@ -548,92 +641,19 @@ public class CommandHandler { return EXIT_CODE_OK; } - String host = DFLT_HOST; - - String port = DFLT_PORT; - - String login = null; - - String pwd = null; - - String baselineAct = ""; - - String baselineArgs = ""; - - List<String> commands = new ArrayList<>(); - - Iterator<String> it = Arrays.asList(args).iterator(); - - while (it.hasNext()) { - String str = it.next().toLowerCase(); - - switch (str) { - case CMD_HOST: - host = nextArg(it, "Expected host name"); - break; - - case CMD_PORT: - port = nextArg(it, "Expected port number"); - - try { - int p = Integer.parseInt(port); - - if (p <= 0 || p > 65535) - throw new IllegalArgumentException("Invalid value for port: " + port); - } - catch (NumberFormatException ignored) { - throw new IllegalArgumentException("Invalid value for port: " + port); - } - break; - case CMD_LOGIN: - login = nextArg(it, "Expected login name"); - break; - case CMD_PASSWORD: - pwd = nextArg(it, "Expected password"); - break; - case CMD_ACTIVATE: - case CMD_DEACTIVATE: - case CMD_STATE: - commands.add(str); - break; - - case CMD_BASE_LINE: - commands.add(CMD_BASE_LINE); - - if (it.hasNext()) { - baselineAct = it.next().toLowerCase(); - - if (BASELINE_ADD.equals(baselineAct) || BASELINE_REMOVE.equals(baselineAct) || - BASELINE_SET.equals(baselineAct) || BASELINE_SET_VERSION.equals(baselineAct)) - baselineArgs = nextArg(it, "Expected baseline arguments"); - else - throw new IllegalArgumentException("Unexpected argument for " + CMD_BASE_LINE + ": " - + baselineAct); - } - - } - } - - int sz = commands.size(); - - if (sz < 1) - throw new IllegalArgumentException("No action was specified"); - - if (sz > 1) - throw new IllegalArgumentException("Only one action can be specified, but found: " + sz); + Arguments args = parseAndValidate(rawArgs); GridClientConfiguration cfg = new GridClientConfiguration(); - cfg.setServers(Collections.singletonList(host + ":" + port)); + cfg.setServers(Collections.singletonList(args.host() + ":" + args.port())); - if (login != null) + if (!F.isEmpty(args.user())) cfg.setSecurityCredentialsProvider( - new SecurityCredentialsBasicProvider(new SecurityCredentials(login, pwd))); + new SecurityCredentialsBasicProvider(new SecurityCredentials(args.user(), args.password()))); try (GridClient client = GridClientFactory.start(cfg)) { - String cmd = commands.get(0); - switch (cmd) { + switch (args.command()) { case CMD_ACTIVATE: activate(client); break; @@ -647,7 +667,7 @@ public class CommandHandler { break; case CMD_BASE_LINE: - baseline(client, baselineAct, baselineArgs); + baseline(client, args.baselineAct(), args.baselineArgs()); break; } } @@ -664,7 +684,6 @@ public class CommandHandler { if (isConnectionError(e)) return error(EXIT_CODE_CONNECTION_FAILED, "Connection to cluster failed.", e); - return error(EXIT_CODE_UNEXPECTED_ERROR, "", e); } } @@ -677,4 +696,105 @@ public class CommandHandler { System.exit(hnd.execute(args)); } + +} + +/** + * Bean with all parsed and validated arguments + */ +class Arguments { + + /** Command. */ + private String cmd; + + /** Host. */ + private String host; + + /** Port. */ + private String port; + + /** User. */ + private String user; + + /** Password. */ + private String pwd; + + /** + * Action for baseline command + */ + private String baselineAct; + + /** + * Arguments for baseline command + */ + private String baselineArgs; + + /** + * @param cmd Command. + * @param host Host. + * @param port Port. + * @param user User. + * @param pwd Password. + * @param baselineAct Baseline action. + * @param baselineArgs Baseline args. + */ + public Arguments(String cmd, String host, String port, String user, String pwd, String baselineAct, + String baselineArgs) { + this.cmd = cmd; + this.host = host; + this.port = port; + this.user = user; + this.pwd = pwd; + this.baselineAct = baselineAct; + this.baselineArgs = baselineArgs; + } + + /** + * @return command + */ + public String command() { + return cmd; + } + + /** + * @return host name + */ + public String host() { + return host; + } + + /** + * @return port number + */ + public String port() { + return port; + } + + /** + * @return user name + */ + public String user() { + return user; + } + + /** + * @return password + */ + public String password() { + return pwd; + } + + /** + * @return baseline action + */ + public String baselineAct() { + return baselineAct; + } + + /** + * @return baseline arguments + */ + public String baselineArgs() { + return baselineArgs; + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/6d926a77/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java new file mode 100644 index 0000000..1de7b5a --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java @@ -0,0 +1,117 @@ +/* + * + * * 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. + * + */ + +package org.apache.ignite.internal.commandline; + +import junit.framework.TestCase; + +import static org.apache.ignite.internal.commandline.CommandHandler.CMD_ACTIVATE; +import static org.apache.ignite.internal.commandline.CommandHandler.CMD_BASE_LINE; +import static org.apache.ignite.internal.commandline.CommandHandler.CMD_DEACTIVATE; +import static org.apache.ignite.internal.commandline.CommandHandler.CMD_STATE; +import static org.apache.ignite.internal.commandline.CommandHandler.DFLT_HOST; +import static org.apache.ignite.internal.commandline.CommandHandler.DFLT_PORT; + +/** + * Tests Command Handler parsing arguments + */ +public class CommandHandlerParsingTest extends TestCase { + + /** Commands. */ + private String[] Commands = new String[] {CMD_STATE, CMD_ACTIVATE, CMD_DEACTIVATE, CMD_BASE_LINE}; + + /** + * test parsing and validation for user and password arguments + */ + public void testParseAndValidateUserAndPassword() { + + for (String cmd : Commands) { + try { + CommandHandler.parseAndValidate("--user"); + + fail("expected exception: Expected user name"); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + + try { + CommandHandler.parseAndValidate("--password"); + + fail("expected exception: Expected password"); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + + try { + CommandHandler.parseAndValidate("--user", "testUser", cmd); + + fail("expected exception: Both user and password should be specified"); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + + try { + CommandHandler.parseAndValidate("--password", "testPass", cmd); + + fail("expected exception: Both user and password should be specified"); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + + Arguments args = CommandHandler.parseAndValidate("--user", "testUser", "--password", "testPass", cmd); + + assertEquals("testUser", args.user()); + assertEquals("testPass", args.password()); + assertEquals(cmd, args.command()); + } + } + + /** + * tests host and port arguments + */ + public void testHostAndPort() { + + for (String cmd : Commands) { + Arguments args = CommandHandler.parseAndValidate(cmd); + + assertEquals(cmd, args.command()); + assertEquals(DFLT_HOST, args.host()); + assertEquals(DFLT_PORT, args.port()); + + args = CommandHandler.parseAndValidate("--port", "12345", "--host", "test-host", cmd); + + assertEquals(cmd, args.command()); + assertEquals("test-host", args.host()); + assertEquals("12345", args.port()); + + try { + CommandHandler.parseAndValidate("--port", "wrong-port", cmd); + + fail("expected exception: Invalid value for port:"); + } + catch (IllegalArgumentException e) { + e.printStackTrace(); + } + } + } +} http://git-wip-us.apache.org/repos/asf/ignite/blob/6d926a77/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java index e524d04..e3be1e3 100644 --- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java +++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteUtilSelfTestSuite.java @@ -19,6 +19,7 @@ package org.apache.ignite.testsuites; import java.util.Set; import junit.framework.TestSuite; +import org.apache.ignite.internal.commandline.CommandHandlerParsingTest; import org.apache.ignite.internal.pagemem.impl.PageIdUtilsSelfTest; import org.apache.ignite.internal.processors.cache.GridCacheUtilsSelfTest; import org.apache.ignite.internal.util.GridArraysSelfTest; @@ -113,6 +114,7 @@ public class IgniteUtilSelfTestSuite extends TestSuite { suite.addTestSuite(PageIdUtilsSelfTest.class); // control.sh + suite.addTestSuite(CommandHandlerParsingTest.class); suite.addTestSuite(GridCommandHandlerTest.class); return suite;
