package org.arquillian.cube.docker.graphene.location; import java.net.URL; import org.arquillian.cube.docker.drone.SeleniumContainers; import org.arquillian.cube.docker.impl.client.CubeDockerConfiguration; import org.arquillian.cube.docker.impl.client.config.DockerCompositions; import org.arquillian.cube.docker.impl.util.ConfigUtil; import org.arquillian.cube.spi.Cube; import org.arquillian.cube.spi.CubeRegistry; import org.arquillian.cube.spi.metadata.HasPortBindings; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.graphene.spi.configuration.GrapheneConfiguration; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class CubeDockerCustomizableURLResourceProviderTest { private static final String DOCKER_HOST = "192.168.99.100"; private static final String SIMPLE_SCENARIO = "helloworld:\n" + " image: dockercloud/hello-world\n" + " portBindings: [8080->80/tcp]"; private static final String MULTIPLE_PORT_BINDING_SCENARIO = "helloworld:\n" + " image: dockercloud/hello-world\n" + " portBindings: [8080->80/tcp, 8081->81/tcp]"; private static final String MULTIPLE_CONTAINER_SCENARIO = "helloworld:\n" + " image: dockercloud/hello-world\n" + " portBindings: [8080->80/tcp]\n" + "helloworld2:\n" + " image: dockercloud/hello-world"; @Mock private GrapheneConfiguration grapheneConfiguration; @Mock private CubeDockerConfiguration cubeDockerConfiguration; @Mock private SeleniumContainers seleniumContainers; @Mock private CubeRegistry cubeRegistry; @Mock private Cube cube; @Mock private HasPortBindings hasPortBindings; private DockerCubeCustomizableURLResourceProvider dockerCubeCustomizableURLResourceProvider; @Before public void prepareCubeDockerConfiguration() { when(cubeDockerConfiguration.getDockerServerIp()).thenReturn(DOCKER_HOST); when(seleniumContainers.getSeleniumContainerName()).thenReturn(SeleniumContainers.SELENIUM_CONTAINER_NAME); when(seleniumContainers.getVncContainerName()).thenReturn(SeleniumContainers.VNC_CONTAINER_NAME); when(hasPortBindings.getInternalIP()).thenReturn("192.168.99.100"); when(cube.hasMetadata(HasPortBindings.class)).thenReturn(true); when(cube.getMetadata(HasPortBindings.class)).thenReturn(hasPortBindings); when(cubeRegistry.getCube("helloworld")).thenReturn(cube); dockerCubeCustomizableURLResourceProvider = new DockerCubeCustomizableURLResourceProvider(); dockerCubeCustomizableURLResourceProvider.cubeDockerConfigurationInstance = new Instance<CubeDockerConfiguration>() { @Override public CubeDockerConfiguration get() { return cubeDockerConfiguration; } }; dockerCubeCustomizableURLResourceProvider.grapheneConfiguration = new Instance<GrapheneConfiguration>() { @Override public GrapheneConfiguration get() { return grapheneConfiguration; } }; dockerCubeCustomizableURLResourceProvider.seleniumContainersInstance = new Instance<SeleniumContainers>() { @Override public SeleniumContainers get() { return seleniumContainers; } }; dockerCubeCustomizableURLResourceProvider.cubeRegistryInstance = new Instance<CubeRegistry>() { @Override public CubeRegistry get() { return cubeRegistry; } }; } @Test public void should_resolve_to_docker_host_if_no_url_provided() { final DockerCompositions compositions = ConfigUtil.load(SIMPLE_SCENARIO); when(cubeDockerConfiguration.getDockerContainersContent()).thenReturn(compositions); when(grapheneConfiguration.getUrl()).thenReturn(null); assertThatThrownBy(() -> { dockerCubeCustomizableURLResourceProvider.lookup(null); }) .hasMessage("Arquillian Cube Graphene integration should provide a URL in Graphene extension configuration."); } @Test public void should_resolve_internal_ip_of_container() { final DockerCompositions compositions = ConfigUtil.load(SIMPLE_SCENARIO); when(cubeDockerConfiguration.getDockerContainersContent()).thenReturn(compositions); when(grapheneConfiguration.getUrl()).thenReturn("http://helloworld:80/context"); final URL url = (URL) dockerCubeCustomizableURLResourceProvider.lookup(null); assertThat(url) .hasProtocol("http") .hasHost("192.168.99.100") .hasPort(80) .hasPath("/context"); } @Test public void should_resolve_internal_ip_of_container_with_default_port() { final DockerCompositions compositions = ConfigUtil.load(SIMPLE_SCENARIO); when(cubeDockerConfiguration.getDockerContainersContent()).thenReturn(compositions); when(grapheneConfiguration.getUrl()).thenReturn("http://helloworld/context"); final URL url = (URL) dockerCubeCustomizableURLResourceProvider.lookup(null); assertThat(url) .hasProtocol("http") .hasHost("192.168.99.100") .hasPort(80) .hasPath("/context"); } @Test public void should_not_resolve_ip() { final DockerCompositions compositions = ConfigUtil.load(SIMPLE_SCENARIO); when(cubeDockerConfiguration.getDockerContainersContent()).thenReturn(compositions); when(grapheneConfiguration.getUrl()).thenReturn("http://192.168.99.101:80/context"); final URL url = (URL) dockerCubeCustomizableURLResourceProvider.lookup(null); assertThat(url) .hasProtocol("http") .hasHost("192.168.99.101") .hasPort(80) .hasPath("/context"); } @Test public void should_resolve_docker_host_in_relative_url() { final DockerCompositions compositions = ConfigUtil.load(SIMPLE_SCENARIO); when(cubeDockerConfiguration.getDockerContainersContent()).thenReturn(compositions); when(grapheneConfiguration.getUrl()).thenReturn("http://dockerHost:80/context"); final URL url = (URL) dockerCubeCustomizableURLResourceProvider.lookup(null); assertThat(url) .hasProtocol("http") .hasHost("192.168.99.100") .hasPort(80) .hasPath("/context"); } @Test public void should_resolve_docker_host_in_relative_url_with_default_port() { final DockerCompositions compositions = ConfigUtil.load(SIMPLE_SCENARIO); when(cubeDockerConfiguration.getDockerContainersContent()).thenReturn(compositions); when(grapheneConfiguration.getUrl()).thenReturn("http://dockerHost/context"); final URL url = (URL) dockerCubeCustomizableURLResourceProvider.lookup(null); assertThat(url) .hasProtocol("http") .hasHost("192.168.99.100") .hasPort(80) .hasPath("/context"); } }