package org.arquillian.cube.docker.impl.client.containerobject.dsl;
import org.arquillian.cube.CubeController;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.docker.impl.model.LocalDockerNetworkRegistry;
import org.arquillian.cube.docker.impl.model.NetworkRegistry;
import org.arquillian.cube.impl.model.LocalCubeRegistry;
import org.arquillian.cube.spi.CubeRegistry;
import org.jboss.arquillian.core.api.Injector;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InOrder;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ContainerNetworkObjectDslTestEnricherTest {
private CubeRegistry cubeRegistry;
private NetworkRegistry networkRegistry;
private CubeController cubeController;
private DockerClientExecutor dockerClientExecutor;
@Before
public void init() {
cubeRegistry = new LocalCubeRegistry();
networkRegistry = new LocalDockerNetworkRegistry();
cubeController = mock(CubeController.class);
dockerClientExecutor = mock(DockerClientExecutor.class);
}
@Test
public void should_start_a_network() {
ContainerNetworkObjectDslTestEnricher containerNetworkObjectDslTestEnricher = new ContainerNetworkObjectDslTestEnricher();
Injector injector = mock(Injector.class);
containerNetworkObjectDslTestEnricher.injectorInstance = () -> injector;
containerNetworkObjectDslTestEnricher.networkRegistryInstance = () -> networkRegistry;
containerNetworkObjectDslTestEnricher.dockerClientExecutorInstance = () -> dockerClientExecutor;
when(injector.inject(any(Network.class))).then(invocation -> invocation.getArgumentAt(0, Network.class));
when(dockerClientExecutor.createNetwork(eq("default"), any(org.arquillian.cube.docker.impl.client.config.Network.class))).thenReturn("default");
containerNetworkObjectDslTestEnricher.enrich(new NetworkTest());
verify(dockerClientExecutor).createNetwork(eq("default"), any(org.arquillian.cube.docker.impl.client.config.Network.class));
assertThat(networkRegistry.getNetwork("default")).isNotNull();
}
@Test
public void should_start_a_container() {
Injector injector = new Injector() {
@Override
public <T> T inject(T target) {
return target;
}
};
ContainerNetworkObjectDslTestEnricher containerNetworkObjectDslTestEnricher = new ContainerNetworkObjectDslTestEnricher();
containerNetworkObjectDslTestEnricher.injectorInstance = () -> injector;
containerNetworkObjectDslTestEnricher.cubeRegistryInstance = () -> cubeRegistry;
containerNetworkObjectDslTestEnricher.cubeControllerInstance = () -> cubeController;
containerNetworkObjectDslTestEnricher.dockerClientExecutorInstance = () -> dockerClientExecutor;
containerNetworkObjectDslTestEnricher.enrich(new SimpleContainerTest());
verify(cubeController).create("mytomcat");
verify(cubeController).start("mytomcat");
assertThat(cubeRegistry.getCube("mytomcat")).isNotNull();
}
@Test
public void should_start_multiple_containers_in_order() {
Injector injector = new Injector() {
@Override
public <T> T inject(T target) {
return target;
}
};
ContainerNetworkObjectDslTestEnricher containerNetworkObjectDslTestEnricher = new ContainerNetworkObjectDslTestEnricher();
containerNetworkObjectDslTestEnricher.injectorInstance = () -> injector;
containerNetworkObjectDslTestEnricher.cubeRegistryInstance = () -> cubeRegistry;
containerNetworkObjectDslTestEnricher.cubeControllerInstance = () -> cubeController;
containerNetworkObjectDslTestEnricher.dockerClientExecutorInstance = () -> dockerClientExecutor;
containerNetworkObjectDslTestEnricher.enrich(new MultipleContainerTest());
InOrder inOrder = Mockito.inOrder(cubeController);
inOrder.verify(cubeController).create("mytomcat3");
inOrder.verify(cubeController).create("mytomcat1");
inOrder.verify(cubeController).create("mytomcat2");
}
public static class MultipleContainerTest {
@DockerContainer(order = 10)
Container container1 = Container.withContainerName("mytomcat1")
.fromImage("tomcat")
.withPortBinding(8080)
.build();
@DockerContainer(order = 5)
Container container2 = Container.withContainerName("mytomcat2")
.fromImage("tomcat")
.withPortBinding(8080)
.build();
@DockerContainer(order = 25)
Container container3 = Container.withContainerName("mytomcat3")
.fromImage("tomcat")
.withPortBinding(8080)
.build();
}
public static class SimpleContainerTest {
@DockerContainer
Container container = Container.withContainerName("mytomcat")
.fromImage("tomcat")
.withPortBinding(8080)
.build();
}
public static class NetworkTest {
@DockerNetwork
Network network = Network.withDefaultDriver("default").build();
}
}