package org.arquillian.cube.docker.impl.client.container;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.arquillian.cube.docker.impl.client.CubeDockerConfiguration;
import org.arquillian.cube.docker.impl.util.OperatingSystemFamily;
import org.arquillian.cube.impl.model.LocalCubeRegistry;
import org.arquillian.cube.spi.Binding;
import org.arquillian.cube.spi.Cube;
import org.arquillian.cube.spi.CubeRegistry;
import org.arquillian.cube.spi.metadata.HasPortBindings;
import org.jboss.arquillian.config.descriptor.api.ContainerDef;
import org.jboss.arquillian.container.spi.Container;
import org.jboss.arquillian.container.spi.ContainerRegistry;
import org.jboss.arquillian.container.spi.client.container.DeployableContainer;
import org.jboss.arquillian.container.spi.event.container.BeforeSetup;
import org.jboss.arquillian.core.api.annotation.ApplicationScoped;
import org.jboss.arquillian.core.test.AbstractManagerTestBase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.yaml.snakeyaml.Yaml;
@RunWith(MockitoJUnitRunner.class)
public class DockerServerIPConfiguratorTest extends AbstractManagerTestBase {
public static final String CUBE_ID = "test";
private static final String CONTENT = "" + "image: tutum/tomcat:7.0\n" + "exposedPorts: [8089/tcp]\n"
+ "portBindings: [8090->8089/tcp]";
@Mock
private Cube cube;
@Mock
private Container container;
@SuppressWarnings("rawtypes")
@Mock
private DeployableContainer deployableContainer;
@Mock
private ContainerRegistry containerRegistry;
@Mock
private ContainerDef containerDef;
@Mock
private HasPortBindings hasPortBindings;
private CubeRegistry registry;
@Override
protected void addExtensions(List<Class<?>> extensions) {
extensions.add(DockerServerIPConfigurator.class);
super.addExtensions(extensions);
}
public static class ContainerConfiguration {
private int port = 8089;
private String myHost = "localhost";
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String getMyHost() {
return myHost;
}
public void setMyHost(String myHost) {
this.myHost = myHost;
}
}
@Before
public void setup() {
Yaml yaml = new Yaml();
@SuppressWarnings("unchecked")
Map<String, Object> content = (Map<String, Object>) yaml.load(CONTENT);
when(cube.getId()).thenReturn(CUBE_ID);
when(cube.configuration()).thenReturn(content);
when(container.getName()).thenReturn(CUBE_ID);
when(container.getDeployableContainer()).thenReturn(deployableContainer);
when(deployableContainer.getConfigurationClass()).thenReturn(ContainerConfiguration.class);
when(container.getContainerConfiguration()).thenReturn(containerDef);
when(containerRegistry.getContainers()).thenReturn(Arrays.asList(container));
when(hasPortBindings.getContainerIP()).thenReturn("192.168.0.1");
registry = new LocalCubeRegistry();
registry.addCube(cube);
bind(ApplicationScoped.class, CubeRegistry.class, registry);
bind(ApplicationScoped.class, ContainerRegistry.class, containerRegistry);
}
@Test
public void shouldRemapContainerAddressToBootToDocker() {
Map<String, String> containerConfig = new HashMap<String, String>();
when(containerDef.getContainerProperties()).thenReturn(containerConfig);
when(cube.getMetadata(HasPortBindings.class)).thenReturn(hasPortBindings);
bind(ApplicationScoped.class, OperatingSystemFamily.class, OperatingSystemFamily.MAC);
fire(new BeforeSetup(deployableContainer));
verify(containerDef).overrideProperty("myHost", "192.168.0.1");
}
@Test
public void shouldSubstituteDockerServerIpContainerAddressToBootToDockerIp() {
Map<String, String> containerConfig = new HashMap<String, String>();
containerConfig.put("myHost", CubeDockerConfiguration.DOCKER_SERVER_IP);
when(containerDef.getContainerProperties()).thenReturn(containerConfig);
when(cube.getMetadata(HasPortBindings.class)).thenReturn(hasPortBindings);
bind(ApplicationScoped.class, OperatingSystemFamily.class, OperatingSystemFamily.MAC);
fire(new BeforeSetup(deployableContainer));
verify(containerDef).overrideProperty("myHost", "192.168.0.1");
}
@Test
public void shouldNotRemapContainerAddressToBootToDocker() {
Map<String, String> containerConfig = new HashMap<String, String>();
containerConfig.put("myHost", "10.0.10.1");
when(containerDef.getContainerProperties()).thenReturn(containerConfig);
when(cube.getMetadata(HasPortBindings.class)).thenReturn(hasPortBindings);
bind(ApplicationScoped.class, OperatingSystemFamily.class, OperatingSystemFamily.MAC);
fire(new BeforeSetup(deployableContainer));
verify(containerDef, times(0)).overrideProperty("myHost", "192.168.0.1");
}
}