/**
* Copyright 2015-2016 Red Hat, Inc, and individual contributors.
*
* Licensed 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.wildfly.swarm.swarmtool;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.URISyntaxException;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Properties;
import java.util.jar.Manifest;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Ignore;
import org.junit.Test;
import org.wildfly.swarm.bootstrap.env.WildFlySwarmManifest;
import static org.fest.assertions.Assertions.assertThat;
public class MainTest {
static Result runTool(String... args) throws Exception {
final OutputStream err = new ByteArrayOutputStream();
final OutputStream out = new ByteArrayOutputStream();
final PrintStream origErr = System.err;
final PrintStream origOut = System.out;
final Result result = new Result();
try {
System.setErr(new PrintStream(err));
System.setOut(new PrintStream(out));
final String[] fullArgs = Arrays.copyOf(args, args.length + 1);
fullArgs[fullArgs.length - 1] = "--output-dir=target/test-output";
final long t = System.currentTimeMillis();
result.jarFile(Main.generateSwarmJar(fullArgs));
//origErr.println("generateSwarmJar took " + (System.currentTimeMillis() - t) + "ms");
} catch (Main.ExitException e) {
result.exitStatus = e.status;
result.exitMessage = e.getMessage();
} finally {
System.setErr(origErr);
System.setOut(origOut);
}
result.err = err.toString();
result.out = out.toString();
//System.err.println(result.err);
//System.out.println(result.err);
return result;
}
static String getResourcePath(String name) throws URISyntaxException {
return Paths.get(MainTest.class.getClassLoader()
.getResource(name)
.toURI())
.toString();
}
Properties swarmProperties(Result result) throws IOException {
try (InputStream in = result.archive
.get(WildFlySwarmManifest.CLASSPATH_LOCATION)
.getAsset()
.openStream()) {
WildFlySwarmManifest manifest = new WildFlySwarmManifest(in);
return manifest.getProperties();
}
}
static synchronized Result getBigJar() throws Exception {
if (bigJar == null) {
bigJar = runTool(getResourcePath("simple-servlet.war"),
"--name=big",
"-Dfoo=bar",
"-Dham=biscuit",
"--property-file=" + getResourcePath("test.properties"),
"--fractions=blarg,a:b:c:d",
"--repos=https://repository-projectodd.forge.cloudbees.com/snapshot");
assertThat(bigJar.exitStatus).isEqualTo(0);
}
return bigJar;
}
static synchronized Result getLittleJar() throws Exception {
if (littleJar == null) {
littleJar = runTool(getResourcePath("simple-servlet.war"),
"--name=little",
"--no-bundle-deps",
"--main=org.foo.bar.Main",
"--modules", getResourcePath("modules"),
"--repos=https://repository-projectodd.forge.cloudbees.com/snapshot");
assertThat(littleJar.exitStatus).isEqualTo(0);
}
return littleJar;
}
@Test
public void properties() throws Exception {
final Properties big = swarmProperties(getBigJar());
assertThat(big.get("cheese")).isEqualTo("biscuit");
assertThat(big.get("foo")).isEqualTo("bar");
// -D overrides properties file
assertThat(big.get("ham")).isEqualTo("biscuit");
final Properties little = swarmProperties(getLittleJar());
assertThat(little.get("cheese")).isNull();
assertThat(little.get("foo")).isNull();
assertThat(little.get("ham")).isNull();
}
@Test
public void dependencies() throws Exception {
assertThat(getBigJar().archive.contains("/m2repo")).isTrue();
assertThat(getLittleJar().archive.contains("/m2repo")).isFalse();
}
@Test
public void addingModules() throws Exception {
assertThat(getLittleJar().archive.contains("/modules/sun/jdk/main/module.xml")).isTrue();
assertThat(getBigJar().archive.contains("/modules/sun/jdk/main/module.xml")).isFalse();
}
@Test
public void invalidFractions() throws Exception {
final Result result = getBigJar();
assertThat(result.err).contains("Invalid fraction specifier: a:b:c:d");
assertThat(result.err).contains("Unknown fraction: blarg");
}
static class Result {
public int exitStatus = 0;
public String exitMessage = null;
public File jarFile = null;
public WebArchive archive = null;
public String err = null;
public String out = null;
public void jarFile(File f) {
this.jarFile = f;
this.archive = ShrinkWrap.createFromZipFile(WebArchive.class, f);
}
}
static Result bigJar = null;
static Result littleJar = null;
}