View Javadoc

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 }