/*
* 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 java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import org.jboss.as.cli.CommandContext;
import org.jboss.as.cli.Util;
import org.jboss.as.test.integration.management.util.CLIWrapper;
import org.jboss.as.test.shared.TestSuiteEnvironment;
import org.junit.After;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.wildfly.core.testrunner.WildflyTestRunner;
/**
*
* @author jdenise@redhat.com
*/
@RunWith(WildflyTestRunner.class)
public class ExplodedDeploymentTestCase {
@Rule
public final TemporaryFolder temporaryUserHome = new TemporaryFolder();
private File index;
private CLIWrapper cli;
@Before
public void before() throws Exception {
System.setProperty("user.home", temporaryUserHome.getRoot().getAbsolutePath());
index = temporaryUserHome.newFile();
Files.write(index.toPath(), "<html></html>".getBytes(StandardCharsets.UTF_8));
cli = new CLIWrapper(true, null, System.in);
}
@After
public void after() throws Exception {
cli.close();
}
@Test
public void testAttachment() throws Exception {
String deploymentUnit = "/deployment=test" + System.currentTimeMillis() + "-content.war";
// Add the deployment
cli.sendLine(deploymentUnit + ":add(content=[{empty=true}])");
assertTrue(cli.readOutput().contains("success"));
try {
File css = new File(TestSuiteEnvironment.getTmpDir(), "index.css");
css.createNewFile();
Files.write(css.toPath(), "p { text-align: center; }".getBytes());
File js = new File(TestSuiteEnvironment.getTmpDir(), "index.js");
js.createNewFile();
Files.write(js.toPath(), "".getBytes());
cli.sendLine(deploymentUnit + ":add-content(content=["
+ "{input-stream-index=" + escapePath("~" + File.separator + index.getName()) + ", target-path=index.xhtml}"
+ "{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=css/theme.css}"
+ "{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=code/js/script.js}"
+ "]");
cli.sendLine(deploymentUnit + ":browse-content(path=./)");
assertTrue(cli.readOutput().contains("index.xhtml"));
assertTrue(cli.readOutput().contains("css/theme.css"));
assertTrue(cli.readOutput().contains("code/js/script.js"));
// Batch
cli.sendLine("batch");
cli.sendLine(deploymentUnit + ":add-content(content=["
+ "{input-stream-index=" + escapePath(index.getAbsolutePath()) + ", target-path=batch/index.xhtml}"
+ "{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=batch/css/theme.css}"
+ "{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=batch/code/js/script.js}"
+ "]");
cli.sendLine(deploymentUnit + ":add-content(content=["
+ "{input-stream-index=" + escapePath(index.getAbsolutePath()) + ", target-path=batch2/index.xhtml}"
+ "{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=batch2/css/theme.css}"
+ "{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=batch2/code/js/script.js}"
+ "]");
cli.sendLine("run-batch");
assertTrue(cli.readOutput().contains("success"));
cli.sendLine(deploymentUnit + ":browse-content(path=./)");
assertTrue(cli.readOutput().contains("batch/index.xhtml"));
assertTrue(cli.readOutput().contains("batch/css/theme.css"));
assertTrue(cli.readOutput().contains("batch/code/js/script.js"));
assertTrue(cli.readOutput().contains("batch2/index.xhtml"));
assertTrue(cli.readOutput().contains("batch2/css/theme.css"));
assertTrue(cli.readOutput().contains("batch2/code/js/script.js"));
// if
cli.sendLine("if (outcome == success) of " + deploymentUnit + ":read-attribute(name=name)");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(index.getAbsolutePath()) + ", target-path=if/index.xhtml}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=if/css/theme.css}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=if/code/js/script.js}]");
cli.sendLine("else");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(index.getAbsolutePath()) + ", target-path=else/index.xhtml}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=else/css/theme.css}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=else/code/js/script.js}]");
cli.sendLine("end-if");
//try
cli.sendLine("try");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(index.getAbsolutePath()) + ", target-path=try/index.xhtml}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=try/css/theme.css}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=try/code/js/script.js}]");
// Then fail...
cli.sendLine(deploymentUnit + ":read-attribute(name=toto)");
cli.sendLine("catch");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(index.getAbsolutePath()) + ", target-path=catch/index.xhtml}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=catch/css/theme.css}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=catch/code/js/script.js}]");
cli.sendLine("finally");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(index.getAbsolutePath()) + ", target-path=finally/index.xhtml}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(css.getAbsolutePath()) + ", target-path=finally/css/theme.css}]");
cli.sendLine(deploymentUnit + ":add-content(content=[{input-stream-index=" + escapePath(js.getAbsolutePath()) + ", target-path=finally/code/js/script.js}]");
cli.sendLine("end-try");
// completion
testCompletion(deploymentUnit + ":add-content(content=[{target-path=");
testCompletion(deploymentUnit + ":add-content(content=[{target-path=toto},{target-path=");
testCompletion(deploymentUnit + ":browse-content(path=");
{
String cmd = deploymentUnit + ":remove-content(paths=";
List<String> candidates = new ArrayList<>();
cli.getCommandContext().getDefaultCommandCompleter().complete(cli.getCommandContext(), cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("["));
assertTrue(candidates.toString(), candidates.size() == 1);
}
{
String cmd = deploymentUnit + ":browse-content(path=/";
List<String> candidates = new ArrayList<>();
cli.getCommandContext().getDefaultCommandCompleter().complete(cli.getCommandContext(), cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.isEmpty());
}
testCompletion(deploymentUnit + ":remove-content(paths=[");
} finally {
cli.sendLine(deploymentUnit + ":remove");
}
}
private void testCompletion(String radical) {
CommandContext ctx = cli.getCommandContext();
{
String cmd = radical;
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("index.xhtml"));
assertTrue(candidates.toString(), candidates.contains("css/"));
assertTrue(candidates.toString(), candidates.contains("code/"));
assertTrue(candidates.toString(), candidates.contains("batch/"));
assertTrue(candidates.toString(), candidates.contains("batch2/"));
assertTrue(candidates.toString(), candidates.contains("if/"));
assertTrue(candidates.toString(), candidates.contains("try/"));
assertTrue(candidates.toString(), candidates.contains("catch/"));
assertTrue(candidates.toString(), candidates.contains("finally/"));
}
{
String cmd = radical + ".";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("./"));
}
{
String cmd = radical + "batch";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("batch/"));
assertTrue(candidates.toString(), candidates.contains("batch2/"));
}
{
String cmd = radical + "batch/";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("index.xhtml"));
assertTrue(candidates.toString(), candidates.contains("css/"));
assertTrue(candidates.toString(), candidates.contains("code/"));
}
{
String cmd = radical + "if";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("if/"));
}
{
String cmd = radical + "if/";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("index.xhtml"));
assertTrue(candidates.toString(), candidates.contains("css/"));
assertTrue(candidates.toString(), candidates.contains("code/"));
}
{
String cmd = radical + "try/";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("index.xhtml"));
assertTrue(candidates.toString(), candidates.contains("css/"));
assertTrue(candidates.toString(), candidates.contains("code/"));
}
{
String cmd = radical + "catch/";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("index.xhtml"));
assertTrue(candidates.toString(), candidates.contains("css/"));
assertTrue(candidates.toString(), candidates.contains("code/"));
}
{
String cmd = radical + "finally/";
List<String> candidates = new ArrayList<>();
ctx.getDefaultCommandCompleter().complete(ctx, cmd,
cmd.length(), candidates);
assertTrue(candidates.toString(), candidates.contains("index.xhtml"));
assertTrue(candidates.toString(), candidates.contains("css/"));
assertTrue(candidates.toString(), candidates.contains("code/"));
}
}
@Test
public void testReadResource() throws Exception {
String deploymentUnit = "/deployment=test" + System.currentTimeMillis()
+ "-read-content.war";
try {
// Add the deployment
cli.sendLine(deploymentUnit + ":add(content=[{empty=true}])");
assertTrue(cli.readOutput().contains("success"));
String content = "<html><body> Test for Read-Content </html>";
File index = new File(TestSuiteEnvironment.getTmpDir(), "index.xhtml");
index.createNewFile();
Files.write(index.toPath(), content.getBytes());
cli.sendLine(deploymentUnit + ":add-content(content=["
+ "{input-stream-index=" + escapePath(index.getAbsolutePath())
+ ", target-path=index.xhtml}"
+ "]");
cli.sendLine("attachment display --operation=" + deploymentUnit
+ ":read-content(path=index.xhtml)");
String output = cli.readOutput();
assertTrue(output, output.contains(content));
} finally {
cli.sendLine(deploymentUnit + ":remove");
}
}
private String escapePath(String filePath) {
if (Util.isWindows()) {
StringBuilder builder = new StringBuilder();
for (char c : filePath.toCharArray()) {
if (c == '\\') {
builder.append('\\');
}
builder.append(c);
}
return builder.toString();
} else {
return filePath;
}
}
}