/* * Copyright 2003-2006 Rick Knowles <winstone-devel at lists sourceforge net> * Distributed under the terms of either: * - the common development and distribution license (CDDL), v1.0; or * - the GNU Lesser General Public License, v2.1 or later */ package winstone.testCase.load; import java.io.IOException; import java.io.InputStream; import org.xml.sax.SAXException; import winstone.Logger; import winstone.WinstoneResourceBundle; import com.meterware.httpunit.GetMethodWebRequest; import com.meterware.httpunit.WebConversation; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; /** * A single worked thread in the load testing program * * @author <a href="mailto:rick_knowles@hotmail.com">Rick Knowles</a> * @version $Id: LoadTestThread.java,v 1.2 2006/02/28 07:32:49 rickknowles Exp $ */ public class LoadTestThread implements Runnable { private WinstoneResourceBundle resources; private String url; private long delayBeforeStarting; private LoadTest loadTest; private WebConversation webConv; private Thread thread; private boolean interrupted; private LoadTestThread next; public LoadTestThread(String url, LoadTest loadTest, WinstoneResourceBundle resources, WebConversation webConv, int delayedThreads) { this.resources = resources; this.url = url; this.loadTest = loadTest; this.webConv = webConv; this.delayBeforeStarting = 1000 * delayedThreads; this.interrupted = false; this.thread = new Thread(this); this.thread.setDaemon(true); this.thread.start(); // Launch the next second's getter if (delayedThreads > 0) this.next = new LoadTestThread(url, loadTest, resources, webConv, delayedThreads - 1); } public void run() { if (this.delayBeforeStarting > 0) try { Thread.sleep(this.delayBeforeStarting); } catch (InterruptedException err) { } long startTime = System.currentTimeMillis(); try { if (this.webConv == null) this.webConv = new WebConversation(); // Access the URL WebRequest wreq = new GetMethodWebRequest(this.url); WebResponse wresp = this.webConv.getResponse(wreq); int responseCode = wresp.getResponseCode(); if (responseCode >= 400) throw new IOException("Failed with status " + responseCode); InputStream inContent = wresp.getInputStream(); int contentLength = wresp.getContentLength(); byte content[] = new byte[contentLength == -1 ? 100 * 1024 : contentLength]; int position = 0; int value = inContent.read(); while ((value != -1) && (((contentLength >= 0) && (position < contentLength)) || (contentLength < 0))) { content[position++] = (byte) value; value = inContent.read(); } inContent.close(); // Confirm the result is the same size the content-length said it // was if ((position == contentLength) || (contentLength == -1)) { if (this.interrupted) return; this.loadTest.incTimeTotal(System.currentTimeMillis() - startTime); this.loadTest.incSuccessCount(); } else throw new IOException("Only downloaded " + position + " of " + contentLength + " bytes"); } catch (IOException err) { Logger.log(Logger.DEBUG, resources, "LoadTestThread.Error", err); } catch (SAXException err) { Logger.log(Logger.DEBUG, resources, "LoadTestThread.Error", err); } } public void destroy() { this.interrupted = true; this.thread.interrupt(); if (this.next != null) this.next.destroy(); } }