/*
* JBoss, Home of Professional Open Source
* Copyright 2010 Red Hat Inc. and/or its affiliates and other contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of 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.jboss.arquillian.container.test.impl.client.deployment;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.logging.Handler;
import java.util.logging.Logger;
import java.util.logging.StreamHandler;
import org.jboss.arquillian.container.spi.client.deployment.DeploymentDescription;
import org.jboss.arquillian.container.spi.client.deployment.TargetDescription;
import org.jboss.arquillian.container.spi.client.deployment.Validate;
import org.jboss.arquillian.container.spi.client.protocol.ProtocolDescription;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.OverProtocol;
import org.jboss.arquillian.container.test.api.ShouldThrowException;
import org.jboss.arquillian.container.test.api.TargetsContainer;
import org.jboss.arquillian.test.spi.TestClass;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* AnnotationDeploymentScenarioGeneratorTestCase
*
* @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a>
* @version $Revision: $
*/
public class AnnotationDeploymentScenarioGeneratorTestCase {
private final static String expectedLogPartForArchiveWithUnexpectedFileExtension = "unexpected file extension";
private static Logger log = Logger.getLogger(AnnotationDeploymentScenarioGenerator.class.getName());
private static OutputStream logCapturingStream;
private static StreamHandler customLogHandler;
@Before
public void attachLogCapturer() {
logCapturingStream = new ByteArrayOutputStream();
Handler[] handlers = log.getParent().getHandlers();
customLogHandler = new StreamHandler(logCapturingStream, handlers[0].getFormatter());
log.addHandler(customLogHandler);
}
@After
public void detachLagCapturer() {
log.removeHandler(customLogHandler);
customLogHandler = null;
try {
logCapturingStream.close();
} catch (IOException e) {
throw new IllegalStateException("Potential memory leak as log capturing stream could not be closed");
}
logCapturingStream = null;
}
public String getTestCapturedLog() throws IOException {
customLogHandler.flush();
return logCapturingStream.toString();
}
@Test
public void shouldHandleMultipleDeploymentsAllDefault() throws Exception {
List<DeploymentDescription> scenario = generate(MultiDeploymentsDefault.class);
Assert.assertNotNull(scenario);
Assert.assertEquals(
"Verify all deployments were found",
2, scenario.size());
for (DeploymentDescription deployment : scenario) {
Assert.assertEquals(
"Verify deployment has default target",
TargetDescription.DEFAULT,
deployment.getTarget());
Assert.assertEquals(
"Verify deployment has default protocol",
ProtocolDescription.DEFAULT,
deployment.getProtocol());
Assert.assertEquals(-1, deployment.getOrder());
Assert.assertEquals(true, deployment.managed());
Assert.assertTrue(Validate.isArchiveOfType(JavaArchive.class, deployment.getArchive()));
}
}
@Test
public void shouldHandleMultipleDeploymentsAllSet() throws Exception {
List<DeploymentDescription> scenario = generate(MultiDeploymentsSet.class);
Assert.assertNotNull(scenario);
Assert.assertEquals(
"Verify all deployments were found",
2, scenario.size());
for (DeploymentDescription deploymentDesc : scenario) {
if (deploymentDesc.getOrder() == 1) {
Assert.assertEquals(
"Verify deployment has specified target",
new TargetDescription("target-first"),
deploymentDesc.getTarget());
Assert.assertEquals(
"Verify deployment has specified protocol",
new ProtocolDescription("protocol-first"),
deploymentDesc.getProtocol());
Assert.assertEquals(1, deploymentDesc.getOrder());
Assert.assertEquals(false, deploymentDesc.managed());
Assert.assertEquals(false, deploymentDesc.testable());
Assert.assertTrue(Validate.isArchiveOfType(JavaArchive.class, deploymentDesc.getArchive()));
Assert.assertNull(deploymentDesc.getExpectedException());
} else {
Assert.assertEquals(
"Verify deployment has specified target",
new TargetDescription("target-second"),
deploymentDesc.getTarget());
Assert.assertEquals(
"Verify deployment has specified protocol",
new ProtocolDescription("protocol-second"),
deploymentDesc.getProtocol());
Assert.assertEquals(2, deploymentDesc.getOrder());
Assert.assertEquals(false, deploymentDesc.managed());
Assert.assertEquals(true, deploymentDesc.testable());
Assert.assertTrue(Validate.isArchiveOfType(JavaArchive.class, deploymentDesc.getArchive()));
Assert.assertNull(deploymentDesc.getExpectedException());
}
}
}
@Test
public void shouldSortDeploymentsByOrder() throws Exception {
List<DeploymentDescription> scenario = generate(MultiDeploymentsInReverseOrder.class);
Assert.assertNotNull(scenario);
Assert.assertEquals(
"Verify all deployments were found",
3, scenario.size());
Assert.assertTrue(
"Deployments are not sorted by order",
scenario.get(0).getOrder() < scenario.get(1).getOrder()
);
Assert.assertTrue(
"Deployments are not sorted by order",
scenario.get(1).getOrder() < scenario.get(2).getOrder()
);
}
@Test
public void shouldReadExpectedAndOverrideDeployment() {
List<DeploymentDescription> scenario = generate(ExpectedDeploymentExceptionSet.class);
Assert.assertNotNull(scenario);
Assert.assertEquals(
"Verify all deployments were found",
1, scenario.size());
DeploymentDescription deploymentOne = scenario.get(0);
Assert.assertEquals(false, deploymentOne.testable());
Assert.assertTrue(Validate.isArchiveOfType(JavaArchive.class, deploymentOne.getArchive()));
Assert.assertEquals(Exception.class, deploymentOne.getExpectedException());
}
@Test
public void shouldAllowNoDeploymentPresent() throws Exception {
List<DeploymentDescription> descriptors = generate(DeploymentNotPresent.class);
Assert.assertNotNull(descriptors);
Assert.assertEquals(0, descriptors.size());
}
@Test
public void shouldAllowNonPublicDeploymentMethods() throws Exception {
List<DeploymentDescription> descriptors = generate(DeploymentProtectedMethods.class);
Assert.assertNotNull(descriptors);
Assert.assertEquals(3, descriptors.size());
}
@Test
public void shouldAllowNonPublicDeploymentMethodsFromSuperClass() throws Exception {
List<DeploymentDescription> descriptors = generate(DeploymentProtectedMethodsInherited.class);
Assert.assertNotNull(descriptors);
Assert.assertEquals(3, descriptors.size());
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowExceptionOnDeploymentNotStatic() throws Exception {
new AnnotationDeploymentScenarioGenerator().generate(
new TestClass(DeploymentNotStatic.class));
}
@Test(expected = IllegalArgumentException.class)
public void shouldThrowExceptionOnDeploymentWrongReturnType() throws Exception {
new AnnotationDeploymentScenarioGenerator().generate(
new TestClass(DeploymentWrongReturnType.class));
}
@Test
public void shouldLogWarningForMismatchingArchiveTypeAndFileExtension() throws Exception {
new AnnotationDeploymentScenarioGenerator().generate(
new TestClass(DeploymentWithMismatchingTypeAndFileExtension.class));
String capturedLog = getTestCapturedLog();
Assert.assertTrue(capturedLog.contains(expectedLogPartForArchiveWithUnexpectedFileExtension));
}
@Test
public void shouldNotLogWarningForMatchingArchiveTypeAndFileExtension() throws Exception {
new AnnotationDeploymentScenarioGenerator().generate(
new TestClass(DeploymentWithSpecifiedFileExtension.class));
String capturedLog = getTestCapturedLog();
Assert.assertFalse(capturedLog.contains(expectedLogPartForArchiveWithUnexpectedFileExtension));
}
@Test
public void shouldLogWarningForDeploymentWithMissingFileExtension() throws Exception {
new AnnotationDeploymentScenarioGenerator().generate(
new TestClass(DeploymentWithMissingFileExtension.class));
String capturedLog = getTestCapturedLog();
Assert.assertTrue(capturedLog.contains(expectedLogPartForArchiveWithUnexpectedFileExtension));
}
@Test // should not log warning when using the default archive name
public void shouldNotLogWarningForDeploymentWithoutSpecifiedName() throws Exception {
new AnnotationDeploymentScenarioGenerator().generate(
new TestClass(DeploymentWithoutSpecifiedName.class));
String capturedLog = getTestCapturedLog();
Assert.assertFalse(capturedLog.contains(expectedLogPartForArchiveWithUnexpectedFileExtension));
}
private List<DeploymentDescription> generate(Class<?> testClass) {
return new AnnotationDeploymentScenarioGenerator().generate(new TestClass(testClass));
}
@SuppressWarnings("unused")
private static class MultiDeploymentsDefault {
@Deployment
public static Archive<?> deploymentOne() {
return ShrinkWrap.create(JavaArchive.class);
}
@Deployment
public static Archive<?> deploymentTwo() {
return ShrinkWrap.create(JavaArchive.class);
}
}
@SuppressWarnings("unused")
private static class MultiDeploymentsSet {
@OverProtocol("protocol-first")
@TargetsContainer("target-first")
@Deployment(name = "first", order = 1, managed = false, testable = false)
public static Archive<?> deploymentOne() {
return ShrinkWrap.create(JavaArchive.class);
}
@OverProtocol("protocol-second")
@TargetsContainer("target-second")
@Deployment(name = "second", order = 2, managed = false)
public static Archive<?> deploymentTwo() {
return ShrinkWrap.create(JavaArchive.class);
}
}
@SuppressWarnings("unused")
private static class MultiDeploymentsInReverseOrder {
@Deployment(name = "second", order = 2)
public static Archive<?> deploymentOne() {
return ShrinkWrap.create(JavaArchive.class);
}
@Deployment(name = "third", order = 3)
public static Archive<?> deploymentThree() {
return ShrinkWrap.create(JavaArchive.class);
}
@Deployment(name = "first", order = 1)
public static Archive<?> deploymentTwo() {
return ShrinkWrap.create(JavaArchive.class);
}
}
@SuppressWarnings("unused")
private static class ExpectedDeploymentExceptionSet {
@Deployment(name = "second", testable = true) // testable should be overwritten by @Expected
@ShouldThrowException
public static Archive<?> deploymentOne() {
return ShrinkWrap.create(JavaArchive.class);
}
}
@SuppressWarnings("unused")
private static class DeploymentProtectedMethods {
@Deployment
static JavaArchive one() {
return ShrinkWrap.create(JavaArchive.class);
}
@Deployment
private static JavaArchive two() {
return ShrinkWrap.create(JavaArchive.class);
}
@Deployment
protected static JavaArchive tree() {
return ShrinkWrap.create(JavaArchive.class);
}
}
private static class DeploymentProtectedMethodsInherited extends DeploymentProtectedMethods {
}
private static class DeploymentNotPresent {
}
@SuppressWarnings("unused")
private static class DeploymentNotStatic {
@Deployment
public Archive<?> test() {
return ShrinkWrap.create(JavaArchive.class);
}
}
@SuppressWarnings("unused")
private static class DeploymentWrongReturnType {
@Deployment
public Object test() {
return ShrinkWrap.create(JavaArchive.class);
}
}
@SuppressWarnings("unused")
private static class DeploymentWithMismatchingTypeAndFileExtension {
@Deployment
public static WebArchive test() {
return ShrinkWrap.create(WebArchive.class, "test.jar");
}
}
@SuppressWarnings("unused")
private static class DeploymentWithSpecifiedFileExtension {
@Deployment
public static WebArchive test() {
return ShrinkWrap.create(WebArchive.class, "test.war");
}
}
@SuppressWarnings("unused")
private static class DeploymentWithMissingFileExtension {
@Deployment
public static WebArchive test() {
return ShrinkWrap.create(WebArchive.class, "test");
}
}
@SuppressWarnings("unused")
private static class DeploymentWithoutSpecifiedName {
@Deployment
public static WebArchive test() {
return ShrinkWrap.create(WebArchive.class);
}
}
}