1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.actions.iface.tools.soapui;
14
15 import java.io.File;
16 import java.io.IOException;
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.List;
20
21 import javax.swing.Action;
22
23 import org.apache.log4j.Logger;
24
25 import com.eviware.soapui.SoapUI;
26 import com.eviware.soapui.impl.wsdl.WsdlProject;
27 import com.eviware.soapui.impl.wsdl.WsdlTestSuite;
28 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.AbstractToolsAction;
29 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ArgumentBuilder;
30 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ProcessToolRunner;
31 import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.ToolHost;
32 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
33 import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
34 import com.eviware.soapui.model.iface.Interface;
35 import com.eviware.soapui.model.support.ModelSupport;
36 import com.eviware.soapui.model.testsuite.TestCase;
37 import com.eviware.soapui.model.testsuite.TestSuite;
38 import com.eviware.soapui.support.StringUtils;
39 import com.eviware.soapui.support.UISupport;
40 import com.eviware.soapui.support.types.StringToStringMap;
41 import com.eviware.x.form.XForm;
42 import com.eviware.x.form.XFormDialog;
43 import com.eviware.x.form.XFormDialogBuilder;
44 import com.eviware.x.form.XFormFactory;
45 import com.eviware.x.form.XFormField;
46 import com.eviware.x.form.XFormFieldListener;
47
48 /***
49 * Invokes soapUI TestRunner tool
50 *
51 * @author Ole.Matzura
52 */
53
54 public class TestRunnerAction extends AbstractToolsAction<WsdlProject>
55 {
56 private static final String ALL_VALUE = "<all>";
57 private static final String ENDPOINT = "Endpoint";
58 private static final String HOSTPORT = "Host:Port";
59 private static final String TESTSUITE = "TestSuite";
60 private static final String TESTCASE = "TestCase";
61 private static final String USERNAME = "Username";
62 private static final String PASSWORD = "Username";
63 private static final String WSSTYPE = "WSS Password Type";
64 private static final String DOMAIN = "Domain";
65 private static final String PRINTREPORT = "Print Report";
66 private static final String ROOTFOLDER = "Root Folder";
67 private static final String EXPORTJUNITRESULTS = "Export JUnit Results";
68 private static final String EXPORTALL = "Export All";
69 private static final String ENABLEUI = "Enable UI";
70 private static final String TESTRUNNERPATH = "TestRunner Path";
71 private static final String SAVEPROJECT = "Save Project";
72 private static final String ADDSETTINGS = "Add Settings";
73 private static final String OPEN_REPORT = "Open Report";
74
75 private XForm mainForm;
76 private final static Logger log = Logger.getLogger(TestRunnerAction.class);
77 public static final String SOAPUI_ACTION_ID = "TestRunnerAction";
78 private XForm advForm;
79 private List<TestSuite> testSuites;
80
81 public TestRunnerAction()
82 {
83 super( "Launch TestRunner", "Launch command-line TestRunner for this project");
84 }
85
86 protected XFormDialog buildDialog( WsdlProject modelItem)
87 {
88 if( modelItem == null )
89 return null;
90
91 XFormDialogBuilder builder = XFormFactory.createDialogBuilder("Launch TestRunner");
92
93 mainForm = builder.createForm( "Basic" );
94 mainForm.addComboBox( TESTSUITE, new String[] {}, "The TestSuite to run" ).addFormFieldListener( new XFormFieldListener() {
95
96 public void valueChanged( XFormField sourceField, String newValue, String oldValue )
97 {
98 List<String> testCases = new ArrayList<String>();
99 String tc = mainForm.getComponentValue( TESTCASE );
100
101 if( newValue.equals( ALL_VALUE ))
102 {
103 for( TestSuite testSuite : testSuites )
104 {
105 for( TestCase testCase : testSuite.getTestCaseList() )
106 {
107 if( !testCases.contains( testCase.getName() ))
108 testCases.add( testCase.getName() );
109 }
110 }
111 }
112 else
113 {
114 TestSuite testSuite = getModelItem().getTestSuiteByName( newValue );
115 if( testSuite != null )
116 testCases.addAll( Arrays.asList( ModelSupport.getNames( testSuite.getTestCaseList() ) ));
117 }
118
119 testCases.add( 0, ALL_VALUE );
120 mainForm.setOptions( TESTCASE, testCases.toArray() );
121
122 if( testCases.contains( tc ))
123 {
124 mainForm.getFormField( TESTCASE ).setValue( tc );
125 }
126 }} );
127
128 mainForm.addComboBox( TESTCASE, new String[] {}, "The TestCase to run" );
129 mainForm.addSeparator();
130 mainForm.addCheckBox( PRINTREPORT, "Prints a summary report to the console" );
131 mainForm.addCheckBox( EXPORTJUNITRESULTS, "Exports results to a JUnit-Style report" );
132 mainForm.addCheckBox( EXPORTALL, "Exports all results (not only errors)" );
133 mainForm.addTextField( ROOTFOLDER, "Folder to export to", XForm.FieldType.FOLDER );
134 mainForm.addCheckBox( OPEN_REPORT, "Open generated HTML report in browser (soapUI Pro only)" );
135 mainForm.addSeparator();
136 mainForm.addCheckBox( ENABLEUI, "Enables UI components in scripts" );
137 mainForm.addTextField( TESTRUNNERPATH, "Folder containing TestRunner.bat to use", XForm.FieldType.FOLDER );
138 mainForm.addCheckBox( SAVEPROJECT, "Saves project before running" );
139 mainForm.addCheckBox( ADDSETTINGS, "Adds global settings to command-line" );
140
141 advForm = builder.createForm( "Overrides" );
142 advForm.addComboBox( ENDPOINT, new String[] {""}, "endpoint to forward to" );
143 advForm.addTextField( HOSTPORT, "Host:Port to use for requests", XForm.FieldType.TEXT );
144 advForm.addSeparator();
145 advForm.addTextField( USERNAME, "The username to set for all requests", XForm.FieldType.TEXT );
146 advForm.addTextField( PASSWORD, "The password to set for all requests", XForm.FieldType.PASSWORD );
147 advForm.addTextField( DOMAIN, "The domain to set for all requests", XForm.FieldType.TEXT );
148 advForm.addComboBox( WSSTYPE, new String[] {"", "Text", "Digest"},
149 "The username to set for all requests" );
150
151 setToolsSettingsAction( null );
152 buildArgsForm( builder, false, "TestRunner" );
153
154 return builder.buildDialog( buildDefaultActions(HelpUrls.TESTRUNNER_HELP_URL, modelItem),
155 "Specify arguments for launching soapUI TestRunner", UISupport.TOOL_ICON );
156 }
157
158 protected Action createRunOption( WsdlProject modelItem)
159 {
160 Action action = super.createRunOption( modelItem );
161 action.putValue( Action.NAME, "Launch" );
162 return action;
163 }
164
165 protected StringToStringMap initValues(WsdlProject modelItem, Object param)
166 {
167 if( modelItem != null && mainForm != null )
168 {
169 List<String> endpoints = new ArrayList<String>();
170
171 for( Interface iface : modelItem.getInterfaces())
172 {
173 for( String endpoint : iface.getEndpoints() )
174 {
175 if( !endpoints.contains( endpoint ))
176 endpoints.add( endpoint );
177 }
178 }
179
180 endpoints.add( 0, null );
181 advForm.setOptions( ENDPOINT, endpoints.toArray() );
182
183 testSuites = modelItem.getTestSuites();
184 for( int c = 0; c < testSuites.size(); c++ )
185 {
186 if( testSuites.get( c ).getTestCaseCount() == 0 )
187 {
188 testSuites.remove( c );
189 c--;
190 }
191 }
192
193 mainForm.setOptions( TESTSUITE, ModelSupport.getNames( new String[]{ALL_VALUE}, testSuites ) );
194
195 List<String> testCases = new ArrayList<String>();
196
197 for( TestSuite testSuite : testSuites )
198 {
199 for( TestCase testCase : testSuite.getTestCaseList() )
200 {
201 if( !testCases.contains( testCase.getName() ))
202 testCases.add( testCase.getName() );
203 }
204 }
205
206 testCases.add( 0, ALL_VALUE );
207 mainForm.setOptions( TESTCASE, testCases.toArray() );
208 }
209 else if( mainForm != null )
210 {
211 mainForm.setOptions( ENDPOINT, new String[] { null } );
212 }
213
214 StringToStringMap values = super.initValues( modelItem, param );
215
216 if( mainForm != null )
217 {
218 if( param instanceof WsdlTestCase )
219 {
220 mainForm.getFormField( TESTSUITE ).setValue( ((WsdlTestCase)param).getTestSuite().getName() );
221 mainForm.getFormField( TESTCASE ).setValue( ((WsdlTestCase)param).getName() );
222
223 values.put( TESTSUITE, ((WsdlTestCase)param).getTestSuite().getName());
224 values.put( TESTCASE, ((WsdlTestCase)param).getName() );
225 }
226 else if( param instanceof WsdlTestSuite )
227 {
228 mainForm.getFormField( TESTSUITE ).setValue( ((WsdlTestSuite)param).getName() );
229 values.put( TESTSUITE, ((WsdlTestSuite)param).getName());
230 }
231 }
232
233 return values;
234 }
235
236 protected void generate(StringToStringMap values, ToolHost toolHost, WsdlProject modelItem ) throws Exception
237 {
238 String testRunnerDir = mainForm.getComponentValue( TESTRUNNERPATH );
239
240 ProcessBuilder builder = new ProcessBuilder();
241 ArgumentBuilder args = buildArgs(modelItem);
242 builder.command(args.getArgs());
243 if( StringUtils.isNullOrEmpty( testRunnerDir))
244 builder.directory(new File("."));
245 else
246 builder.directory(new File(testRunnerDir));
247
248 if( mainForm.getComponentValue( SAVEPROJECT ).equals( Boolean.TRUE.toString() ))
249 {
250 modelItem.save();
251 }
252
253 if( log.isDebugEnabled() )
254 log.debug( "Launching testrunner in directory [" + builder.directory() + "] with arguments [" +
255 args.toString() + "]" );
256
257 toolHost.run( new ProcessToolRunner( builder, "soapUI TestRunner", modelItem ));
258 }
259
260 private ArgumentBuilder buildArgs(WsdlProject modelItem) throws IOException
261 {
262 if( dialog == null )
263 {
264 ArgumentBuilder builder = new ArgumentBuilder( new StringToStringMap() );
265 builder.startScript( "testrunner", ".bat", ".sh" );
266 return builder;
267 }
268
269 StringToStringMap values = dialog.getValues();
270
271 ArgumentBuilder builder = new ArgumentBuilder( values );
272
273 builder.startScript( "testrunner", ".bat", ".sh" );
274
275 builder.addString( ENDPOINT, "-e", "" );
276 builder.addString( HOSTPORT, "-h", "" );
277
278 if( !values.get( TESTSUITE ).equals( ALL_VALUE ))
279 builder.addString( TESTSUITE, "-s", "" );
280
281 if( !values.get( TESTCASE ).equals( ALL_VALUE ))
282 builder.addString( TESTCASE, "-c", "" );
283
284 builder.addString( USERNAME, "-u", "" );
285 builder.addString( PASSWORD, "-p", "" );
286 builder.addString( DOMAIN, "-d", "" );
287 builder.addString( WSSTYPE, "-w", "" );
288
289 builder.addBoolean( PRINTREPORT, "-r" );
290 builder.addBoolean( EXPORTALL, "-a" );
291 builder.addBoolean( EXPORTJUNITRESULTS, "-j" );
292 builder.addString( ROOTFOLDER, "-f" );
293 builder.addBoolean( OPEN_REPORT, "-o" );
294
295 if( dialog.getBooleanValue( ADDSETTINGS ))
296 {
297 try
298 {
299 builder.addBoolean( ADDSETTINGS, "-t" + SoapUI.saveSettings() );
300 }
301 catch( Exception e )
302 {
303 SoapUI.logError( e );
304 }
305 }
306
307 builder.addBoolean( ENABLEUI, "-i" );
308 builder.addArgs( new String [] {modelItem.getPath()} );
309
310 addToolArgs( values, builder );
311
312 return builder;
313 }
314 }