package org.arquillian.cube.docker.impl.client.containerobject.dsl;
import org.arquillian.cube.docker.impl.await.HttpAwaitStrategy;
import org.arquillian.cube.docker.impl.client.config.Await;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Builder to create await objects. Polling comes by default if not set.
*/
public class AwaitBuilder {
private static final int DEFAULT_TIMEOUT = 30;
public static Await logAwait(String matching) {
return logAwait(matching, DEFAULT_TIMEOUT, 1);
}
public static Await logAwait(String matching, int occurrences) {
return logAwait(matching, DEFAULT_TIMEOUT, occurrences);
}
public static Await logAwait(String matching, int timeoutInSeconds, int occurrences) {
Await await = new Await();
await.setStrategy("log");
await.setMatch(matching);
await.setTimeout(timeoutInSeconds);
await.setStdOut(true);
await.setOccurrences(occurrences);
return await;
}
public static HttpAwaitBuilder httpAwait(String path, int port) {
URL url = createUrl("http", path, port);
return httpAwait(url, null);
}
public static HttpAwaitBuilder httpsAwait(String path, int port) {
URL url = createUrl("https", path, port);
return httpAwait(url, null);
}
private static URL createUrl(String protocol, String path, int port) {
URL url;
try {
url = new URL(protocol, HttpAwaitStrategy.DOCKER_HOST, port, path);
} catch (MalformedURLException e) {
throw new IllegalArgumentException(e);
}
return url;
}
/**
*
* @param serviceUrl You can use dockerHost reserved keyword, which is replaced at runtime for real docker host ip.
* @return
*/
public static HttpAwaitBuilder httpAwait(URL serviceUrl, String messageContent) {
return new HttpAwaitBuilder(serviceUrl, messageContent);
}
public static Await defaultHttpAwait(URL serviceUrl, String messageContent, int statusCode) {
return httpAwait(serviceUrl, messageContent).withResponseCode(statusCode).build();
}
public static class HttpAwaitBuilder {
private Await await;
public HttpAwaitBuilder(URL url, String messageContent) {
this.await = new Await();
await.setStrategy("http");
await.setMatch(messageContent);
await.setUrl(url.toExternalForm());
await.setSleepPollingTime(DEFAULT_TIMEOUT + " s");
await.setIterations(10);
}
public HttpAwaitBuilder withResponseCode(int responseCode) {
await.setResponseCode(responseCode);
return this;
}
public HttpAwaitBuilder withSleepPollingTime(int time, TimeUnit unit) {
final long l = unit.toMillis(time);
await.setSleepPollingTime(l + "ms");
return this;
}
public HttpAwaitBuilder withIterations(int iterations) {
await.setIterations(iterations);
return this;
}
public HttpAwaitBuilder withHeaders(Map<String, Object> headers) {
await.setHeaders(headers);
return this;
}
public HttpAwaitBuilder withHeaders(String key, Object value, Object... keyValues) {
if (keyValues.length % 2 != 0) {
throw new IllegalArgumentException("Key Values should be a pair of key, value");
}
final Map<String, Object> headers = new HashMap<>();
headers.put(key, value);
for (int i = 0; i < keyValues.length; i += 2) {
headers.put((String) keyValues[i], keyValues[i + 1]);
}
return withHeaders(headers);
}
public Await build() {
return this.await;
}
}
}