001: package org.testng.remote;
002:
003: import java.util.ArrayList;
004: import java.util.Collection;
005: import java.util.List;
006: import java.util.Properties;
007:
008: import org.testng.ISuite;
009: import org.testng.ISuiteResult;
010: import org.testng.ITestListener;
011: import org.testng.ITestResult;
012: import org.testng.SuiteRunner;
013: import org.testng.TestNGException;
014: import org.testng.internal.Invoker;
015: import org.testng.internal.PropertiesFile;
016: import org.testng.internal.annotations.IAnnotationFinder;
017: import org.testng.remote.adapter.DefaultMastertAdapter;
018: import org.testng.remote.adapter.IMasterAdapter;
019: import org.testng.remote.adapter.RemoteResultListener;
020: import org.testng.xml.XmlSuite;
021: import org.testng.xml.XmlTest;
022:
023: /**
024: * Dispatches test suits according to the strategy defined.
025: *
026: *
027: * @author Guy Korland
028: * @date April 20, 2007
029: */
030: public class SuiteDispatcher {
031: /**
032: * Properties allowed in remote.properties
033: */
034: public static final String MASTER_STRATEGY = "testng.master.strategy";
035: public static final String VERBOSE = "testng.verbose";
036: public static final String MASTER_ADPATER = "testng.master.adpter";
037:
038: /**
039: * Values allowed for STRATEGY
040: */
041: public static final String STRATEGY_TEST = "test";
042: public static final String STRATEGY_SUITE = "suite";
043:
044: final private int m_verbose;
045: final private boolean m_isStrategyTest;
046:
047: final private IMasterAdapter m_masterAdpter;
048:
049: /**
050: * Creates a new suite dispatcher.
051: *
052: * @param propertiesFile
053: * @throws Exception
054: */
055: public SuiteDispatcher(String propertiesFile)
056: throws TestNGException {
057: try {
058: PropertiesFile file = new PropertiesFile(propertiesFile);
059: Properties properties = file.getProperties();
060:
061: m_verbose = Integer.parseInt(properties.getProperty(
062: VERBOSE, "1"));
063:
064: String strategy = properties.getProperty(MASTER_STRATEGY,
065: STRATEGY_SUITE);
066: m_isStrategyTest = STRATEGY_TEST.equalsIgnoreCase(strategy);
067:
068: String adapter = properties.getProperty(MASTER_ADPATER);
069: if (adapter == null) {
070: m_masterAdpter = new DefaultMastertAdapter();
071: } else {
072: Class clazz = Class.forName(adapter);
073: m_masterAdpter = (IMasterAdapter) clazz.newInstance();
074: }
075: m_masterAdpter.init(properties);
076: } catch (Exception e) {
077: throw new TestNGException("Fail to initialize master mode",
078: e);
079: }
080: }
081:
082: /**
083: * Dispatch test suites
084: * @param suites
085: * @param outputDir
086: * @param javadocAnnotationFinder
087: * @param jdkAnnotationFinder
088: * @param testListeners
089: * @return suites result
090: */
091: public List<ISuite> dispatch(List<XmlSuite> suites,
092: String outputDir,
093: IAnnotationFinder javadocAnnotationFinder,
094: IAnnotationFinder jdkAnnotationFinder,
095: List<ITestListener> testListeners) {
096: List<ISuite> result = new ArrayList<ISuite>();
097: try {
098: //
099: // Dispatch the suites/tests
100: //
101:
102: for (XmlSuite suite : suites) {
103: suite.setVerbose(m_verbose);
104: SuiteRunner suiteRunner = new SuiteRunner(suite,
105: outputDir, new IAnnotationFinder[] {
106: javadocAnnotationFinder,
107: jdkAnnotationFinder });
108: RemoteResultListener listener = new RemoteResultListener(
109: suiteRunner);
110: if (m_isStrategyTest) {
111: for (XmlTest test : suite.getTests()) {
112: XmlSuite tmpSuite = new XmlSuite();
113: tmpSuite.setXmlPackages(suite.getXmlPackages());
114: tmpSuite.setAnnotations(suite.getAnnotations());
115: tmpSuite.setJUnit(suite.isJUnit());
116: tmpSuite.setSkipFailedInvocationCounts(suite
117: .skipFailedInvocationCounts());
118: tmpSuite.setName("Temporary suite for "
119: + test.getName());
120: tmpSuite.setParallel(suite.getParallel());
121: tmpSuite.setParameters(suite.getParameters());
122: tmpSuite.setThreadCount(suite.getThreadCount());
123: tmpSuite.setVerbose(suite.getVerbose());
124: tmpSuite.setObjectFactory(suite
125: .getObjectFactory());
126: XmlTest tmpTest = new XmlTest(tmpSuite);
127: tmpTest.setAnnotations(test.getAnnotations());
128: tmpTest.setBeanShellExpression(test
129: .getExpression());
130: tmpTest.setXmlClasses(test.getXmlClasses());
131: tmpTest.setExcludedGroups(test
132: .getExcludedGroups());
133: tmpTest.setIncludedGroups(test
134: .getIncludedGroups());
135: tmpTest.setJUnit(test.isJUnit());
136: tmpTest.setMethodSelectors(test
137: .getMethodSelectors());
138: tmpTest.setName(test.getName());
139: tmpTest.setParallel(test.getParallel());
140: tmpTest.setParameters(test.getParameters());
141: tmpTest.setVerbose(test.getVerbose());
142: tmpTest.setXmlClasses(test.getXmlClasses());
143: tmpTest.setXmlPackages(test.getXmlPackages());
144:
145: m_masterAdpter.runSuitesRemotely(tmpSuite,
146: listener);
147: }
148: } else {
149: m_masterAdpter.runSuitesRemotely(suite, listener);
150: }
151: result.add(suiteRunner);
152: }
153:
154: m_masterAdpter.awaitTermination(100000);
155:
156: //
157: // Run test listeners
158: //
159: for (ISuite suite : result) {
160: for (ISuiteResult suiteResult : suite.getResults()
161: .values()) {
162: Collection<ITestResult> allTests[] = new Collection[] {
163: suiteResult.getTestContext()
164: .getPassedTests().getAllResults(),
165: suiteResult.getTestContext()
166: .getFailedTests().getAllResults(),
167: suiteResult.getTestContext()
168: .getSkippedTests().getAllResults(),
169: suiteResult
170: .getTestContext()
171: .getFailedButWithinSuccessPercentageTests()
172: .getAllResults(), };
173: for (Collection<ITestResult> all : allTests) {
174: for (ITestResult tr : all) {
175: Invoker.runTestListeners(tr, testListeners);
176: }
177: }
178: }
179: }
180: } catch (Exception ex) {
181: //TODO add to logs
182: ex.printStackTrace();
183: }
184: return result;
185: }
186: }
|