/*
* Copyright 2011 Google Inc.
*
* 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 com.google.jstestdriver.server.gateway;
import static org.easymock.EasyMock.expect;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import junit.framework.TestCase;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author rdionne@google.com (Robert Dionne)
*/
public class GatewayServletTest extends TestCase {
private IMocksControl control;
private HttpClient client;
private GatewayRequestHandler gateway;
private HttpServletRequest request;
private HttpServletResponse response;
@Override
protected void setUp() throws Exception {
control = EasyMock.createControl();
client = control.createMock(HttpClient.class);
request = control.createMock(HttpServletRequest.class);
response = control.createMock(HttpServletResponse.class);
gateway = new GatewayRequestHandler(client, request, response, "http://hostname:80", null);
}
@Override
protected void tearDown() throws Exception {
control.verify();
}
public void testService_GET() throws Exception {
expect(request.getMethod()).andStubReturn("GET");
expect(request.getRequestURI()).andStubReturn("/relativeUri");
expect(request.getHeaderNames()).andStubReturn(
Iterators.asEnumeration(ImmutableList.of("Host").iterator()));
expect(request.getHeaders("Host")).andStubReturn(
Iterators.asEnumeration(ImmutableList.of("jstd:80").iterator()));
expect(request.getQueryString()).andStubReturn("id=123");
// TODO(rdionne): Feed fake response values into the captured HttpMethod and assert they are
// properly converted to equivalent HttpServletResponse fields.
Capture<HttpMethodBase> methodCapture = new Capture<HttpMethodBase>();
expect(client.executeMethod(EasyMock.capture(methodCapture))).andStubReturn(200);
/* expect */ response.setStatus(200);
expect(request.getHeaders("Pragma")).andStubReturn(
Iterators.asEnumeration(Iterators.emptyIterator()));
final ByteArrayOutputStream output = new ByteArrayOutputStream();
ServletOutputStream out = new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
output.write(b);
}
};
expect(response.getOutputStream()).andStubReturn(out);
control.replay();
gateway.handleIt();
assertEquals("GET", methodCapture.getValue().getName());
assertEquals("http://hostname/relativeUri?id=123", methodCapture.getValue().getURI().toString());
assertEquals("hostname:80", methodCapture.getValue().getRequestHeader("Host").getValue());
assertEquals("id=123", methodCapture.getValue().getQueryString());
assertEquals("", output.toString());
}
public void testService_POST() throws Exception {
expect(request.getMethod()).andStubReturn("POST");
expect(request.getRequestURI()).andStubReturn("/relativeUri");
final ByteArrayInputStream input = new ByteArrayInputStream("ASDF".getBytes());
ServletInputStream in = new ServletInputStream() {
@Override
public int read() throws IOException {
return input.read();
}
};
expect(request.getInputStream()).andStubReturn(in);
expect(request.getHeaderNames()).andStubReturn(
Iterators.asEnumeration(ImmutableList.of("Host").iterator()));
expect(request.getHeaders("Host")).andStubReturn(
Iterators.asEnumeration(ImmutableList.of("jstd:80").iterator()));
expect(request.getQueryString()).andStubReturn("id=123");
// TODO(rdionne): Feed fake response values into the captured HttpMethod and assert they are
// properly converted to equivalent HttpServletResponse fields.
Capture<HttpMethodBase> methodCapture = new Capture<HttpMethodBase>();
expect(client.executeMethod(EasyMock.capture(methodCapture))).andStubReturn(200);
/* expect */ response.setStatus(200);
expect(request.getHeaders("Pragma")).andStubReturn(
Iterators.asEnumeration(Iterators.emptyIterator()));
final ByteArrayOutputStream output = new ByteArrayOutputStream();
ServletOutputStream out = new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
output.write(b);
}
};
expect(response.getOutputStream()).andStubReturn(out);
control.replay();
gateway.handleIt();
ByteArrayOutputStream requestBody = new ByteArrayOutputStream();
((EntityEnclosingMethod) methodCapture.getValue()).getRequestEntity().writeRequest(requestBody);
assertEquals("POST", methodCapture.getValue().getName());
assertEquals("http://hostname/relativeUri?id=123", methodCapture.getValue().getURI().toString());
assertEquals("hostname:80", methodCapture.getValue().getRequestHeader("Host").getValue());
assertEquals("id=123", methodCapture.getValue().getQueryString());
assertEquals("ASDF", requestBody.toString());
assertEquals("", output.toString());
}
}