1 package org.testng; 2 3 import org.testng.collections.Lists; 4 import org.testng.collections.Objects; 5 import org.testng.internal.SuiteRunnerMap; 6 import org.testng.internal.Utils; 7 import org.testng.internal.thread.graph.IWorker; 8 import org.testng.xml.XmlSuite; 9 10 import java.util.Collection; 11 import java.util.List; 12 import java.util.Map; 13 14 /** 15 * An {@code IWorker} that is used to encapsulate and run Suite Runners 16 * 17 * @author cbeust, nullin 18 */ 19 public class SuiteRunnerWorker implements IWorker<ISuite> { 20 21 private SuiteRunner m_suiteRunner; 22 private Integer m_verbose; 23 private String m_defaultSuiteName; 24 private SuiteRunnerMap m_suiteRunnerMap; 25 SuiteRunnerWorker(ISuite suiteRunner, SuiteRunnerMap suiteRunnerMap, int verbose, String defaultSuiteName)26 public SuiteRunnerWorker(ISuite suiteRunner, 27 SuiteRunnerMap suiteRunnerMap, 28 int verbose, 29 String defaultSuiteName) 30 { 31 m_suiteRunnerMap = suiteRunnerMap; 32 m_suiteRunner = (SuiteRunner) suiteRunner; 33 m_verbose = verbose; 34 m_defaultSuiteName = defaultSuiteName; 35 } 36 37 /** 38 * Runs a suite 39 * @param suiteRunnerMap map of suiteRunners that are updated with test results 40 * @param xmlSuite XML suites to run 41 */ runSuite(SuiteRunnerMap suiteRunnerMap , XmlSuite xmlSuite)42 private void runSuite(SuiteRunnerMap suiteRunnerMap /* OUT */, XmlSuite xmlSuite) 43 { 44 if (m_verbose > 0) { 45 StringBuffer allFiles = new StringBuffer(); 46 allFiles.append(" ").append(xmlSuite.getFileName() != null 47 ? xmlSuite.getFileName() : m_defaultSuiteName).append('\n'); 48 Utils.log("TestNG", 0, "Running:\n" + allFiles.toString()); 49 } 50 51 SuiteRunner suiteRunner = (SuiteRunner) suiteRunnerMap.get(xmlSuite); 52 suiteRunner.run(); 53 54 //TODO: this should be handled properly 55 // for (IReporter r : suiteRunner.getReporters()) { 56 // addListener(r); 57 // } 58 59 // PoolService.getInstance().shutdown(); 60 61 // 62 // Display the final statistics 63 // 64 if (xmlSuite.getVerbose() > 0) { 65 SuiteResultCounts counts = new SuiteResultCounts(); 66 synchronized (suiteRunnerMap) { 67 counts.calculateResultCounts(xmlSuite, suiteRunnerMap); 68 } 69 70 StringBuffer bufLog = new StringBuffer("\n===============================================\n") 71 .append(xmlSuite.getName()); 72 bufLog.append("\nTotal tests run: ") 73 .append(counts.m_total).append(", Failures: ").append(counts.m_failed) 74 .append(", Skips: ").append(counts.m_skipped); 75 if(counts.m_confFailures > 0 || counts.m_confSkips > 0) { 76 bufLog.append("\nConfiguration Failures: ").append(counts.m_confFailures) 77 .append(", Skips: ").append(counts.m_confSkips); 78 } 79 bufLog.append("\n===============================================\n"); 80 System.out.println(bufLog.toString()); 81 } 82 } 83 84 @Override run()85 public void run() { 86 runSuite(m_suiteRunnerMap, m_suiteRunner.getXmlSuite()); 87 } 88 89 @Override compareTo(IWorker<ISuite> arg0)90 public int compareTo(IWorker<ISuite> arg0) { 91 /* 92 * Dummy Implementation 93 * 94 * Used by IWorkers to prioritize execution in parallel. Not required by 95 * this Worker in current implementation 96 */ 97 return 0; 98 } 99 100 @Override getTasks()101 public List<ISuite> getTasks() { 102 List<ISuite> suiteRunnerList = Lists.newArrayList(); 103 suiteRunnerList.add(m_suiteRunner); 104 return suiteRunnerList; 105 } 106 107 @Override toString()108 public String toString() { 109 return Objects.toStringHelper(getClass()) 110 .add("name", m_suiteRunner.getName()) 111 .toString(); 112 } 113 114 @Override getTimeOut()115 public long getTimeOut() 116 { 117 return m_suiteRunner.getXmlSuite().getTimeOut(Long.MAX_VALUE); 118 } 119 120 @Override getPriority()121 public int getPriority() 122 { 123 // this class doesnt support priorities yet 124 return 0; 125 } 126 127 } 128 129 /** 130 * Class to help calculate result counts for tests run as part of a suite and 131 * its children suites 132 * 133 * @author nullin 134 * 135 */ 136 class SuiteResultCounts { 137 138 int m_total = 0; 139 int m_skipped = 0; 140 int m_failed = 0; 141 int m_confFailures = 0; 142 int m_confSkips = 0; 143 calculateResultCounts(XmlSuite xmlSuite, SuiteRunnerMap suiteRunnerMap)144 public void calculateResultCounts(XmlSuite xmlSuite, SuiteRunnerMap suiteRunnerMap) 145 { 146 ISuite iSuite = suiteRunnerMap.get(xmlSuite); 147 if (iSuite != null) { 148 Map<String, ISuiteResult> results = iSuite.getResults(); 149 if (results != null) { 150 Collection<ISuiteResult> tempSuiteResult = results.values(); 151 for (ISuiteResult isr : tempSuiteResult) { 152 ITestContext ctx = isr.getTestContext(); 153 int skipped = ctx.getSkippedTests().size(); 154 int failed = ctx.getFailedTests().size() + ctx.getFailedButWithinSuccessPercentageTests().size(); 155 m_skipped += skipped; 156 m_failed += failed; 157 m_confFailures += ctx.getFailedConfigurations().size(); 158 m_confSkips += ctx.getSkippedConfigurations().size(); 159 m_total += ctx.getPassedTests().size() + failed + skipped; 160 } 161 162 for (XmlSuite childSuite : xmlSuite.getChildSuites()) { 163 calculateResultCounts(childSuite, suiteRunnerMap); 164 } 165 } 166 } 167 } 168 } 169 170