View Javadoc

1   // ========================================================================
2   // Copyright 2004-2010 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses.
12  // ========================================================================
13  package org.eclipse.jetty.server.session;
14  
15  import java.io.IOException;
16  import java.util.Random;
17  
18  import javax.servlet.ServletException;
19  import javax.servlet.http.HttpServlet;
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  import javax.servlet.http.HttpSession;
23  
24  import org.eclipse.jetty.client.ContentExchange;
25  import org.eclipse.jetty.client.HttpClient;
26  import org.eclipse.jetty.http.HttpMethods;
27  import org.eclipse.jetty.server.Request;
28  import org.eclipse.jetty.server.SessionManager;
29  import org.junit.Test;
30  
31  /**
32   * AbstractLocalSessionScavengingTest
33   */
34  public abstract class AbstractLocalSessionScavengingTest
35  {
36      public abstract AbstractTestServer createServer(int port, int max, int scavenge);
37  
38      public void pause(int scavengePeriod)
39      {
40          try
41          {
42              Thread.sleep(scavengePeriod * 2500L);
43          }
44          catch (InterruptedException e)
45          {
46              e.printStackTrace();
47          }
48      }
49      
50      @Test
51      public void testLocalSessionsScavenging() throws Exception
52      {
53          Random random = new Random(System.nanoTime());
54          String contextPath = "";
55          String servletMapping = "/server";
56          int port1 = random.nextInt(50000) + 10000;
57          int inactivePeriod = 1;
58          int scavengePeriod = 2;
59          AbstractTestServer server1 = createServer(port1, inactivePeriod, scavengePeriod);
60          server1.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
61          server1.start();
62          try
63          {
64              int port2 = random.nextInt(50000) + 10000;
65              AbstractTestServer server2 = createServer(port2, inactivePeriod, scavengePeriod * 3);
66              server2.addContext(contextPath).addServlet(TestServlet.class, servletMapping);
67              server2.start();
68              try
69              {
70                  HttpClient client = new HttpClient();
71                  client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
72                  client.start();
73                  try
74                  {
75                      String[] urls = new String[2];
76                      urls[0] = "http://localhost:" + port1 + contextPath + servletMapping;
77                      urls[1] = "http://localhost:" + port2 + contextPath + servletMapping;
78  
79                      // Create the session on node1
80                      ContentExchange exchange1 = new ContentExchange(true);
81                      exchange1.setMethod(HttpMethods.GET);
82                      exchange1.setURL(urls[0] + "?action=init");
83                      client.send(exchange1);
84                      exchange1.waitForDone();
85                      assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK;
86                      String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie");
87                      assert sessionCookie != null;
88                      // Mangle the cookie, replacing Path with $Path, etc.
89                      sessionCookie = sessionCookie.replaceFirst("(\\W)(P|p)ath=", "$1\\$Path=");
90  
91                      // Be sure the session is also present in node2
92                      ContentExchange exchange2 = new ContentExchange(true);
93                      exchange2.setMethod(HttpMethods.GET);
94                      exchange2.setURL(urls[1] + "?action=test");
95                      exchange2.getRequestFields().add("Cookie", sessionCookie);
96                      client.send(exchange2);
97                      exchange2.waitForDone();
98                      assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK;
99                      
100                     
101                     // Wait for the scavenger to run on node1, waiting 2.5 times the scavenger period
102                     pause(scavengePeriod);
103                     
104                     // Check that node1 does not have any local session cached
105                     exchange1 = new ContentExchange(true);
106                     exchange1.setMethod(HttpMethods.GET);
107                     exchange1.setURL(urls[0] + "?action=check");
108                     client.send(exchange1);
109                     exchange1.waitForDone();
110                     assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK;
111 
112 
113                     // Wait for the scavenger to run on node2, waiting 2 times the scavenger period
114                     // This ensures that the scavenger on node2 runs at least once.
115                     pause(scavengePeriod);
116 
117                     // Check that node2 does not have any local session cached   
118                     exchange2 = new ContentExchange(true);
119                     exchange2.setMethod(HttpMethods.GET);
120                     exchange2.setURL(urls[1] + "?action=check");
121                     client.send(exchange2);
122                     exchange2.waitForDone();
123                     assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK;
124                 }
125                 finally
126                 {
127                     client.stop();
128                 }
129             }
130             finally
131             {
132                 server2.stop();
133             }
134         }
135         finally
136         {
137             server1.stop();
138         }
139     }
140 
141     public static class TestServlet extends HttpServlet
142     {
143         private SessionManager sessionManager;
144 
145         @Override
146         protected void doGet(HttpServletRequest request, HttpServletResponse httpServletResponse) throws ServletException, IOException
147         {
148             String action = request.getParameter("action");
149             if ("init".equals(action))
150             {
151                 HttpSession session = request.getSession(true);
152                 session.setAttribute("test", "test");
153                 this.sessionManager = ((Request)request).getSessionManager();
154             }
155             else if ("test".equals(action))
156             {
157                 HttpSession session = request.getSession(false);
158                 session.setAttribute("test", "test");
159                 this.sessionManager = ((Request)request).getSessionManager();
160             }
161             else if ("check".equals(action))
162             {
163                 HttpSession session = request.getSession(false);
164                 assert session == null;
165             }
166         }
167     }
168 }