package org.arquillian.cube.docker.impl.client;
import com.github.dockerjava.api.model.Container;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.spi.ConnectionMode;
import org.arquillian.cube.spi.CubeConfiguration;
import org.arquillian.cube.spi.event.CreateCube;
import org.arquillian.cube.spi.event.DestroyCube;
import org.arquillian.cube.spi.event.PreRunningCube;
import org.arquillian.cube.spi.event.StartCube;
import org.arquillian.cube.spi.event.StopCube;
import org.jboss.arquillian.container.spi.ContainerRegistry;
import org.jboss.arquillian.core.api.annotation.ApplicationScoped;
import org.jboss.arquillian.core.test.AbstractManagerTestBase;
import org.jboss.arquillian.test.spi.event.suite.AfterSuite;
import org.jboss.arquillian.test.spi.event.suite.BeforeSuite;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class CubeSuiteLifecycleControllerTest extends AbstractManagerTestBase {
@Mock
private DockerClientExecutor executor;
@Override
protected void addExtensions(List<Class<?>> extensions) {
extensions.add(CubeSuiteLifecycleController.class);
super.addExtensions(extensions);
}
@Test
public void shouldParseEmptyAutostart() throws Exception {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("autoStartContainers", "");
parameters.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(new HashMap<String, String>());
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(parameters, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 0);
assertEventFired(StartCube.class, 0);
}
@Test
public void shouldParseEmptyValuesAutostart() throws Exception {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("autoStartContainers", " , ");
parameters.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(new HashMap<String, String>());
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(parameters, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 0);
assertEventFired(StartCube.class, 0);
}
@Test
public void shouldParseTrimAutostart() throws Exception {
Map<String, String> parameters = new HashMap<String, String>();
parameters.put("autoStartContainers", "a , b ");
parameters.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(new HashMap<String, String>());
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(parameters, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 2);
assertEventFired(StartCube.class, 2);
assertEventFiredOnOtherThread(CreateCube.class);
assertEventFiredOnOtherThread(StartCube.class);
}
@Test
public void shouldCreateAndStartAutoContainersWhenNoAutoStartIsProvided() {
Map<String, String> dockerData = new HashMap<String, String>();
dockerData.put("dockerContainers", "a:\n image: a\n links:\n - b:b\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(new HashMap<String, String>());
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(dockerData, null);
dockerConfiguration.setAutoStartContainers(new AutomaticResolutionLinksAutoStartParser(Arrays.asList("a"),
dockerConfiguration.getDockerContainersContent()));
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
ContainerRegistry containerRegistry = mock(ContainerRegistry.class);
List<org.jboss.arquillian.container.spi.Container> containers = new ArrayList<>();
org.jboss.arquillian.container.spi.Container container = mock(org.jboss.arquillian.container.spi.Container.class);
when(container.getName()).thenReturn("a");
containers.add(container);
when(containerRegistry.getContainers()).thenReturn(containers);
bind(ApplicationScoped.class, ContainerRegistry.class, containerRegistry);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 1);
assertEventFired(StartCube.class, 1);
}
@Test
public void shouldCreateAndStartAutoContainersDefiningRegularExpressions() {
Map<String, String> dockerData = new HashMap<String, String>();
dockerData.put("autoStartContainers", "regexp:a(.*)");
dockerData.put("dockerContainers", "a:\n image: a\nab:\n image: a\nx:\n" +
" image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(new HashMap<String, String>());
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(dockerData, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 2);
assertEventFired(StartCube.class, 2);
assertEventFiredOnOtherThread(CreateCube.class);
assertEventFiredOnOtherThread(StartCube.class);
}
@Test
public void shouldCreateAndStartAutoContainers() {
Map<String, String> dockerData = new HashMap<String, String>();
dockerData.put("autoStartContainers", "a,b");
dockerData.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(new HashMap<String, String>());
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(dockerData, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 2);
assertEventFired(StartCube.class, 2);
assertEventFiredOnOtherThread(CreateCube.class);
assertEventFiredOnOtherThread(StartCube.class);
}
@Test
public void shouldStopAndDestroyAutoContainers() {
Map<String, String> dockerData = new HashMap<String, String>();
dockerData.put("autoStartContainers", "a,b");
dockerData.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(new HashMap<String, String>());
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(dockerData, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
fire(new AfterSuite());
assertEventFired(StopCube.class, 2);
assertEventFired(DestroyCube.class, 2);
assertEventFiredOnOtherThread(StopCube.class);
assertEventFiredOnOtherThread(DestroyCube.class);
}
@Test
public void shouldUsePreRunningContainers() {
Map<String, String> cubeData = new HashMap<String, String>();
cubeData.put("connectionMode", ConnectionMode.STARTORCONNECT.name());
Map<String, String> dockerData = new HashMap<String, String>();
dockerData.put("autoStartContainers", "a,b");
dockerData.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(cubeData);
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(dockerData, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
Container container = mock(Container.class);
when(container.getNames()).thenReturn(new String[] {"a"});
when(executor.listRunningContainers()).thenReturn(Arrays.asList(container));
bind(ApplicationScoped.class, DockerClientExecutor.class, executor);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 1);
assertEventFired(StartCube.class, 1);
assertEventFired(PreRunningCube.class, 1);
assertEventFiredOnOtherThread(CreateCube.class);
assertEventFiredOnOtherThread(StartCube.class);
assertEventFiredOnOtherThread(PreRunningCube.class);
}
@Test
public void shouldStartAContainerInStartOrConnectModeAndStopIt() {
Map<String, String> cubeData = new HashMap<String, String>();
cubeData.put("connectionMode", ConnectionMode.STARTORCONNECT.name());
Map<String, String> dockerData = new HashMap<String, String>();
dockerData.put("autoStartContainers", "a,b");
dockerData.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(cubeData);
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(dockerData, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
Container container = mock(Container.class);
when(container.getNames()).thenReturn(new String[] {"alreadyrun"});
when(executor.listRunningContainers()).thenReturn(Arrays.asList(container));
bind(ApplicationScoped.class, DockerClientExecutor.class, executor);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 2);
assertEventFired(StartCube.class, 2);
assertEventFired(PreRunningCube.class, 0);
assertEventFiredOnOtherThread(CreateCube.class);
assertEventFiredOnOtherThread(StartCube.class);
}
@Test
public void shouldStartAContainerInStartOrConnectAndLeaveModeAndNotStopIt() {
Map<String, String> cubeData = new HashMap<String, String>();
cubeData.put("connectionMode", ConnectionMode.STARTORCONNECTANDLEAVE.name());
Map<String, String> dockerData = new HashMap<String, String>();
dockerData.put("autoStartContainers", "a,b");
dockerData.put("dockerContainers", "a:\n image: a\nb:\n image: a\n");
CubeConfiguration cubeConfiguration = CubeConfiguration.fromMap(cubeData);
bind(ApplicationScoped.class, CubeConfiguration.class, cubeConfiguration);
CubeDockerConfiguration dockerConfiguration = CubeDockerConfiguration.fromMap(dockerData, null);
bind(ApplicationScoped.class, CubeDockerConfiguration.class, dockerConfiguration);
Container container = mock(Container.class);
when(container.getNames()).thenReturn(new String[] {"alreadyrun"});
when(executor.listRunningContainers()).thenReturn(Arrays.asList(container));
bind(ApplicationScoped.class, DockerClientExecutor.class, executor);
fire(new BeforeSuite());
assertEventFired(CreateCube.class, 2);
assertEventFired(StartCube.class, 2);
assertEventFired(PreRunningCube.class, 2);
assertEventFiredOnOtherThread(CreateCube.class);
assertEventFiredOnOtherThread(StartCube.class);
assertEventFiredOnOtherThread(PreRunningCube.class);
}
}