| /* |
| * $Header: /home/data/cvs/rt/org.eclipse.ecf/tests/bundles/org.eclipse.ecf.tests.apache.httpclient.server/src/org/apache/commons/httpclient/TestHttpConnection.java,v 1.1 2009/02/13 18:07:48 slewis Exp $ |
| * $Revision: 1.1 $ |
| * $Date: 2009/02/13 18:07:48 $ |
| * ==================================================================== |
| * |
| * Copyright 2002-2004 The Apache Software Foundation |
| * |
| * 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. |
| * ==================================================================== |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals on behalf of the Apache Software Foundation. For more |
| * information on the Apache Software Foundation, please see |
| * <http://www.apache.org/>. |
| * |
| * [Additional notices, if required by prior licensing conditions] |
| * |
| */ |
| |
| package org.apache.commons.httpclient; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.InetAddress; |
| import java.net.Socket; |
| import java.net.UnknownHostException; |
| |
| import junit.framework.Test; |
| import junit.framework.TestSuite; |
| |
| import org.apache.commons.httpclient.methods.GetMethod; |
| import org.apache.commons.httpclient.params.HttpConnectionParams; |
| import org.apache.commons.httpclient.protocol.Protocol; |
| import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; |
| import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory; |
| |
| /** |
| * |
| * Unit tests for {@link HttpConnection}. |
| * |
| * @author Sean C. Sullivan |
| * |
| * @version $Id: TestHttpConnection.java,v 1.1 2009/02/13 18:07:48 slewis Exp $ |
| * |
| */ |
| public class TestHttpConnection extends HttpClientTestBase { |
| |
| // ------------------------------------------------------------ Constructor |
| public TestHttpConnection(String testName) throws Exception { |
| super(testName); |
| } |
| |
| // ------------------------------------------------------------------- Main |
| public static void main(String args[]) { |
| String[] testCaseName = { TestHttpConnection.class.getName() }; |
| junit.textui.TestRunner.main(testCaseName); |
| } |
| |
| // ------------------------------------------------------- TestCase Methods |
| |
| public static Test suite() { |
| return new TestSuite(TestHttpConnection.class); |
| } |
| |
| |
| // ----------------------------------------------------------- Test Methods |
| |
| public void testConstructThenClose() { |
| this.server.setHttpService(new EchoService()); |
| HttpConnection conn = new HttpConnection( |
| this.server.getLocalAddress(), this.server.getLocalPort()); |
| conn.close(); |
| assertTrue(!conn.isOpen()); |
| } |
| |
| public void testConnTimeoutRelease() { |
| this.server.setHttpService(new EchoService()); |
| // create a custom protocol that will delay for 500 milliseconds |
| Protocol testProtocol = new Protocol( |
| "timeout", |
| new DelayedProtocolSocketFactory( |
| 500, |
| Protocol.getProtocol("http").getSocketFactory() |
| ), |
| this.server.getLocalPort() |
| ); |
| |
| NoHostHttpConnectionManager connectionManager = new NoHostHttpConnectionManager(); |
| connectionManager.setConnection( |
| new HttpConnection( |
| this.server.getLocalAddress(), this.server.getLocalPort(), testProtocol)); |
| this.client.setHttpConnectionManager(connectionManager); |
| client.getHostConfiguration().setHost( |
| this.server.getLocalAddress(), this.server.getLocalPort(), testProtocol); |
| client.getHttpConnectionManager().getParams().setConnectionTimeout(1); |
| |
| try { |
| GetMethod get = new GetMethod(); |
| client.executeMethod(get); |
| fail("Should have timed out"); |
| } catch(IOException e) { |
| /* should fail */ |
| assertTrue(e instanceof ConnectTimeoutException); |
| assertTrue(connectionManager.isConnectionReleased()); |
| } |
| } |
| |
| |
| public void testConnTimeout() { |
| |
| // create a custom protocol that will delay for 500 milliseconds |
| Protocol testProtocol = new Protocol( |
| "timeout", |
| new DelayedProtocolSocketFactory( |
| 500, |
| Protocol.getProtocol("http").getSocketFactory() |
| ), |
| this.server.getLocalPort() |
| ); |
| |
| HttpConnection conn = new HttpConnection( |
| this.server.getLocalAddress(), this.server.getLocalPort(), testProtocol); |
| // 1 ms is short enough to make this fail |
| conn.getParams().setConnectionTimeout(1); |
| try { |
| conn.open(); |
| fail("Should have timed out"); |
| } catch(IOException e) { |
| assertTrue(e instanceof ConnectTimeoutException); |
| /* should fail */ |
| } |
| } |
| |
| public void testForIllegalStateExceptions() { |
| HttpConnection conn = new HttpConnection( |
| this.server.getLocalAddress(), this.server.getLocalPort()); |
| try { |
| OutputStream out = conn.getRequestOutputStream(); |
| fail("getRequestOutputStream did not throw the expected exception"); |
| } |
| catch (IllegalStateException expected) { |
| // this exception is expected |
| } |
| catch (IOException ex) { |
| fail("getRequestOutputStream did not throw the expected exception"); |
| } |
| |
| try { |
| OutputStream out = new ChunkedOutputStream(conn.getRequestOutputStream()); |
| fail("getRequestOutputStream(true) did not throw the expected exception"); |
| } |
| catch (IllegalStateException expected) { |
| // this exception is expected |
| } |
| catch (IOException ex) { |
| fail("getRequestOutputStream(true) did not throw the expected exception"); |
| } |
| |
| try { |
| InputStream in = conn.getResponseInputStream(); |
| fail("getResponseInputStream() did not throw the expected exception"); |
| } |
| catch (IllegalStateException expected) { |
| // this exception is expected |
| } |
| catch (IOException ex) { |
| fail("getResponseInputStream() did not throw the expected exception"); |
| } |
| |
| } |
| |
| /** |
| * A ProtocolSocketFactory that delays before creating a socket. |
| */ |
| class DelayedProtocolSocketFactory implements ProtocolSocketFactory { |
| |
| private int delay; |
| private ProtocolSocketFactory realFactory; |
| |
| public DelayedProtocolSocketFactory(int delay, ProtocolSocketFactory realFactory) { |
| this.delay = delay; |
| this.realFactory = realFactory; |
| } |
| |
| public Socket createSocket( |
| String host, |
| int port, |
| InetAddress localAddress, |
| int localPort |
| ) throws IOException, UnknownHostException { |
| |
| synchronized (this) { |
| try { |
| this.wait(delay); |
| } catch (InterruptedException e) {} |
| } |
| return realFactory.createSocket(host, port, localAddress, localPort); |
| } |
| |
| public Socket createSocket( |
| final String host, |
| final int port, |
| final InetAddress localAddress, |
| final int localPort, |
| final HttpConnectionParams params |
| ) throws IOException, UnknownHostException { |
| |
| if (params == null) { |
| throw new IllegalArgumentException("Parameters may not be null"); |
| } |
| int timeout = params.getConnectionTimeout(); |
| ControllerThreadSocketFactory.SocketTask task = new ControllerThreadSocketFactory.SocketTask() { |
| public void doit() throws IOException { |
| synchronized (this) { |
| try { |
| this.wait(delay); |
| } catch (InterruptedException e) {} |
| } |
| setSocket(realFactory.createSocket(host, port, localAddress, localPort)); |
| } |
| }; |
| return ControllerThreadSocketFactory.createSocket(task, timeout); |
| } |
| |
| public Socket createSocket(String host, int port) |
| throws IOException, UnknownHostException { |
| synchronized (this) { |
| try { |
| this.wait(delay); |
| } catch (InterruptedException e) {} |
| } |
| return realFactory.createSocket(host, port); |
| } |
| |
| } |
| |
| } |
| |