1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.http.functional;
12
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertTrue;
15
16 import org.mule.tck.AbstractServiceAndFlowTestCase;
17 import org.mule.tck.junit4.rule.DynamicPort;
18
19 import java.io.IOException;
20 import java.util.Arrays;
21 import java.util.Collection;
22 import java.util.concurrent.CountDownLatch;
23 import java.util.concurrent.TimeUnit;
24 import java.util.concurrent.atomic.AtomicBoolean;
25
26 import javax.servlet.ServletException;
27 import javax.servlet.http.HttpServlet;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.apache.commons.httpclient.Cookie;
32 import org.apache.commons.httpclient.HttpClient;
33 import org.apache.commons.httpclient.HttpState;
34 import org.apache.commons.httpclient.cookie.CookiePolicy;
35 import org.apache.commons.httpclient.methods.PostMethod;
36 import org.apache.commons.logging.Log;
37 import org.apache.commons.logging.LogFactory;
38 import org.junit.Rule;
39 import org.junit.Test;
40 import org.junit.runners.Parameterized.Parameters;
41 import org.mortbay.jetty.Connector;
42 import org.mortbay.jetty.Server;
43 import org.mortbay.jetty.bio.SocketConnector;
44 import org.mortbay.jetty.servlet.ServletHandler;
45
46 public class HttpMultipleCookiesTestCase extends AbstractServiceAndFlowTestCase
47 {
48
49 protected static String TEST_MESSAGE = "Test Http Request ";
50 protected static final Log logger = LogFactory.getLog(HttpMultipleCookiesTestCase.class);
51
52 private CountDownLatch simpleServerLatch = new CountDownLatch(1);
53 private CountDownLatch simpleServerShutdownLatch = new CountDownLatch(1);
54 private static AtomicBoolean cookiesRecieved = new AtomicBoolean(false);
55
56 private Server server = null;
57
58 @Rule
59 public DynamicPort dynamicPort1 = new DynamicPort("port1");
60
61 @Rule
62 public DynamicPort dynamicPort2 = new DynamicPort("port2");
63
64 public HttpMultipleCookiesTestCase(ConfigVariant variant, String configResources)
65 {
66 super(variant, configResources);
67 setStartContext(false);
68 }
69
70 @Parameters
71 public static Collection<Object[]> parameters()
72 {
73 return Arrays.asList(new Object[][]{
74 {ConfigVariant.SERVICE, "http-multiple-cookies-test-flow.xml"},
75 {ConfigVariant.FLOW, "http-multiple-cookies-test-service.xml"}
76 });
77 }
78
79 @Override
80 protected void doSetUp() throws Exception
81 {
82 super.doSetUp();
83 startServer();
84 assertTrue(simpleServerLatch.await(RECEIVE_TIMEOUT, TimeUnit.MILLISECONDS));
85 }
86
87 @Override
88 protected void doTearDown() throws Exception
89 {
90 super.doTearDown();
91 muleContext.stop();
92 stopServer();
93 assertTrue(simpleServerShutdownLatch.await(RECEIVE_TIMEOUT, TimeUnit.MILLISECONDS));
94 }
95
96 @Test
97 public void testSendDirectly() throws Exception
98 {
99 muleContext.start();
100 sendMessage(dynamicPort2.getNumber());
101 }
102
103 @Test
104 public void testSendviaMule() throws Exception
105 {
106 muleContext.start();
107 sendMessage(dynamicPort1.getNumber());
108 }
109
110 protected void sendMessage(int port) throws Exception
111 {
112 HttpClient client2 = new HttpClient();
113 client2.getParams().setCookiePolicy(CookiePolicy.RFC_2109);
114 HttpState state = new HttpState();
115 Cookie cookie1 = new Cookie("localhost", "TheFirst", "First", "/", null, false);
116 state.addCookie(cookie1);
117 Cookie cookie2 = new Cookie("localhost", "TheSecond", "Value2", "/", null, false);
118 state.addCookie(cookie2);
119 Cookie cookie3 = new Cookie("localhost", "TheThird", "Value3", "/", null, false);
120 state.addCookie(cookie3);
121
122 client2.setState(state);
123 PostMethod method = new PostMethod("http://localhost:" + port);
124 Thread.sleep(5000);
125 client2.executeMethod(method);
126 assertEquals(TEST_MESSAGE, method.getResponseBodyAsString());
127 assertTrue("Cookies were not recieved", cookiesRecieved.get());
128
129 for (Cookie cookie : client2.getState().getCookies())
130 {
131 logger.debug(cookie.getName() + " " + cookie.getValue());
132 }
133 assertEquals(6, client2.getState().getCookies().length);
134 }
135
136 protected void startServer() throws Exception
137 {
138 logger.debug("server starting");
139 Server server = new Server();
140 Connector connector = new SocketConnector();
141 connector.setPort(dynamicPort2.getNumber());
142 server.setConnectors(new Connector[]{connector});
143
144 ServletHandler handler = new ServletHandler();
145 server.setHandler(handler);
146
147 handler.addServletWithMapping(HelloServlet.class.getName(), "/");
148
149 server.start();
150
151 simpleServerLatch.countDown();
152 logger.debug("Server started");
153 }
154
155 protected void stopServer() throws Exception
156 {
157 logger.debug("server stopping");
158
159 if(server != null && server.isRunning())
160 {
161 assertEquals(1, server.getConnectors());
162
163 server.getConnectors()[0].stop();
164 }
165
166 simpleServerShutdownLatch.countDown();
167 logger.debug("Server stopped");
168 }
169
170 public static class HelloServlet extends HttpServlet
171 {
172 @Override
173 protected void doGet(HttpServletRequest request, HttpServletResponse response)
174 throws ServletException, IOException
175 {
176 try
177 {
178 response.setContentType("text/xml");
179 response.setContentLength(TEST_MESSAGE.length());
180 for (int i = 0; i < 3; i++)
181 {
182 javax.servlet.http.Cookie cookie1 = new javax.servlet.http.Cookie("OutputCookieName" + i,
183 "OutputCookieValue" + i);
184 response.addCookie(cookie1);
185 }
186 cookiesRecieved.set(false);
187 javax.servlet.http.Cookie[] cookies = request.getCookies();
188 if (cookies != null)
189 {
190 for (javax.servlet.http.Cookie cookie : cookies)
191 {
192 logger.debug(cookie.getName() + " " + cookie.getValue());
193 cookiesRecieved.set(true);
194 }
195 }
196 response.setStatus(HttpServletResponse.SC_OK);
197 response.getWriter().println(TEST_MESSAGE);
198 }
199 catch (Exception e)
200 {
201 logger.error("Servlet error", e);
202 throw new ServletException(e);
203 }
204 }
205
206 @Override
207 protected void doPost(HttpServletRequest request, HttpServletResponse response)
208 throws ServletException, IOException
209 {
210 doGet(request, response);
211 }
212
213 }
214
215 }