//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.testing.servlets; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.util.Arrays; import org.apache.http.NameValuePair; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import uk.gov.dstl.baleen.core.manager.BaleenManager; import uk.gov.dstl.baleen.core.utils.YamlConfiguration; import uk.gov.dstl.baleen.core.web.BaleenWebApi; import uk.gov.dstl.baleen.exceptions.BaleenException; public class WebApiTestServer { private WebApiTestServer() { // Do nothing } public static void runServer(BaleenManager manager, Runnable run) throws BaleenException { BaleenWebApi web = new BaleenWebApi(manager); try { web.configure(new YamlConfiguration()); web.start(); // Wait for the server to be up try { Thread.sleep(2000); } catch (InterruptedException e) { // Do nothing } run.run(); } finally { web.stop(); } } public static String getBodyForGet(String username, String password, String path) throws IOException { try (CloseableHttpClient httpClient = createClient(username, password); CloseableHttpResponse response = httpClient.execute(new HttpGet(makeApiUrl(path)))) { return EntityUtils.toString(response.getEntity()); } } public static String getBodyForDelete(String username, String password, String path) throws IOException { try (CloseableHttpClient httpClient = createClient(username, password); CloseableHttpResponse response = httpClient.execute(new HttpDelete(makeApiUrl(path)))) { return EntityUtils.toString(response.getEntity()); } } public static String getBodyForPost(String username, String password, String path) throws IOException { try (CloseableHttpClient httpClient = createClient(username, password); CloseableHttpResponse response = httpClient.execute(new HttpPost(makeApiUrl(path)))) { return EntityUtils.toString(response.getEntity()); } } public static String getBodyForPost(String username, String password, String path, NameValuePair... parameters) throws IOException { HttpPost post = new HttpPost(makeApiUrl(path)); post.setEntity(new UrlEncodedFormEntity(Arrays.asList(parameters))); try (CloseableHttpClient httpClient = createClient(username, password); CloseableHttpResponse response = httpClient.execute(post)) { return EntityUtils.toString(response.getEntity()); } } public static void assertForGet(String username, String password, int statusCode, String path) throws IOException { try (CloseableHttpClient httpClient = createClient(username, password)) { CloseableHttpResponse response = httpClient.execute(new HttpGet(makeApiUrl(path))); int code = response.getStatusLine().getStatusCode(); response.close(); assertEquals(statusCode, code); } } public static void assertForPost(String username, String password, int statusCode, String path) throws IOException { try (CloseableHttpClient httpClient = createClient(username, password)) { CloseableHttpResponse response = httpClient.execute(new HttpPost(makeApiUrl(path))); int code = response.getStatusLine().getStatusCode(); response.close(); assertEquals(statusCode, code); } } public static String makeApiUrl(String path) { int port = BaleenWebApi.getPort(BaleenWebApi.DEFAULT_PORT); return "http://localhost:" + port + "/api/1" + path; } public static CloseableHttpClient createClient(String username, String password) { HttpClientBuilder builder = HttpClientBuilder.create(); if (username != null && password != null) { BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password)); builder.setDefaultCredentialsProvider(credentialsProvider); } return builder.build(); } }