package org.arquillian.cube.docker.impl.client; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.util.List; import org.arquillian.cube.docker.impl.client.config.CubeContainer; import org.arquillian.cube.docker.impl.client.config.DockerCompositions; import org.arquillian.cube.docker.impl.docker.DockerClientExecutor; import org.arquillian.cube.docker.impl.model.DockerCube; import org.arquillian.cube.docker.impl.util.ConfigUtil; import org.arquillian.cube.spi.CubeRegistry; import org.arquillian.cube.spi.event.lifecycle.BeforeStop; import org.jboss.arquillian.core.api.annotation.ApplicationScoped; import org.jboss.arquillian.core.test.AbstractManagerTestBase; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class BeforeStopContainerObserverTest extends AbstractManagerTestBase { private static final String CUBE_CONTAINER_NAME = "test"; private static final String CONTAINER_COPY_CONFIGURATION = "tomcat_default:\n" + " image: tutum/tomcat:7.0\n" + " beforeStop:\n" + " - copy:\n" + " from: /test\n" + " to: "; private static final String CONTAINER_LOG_CONFIGURATION = "tomcat_default:\n" + " image: tutum/tomcat:7.0\n" + " beforeStop:\n" + " - log:\n" + " to: "; private static final String CONTAINER_CUSTOM_BEFORE_STOP_ACTION_CONFIGURATION = "tomcat_default:\n" + " image: tutum/tomcat:7.0\n" + " beforeStop:\n" + " - customBeforeStopAction:\n" + " strategy: org.arquillian.cube.docker.impl.beforeStop.CustomBeforeStopActionImpl"; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Mock private DockerCube cube; @Mock private CubeRegistry registry; @Mock private DockerClientExecutor dockerClientExecutor; @BeforeClass public static void startDockerStub() { } @Override protected void addExtensions(List<Class<?>> extensions) { super.addExtensions(extensions); extensions.add(BeforeStopContainerObserver.class); } @Before public void setup() { bind(ApplicationScoped.class, DockerClientExecutor.class, dockerClientExecutor); Mockito.when(registry.getCube(CUBE_CONTAINER_NAME, DockerCube.class)).thenReturn( cube); bind(ApplicationScoped.class, CubeRegistry.class, registry); } @Test public void shouldCopyFileFromContainer() throws IOException { File newFolder = temporaryFolder.newFolder(); String content = CONTAINER_COPY_CONFIGURATION; content += newFolder.getAbsolutePath(); DockerCompositions configuration = ConfigUtil.load(content); CubeContainer config = configuration.get("tomcat_default"); Mockito.when(cube.configuration()).thenReturn(config); Mockito.when(dockerClientExecutor.getFileOrDirectoryFromContainerAsTar(eq(CUBE_CONTAINER_NAME), anyString())) .thenReturn(BeforeStopContainerObserverTest.class.getResourceAsStream("/hello.tar")); fire(new BeforeStop(CUBE_CONTAINER_NAME)); verify(dockerClientExecutor).getFileOrDirectoryFromContainerAsTar(eq(CUBE_CONTAINER_NAME), eq("/test")); assertThat(new File(newFolder, "hello.txt").exists(), is(true)); } @Test public void shouldGetLogFromContainer() throws IOException { File newFolder = temporaryFolder.newFolder(); String content = CONTAINER_LOG_CONFIGURATION; content += newFolder.getAbsolutePath(); content += "mylog.log"; DockerCompositions configuration = ConfigUtil.load(content); CubeContainer config = configuration.get("tomcat_default"); Mockito.when(cube.configuration()).thenReturn(config); fire(new BeforeStop(CUBE_CONTAINER_NAME)); verify(dockerClientExecutor, times(1)).copyLog(eq(CUBE_CONTAINER_NAME), eq(false), eq(false), eq(false), eq(false), eq(-1), any(OutputStream.class)); } @Test public void shouldExecuteCustomBeforeStopOperationForContainer() throws IOException { DockerCompositions configuration = ConfigUtil.load(CONTAINER_CUSTOM_BEFORE_STOP_ACTION_CONFIGURATION); CubeContainer config = configuration.get("tomcat_default"); Mockito.when(cube.configuration()).thenReturn(config); fire(new BeforeStop(CUBE_CONTAINER_NAME)); verify(dockerClientExecutor, times(1)).getDockerUri(); } }