/* * Copyright 2008-2011 the original author or authors. * * 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.nominanuda.web.http; import static com.nominanuda.zen.oio.OioUtils.IO; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URI; import java.nio.charset.Charset; import java.util.Collections; import java.util.LinkedList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.ContentType; import org.apache.http.util.EntityUtils; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.AbstractHandler; public abstract class BaseHttpTest implements HttpProtocol { protected HttpCoreHelper httpCoreHelper = new HttpCoreHelper(); protected int maxConnPerRoute = 10; private HttpClient client; private final List<String> failures = Collections.synchronizedList(new LinkedList<String>()); protected void asyncAssertEquals(Object o1, Object o2) { if(o1 == null || o2 == null) { asyncFail("null object on equals"); } else { asyncAssert(o1.equals(o2), "expected "+o1.toString()+" got "+o2.toString()); } } protected void asyncAssert(boolean cond) { if(! cond) { asyncFail(); } } protected void asyncAssert(boolean cond, String reason) { if(! cond) { asyncFail(reason); } } protected void asyncFail() { failures.add(""); } protected void asyncFail(String reason) { failures.add(reason); } protected boolean isFailed() { return ! failures.isEmpty(); } protected void dumpFailures(OutputStream os) throws IOException { dumpFailures(new OutputStreamWriter(os, CS_UTF_8)); } protected void dumpFailures(Writer w) throws IOException { for(String f : failures) { w.write("failure:"+f+"\n"); } w.flush(); } protected Server startServer(int port, final Handler h) throws Exception { Server srv = new Server(port); srv.setHandler(new AbstractHandler() { public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { h.handle(target, baseRequest, request, response); baseRequest.setHandled(true); }}); srv.start(); return srv; } protected HttpClient buildClient(int maxConn) { return httpCoreHelper.createClient(maxConnPerRoute, 100000000, 100000000); } protected boolean GETfor200(URI uri) throws ClientProtocolException, IOException { HttpResponse resp = GET(uri); HttpEntity entity = resp.getEntity(); try { return (HttpStatus.SC_OK == resp.getStatusLine().getStatusCode()); } finally { EntityUtils.consume(entity); } } protected HttpResponse GET(URI uri) throws ClientProtocolException, IOException { if(client == null) { client = buildClient(maxConnPerRoute); } return client.execute(new HttpGet(uri)); } protected HttpResponse POST(URI uri, String ct, byte[] body) throws ClientProtocolException, IOException { return performEntityEnclosingMethod(ct, body, new HttpPost(uri)); } protected HttpResponse performEntityEnclosingMethod(String ct, byte[] body, HttpEntityEnclosingRequestBase post) throws IOException, ClientProtocolException { if(client == null) { client = buildClient(maxConnPerRoute); } ByteArrayEntity entity = new ByteArrayEntity(body); entity.setContentType(ct); post.setEntity(entity); return client.execute(post); } protected HttpResponse PUT(URI uri, String ct, byte[] body) throws ClientProtocolException, IOException { return performEntityEnclosingMethod(ct, body, new HttpPut(uri)); } protected byte[] getBody(HttpResponse resp) throws ClientProtocolException, IOException { HttpEntity entity = resp.getEntity(); try { if(HttpStatus.SC_OK != resp.getStatusLine().getStatusCode()) { throw new RuntimeException(); } return IO.readAndClose(entity.getContent()); } finally { EntityUtils.consume(entity); } } protected String asString(HttpResponse resp) throws ClientProtocolException, IOException { HttpEntity entity = resp.getEntity(); try { if(HttpStatus.SC_OK != resp.getStatusLine().getStatusCode()) { throw new RuntimeException(); } Charset cs = ContentType.get(entity).getCharset(); return new String(IO.readAndClose(entity.getContent()), cs == null ? CS_UTF_8 : cs); } finally { EntityUtils.consume(entity); } } }