• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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