1
2
3
4
5
6
7
8
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
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
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 }