/*
* This file is part of the WfMOpen project.
* Copyright (C) 2001-2003 Danet GmbH (www.danet.de), GS-AN.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: TypicalProcessTests.java 2550 2007-10-22 14:00:54Z $
*/
package load;
import java.util.HashMap;
import java.util.Map;
import javax.security.auth.login.LoginException;
import de.danet.an.util.junit.EJBClientTest;
import de.danet.an.util.junit.NamedTestGroup;
import com.clarkware.junitperf.ConstantTimer;
import com.clarkware.junitperf.LoadTest;
import common.STProjectLoginContext;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.log4j.Logger;
import load.TypicalProcessManager.InitialProcessDataAdapter;
/**
* This class generates base load for the workflow engine.
* Additionally a test suite for load test szenario with a running base load
* can be built.
*
* @author <a href="weidauer@danet.de">Christian Weidauer</a>
* @version $Revision: 2550 $
*/
public class TypicalProcessTests {
// base load parameters
private static final int BASELOAD_PROCESS_NUMBER = 500;
private static final int PROCESS_AVERAGE_DURATION = 60 * 60; // in s
private static final int WAIT_TIME
= (int) (0.1 * PROCESS_AVERAGE_DURATION); // in s
// test load parameters
private static final int USERS = 30;
private static final int ITERATIONS = 1;
private static final int PROCESSSTARTS_PER_SECOND = 2;
// dependend test load parameters
private static final int DELAYTIME
= (int) (1000 / PROCESSSTARTS_PER_SECOND); // in ms
// logger
private static final Logger logger
= Logger.getLogger(TypicalProcessTests.class);
private static STProjectLoginContext plc = null;
static {
try {
plc = new STProjectLoginContext();
plc.login();
} catch (LoginException e) {
throw new IllegalStateException (e.getMessage ());
}
}
/**
* Make this test suite.
* @return the test suite
*/
public static Test suite() throws Exception {
clearWorkflowEngine();
generateBaseLoad(BASELOAD_PROCESS_NUMBER, PROCESS_AVERAGE_DURATION);
System.out.println("waits for " + WAIT_TIME + " sec");
pause(WAIT_TIME * 1000);
System.out.println("starts test preparation");
//TypicalProcess tp1 = new TypicalProcess(PROCESS_AVERAGE_DURATION);
TypicalProcess tp2a
= new TypicalProcess(TypicalProcess.PATH1,
PROCESS_AVERAGE_DURATION / 4,
PROCESS_AVERAGE_DURATION / 4, 2);
/*
TypicalProcess tp2b
= new TypicalProcess(TypicalProcess.PATH2,
PROCESS_AVERAGE_DURATION / 3, 0, 3);
TypicalProcess tp3 = new TypicalProcess(PROCESS_AVERAGE_DURATION / 8,
PROCESS_AVERAGE_DURATION / 6,
6);
*/
TestSuite rootSuite = new TestSuite();
Map tg = new HashMap ();
TestSuite suite = new TestSuite();
tg.put("title",
"Create typical processes along different pathes and start them."
+ " Baseload: " + BASELOAD_PROCESS_NUMBER + " processes,"
+ " process starts per second: " + PROCESSSTARTS_PER_SECOND
+ ".");
//addTest(suite, "Create and Start Process along Path1",
// tp1.createInitStartTest());
addTest(suite, "Create and Start Process along Path2a",
tp2a.createInitStartTest());
/* addTest(suite, "Create and Start Process along Path2b",
tp2b.createInitStartTest());
addTest(suite, "Create and Start Process along Path3",
tp3.createInitStartTest());
*/
rootSuite.addTest(new NamedTestGroup (suite, "TestGroup", tg));
System.out.println("finished test preparation");
return new EJBClientTest (plc, rootSuite);
}
public static void generateBaseLoad(int processNumber,
int processAverageDuration)
throws Exception {
System.out.println("generates base load of "
+ BASELOAD_PROCESS_NUMBER
+ " processes of an average life time of "
+ processAverageDuration + " sec");
long startTime = System.currentTimeMillis();
// 10% processes with 5 active activities
generatePath1Processes((int) (processNumber * 0.1 * 0.5),
(int) (0.1 * processAverageDuration),
(int) (1.9 * processAverageDuration));
generatePath2Processes((int) (processNumber * 0.1 * 0.5),
TypicalProcess.PATH1,
(int) (0.2 * processAverageDuration / 2),
(int) (0.8 * processAverageDuration / 2),
(int) (0.5 * processAverageDuration / 2), 2);
// 40% processes with 8-10 active activities
generatePath3Processes((int) (processNumber * 0.4 * 0.3),
(int) (0.6 * processAverageDuration / 1),
(int) (1.4 * processAverageDuration / 1),
(int) (processAverageDuration / 5), 1);
generatePath2Processes((int) (processNumber * 0.4 * 0.3),
TypicalProcess.PATH1,
(int) (0.2 * processAverageDuration / 2),
(int) (0.8 * processAverageDuration / 2),
(int) (0.5 * processAverageDuration / 2), 2);
generatePath2Processes((int) (processNumber * 0.4 * 0.4),
TypicalProcess.PATH2,
(int) (0.2 * processAverageDuration / 2),
(int) (1.8 * processAverageDuration / 2),
(int) 0, 2);
// 40% processes with 21-22 active activities
generatePath3Processes((int) (processNumber * 0.4 * 0.3),
(int) (0.6 * processAverageDuration / 3),
(int) (1.4 * processAverageDuration / 3),
(int) (processAverageDuration / 5), 3);
generatePath2Processes((int) (processNumber * 0.4 * 0.3),
TypicalProcess.PATH1,
(int) (0.2 * processAverageDuration / 5),
(int) (0.8 * processAverageDuration / 5),
(int) (0.5 * processAverageDuration / 5), 5);
generatePath2Processes((int) (processNumber * 0.4 * 0.4),
TypicalProcess.PATH2,
(int) (0.2 * processAverageDuration / 4),
(int) (1.8 * processAverageDuration / 4),
(int) 0, 4);
// 10% processes with 29-31 active activities
generatePath3Processes((int) (processNumber * 0.1 * 0.4),
(int) (0.6 * processAverageDuration / 4),
(int) (1.4 * processAverageDuration / 4),
(int) (processAverageDuration / 10), 4);
generatePath2Processes((int) (processNumber * 0.1 * 0.3),
TypicalProcess.PATH1,
(int) (0.2 * processAverageDuration / 7),
(int) (0.8 * processAverageDuration / 7),
(int) (0.5 * processAverageDuration / 7), 7);
generatePath2Processes((int) (processNumber * 0.1 * 0.3),
TypicalProcess.PATH2,
(int) (0.2 * processAverageDuration / 6),
(int) (1.8 * processAverageDuration / 6),
(int) 0, 6);
long duration = System.currentTimeMillis() - startTime;
System.out.println("... took " + duration / 1000
+ " sec");
}
private static void pause(int milliSeconds) throws Exception {
Thread.currentThread().sleep(milliSeconds / 4);
System.out.println("... waited " + milliSeconds / 4000 + " sec.");
Thread.currentThread().sleep(milliSeconds / 4);
System.out.println("... waited " + milliSeconds / 2000 + " sec.");
Thread.currentThread().sleep(milliSeconds / 4);
System.out.println("... waited " + milliSeconds / 1333 + " sec.");
Thread.currentThread().sleep(milliSeconds / 4);
}
private static void generatePath1Processes(int number, int duration)
throws Exception {
TypicalProcessManager.STARTER
.generate(new TypicalProcess(duration), number);
}
private static void generatePath1Processes(int number, int durationFrom,
int durationTo)
throws Exception {
InitialProcessDataAdapter adapter
= TypicalProcessManager.STARTER.createAdapter
("BE1_3_Duration", durationFrom, durationTo);
TypicalProcessManager.STARTER
.generate(new TypicalProcess(0), number, adapter);
}
private static void generatePath2Processes(int number, String decision2,
int durationBE2_1,
int durationBE2_3_1,
int initialLoopCounter)
throws Exception {
TypicalProcessManager.STARTER
.generate(new TypicalProcess(decision2, durationBE2_1,
durationBE2_3_1, initialLoopCounter),
number);
}
private static void generatePath2Processes(int number, String decision2,
int durationBE2_1_From,
int durationBE2_1_To,
int durationBE2_3_1,
int initialLoopCounter)
throws Exception {
InitialProcessDataAdapter adapter
= TypicalProcessManager.STARTER.createAdapter
("BE2_1_Duration", durationBE2_1_From, durationBE2_1_To);
TypicalProcessManager.STARTER
.generate(new TypicalProcess(decision2, 0,
durationBE2_3_1, initialLoopCounter),
number, adapter);
}
private static void generatePath3Processes(int number,
int durationBE3_2_1,
int durationBE3_2_2,
int initialLoopCounter)
throws Exception {
TypicalProcessManager.STARTER
.generate(new TypicalProcess(durationBE3_2_1,
durationBE3_2_2, initialLoopCounter),
number);
}
private static void generatePath3Processes(int number,
int durationBE3_2_1_From,
int durationBE3_2_1_To,
int durationBE3_2_2,
int initialLoopCounter)
throws Exception {
InitialProcessDataAdapter adapter
= TypicalProcessManager.STARTER.createAdapter
("BE3_2_1_Duration", durationBE3_2_1_From, durationBE3_2_1_To);
TypicalProcessManager.STARTER
.generate(new TypicalProcess(0, durationBE3_2_2,
initialLoopCounter),
number, adapter);
}
private static void clearWorkflowEngine() throws Exception {
System.out.println("clears workflow engine");
GenericTest.closeAllCloseableProcesses();
GenericTest.waitForNoRunningProcesses();
GenericTest.removeAllProcesses();
}
private static void addTest (TestSuite parentSuite, String title,
Test testCase) {
TestSuite suite = new TestSuite ();
Map sas = new HashMap ();
sas.put ("users", new Integer(USERS));
suite.addTest
(new NamedTestGroup
(new LoadTest(testCase, USERS, ITERATIONS,
new ConstantTimer(DELAYTIME)),
"Samples", sas));
Map tt = new HashMap ();
tt.put ("title", title);
parentSuite.addTest (new NamedTestGroup(suite, "Test", tt));
}
}