1 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 ; 14 import java.io.PrintWriter ; 15 import java.net.MalformedURLException ; 16 import java.net.URL ; 17 import java.text.SimpleDateFormat ; 18 import java.util.ArrayList ; 19 import java.util.Collections ; 20 import java.util.Date ; 21 import java.util.List ; 22 23 import javax.servlet.http.HttpServlet ; 24 import javax.servlet.http.HttpServletRequest ; 25 import javax.servlet.http.HttpServletResponse ; 26 import javax.servlet.http.HttpSession ; 27 28 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 } 39 40 private static class Driver extends Thread { 41 private HttpClient client; 42 private int port0, port1; 43 private SynchWriteMultiThreadsTest parent; 44 private List errors; 45 46 public Driver(SynchWriteMultiThreadsTest parent, int port0, int port1, List 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 url0 = parent.createUrl(port0, "server=0&command=ping"); 57 assertEquals("Send ping", "OK", hit(url0, client)); 58 URL url1 = parent.createUrl(port1, "server=1&command=ping"); 59 assertEquals("Receive pong", "OK", hit(url1, client)); 60 generateTransactionRequests(); 61 } catch (Throwable e) { 62 errors.add(e); 63 throw new RuntimeException (e); 64 } 65 } 66 67 private void generateTransactionRequests() throws Exception { 68 for (int i = 0; i < INTENSITY; i++) { 69 URL 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 { 75 URL 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 createUrl(int port, String query) throws MalformedURLException { 83 return super.createUrl(port, SynchWriteMultiThreadsTest.DsoPingPongServlet.class, query); 84 } 85 86 private static String hit(URL url, HttpClient client) throws Exception { 87 String response = ""; 88 try { 89 response = HttpUtil.getResponseBody(url, client); 90 } catch (Throwable 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 { 99 100 this.setSynchronousWrite(true); 101 this.startDsoServer(); 102 103 int port0 = startAppServer(true).serverPort(); 104 int port1 = startAppServer(true).serverPort(); 105 106 List errors = Collections.synchronizedList(new ArrayList ()); 107 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 for (int i = 0; i < NUM_OF_DRIVERS; i++) { 116 drivers[i].join(); 117 } 118 119 if (errors.size() == 0) { 121 killServer0(port0); 123 124 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 ) errors.get(0)); 130 } 131 } 132 133 private void killServer0(int port0) { 134 try { 135 URL url0 = createUrl(port0, "server=0&command=kill"); 136 assertEquals("OK", hit(url0, HttpUtil.createHttpClient())); 137 } catch (Throwable e) { 138 System.err.println("Caught exception from kill server0"); 140 } 141 } 142 143 public static final class DsoPingPongServlet extends HttpServlet { 144 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 145 HttpSession session = request.getSession(true); 146 response.setContentType("text/html"); 147 PrintWriter out = response.getWriter(); 148 149 String server = request.getParameter("server"); 150 String command = request.getParameter("command"); 151 String 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 session, PrintWriter out, String command, String 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 session, PrintWriter out, String command, String data) { 182 if (command.equals("ping")) { 183 String ping = (String ) 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 log = "** " + new SimpleDateFormat ("HH:mm:ss").format(new Date ()) + " | sessionId=" 190 + session.getId().substring(0, 5) + " | command=" + command + " | data=" + data; 191 192 String queried_data = (String ) 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 |