KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tctest > server > appserver > unit > SynchWriteMultiThreadsTest


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright
3  * notice. All rights reserved.
4  */

5 package com.tctest.server.appserver.unit;
6
7 import org.apache.commons.httpclient.HttpClient;
8
9 import com.tc.test.server.appserver.unit.AbstractAppServerTestCase;
10 import com.tc.test.server.util.HttpUtil;
11 import com.tc.util.Assert;
12
13 import java.io.IOException JavaDoc;
14 import java.io.PrintWriter JavaDoc;
15 import java.net.MalformedURLException JavaDoc;
16 import java.net.URL JavaDoc;
17 import java.text.SimpleDateFormat JavaDoc;
18 import java.util.ArrayList JavaDoc;
19 import java.util.Collections JavaDoc;
20 import java.util.Date JavaDoc;
21 import java.util.List JavaDoc;
22
23 import javax.servlet.http.HttpServlet JavaDoc;
24 import javax.servlet.http.HttpServletRequest JavaDoc;
25 import javax.servlet.http.HttpServletResponse JavaDoc;
26 import javax.servlet.http.HttpSession JavaDoc;
27
28 /**
29  *
30  */

31 public class SynchWriteMultiThreadsTest extends AbstractAppServerTestCase {
32
33   private static final int INTENSITY = 1000;
34   private static final int NUM_OF_DRIVERS = 15;
35
36   public SynchWriteMultiThreadsTest() {
37     // this.disableAllUntil("2007-03-08");
38
}
39
40   private static class Driver extends Thread JavaDoc {
41     private HttpClient client;
42     private int port0, port1;
43     private SynchWriteMultiThreadsTest parent;
44     private List JavaDoc errors;
45
46     public Driver(SynchWriteMultiThreadsTest parent, int port0, int port1, List JavaDoc errors) {
47       client = HttpUtil.createHttpClient();
48       this.parent = parent;
49       this.port0 = port0;
50       this.port1 = port1;
51       this.errors = errors;
52     }
53
54     public void run() {
55       try {
56         URL JavaDoc url0 = parent.createUrl(port0, "server=0&command=ping");
57         assertEquals("Send ping", "OK", hit(url0, client));
58         URL JavaDoc url1 = parent.createUrl(port1, "server=1&command=ping");
59         assertEquals("Receive pong", "OK", hit(url1, client));
60         generateTransactionRequests();
61       } catch (Throwable JavaDoc e) {
62         errors.add(e);
63         throw new RuntimeException JavaDoc(e);
64       }
65     }
66
67     private void generateTransactionRequests() throws Exception JavaDoc {
68       for (int i = 0; i < INTENSITY; i++) {
69         URL JavaDoc url0 = parent.createUrl(port0, "server=0&command=insert&data=" + i);
70         assertEquals("Send data", "OK", hit(url0, client));
71       }
72     }
73
74     public void validate() throws Exception JavaDoc {
75       URL JavaDoc url1 = parent.createUrl(port1, "server=1&command=query&data=0");
76       assertEquals("Query 0", "0", hit(url1, client));
77       url1 = parent.createUrl(port1, "server=1&command=query&data=" + (INTENSITY - 1));
78       assertEquals("Query last attr", "" + (INTENSITY - 1), hit(url1, client));
79     }
80   }
81
82   public URL JavaDoc createUrl(int port, String JavaDoc query) throws MalformedURLException JavaDoc {
83     return super.createUrl(port, SynchWriteMultiThreadsTest.DsoPingPongServlet.class, query);
84   }
85   
86   private static String JavaDoc hit(URL JavaDoc url, HttpClient client) throws Exception JavaDoc {
87     String JavaDoc response = "";
88     try {
89       response = HttpUtil.getResponseBody(url, client);
90     } catch (Throwable JavaDoc e) {
91       Thread.sleep(2000);
92       response = HttpUtil.getResponseBody(url, client);
93     }
94     
95     return response;
96   }
97
98   public final void testSessions() throws Exception JavaDoc {
99
100     this.setSynchronousWrite(true);
101     this.startDsoServer();
102
103     int port0 = startAppServer(true).serverPort();
104     int port1 = startAppServer(true).serverPort();
105
106     List JavaDoc errors = Collections.synchronizedList(new ArrayList JavaDoc());
107     // start all drivers
108
Driver[] drivers = new Driver[NUM_OF_DRIVERS];
109     for (int i = 0; i < NUM_OF_DRIVERS; i++) {
110       drivers[i] = new Driver(this, port0, port1, errors);
111       drivers[i].start();
112     }
113
114     // wait for all of them to finish
115
for (int i = 0; i < NUM_OF_DRIVERS; i++) {
116       drivers[i].join();
117     }
118
119     // proceed only if there are no errors inside any threads
120
if (errors.size() == 0) {
121       // send kill signal to server0
122
killServer0(port0);
123
124       // validate data on server1
125
for (int i = 0; i < NUM_OF_DRIVERS; i++) {
126         drivers[i].validate();
127       }
128     } else {
129       Assert.failure("Exception found in driver thread. ", (Throwable JavaDoc) errors.get(0));
130     }
131   }
132
133   private void killServer0(int port0) {
134     try {
135       URL JavaDoc url0 = createUrl(port0, "server=0&command=kill");
136       assertEquals("OK", hit(url0, HttpUtil.createHttpClient()));
137     } catch (Throwable JavaDoc e) {
138       // expected
139
System.err.println("Caught exception from kill server0");
140     }
141   }
142
143   public static final class DsoPingPongServlet extends HttpServlet JavaDoc {
144     public void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response) throws IOException JavaDoc {
145       HttpSession JavaDoc session = request.getSession(true);
146       response.setContentType("text/html");
147       PrintWriter JavaDoc out = response.getWriter();
148
149       String JavaDoc server = request.getParameter("server");
150       String JavaDoc command = request.getParameter("command");
151       String JavaDoc data = request.getParameter("data");
152
153       switch (Integer.parseInt(server)) {
154         case 0:
155           handleServer0(session, out, command, data);
156           break;
157         case 1:
158           handleServer1(session, out, command, data);
159           break;
160         default:
161           out.print("unknown value for server param: " + server);
162       }
163       out.flush();
164     }
165
166     private void handleServer0(HttpSession JavaDoc session, PrintWriter JavaDoc out, String JavaDoc command, String JavaDoc data) {
167       if (command.equals("ping")) {
168         session.setAttribute("ping", "pong");
169         out.println("OK");
170       } else if (command.equals("insert")) {
171         session.setAttribute("data" + data, data + "");
172         out.println("OK");
173       } else if (command.equals("kill")) {
174         out.println("OK");
175         System.err.println("Execute order 66... halt.");
176         System.err.flush();
177         Runtime.getRuntime().halt(1);
178       }
179     }
180
181     private void handleServer1(HttpSession JavaDoc session, PrintWriter JavaDoc out, String JavaDoc command, String JavaDoc data) {
182       if (command.equals("ping")) {
183         String JavaDoc ping = (String JavaDoc) session.getAttribute("ping");
184         if (ping == null) {
185           out.println("ping is null");
186         } else out.println("OK");
187       } else if (command.equals("query")) {
188
189         String JavaDoc log = "** " + new SimpleDateFormat JavaDoc("HH:mm:ss").format(new Date JavaDoc()) + " | sessionId="
190                      + session.getId().substring(0, 5) + " | command=" + command + " | data=" + data;
191
192         String JavaDoc queried_data = (String JavaDoc) session.getAttribute("data" + data);
193         if (queried_data == null) {
194           out.println("data" + data + " is null");
195         } else out.println(queried_data);
196
197         System.err.println(log + "## found=" + queried_data);
198         System.err.flush();
199       }
200     }
201   }
202 }
203
Popular Tags