View Javadoc

1   /*
2    * $Id: HttpMuleMessageFactoryTestCase.java 19519 2010-09-09 21:36:07Z dzapata $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.http;
12  
13  import static org.mockito.Mockito.mock;
14  import static org.mockito.Mockito.when;
15  
16  import org.mule.MessageExchangePattern;
17  import org.mule.api.MuleMessage;
18  import org.mule.api.transport.MessageTypeNotSupportedException;
19  import org.mule.api.transport.MuleMessageFactory;
20  import org.mule.transport.AbstractMuleMessageFactoryTestCase;
21  
22  import java.io.ByteArrayInputStream;
23  import java.io.InputStream;
24  import java.util.Arrays;
25  import java.util.Map;
26  
27  import org.apache.commons.httpclient.Header;
28  import org.apache.commons.httpclient.HttpMethod;
29  import org.apache.commons.httpclient.HttpVersion;
30  import org.apache.commons.httpclient.StatusLine;
31  import org.apache.commons.httpclient.URI;
32  
33  public class HttpMuleMessageFactoryTestCase extends AbstractMuleMessageFactoryTestCase
34  {
35      private static final Header[] HEADERS = new Header[] { new Header("foo-header", "foo-value") };
36      private static final String REQUEST_LINE = "GET /services/Echo HTTP/1.1";
37  
38      @Override
39      protected MuleMessageFactory doCreateMuleMessageFactory()
40      {
41          return new HttpMuleMessageFactory(muleContext);
42      }
43  
44      @Override
45      protected Object getValidTransportMessage() throws Exception
46      {
47          RequestLine requestLine = RequestLine.parseLine(REQUEST_LINE);
48          HttpRequest request = new HttpRequest(requestLine, HEADERS, null, encoding);
49          return request;
50      }
51      
52      @Override
53      protected Object getUnsupportedTransportMessage()
54      {
55          return "this is not a valid transport message for HttpMuleMessageFactory";
56      }
57  
58      @Override
59      public void testValidPayload() throws Exception
60      {
61          MuleMessageFactory factory = createMuleMessageFactory();
62          
63          Object payload = getValidTransportMessage();
64          MuleMessage message = factory.create(payload, encoding);
65          assertNotNull(message);
66          assertEquals("/services/Echo", message.getPayload());
67          // note that on this level it's only message factory, and it adds messages from http request to the inbound scope
68          assertEquals(HttpConstants.METHOD_GET, message.getInboundProperty(HttpConnector.HTTP_METHOD_PROPERTY));
69          assertEquals("foo-value", message.getInboundProperty("foo-header"));
70      }
71      
72      public void testInvalidPayloadOnHttpMuleMessageFactory() throws Exception
73      {
74          HttpMuleMessageFactory factory = new HttpMuleMessageFactory(muleContext);
75          try
76          {
77              factory.extractPayload(getUnsupportedTransportMessage(), encoding);
78              fail("HttpMuleMessageFactory should fail when receiving an invalid payload");
79          }
80          catch (MessageTypeNotSupportedException mtnse)
81          {
82              // this one was expected
83          }
84      }
85      
86      public void testHttpRequestPostPayload() throws Exception
87      {
88          HttpMuleMessageFactory factory = (HttpMuleMessageFactory) createMuleMessageFactory();
89          factory.setExchangePattern(MessageExchangePattern.ONE_WAY);
90  
91          HttpRequest request = createPostHttpRequest();
92          MuleMessage message = factory.create(request, encoding);
93          assertNotNull(message);
94          assertEquals(byte[].class, message.getPayload().getClass());
95          byte[] payload = (byte[]) message.getPayload();
96          assertTrue(Arrays.equals(TEST_MESSAGE.getBytes(), payload));
97      }
98  
99      private HttpRequest createPostHttpRequest() throws Exception
100     {
101         String line = REQUEST_LINE.replace(HttpConstants.METHOD_GET, HttpConstants.METHOD_POST);
102         RequestLine requestLine = RequestLine.parseLine(line);
103         InputStream stream = new ByteArrayInputStream(TEST_MESSAGE.getBytes());
104         return new HttpRequest(requestLine, HEADERS, stream, encoding);
105     }
106     
107     public void testHttpMethodGet() throws Exception
108     {
109         InputStream body = new ByteArrayInputStream("/services/Echo".getBytes());
110         HttpMethod method = createMockHttpMethod(HttpConstants.METHOD_GET, body);
111         
112         MuleMessageFactory factory = createMuleMessageFactory();
113         MuleMessage message = factory.create(method, encoding);
114         assertNotNull(message);
115         assertEquals("/services/Echo", message.getPayloadAsString());
116         assertEquals(HttpConstants.METHOD_GET, message.getInboundProperty(HttpConnector.HTTP_METHOD_PROPERTY));
117         assertEquals(HttpVersion.HTTP_1_1.toString(), message.getInboundProperty(HttpConnector.HTTP_VERSION_PROPERTY));
118         assertEquals("200", message.getInboundProperty(HttpConnector.HTTP_STATUS_PROPERTY));
119     }
120     
121     public void testHttpMethodPost() throws Exception
122     {
123         InputStream body = new ByteArrayInputStream(TEST_MESSAGE.getBytes());
124         HttpMethod method = createMockHttpMethod(HttpConstants.METHOD_POST, body);
125 
126         MuleMessageFactory factory = createMuleMessageFactory();
127         MuleMessage message = factory.create(method, encoding);
128         assertNotNull(message);
129         assertEquals(TEST_MESSAGE, message.getPayloadAsString());
130         assertEquals(HttpConstants.METHOD_POST, message.getInboundProperty(HttpConnector.HTTP_METHOD_PROPERTY));
131         assertEquals(HttpVersion.HTTP_1_1.toString(), message.getInboundProperty(HttpConnector.HTTP_VERSION_PROPERTY));
132         assertEquals("200", message.getInboundProperty(HttpConnector.HTTP_STATUS_PROPERTY));
133     }
134     
135     private HttpMethod createMockHttpMethod(String method, InputStream body) throws Exception
136     {
137         HttpMethod httpMethod = mock(HttpMethod.class);
138         when(httpMethod.getName()).thenReturn(method);
139         when(httpMethod.getStatusLine()).thenReturn(new StatusLine("HTTP/1.1 200 OK"));
140         when(httpMethod.getStatusCode()).thenReturn(HttpConstants.SC_OK);
141         when(httpMethod.getURI()).thenReturn(new URI("http://localhost/services/Echo", false));
142         when(httpMethod.getResponseHeaders()).thenReturn(HEADERS);
143         when(httpMethod.getResponseBodyAsStream()).thenReturn(body);
144         
145         return httpMethod;
146     }
147 
148     public void testMultipleHeaderWithSameName() throws Exception
149     {
150         HttpMuleMessageFactory messageFactory = new HttpMuleMessageFactory(null);
151 
152         Header[] headers = new Header[4];
153         headers[0] = new Header("k2", "priority");
154         headers[1] = new Header("k1", "top");
155         headers[2] = new Header("k2", "always");
156         headers[3] = new Header("k2", "true");
157 
158         Map<String, Object> parsedHeaders = messageFactory.convertHeadersToMap(headers, "http://localhost/");
159 
160         assertEquals(2, parsedHeaders.size());
161         assertEquals("top", parsedHeaders.get("k1"));
162         assertEquals("priority,always,true", parsedHeaders.get("k2"));
163     }
164 }