TestUtils.java
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.esigate.test;
import java.io.IOException;
import java.util.Properties;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.RequestLine;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.message.BasicRequestLine;
import org.esigate.Driver;
import org.esigate.DriverFactory;
import org.esigate.HttpErrorPage;
import org.esigate.Renderer;
import org.esigate.api.ContainerRequestContext;
import org.esigate.http.Http;
import org.esigate.http.HttpClientRequestExecutor;
import org.esigate.http.IncomingRequest;
import org.esigate.impl.DriverRequest;
import org.esigate.test.conn.IResponseHandler;
import org.esigate.test.conn.MockConnectionManager;
import org.esigate.test.http.HttpResponseBuilder;
import org.esigate.util.UriUtils;
/**
* Helper class for unit or integration tests.
*
* @author Francois-Xavier Bonnet
* @author Nicolas Richeton
*
*/
public final class TestUtils {
private TestUtils() {
}
/**
* Creates a mock {@link IncomingRequest}.
*
* @param uri
* the uri
* @return the {@link IncomingRequest}
*/
public static IncomingRequest.Builder createIncomingRequest(String uri) {
HttpHost httpHost = UriUtils.extractHost(uri);
String scheme = httpHost.getSchemeName();
String host = httpHost.getHostName();
int port = httpHost.getPort();
RequestLine requestLine = new BasicRequestLine("GET", uri, HttpVersion.HTTP_1_1);
IncomingRequest.Builder builder = IncomingRequest.builder(requestLine);
builder.setContext(new ContainerRequestContext() {
});
// Remove default ports
if (port == -1 || (port == Http.DEFAULT_HTTP_PORT && "http".equals(scheme))
|| (port == Http.DEFAULT_HTTPS_PORT && "https".equals(scheme))) {
builder.addHeader("Host", host);
} else {
builder.addHeader("Host", host + ":" + port);
}
builder.setSession(new MockSession());
return builder;
}
/**
* Creates a mock {@link IncomingRequest}.
*
* @return the {@link IncomingRequest}
*/
public static IncomingRequest.Builder createIncomingRequest() {
return createIncomingRequest("http://localhost:8080");
}
/**
* Creates a mock {@link DriverRequest}.
*
* @param uri
* the uri
* @param driver
* the {@link Driver}
* @return the {@link DriverRequest}
* @throws HttpErrorPage
* if an error occurs
*/
public static DriverRequest createDriverRequest(String uri, Driver driver) throws HttpErrorPage {
IncomingRequest request = createIncomingRequest(uri).build();
return new DriverRequest(request, driver, "/");
}
/**
* Creates a mock {@link DriverRequest}.
*
* @param driver
* the {@link Driver}
* @return the {@link DriverRequest}
* @throws HttpErrorPage
* if an error occurs
*/
public static DriverRequest createDriverRequest(Driver driver) throws HttpErrorPage {
IncomingRequest request = createIncomingRequest().build();
return new DriverRequest(request, driver, "/");
}
/**
* Creates a {@link Driver} instance with a custom response handler.
*
* @param properties
* the {@link Properties}
* @param responseHandler
* the {@link IResponseHandler}
* @return new {@link Driver} object
*/
public static Driver createMockDriver(Properties properties, IResponseHandler responseHandler) {
MockConnectionManager connManager = new MockConnectionManager();
connManager.setResponseHandler(responseHandler);
return createMockDriver(properties, connManager);
}
/**
* Creates a {@link Driver} instance with a mock {@link HttpResponse}.
*
* @param properties
* the {@link Properties}
* @param response
* the {@link HttpResponse}
* @return new {@link Driver} object
*/
public static Driver createMockDriver(Properties properties, HttpResponse response) {
MockConnectionManager connManager = new MockConnectionManager();
connManager.setResponse(response);
return createMockDriver(properties, connManager);
}
/**
* Create a Driver instance with a custom connection Manager.
*
* @param properties
* the {@link Properties}
* @param connectionManager
* the {@link HttpClientConnectionManager}
* @return new {@link Driver} object
*/
public static Driver createMockDriver(Properties properties, HttpClientConnectionManager connectionManager) {
return createMockDriver(properties, connectionManager, "tested");
}
/**
* Create a Driver instance with a custom connection Manager.
*
* @param properties
* the {@link Properties}
* @param connectionManager
* the {@link HttpClientConnectionManager}
* @param name
* name of the Driver instance
* @return new {@link Driver} object
*/
public static Driver createMockDriver(Properties properties, HttpClientConnectionManager connectionManager,
String name) {
Driver driver =
Driver.builder()
.setName(name)
.setProperties(properties)
.setRequestExecutorBuilder(
HttpClientRequestExecutor.builder().setConnectionManager(connectionManager)).build();
DriverFactory.put(name, driver);
return driver;
}
/**
* Create a fluent-style builder for {@link HttpResponse}.
*
* @return a {@link HttpResponseBuilder}
*/
public static HttpResponseBuilder createHttpResponse() {
return new HttpResponseBuilder();
}
/**
* Create a fluent-style builder for {@link IncomingRequest}.
*
* @param uri
* the request uri
* @return the IncomingRequest.Builder
*/
public static IncomingRequest.Builder createRequest(String uri) {
return createIncomingRequest(uri);
}
/**
* Execute {@link Driver#proxy(String, org.esigate.http.IncomingRequest, Renderer...)} on an HttpRequest.
*
*
* @param d
* {@link Driver}
* @param request
* Request
* @param renderers
* {@link Renderer} which will be applied on response entity.
* @return the {@link HttpResponse}
* @throws IOException
* if an {@link IOException} occurs
* @throws HttpErrorPage
* if any other Exception
*/
public static CloseableHttpResponse driverProxy(Driver d, IncomingRequest request, Renderer... renderers)
throws IOException, HttpErrorPage {
String uri = request.getRequestLine().getUri();
return d.proxy(UriUtils.getPath(uri), request, renderers);
}
}