001: /*
002: * ====================================================================
003: * JAFFA - Java Application Framework For All
004: *
005: * Copyright (C) 2002 JAFFA Development Group
006: *
007: * This library is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU Lesser General Public
009: * License as published by the Free Software Foundation; either
010: * version 2.1 of the License, or (at your option) any later version.
011: *
012: * This library is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this library; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020: *
021: * Redistribution and use of this software and associated documentation ("Software"),
022: * with or without modification, are permitted provided that the following conditions are met:
023: * 1. Redistributions of source code must retain copyright statements and notices.
024: * Redistributions must also contain a copy of this document.
025: * 2. Redistributions in binary form must reproduce the above copyright notice,
026: * this list of conditions and the following disclaimer in the documentation
027: * and/or other materials provided with the distribution.
028: * 3. The name "JAFFA" must not be used to endorse or promote products derived from
029: * this Software without prior written permission. For written permission,
030: * please contact mail to: jaffagroup@yahoo.com.
031: * 4. Products derived from this Software may not be called "JAFFA" nor may "JAFFA"
032: * appear in their names without prior written permission.
033: * 5. Due credit should be given to the JAFFA Project (http://jaffa.sourceforge.net).
034: *
035: * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
036: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
037: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
038: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
039: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
040: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
041: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
042: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
043: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
044: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
045: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
046: * SUCH DAMAGE.
047: * ====================================================================
048: */
049: /*
050: * AppBuilder.java
051: *
052: * Created on March 30, 2003, 1:57 PM
053: */
054:
055: package org.jaffa.tools.loadtest;
056:
057: import com.meterware.httpunit.WebConversation;
058: import com.meterware.httpunit.WebResponse;
059: import java.io.File;
060: import java.io.FileWriter;
061: import java.io.IOException;
062: import java.io.Writer;
063: import java.math.BigInteger;
064: import java.net.MalformedURLException;
065: import java.util.Calendar;
066: import java.util.Iterator;
067: import java.util.List;
068: import javax.xml.bind.JAXBContext;
069: import javax.xml.bind.UnmarshalException;
070: import javax.xml.bind.Unmarshaller;
071: import org.apache.log4j.Logger;
072: import org.jaffa.tools.loadtest.domain.*;
073: import org.jaffa.tools.loadtest.domain.User;
074: import org.jaffa.util.XmlHelper;
075:
076: /** This utitity is used for executing load tests based on exsiting unit test cases
077: *
078: * @author PaulE, MaheshD
079: * @version 1.0
080: */
081: public class LoadTester {
082:
083: /** Set up Logging for Log4J */
084: private static Logger log = Logger.getLogger(LoadTester.class);
085:
086: private LoadTesting m_settings = null;
087:
088: /** Creates a new instance of AppBuilder
089: * @param name The name of the config file that describes how to build the application
090: */
091: public LoadTester(String name) {
092: m_settings = loadSettings(name);
093: if (m_settings == null)
094: throw new RuntimeException("Can't Start LoadTetster!");
095: }
096:
097: /** Invokes the start of the pattern generation process
098: */
099: private LoadTesting loadSettings(String name) {
100: try {
101: // create a JAXBContext capable of handling classes generated into the package
102: JAXBContext jc = JAXBContext
103: .newInstance("org.jaffa.tools.loadtest.domain");
104: // create an Unmarshaller
105: Unmarshaller u = jc.createUnmarshaller();
106: // enable validation
107: u.setValidating(true);
108: // unmarshal a document into a tree of Java content objects composed of classes from the package.
109: return (LoadTesting) u.unmarshal(XmlHelper
110: .stripDoctypeDeclaration((new File(name)).toURL()));
111:
112: } catch (MalformedURLException e) {
113: log.error("Can't load file - " + name + ", Bad URL");
114: } catch (UnmarshalException e) {
115: log.error("Invalid XML. File - " + name, e);
116: } catch (Exception e) {
117: log.error("Unknown Error! Can't load file - " + name, e);
118: }
119: return null;
120: }
121:
122: /** Main method to run all the tests based on the settings file.
123: */
124: public void runTests() {
125: log.info("Starting Tests");
126: for (Iterator it = m_settings.getTestSet().iterator(); it
127: .hasNext();) {
128: TestSet ts = (TestSet) it.next();
129: runTestSet(ts);
130: }
131: log.info("Ended Tests");
132: }
133:
134: /** Initializes the RunTestSet and then calls the thread's start method.
135: * It invokes the run method defined in RunTestSet
136: * @param testSet TestSet object which contains all the parameters required to run the Load Test*/
137: public void runTestSet(TestSet testSet) {
138: log.info("Running Test Set - " + testSet.getName());
139: int threadCount = 0;
140: int noOfThreads = testSet.getThreads().intValue();
141: String fileName = testSet.getOutputDir() + "/"
142: + testSet.getName() + ".csv";
143: TestResultLogger resultLog = new TestResultLogger(testSet
144: .getLogOn().getWebappRoot(), fileName);
145:
146: while (noOfThreads != 0) {
147: RunTestSet runtest = new RunTestSet(testSet, ++threadCount,
148: resultLog);
149: runtest.start();
150: --noOfThreads;
151: }
152: }
153:
154: /** Command line entry point for the utility
155: *
156: * @param args The command line arguments.
157: * Must supply the following ...
158: * [0] = Location of Load Testing XML Descriptor
159: */
160: public static void main(String[] args) {
161: org.apache.log4j.BasicConfigurator.configure();
162:
163: // this is just for local testing....TO BE REMOVED...
164: //args = new String[] { ClassLoader.getSystemResource("org/jaffa/tools/loadtest/domain/example.xml").getPath() };
165:
166: if (args == null || args.length != 1) {
167: System.out.println("Must supply the following parameters");
168: System.out
169: .println(" [0] = Location of Load Testing XML Descriptor");
170: System.exit(-1);
171: }
172:
173: log.debug("XML Descriptor = " + args[0]);
174:
175: LoadTester lt = new LoadTester(args[0]);
176:
177: lt.runTests();
178:
179: }
180:
181: }
|