/* * JBoss, Home of Professional Open Source * Copyright 2011 Red Hat Inc. and/or its affiliates and other contributors * as indicated by the @authors tag. All rights reserved. * 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.impl.client.container; import java.util.List; import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor; import org.jboss.arquillian.container.spi.ContainerRegistry; import org.jboss.arquillian.container.spi.client.container.DeployableContainer; import org.jboss.arquillian.container.test.AbstractContainerTestBase; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.annotation.ApplicationScoped; import org.jboss.arquillian.core.api.annotation.Inject; import org.jboss.arquillian.core.spi.ServiceLoader; import org.jboss.shrinkwrap.descriptor.api.Descriptors; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; /** * ContainerRegistryCreatorTestCase * * @author <a href="mailto:aslak@redhat.com">Aslak Knutsen</a> * @version $Revision: $ */ @RunWith(MockitoJUnitRunner.class) public class ContainerRegistryCreatorTestCase extends AbstractContainerTestBase { private static final String CONTAINER_1 = "container_1"; private static final String CONTAINER_2 = "container_2"; private static final String GROUP_1 = "group_1"; private static final String GROUP_2 = "group_2"; @Inject private Instance<ContainerRegistry> regInst; @Mock private ServiceLoader serviceLoader; @Mock private DeployableContainer<?> deployableContainer; @Before public void addServiceLoader() { Mockito.when(serviceLoader.onlyOne(DeployableContainer.class)).thenReturn(deployableContainer); bind(ApplicationScoped.class, ServiceLoader.class, serviceLoader); } @Override protected void addExtensions(List<Class<?>> extensions) { extensions.add(ContainerRegistryCreator.class); } @Test public void shouldRegisterDefaultContainer() { fire( Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_1)); // not set as default verifyRegistry("default"); } @Test public void shouldRegisterContainerMarkedDefault() { fire( Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_1) .setDefault()); verifyRegistry(CONTAINER_1); } @Test public void shouldRegisterContainerMarkedDefaultWhenMultipleDefined() { fire( Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_1) .setDefault() .container(CONTAINER_2)); verifyRegistry(CONTAINER_1); } @Test public void shouldRegisterGroupMarkedDefault() { fire( Descriptors.create(ArquillianDescriptor.class) .group(GROUP_1) .setGroupDefault() .container(CONTAINER_1)); verifyRegistry(CONTAINER_1); } @Test public void shouldRegisterContainerDefinedBySystemProperty() { System.setProperty(ContainerRegistryCreator.ARQUILLIAN_LAUNCH_PROPERTY, CONTAINER_1); try { fire( Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_1) .group(GROUP_1) .setGroupDefault() .container(CONTAINER_2)); verifyRegistry(CONTAINER_1); } finally { System.setProperty(ContainerRegistryCreator.ARQUILLIAN_LAUNCH_PROPERTY, ""); } } @Test public void shouldRegisterGroupDefinedBySystemProperty() { System.setProperty(ContainerRegistryCreator.ARQUILLIAN_LAUNCH_PROPERTY, GROUP_1); try { fire( Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_1) .setDefault() .group(GROUP_1) .container(CONTAINER_2)); verifyRegistry(CONTAINER_2); } finally { System.setProperty(ContainerRegistryCreator.ARQUILLIAN_LAUNCH_PROPERTY, ""); } } @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfMultipleContainersSetAsDefault() throws IllegalStateException { try { fire( Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_1) .setDefault() .container(CONTAINER_2) .setDefault()); } catch (IllegalStateException e) { Assert.assertTrue(e.getMessage().startsWith("Multiple Containers defined as default")); throw e; } } @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfMultipleGroupsSetAsDefault() throws IllegalStateException { try { fire( Descriptors.create(ArquillianDescriptor.class) .group(GROUP_1) .setGroupDefault() .group(GROUP_2) .setGroupDefault()); } catch (IllegalStateException e) { Assert.assertTrue(e.getMessage().startsWith("Multiple Groups defined as default")); throw e; } } @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfMultipleGroupsOrContainersSetAsDefault() throws IllegalStateException { try { fire( Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_1) .setDefault() .group(GROUP_1) .setGroupDefault()); } catch (IllegalStateException e) { Assert.assertTrue(e.getMessage().startsWith("Multiple Containers/Groups defined as default")); throw e; } } @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfMultipleContainersInGroupSetAsDefault() throws IllegalStateException { try { fire(Descriptors.create(ArquillianDescriptor.class) .group(GROUP_1) .container(CONTAINER_1) .setDefault() .container(CONTAINER_2) .setDefault()); } catch (IllegalStateException e) { Assert.assertTrue(e.getMessage().startsWith("Multiple Containers within Group defined as default")); throw e; } } @Test(expected = IllegalArgumentException.class) public void shouldThrowExceptionOnDefinedLaunchQualifierMissing() throws IllegalArgumentException { System.setProperty(ContainerRegistryCreator.ARQUILLIAN_LAUNCH_PROPERTY, CONTAINER_1); try { fire(Descriptors.create(ArquillianDescriptor.class) .container(CONTAINER_2)); } catch (IllegalArgumentException e) { Assert.assertTrue(e.getMessage().startsWith("No container or group found that match given qualifier")); throw e; } finally { System.setProperty(ContainerRegistryCreator.ARQUILLIAN_LAUNCH_PROPERTY, ""); } } /* * ARQ-619, multiple DeployableContainer on classpath is not currently allowed, but not reported. */ @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfMultipleDeployableContainersFoundOnClassapth() { Mockito.when(serviceLoader.onlyOne(DeployableContainer.class)) .thenThrow(new IllegalStateException("Multiple service implementations found for ...")); try { fire(Descriptors.create(ArquillianDescriptor.class)); } catch (IllegalStateException e) { Assert.assertTrue(e.getMessage().startsWith("Could not add a default container")); throw e; } } @Test(expected = IllegalStateException.class) public void shouldThrowExceptionIfFailedToCreateDefaultDeployableContainerInstance() { Mockito.when(serviceLoader.onlyOne(DeployableContainer.class)) .thenThrow(new RuntimeException("Class yatta yatta not found...")); try { fire(Descriptors.create(ArquillianDescriptor.class)); } catch (IllegalStateException e) { Assert.assertTrue(e.getMessage().startsWith("Could not create the default")); throw e; } } private void verifyRegistry(String... containerNames) { ContainerRegistry registry = regInst.get(); Assert.assertNotNull( "Verify Containers registered", registry.getContainers()); Assert.assertEquals( "Verify " + containerNames.length + " Container(s) registrered", containerNames.length, registry.getContainers().size()); for (int i = 0; i < containerNames.length; i++) { String containerName = containerNames[i]; Assert.assertEquals( "Verify correct Container registrered", containerName, registry.getContainers().get(i).getName()); } } }