~ubuntu-branches/ubuntu/utopic/jetty/utopic-proposed

« back to all changes in this revision

Viewing changes to contrib/terracotta/src/test/java/org/mortbay/terracotta/servlet/TIMLightLoadTest.java

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2009-08-09 08:48:10 UTC
  • Revision ID: james.westby@ubuntu.com-20090809084810-k522b97ind2robyd
ImportĀ upstreamĀ versionĀ 6.1.19

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// ========================================================================
 
2
// Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.
 
3
// ------------------------------------------------------------------------
 
4
// Licensed under the Apache License, Version 2.0 (the "License");
 
5
// you may not use this file except in compliance with the License.
 
6
// You may obtain a copy of the License at
 
7
// http://www.apache.org/licenses/LICENSE-2.0
 
8
// Unless required by applicable law or agreed to in writing, software
 
9
// distributed under the License is distributed on an "AS IS" BASIS,
 
10
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
11
// See the License for the specific language governing permissions and
 
12
// limitations under the License.
 
13
// ========================================================================
 
14
 
 
15
package org.mortbay.terracotta.servlet;
 
16
 
 
17
import java.io.File;
 
18
import java.io.FileWriter;
 
19
import java.io.IOException;
 
20
import java.io.PrintWriter;
 
21
import java.util.Random;
 
22
import java.util.concurrent.CyclicBarrier;
 
23
import java.util.concurrent.ExecutorService;
 
24
import java.util.concurrent.Executors;
 
25
import java.util.concurrent.TimeUnit;
 
26
 
 
27
import javax.servlet.ServletException;
 
28
import javax.servlet.http.HttpServlet;
 
29
import javax.servlet.http.HttpServletRequest;
 
30
import javax.servlet.http.HttpServletResponse;
 
31
import javax.servlet.http.HttpSession;
 
32
 
 
33
import org.mortbay.jetty.HttpMethods;
 
34
import org.mortbay.jetty.Server;
 
35
import org.mortbay.jetty.client.ContentExchange;
 
36
import org.mortbay.jetty.client.HttpClient;
 
37
import org.mortbay.jetty.servlet.SessionHandler;
 
38
import org.mortbay.jetty.webapp.WebAppContext;
 
39
import org.testng.annotations.Test;
 
40
 
 
41
/**
 
42
 * @version $Revision: 1319 $ $Date: 2008-11-14 00:55:54 +0100 (Fr, 14. Nov 2008) $
 
43
 */
 
44
public class TIMLightLoadTest
 
45
{
 
46
    @Test
 
47
    public void testLightLoad() throws Exception
 
48
    {
 
49
        File warDir = new File(System.getProperty("java.io.tmpdir"), "lightLoad");
 
50
        warDir.deleteOnExit();
 
51
        warDir.mkdir();
 
52
        File webInfDir = new File(warDir, "WEB-INF");
 
53
        webInfDir.deleteOnExit();
 
54
        webInfDir.mkdir();
 
55
        File webXml = new File(webInfDir, "web.xml");
 
56
        webXml.deleteOnExit();
 
57
        String xml =
 
58
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
 
59
                "<web-app xmlns=\"http://java.sun.com/xml/ns/j2ee\"\n" +
 
60
                "         xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
 
61
                "         xsi:schemaLocation=\"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd\"\n" +
 
62
                "         version=\"2.4\">\n" +
 
63
                "\n" +
 
64
                "</web-app>";
 
65
        FileWriter w = new FileWriter(webXml);
 
66
        w.write(xml);
 
67
        w.close();
 
68
 
 
69
        Random random = new Random(System.nanoTime());
 
70
        String contextPath = "/lightLoad";
 
71
        String servletMapping = "/server";
 
72
        int port1 = random.nextInt(50000) + 10000;
 
73
        Server server1 = new Server(port1);
 
74
        WebAppContext context1 = new WebAppContext(warDir.getCanonicalPath(), contextPath);
 
75
        context1.setSessionHandler(new SessionHandler());
 
76
        context1.addServlet(TestServlet.class, servletMapping);
 
77
        server1.setHandler(context1);
 
78
        server1.start();
 
79
        try
 
80
        {
 
81
            int port2 = random.nextInt(50000) + 10000;
 
82
            Server server2 = new Server(port2);
 
83
            WebAppContext context2 = new WebAppContext(warDir.getCanonicalPath(), contextPath);
 
84
            context2.setSessionHandler(new SessionHandler());
 
85
            context2.addServlet(TestServlet.class, servletMapping);
 
86
            server2.setHandler(context2);
 
87
            server2.start();
 
88
            try
 
89
            {
 
90
                HttpClient client = new HttpClient();
 
91
                client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
 
92
                client.start();
 
93
                try
 
94
                {
 
95
                    String[] urls = new String[2];
 
96
                    urls[0] = "http://localhost:" + port1 + contextPath + servletMapping;
 
97
                    urls[1] = "http://localhost:" + port2 + contextPath + servletMapping;
 
98
 
 
99
                    ContentExchange exchange1 = new ContentExchange(true);
 
100
                    exchange1.setMethod(HttpMethods.GET);
 
101
                    exchange1.setURL(urls[0] + "?action=init");
 
102
                    client.send(exchange1);
 
103
                    exchange1.waitForDone();
 
104
                    assert exchange1.getResponseStatus() == HttpServletResponse.SC_OK;
 
105
                    String sessionCookie = exchange1.getResponseFields().getStringField("Set-Cookie");
 
106
                    assert sessionCookie != null;
 
107
                    System.out.println("sessionCookie = " + sessionCookie);
 
108
 
 
109
                    ExecutorService executor = Executors.newCachedThreadPool();
 
110
                    int clientsCount = 50;
 
111
                    CyclicBarrier barrier = new CyclicBarrier(clientsCount + 1);
 
112
                    int requestsCount = 100;
 
113
                    Worker[] workers = new Worker[clientsCount];
 
114
                    for (int i = 0; i < clientsCount; ++i)
 
115
                    {
 
116
                        workers[i] = new Worker(barrier, requestsCount, sessionCookie, urls);
 
117
                        workers[i].start();
 
118
                        executor.execute(workers[i]);
 
119
                    }
 
120
                    // Wait for all workers to be ready
 
121
                    barrier.await();
 
122
                    long start = System.nanoTime();
 
123
 
 
124
                    // Wait for all workers to be done
 
125
                    barrier.await();
 
126
                    long end = System.nanoTime();
 
127
                    long elapsed = TimeUnit.NANOSECONDS.toMillis(end - start);
 
128
                    System.out.println("elapsed ms: " + elapsed);
 
129
 
 
130
                    for (Worker worker : workers) worker.stop();
 
131
                    executor.shutdownNow();
 
132
 
 
133
                    // Perform one request to get the result
 
134
                    ContentExchange exchange2 = new ContentExchange(true);
 
135
                    exchange2.setMethod(HttpMethods.GET);
 
136
                    exchange2.setURL(urls[0] + "?action=result");
 
137
                    exchange2.getRequestFields().add("Cookie", sessionCookie);
 
138
                    client.send(exchange2);
 
139
                    exchange2.waitForDone();
 
140
                    assert exchange2.getResponseStatus() == HttpServletResponse.SC_OK;
 
141
                    String response = exchange2.getResponseContent();
 
142
                    System.out.println("get = " + response);
 
143
                    assert response.trim().equals(String.valueOf(clientsCount * requestsCount));
 
144
                }
 
145
                finally
 
146
                {
 
147
                    client.stop();
 
148
                }
 
149
            }
 
150
            finally
 
151
            {
 
152
                server2.stop();
 
153
            }
 
154
        }
 
155
        finally
 
156
        {
 
157
            server1.stop();
 
158
        }
 
159
    }
 
160
 
 
161
    public static class Worker implements Runnable
 
162
    {
 
163
        private final HttpClient client;
 
164
        private final CyclicBarrier barrier;
 
165
        private final int requestsCount;
 
166
        private final String sessionCookie;
 
167
        private final String[] urls;
 
168
 
 
169
        public Worker(CyclicBarrier barrier, int requestsCount, String sessionCookie, String[] urls)
 
170
        {
 
171
            this.client = new HttpClient();
 
172
            this.client.setConnectorType(HttpClient.CONNECTOR_SOCKET);
 
173
            this.barrier = barrier;
 
174
            this.requestsCount = requestsCount;
 
175
            this.sessionCookie = sessionCookie;
 
176
            this.urls = urls;
 
177
        }
 
178
 
 
179
        public void start() throws Exception
 
180
        {
 
181
            client.start();
 
182
        }
 
183
 
 
184
        public void stop() throws Exception
 
185
        {
 
186
            client.stop();
 
187
        }
 
188
 
 
189
        public void run()
 
190
        {
 
191
            try
 
192
            {
 
193
                // Wait for all workers to be ready
 
194
                barrier.await();
 
195
 
 
196
                Random random = new Random(System.nanoTime());
 
197
                for (int i = 0; i < requestsCount; ++i)
 
198
                {
 
199
                    int urlIndex = random.nextInt(urls.length);
 
200
 
 
201
                    ContentExchange exchange = new ContentExchange(true);
 
202
                    exchange.setMethod(HttpMethods.GET);
 
203
                    exchange.setURL(urls[urlIndex] + "?action=increment");
 
204
                    exchange.getRequestFields().add("Cookie", sessionCookie);
 
205
                    client.send(exchange);
 
206
                    exchange.waitForDone();
 
207
                    assert exchange.getResponseStatus() == HttpServletResponse.SC_OK;
 
208
                }
 
209
 
 
210
                // Wait for all workers to be done
 
211
                barrier.await();
 
212
            }
 
213
            catch (Exception x)
 
214
            {
 
215
                throw new RuntimeException(x);
 
216
            }
 
217
        }
 
218
    }
 
219
 
 
220
    public static class TestServlet extends HttpServlet
 
221
    {
 
222
        @Override
 
223
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 
224
        {
 
225
            String action = request.getParameter("action");
 
226
            if ("init".equals(action))
 
227
            {
 
228
                HttpSession session = request.getSession(true);
 
229
                session.setAttribute("value", 0);
 
230
            }
 
231
            else if ("increment".equals(action))
 
232
            {
 
233
                // Without synchronization, because it is taken care by Jetty/Terracotta
 
234
                HttpSession session = request.getSession(false);
 
235
                int value = (Integer)session.getAttribute("value");
 
236
                session.setAttribute("value", value + 1);
 
237
            }
 
238
            else if ("result".equals(action))
 
239
            {
 
240
                HttpSession session = request.getSession(false);
 
241
                int value = (Integer)session.getAttribute("value");
 
242
                PrintWriter writer = response.getWriter();
 
243
                writer.println(value);
 
244
                writer.flush();
 
245
            }
 
246
        }
 
247
    }
 
248
}