package org.arquillian.cube.docker.impl.await;
import java.io.ByteArrayInputStream;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import org.arquillian.cube.docker.impl.client.config.Await;
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.util.ConfigUtil;
import org.arquillian.cube.spi.Cube;
import org.arquillian.cube.spi.await.AwaitStrategy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
@RunWith(MockitoJUnitRunner.class)
public class AwaitStrategyTest {
@Mock
private Cube<?> cube;
@Mock
private DockerClientExecutor dockerClientExecutor;
@Test
public void should_be_able_to_create_http_await_strategy() {
String containerDefinition = "tomcat:\n" +
" image: tutum/tomcat:7.0\n" +
" exposedPorts: [8089/tcp]\n" +
" await:\n" +
" strategy: http\n" +
" iterations: 10\n" +
" sleepPollingTime: 200 s\n" +
" url: http://localhost:8080/ping\n" +
" responseCode: 201\n" +
" match: 'Server startup'\n" +
" headers: \n" +
" X-Cube: Docker\n";
final DockerCompositions load = ConfigUtil.load(new ByteArrayInputStream(containerDefinition.getBytes()));
final CubeContainer tomcat = load.getContainers().get("tomcat");
HttpAwaitStrategy awaitStrategy = new HttpAwaitStrategy(cube, dockerClientExecutor, tomcat.getAwait());
assertThat(awaitStrategy.getPollIterations(), is(10));
assertThat(awaitStrategy.getUrl(), is("http://localhost:8080/ping"));
assertThat(awaitStrategy.getResponseCode(), is(201));
assertThat(awaitStrategy.getMatcher(), is("Server startup"));
assertThat((String) awaitStrategy.getHeaders().get("X-Cube"), is("Docker"));
}
@Test
public void should_be_able_to_create_custom_await_strategies() {
Await await = new Await();
await.setStrategy("org.arquillian.cube.docker.impl.await.CustomAwaitStrategyImpl");
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(dockerClientExecutor, cube, cubeContainer);
assertThat(strategy, instanceOf(CustomAwaitStrategyInstantiator.class));
CustomAwaitStrategyInstantiator customAwaitStrategyInstantiator = (CustomAwaitStrategyInstantiator) strategy;
assertThat(customAwaitStrategyInstantiator.await(), is(true));
}
@Test
public void should_create_static_await_strategy() {
Await await = new Await();
await.setStrategy("static");
await.setIp("localhost");
await.setPorts(Arrays.asList(8080, 8089));
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(StaticAwaitStrategy.class));
StaticAwaitStrategy staticAwaitStrategy = (StaticAwaitStrategy) strategy;
assertThat(staticAwaitStrategy.getIp(), is("localhost"));
assertThat(staticAwaitStrategy.getPorts().get(0), is(8080));
assertThat(staticAwaitStrategy.getPorts().get(1), is(8089));
}
@Test
public void should_create_static_await_strategy_without_defaults() {
Await await = new Await();
await.setStrategy("static");
await.setIp("localhost");
await.setPorts(Arrays.asList(8080, 8089));
await.setSleepPollingTime(200);
await.setIterations(3);
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(StaticAwaitStrategy.class));
StaticAwaitStrategy staticAwaitStrategy = (StaticAwaitStrategy) strategy;
assertThat(staticAwaitStrategy.getIp(), is("localhost"));
assertThat(staticAwaitStrategy.getPorts().get(0), is(8080));
assertThat(staticAwaitStrategy.getPorts().get(1), is(8089));
assertThat(staticAwaitStrategy.getPollIterations(), is(3));
assertThat(staticAwaitStrategy.getSleepTime(), is(200));
}
@Test
public void should_create_static_await_strategy_without_defaults_and_units() {
Await await = new Await();
await.setStrategy("static");
await.setIp("localhost");
await.setPorts(Arrays.asList(8080, 8089));
await.setSleepPollingTime("200 s");
await.setIterations(3);
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(StaticAwaitStrategy.class));
StaticAwaitStrategy staticAwaitStrategy = (StaticAwaitStrategy) strategy;
assertThat(staticAwaitStrategy.getIp(), is("localhost"));
assertThat(staticAwaitStrategy.getPorts().get(0), is(8080));
assertThat(staticAwaitStrategy.getPorts().get(1), is(8089));
assertThat(staticAwaitStrategy.getPollIterations(), is(3));
assertThat(staticAwaitStrategy.getSleepTime(), is(200));
assertThat(staticAwaitStrategy.getTimeUnit(), is(TimeUnit.SECONDS));
}
@Test
public void should_create_polling_await_strategy_if_no_strategy_is_provided() {
CubeContainer cubeContainer = new CubeContainer();
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(PollingAwaitStrategy.class));
}
@Test
public void should_create_polling_await_strategy() {
Await await = new Await();
await.setStrategy("polling");
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(PollingAwaitStrategy.class));
}
@Test
public void should_create_polling_await_strategy_with_specific_port() {
Await await = new Await();
await.setStrategy("polling");
await.setPorts(Arrays.asList(80));
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(PollingAwaitStrategy.class));
assertThat(((PollingAwaitStrategy) strategy).getPorts(), hasItems(80));
}
@Test
public void should_create_polling_await_strategy_with_specific_times() {
Await await = new Await();
await.setStrategy("polling");
await.setSleepPollingTime(200);
await.setIterations(3);
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(PollingAwaitStrategy.class));
assertThat(((PollingAwaitStrategy) strategy).getPollIterations(), is(3));
assertThat(((PollingAwaitStrategy) strategy).getSleepTime(), is(200));
}
@Test
public void should_create_sleeping_await_strategy_with_specific_times() {
Await await = new Await();
await.setStrategy("sleeping");
await.setSleepTime("200 s");
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(SleepingAwaitStrategy.class));
assertThat(((SleepingAwaitStrategy) strategy).getSleepTime(), is(200));
}
@Test
public void should_create_polling_await_strategy_with_specific_times_and_unit() {
Await await = new Await();
await.setStrategy("polling");
await.setSleepPollingTime("200 s");
await.setIterations(3);
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(PollingAwaitStrategy.class));
assertThat(((PollingAwaitStrategy) strategy).getPollIterations(), is(3));
assertThat(((PollingAwaitStrategy) strategy).getSleepTime(), is(200));
assertThat(((PollingAwaitStrategy) strategy).getTimeUnit(), is(TimeUnit.SECONDS));
assertThat(((PollingAwaitStrategy) strategy).getType(), is("sscommand"));
}
@Test
public void should_create_polling_await_strategy_with_specific_type() {
Await await = new Await();
await.setStrategy("polling");
await.setType("sscommand");
await.setSleepPollingTime("200 s");
await.setIterations(3);
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(PollingAwaitStrategy.class));
assertThat(((PollingAwaitStrategy) strategy).getType(), is("sscommand"));
}
@Test
public void should_create_native_await_strategy() {
Await await = new Await();
await.setStrategy("native");
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(NativeAwaitStrategy.class));
}
@Test
public void should_create_log_scanning_await_strategy() {
Await await = new Await();
await.setStrategy("log");
await.setMatch("STARTED");
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(LogScanningAwaitStrategy.class));
final LogScanningAwaitStrategy log = (LogScanningAwaitStrategy) strategy;
assertThat(log.getTimeout(), is(15));
assertThat(log.isStdOut(), is(true));
assertThat(log.isStdErr(), is(false));
}
@Test
public void should_create_log_scanning_await_strategy_without_defaults() {
Await await = new Await();
await.setStrategy("log");
await.setMatch("regexp:.*STARTED.*");
await.setStdOut(false);
await.setStdErr(true);
await.setTimeout(20);
await.setOccurrences(3);
CubeContainer cubeContainer = new CubeContainer();
cubeContainer.setAwait(await);
AwaitStrategy strategy = AwaitStrategyFactory.create(null, cube, cubeContainer);
assertThat(strategy, instanceOf(LogScanningAwaitStrategy.class));
final LogScanningAwaitStrategy log = (LogScanningAwaitStrategy) strategy;
assertThat(log.getTimeout(), is(20));
assertThat(log.isStdOut(), is(false));
assertThat(log.isStdErr(), is(true));
assertThat(log.getOccurrences(), is(3));
}
}