View Javadoc

1   /*
2    * $Id: HttpMultipleCookiesTestCase.java 22518 2011-07-22 07:00:22Z claude.mamo $
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.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         // server.join();
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             // this test only uses one connector
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 }