/****************************************************************
* Copyright (C) 2006 LAMS Foundation (http://lamsfoundation.org)
* =============================================================
* License Information: http://lamsfoundation.org/licensing/lams/2.0/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2.0
* as published by the Free Software Foundation.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
*
* http://www.gnu.org/licenses/gpl.txt
* ****************************************************************
*/
package org.lamsfoundation.testharness;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.apache.log4j.Logger;
/**
* @version
*
*
* View Source
*
*
* @author Fei Yang
*/
public abstract class AbstractTestManager {
private static final Logger log = Logger.getLogger(AbstractTestManager.class);
protected List testSuites = new LinkedList();
protected static final Integer MAX_USERNAME_LENGTH = 20;
protected CountDownLatch allDoneSignal;
/**
* This is where test manager initializes the test suites.
* Must set TestReport's reportFileName and reportFileTemplate here.
*/
protected abstract void init();
protected final void kickOff(){
init();
if(!TestReporter.initialized()){
throw new TestHarnessException("TestReport class is not initialized! It should be a bug in the AbstractTestManager implementation");
}
log.info(composeStartInfo());
for (int i = 0; i < testSuites.size(); i++) {
new Thread(testSuites.get(i),"TestSuite-"+testSuites.get(i).getSuiteIndex()).start();
}
if(testSuites.size()>0){
allDoneSignal = new CountDownLatch(testSuites.size());
try{
allDoneSignal.await();
}catch(InterruptedException e){
log.fatal(e.getMessage(), e);
//what to do?
}
}
log.info(composeEndInfo());
}
private String composeStartInfo() {
switch (testSuites.size()) {
case 0:
return "There is no test suite found on the list";
case 1:
return "Kicking off the test suite...";
default:
return "Kicking off the " + testSuites.size() + " test suites...";
}
}
private String composeEndInfo() {
switch (testSuites.size()) {
case 0:
return "So we can play the game now";
case 1:
if(countAborted()==0)
return "The only test suite is finished";
else
return "The only test suite aborted";
case 2:
switch(countAborted()){
case 0:
return "Both the test suites are finished";
case 1:
return "One test suite is finished, and the other aborted";
case 2:
return "Both the test suites aborted";
default:
return "Impossible! "+countAborted()+" out of "+testSuites.size()+" testSuites aborted!";
}
default:
if(countAborted() == 0)
return "All the test suites are finished";
else if(countAborted() == testSuites.size())
return "All the test suites aborted";
else{
int abortedCounter = countAborted();
int finishedCounter = testSuites.size()-countAborted();
return finishedCounter+" test suite"+(finishedCounter>1? "s are finished and " : " is finished and ")
+ abortedCounter + "test suite"+(abortedCounter>1? "s aborted":" aborted");
}
}
}
protected final void addTestSuite(TestSuite suite) {
testSuites.add(suite);
}
protected final int countAborted(){
int amount = 0;
for(TestSuite suite : testSuites){
if (!suite.isFinished())
amount++;
}
return amount;
}
}