1 package com.eviware.soapui.impl.wsdl.testcase;
2
3 import java.util.ArrayList;
4 import java.util.HashSet;
5 import java.util.List;
6 import java.util.Set;
7
8 import com.eviware.soapui.SoapUI;
9 import com.eviware.soapui.model.support.TestRunListenerAdapter;
10 import com.eviware.soapui.model.testsuite.TestCase;
11 import com.eviware.soapui.model.testsuite.TestRunContext;
12 import com.eviware.soapui.model.testsuite.TestRunner;
13 import com.eviware.soapui.model.testsuite.TestSuite.TestSuiteRunType;
14 import com.eviware.soapui.support.types.StringToObjectMap;
15
16 public class WsdlTestScenario implements Runnable
17 {
18 private boolean canceled;
19 private List<TestRunner> runners = new ArrayList<TestRunner>();
20 private InternalTestRunListener internalTestRunListener = new InternalTestRunListener();
21 private StringToObjectMap context;
22 private List<TestCase> testCaseList = new ArrayList<TestCase>();
23 private TestSuiteRunType runType;
24 private boolean skipTestCasesWithRunningLoadTest = true;
25 private boolean abortOnFail = false;
26 private Set<TestScenarioListener> listeners = new HashSet<TestScenarioListener>();
27
28 public WsdlTestScenario( TestSuiteRunType runType )
29 {
30 this.runType = runType;
31 }
32
33 public void cancel()
34 {
35 canceled = true;
36
37 for( TestRunner runner : runners )
38 {
39 runner.cancel( "Canceled from TestSuite" );
40 }
41 }
42
43 public void addTestCase( TestCase testCase )
44 {
45 testCaseList.add( testCase );
46 }
47
48 public void run()
49 {
50 canceled = false;
51 beforeRun();
52
53 try
54 {
55 context = new StringToObjectMap();
56
57 for( int c = 0; c < testCaseList.size(); c++ )
58 {
59 TestCase testCase = testCaseList.get( c );
60 if( testCase.isDisabled() ||
61 (skipTestCasesWithRunningLoadTest && SoapUI.getTestMonitor().hasRunningLoadTest( testCase ) ))
62 {
63 continue;
64 }
65
66 if( runType == TestSuiteRunType.PARALLEL )
67 {
68 testCase.addTestRunListener( internalTestRunListener );
69 }
70
71 beforeTestCase( testCase );
72
73 TestRunner runner = testCase.run( context, true );
74 runners.add( runner );
75
76 if( runType == TestSuiteRunType.SEQUENTIAL )
77 {
78 runner.waitUntilFinished();
79 afterTestCase( testCase, runner );
80 runners.remove( runner );
81
82 if( abortOnFail && runner.getStatus() == TestRunner.Status.FAILED )
83 break;
84 }
85
86 if( canceled )
87 break;
88 }
89 }
90 catch( Exception e )
91 {
92 SoapUI.logError( e );
93 }
94 finally
95 {
96 if( runners.isEmpty() )
97 afterRun();
98 }
99 }
100
101 protected void afterTestCase( TestCase testCase, TestRunner runner )
102 {
103 for( TestScenarioListener listener : listeners.toArray( new TestScenarioListener[listeners.size()] ))
104 {
105 listener.afterTestCase( testCase, runner );
106 }
107 }
108
109 protected void beforeTestCase( TestCase testCase )
110 {
111 for( TestScenarioListener listener : listeners.toArray( new TestScenarioListener[listeners.size()] ))
112 {
113 listener.beforeTestCase( testCase );
114 }
115 }
116
117 protected void beforeRun()
118 {
119 for( TestScenarioListener listener : listeners.toArray( new TestScenarioListener[listeners.size()] ))
120 {
121 listener.beforeRun();
122 }
123 }
124
125 protected void afterRun()
126 {
127 for( TestScenarioListener listener : listeners.toArray( new TestScenarioListener[listeners.size()] ))
128 {
129 listener.afterRun();
130 }
131 }
132
133 /***
134 * Waits for running tests to finish when running in parallel
135 */
136
137 private class InternalTestRunListener extends TestRunListenerAdapter
138 {
139 public void afterRun( TestRunner testRunner, TestRunContext runContext )
140 {
141 runners.remove( testRunner );
142
143 WsdlTestCase testCase = ( WsdlTestCase ) testRunner.getTestCase();
144
145 testRunner.getTestCase().removeTestRunListener( this );
146 afterTestCase( testCase, testRunner );
147
148 if( runners.isEmpty() )
149 WsdlTestScenario.this.afterRun();
150
151 if( testRunner.getStatus() == TestRunner.Status.FAILED )
152 {
153 testCaseFailed( testCase );
154
155 if( abortOnFail && !canceled )
156 cancel();
157 }
158 }
159 }
160
161 public void testCaseFailed( WsdlTestCase testCase )
162 {
163 }
164
165 public boolean isAbortOnFail()
166 {
167 return abortOnFail;
168 }
169
170 public void setAbortOnFail( boolean abortOnFail )
171 {
172 this.abortOnFail = abortOnFail;
173 }
174
175 public TestSuiteRunType getRunType()
176 {
177 return runType;
178 }
179
180 public void setRunType( TestSuiteRunType runType )
181 {
182 this.runType = runType;
183 }
184
185 public boolean isSkipTestCasesWithRunningLoadTest()
186 {
187 return skipTestCasesWithRunningLoadTest;
188 }
189
190 public void setSkipTestCasesWithRunningLoadTest( boolean skipTestCasesWithRunningLoadTest )
191 {
192 this.skipTestCasesWithRunningLoadTest = skipTestCasesWithRunningLoadTest;
193 }
194
195 public boolean isCanceled()
196 {
197 return canceled;
198 }
199
200 public List<TestRunner> getRunners()
201 {
202 return runners;
203 }
204
205 public void addTestScenarioListener( TestScenarioListener listener )
206 {
207 listeners.add( listener );
208 }
209
210 public void removeTestScenarioListener( TestScenarioListener listener )
211 {
212 listeners.remove( listener );
213 }
214
215 protected List<TestCase> getTestCaseList()
216 {
217 return testCaseList;
218 }
219
220 public int getTestCaseCount()
221 {
222 return testCaseList.size();
223 }
224
225 public TestCase getTestCaseAt( int index )
226 {
227 return testCaseList.get( index );
228 }
229
230 public void removeTestCase( TestCase testCase )
231 {
232 testCaseList.remove( testCase );
233 }
234
235 public void removeAllTestCases()
236 {
237 testCaseList.clear();
238 }
239 }