/* * JBoss, Home of Professional Open Source. * Copyright 2016, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.test.integration.management.cli; import org.apache.commons.lang3.StringUtils; import org.jboss.as.cli.CommandContext; import org.jboss.as.cli.parsing.UnresolvedVariableException; import org.jboss.as.test.integration.management.util.CLITestUtil; import org.jboss.as.test.shared.TestSuiteEnvironment; import org.wildfly.core.testrunner.WildflyTestRunner; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.ByteArrayOutputStream; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; import static org.junit.Assert.assertNotNull; /** * Tests for 'set' and 'unset' commands * * @author Martin Schvarcbacher */ @RunWith(WildflyTestRunner.class) public class CliVariablesTestCase { private static final String JBOSS_CLI_RC_PROP = "jboss.cli.rc"; private static final String VAR_NAME_RC = "test_var_rc_name"; private static final String VAR_VALUE_RC = "test_var_rc_value"; private static final String VAR_NAME_SCRIPT = "test_var_script_name"; private static final String VAR_VALUE_SCRIPT = "test_var_script_value"; private static final File TMP_JBOSS_CLI_RC; private static final File TMP_JBOSS_CLI_SCRIPTSET_ONLY; private static final File TMP_JBOSS_CLI_SCRIPTSET_UNSET; static { TMP_JBOSS_CLI_RC = new File(new File(TestSuiteEnvironment.getTmpDir()), ".tmp-jbossclirc"); TMP_JBOSS_CLI_SCRIPTSET_ONLY = new File(new File(TestSuiteEnvironment.getTmpDir()), ".tmp-jbosscli-setonly"); TMP_JBOSS_CLI_SCRIPTSET_UNSET = new File(new File(TestSuiteEnvironment.getTmpDir()), ".tmp-jbosscli-setunset"); } @BeforeClass public static void setup() { ensureRemoved(TMP_JBOSS_CLI_RC); ensureRemoved(TMP_JBOSS_CLI_SCRIPTSET_ONLY); ensureRemoved(TMP_JBOSS_CLI_RC); try (BufferedWriter writer = new BufferedWriter(new FileWriter(TMP_JBOSS_CLI_RC))) { writer.write("set " + VAR_NAME_RC + "=" + VAR_VALUE_RC); writer.newLine(); } catch (IOException e) { fail(e.getLocalizedMessage()); } try (BufferedWriter writer = new BufferedWriter(new FileWriter(TMP_JBOSS_CLI_SCRIPTSET_ONLY))) { writer.write("set " + VAR_NAME_SCRIPT + "=" + VAR_VALUE_SCRIPT); writer.newLine(); writer.write("set"); writer.newLine(); } catch (IOException e) { fail(e.getLocalizedMessage()); } try (BufferedWriter writer = new BufferedWriter(new FileWriter(TMP_JBOSS_CLI_SCRIPTSET_UNSET))) { writer.write("set " + VAR_NAME_SCRIPT + "=" + VAR_VALUE_SCRIPT); writer.newLine(); writer.write("unset " + VAR_NAME_SCRIPT); writer.newLine(); writer.write("$" + VAR_NAME_SCRIPT); writer.newLine(); writer.write("set"); writer.newLine(); } catch (IOException e) { fail(e.getLocalizedMessage()); } } @AfterClass public static void cleanUp() { ensureRemoved(TMP_JBOSS_CLI_RC); ensureRemoved(TMP_JBOSS_CLI_SCRIPTSET_ONLY); ensureRemoved(TMP_JBOSS_CLI_SCRIPTSET_UNSET); } /** * Tests setting variables from --file and RC simultaneously * @throws Exception */ @Test public void testPropertiesDifferentSources() throws Exception { CliProcessWrapper cli = new CliProcessWrapper() .addCliArgument("--file=" + TMP_JBOSS_CLI_SCRIPTSET_ONLY.getAbsolutePath()) .addJavaOption("-D" + JBOSS_CLI_RC_PROP + "=" + TMP_JBOSS_CLI_RC.getAbsolutePath()); final String result = cli.executeNonInteractive(); assertTrue(cli.getProcessExitValue() == 0); assertNotNull(result); assertTrue(result.contains(VAR_NAME_SCRIPT + "=" + VAR_VALUE_SCRIPT)); assertTrue(result.contains(VAR_NAME_RC + "=" + VAR_VALUE_RC)); } /** * Tests set and unset when ran from --file * @throws Exception */ @Test public void testSetUnsetVariableInFile() throws Exception { CliProcessWrapper cli = new CliProcessWrapper() .addCliArgument("--file=" + TMP_JBOSS_CLI_SCRIPTSET_UNSET.getAbsolutePath()); final String result = cli.executeNonInteractive(); assertTrue(cli.getProcessExitValue() != 0); //fails on non-existing variable assertNotNull(result); assertTrue(result.contains("Unrecognized variable " + VAR_NAME_SCRIPT)); } /** * Tests if 'set' with no parameters prints all currently set variables * @throws Exception */ @Test public void testSetPrintsAllVariables() throws Exception { final String VAR1_NAME = "variable_1"; final String VAR2_NAME = "variable_2"; final String VAR1_VALUE = "value_1"; final String VAR2_VALUE = "value_2"; final ByteArrayOutputStream cliOut = new ByteArrayOutputStream(); final CommandContext ctx = CLITestUtil.getCommandContext(cliOut); ctx.handle("set " + VAR1_NAME + "=" + VAR1_VALUE); ctx.handle("set " + VAR2_NAME + "=" + VAR2_VALUE); cliOut.reset(); ctx.handle("echo $" + VAR1_NAME); ctx.handle("echo $" + VAR2_NAME); String echoResult = cliOut.toString(); assertTrue(echoResult.contains(VAR1_VALUE)); assertTrue(echoResult.contains(VAR2_VALUE)); cliOut.reset(); ctx.handle("set"); //print all variables String setResult = cliOut.toString(); assertTrue(setResult.contains(VAR1_NAME + "=" + VAR1_VALUE)); assertTrue(setResult.contains(VAR2_NAME + "=" + VAR2_VALUE)); assertTrue(ctx.getExitCode() == 0); } /** * Tests variable chaining: set var2=$var1 * @throws Exception */ @Test public void testVariableChaining() throws Exception { final String VAR1_NAME = "variable_1"; final String VAR2_NAME = "variable_2"; final String VAR1_VALUE = "value_1"; final String VAR2_VALUE = "$" + VAR1_NAME; final ByteArrayOutputStream cliOut = new ByteArrayOutputStream(); final CommandContext ctx = CLITestUtil.getCommandContext(cliOut); ctx.handle("set " + VAR1_NAME + "=" + VAR1_VALUE); ctx.handle("set " + VAR2_NAME + "=" + VAR2_VALUE); cliOut.reset(); ctx.handle("echo $" + VAR1_NAME); ctx.handle("echo $" + VAR2_NAME); String echoResult = cliOut.toString(); assertTrue(echoResult.contains(VAR1_VALUE)); assertFalse(echoResult.contains(VAR2_VALUE)); assertTrue(StringUtils.countMatches(echoResult, VAR1_VALUE) == 2); cliOut.reset(); ctx.handle("set"); //print all variables String setResult = cliOut.toString(); assertTrue(setResult.contains(VAR1_NAME + "=" + VAR1_VALUE)); assertTrue(setResult.contains(VAR2_NAME + "=" + VAR1_VALUE)); assertTrue(ctx.getExitCode() == 0); } /** * Tests the 'unset' command * @throws Exception */ @Test public void testSetAndUnsetVariables() throws Exception { final String VAR1_NAME = "variable_1"; final String VAR1_VALUE = "value_1"; final ByteArrayOutputStream cliOut = new ByteArrayOutputStream(); final CommandContext ctx = CLITestUtil.getCommandContext(cliOut); ctx.handle("set " + VAR1_NAME + "=" + VAR1_VALUE); cliOut.reset(); ctx.handle("echo $" + VAR1_NAME); assertTrue(cliOut.toString().contains(VAR1_VALUE)); ctx.handle("unset " + VAR1_NAME); try { ctx.handle("$" + VAR1_NAME); fail(VAR1_NAME + " should be unset"); } catch (UnresolvedVariableException ex) { //expected } cliOut.reset(); ctx.handle("set"); assertFalse(cliOut.toString().contains(VAR1_NAME)); assertTrue(ctx.getExitCode() == 0); } private static void ensureRemoved(File f) { if (f.exists()) { if (!f.delete()) { fail("Failed to delete " + f.getAbsolutePath()); } } } }