View Javadoc

    1   /*
    2    *  soapUI, copyright (C) 2004-2007 eviware.com
    3    *
    4    *  soapUI is free software; you can redistribute it and/or modify it under the
    5    *  terms of version 2.1 of the GNU Lesser General Public License as published by
    6    *  the Free Software Foundation.
    7    *
    8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
    9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    10   *  See the GNU Lesser General Public License for more details at gnu.org.
    11   */
    12
    13  package com.eviware.soapui.impl.wsdl.teststeps;
    14
    15  import java.beans.PropertyChangeEvent;
    16  import java.beans.PropertyChangeListener;
    17  import java.util.Iterator;
    18  import java.util.List;
    19
    20  import javax.swing.ImageIcon;
    21
    22  import com.eviware.soapui.SoapUI;
    23  import com.eviware.soapui.config.AttachmentConfig;
    24  import com.eviware.soapui.config.CallConfig;
    25  import com.eviware.soapui.config.RequestAssertionConfig;
    26  import com.eviware.soapui.impl.settings.XmlBeansSettingsImpl;
    27  import com.eviware.soapui.impl.wsdl.WsdlInterface;
    28  import com.eviware.soapui.impl.wsdl.WsdlOperation;
    29  import com.eviware.soapui.impl.wsdl.WsdlRequest;
    30  import com.eviware.soapui.impl.wsdl.submit.transports.http.WsdlResponse;
    31  import com.eviware.soapui.impl.wsdl.support.assertions.Assertable;
    32  import com.eviware.soapui.impl.wsdl.support.assertions.AssertionsListener;
    33  import com.eviware.soapui.impl.wsdl.testcase.WsdlTestCase;
    34  import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext;
    35  import com.eviware.soapui.impl.wsdl.teststeps.assertions.WsdlAssertionRegistry;
    36  import com.eviware.soapui.impl.wsdl.teststeps.assertions.WsdlAssertionRegistry.AssertableType;
    37  import com.eviware.soapui.model.iface.Submit;
    38  import com.eviware.soapui.model.iface.SubmitContext;
    39  import com.eviware.soapui.monitor.TestMonitor;
    40  import com.eviware.soapui.support.UISupport;
    41
    42  /***
    43   * WsdlRequest extension that adds WsdlAssertions
    44   *
    45   * @author Ole.Matzura
    46   */
    47
    48  public class WsdlTestRequest extends WsdlRequest implements PropertyChangeListener, Assertable
    49  {
    50     public static final String RESPONSE_PROPERTY = WsdlTestRequest.class.getName() + "@response";
    51     public static final String STATUS_PROPERTY = WsdlTestRequest.class.getName() + "@status";
    52
    53     private static ImageIcon validRequestIcon;
    54     private static ImageIcon failedRequestIcon;
    55     private static ImageIcon disabledRequestIcon;
    56     private static ImageIcon unknownRequestIcon;
    57
    58     private AssertionStatus currentStatus;
    59     private final WsdlTestRequestStep testStep;
    60
    61     private AssertionsSupport assertionsSupport;
    62  	private WsdlResponseMessageExchange messageExchange;
    63  	private final boolean forLoadTest;
    64
    65     public WsdlTestRequest( WsdlOperation operation, CallConfig callConfig, WsdlTestRequestStep testStep, boolean forLoadTest )
    66     {
    67        super( operation, callConfig, forLoadTest );
    68  		this.forLoadTest = forLoadTest;
    69
    70        setSettings( new XmlBeansSettingsImpl( this, testStep.getSettings(), callConfig.getSettings() ));
    71
    72        this.testStep = testStep;
    73
    74        initAssertions();
    75        initIcons();
    76     }
    77
    78     public WsdlTestCase getTestCase()
    79     {
    80        return testStep.getTestCase();
    81     }
    82
    83     protected void initIcons()
    84     {
    85     	if( validRequestIcon == null )
    86     		validRequestIcon = UISupport.createImageIcon("/valid_request.gif");
    87
    88     	if( failedRequestIcon == null )
    89     		failedRequestIcon = UISupport.createImageIcon("/invalid_request.gif");
    90
    91     	if( unknownRequestIcon == null )
    92     		unknownRequestIcon = UISupport.createImageIcon("/unknown_request.gif");
    93
    94     	if( disabledRequestIcon == null )
    95     		disabledRequestIcon = UISupport.createImageIcon("/disabled_request.gif");
    96     }
    97
    98     protected RequestIconAnimator initIconAnimator()
    99     {
    100    	return new TestRequestIconAnimator();
    101    }
    102
    103    private void initAssertions()
    104    {
    105    	assertionsSupport = new AssertionsSupport( this, getConfig().getAssertionList() );
    106    }
    107
    108    public int getAssertionCount()
    109    {
    110       return assertionsSupport.getAssertionCount();
    111    }
    112
    113    public WsdlMessageAssertion getAssertionAt(int c)
    114    {
    115       return assertionsSupport.getAssertionAt( c );
    116    }
    117
    118    public void setResponse(WsdlResponse response, SubmitContext context)
    119    {
    120       super.setResponse( response, context );
    121
    122       assertResponse( context );
    123    }
    124
    125    public void assertResponse( SubmitContext context )
    126    {
    127    	PropertyChangeNotifier notifier = new PropertyChangeNotifier();
    128    	messageExchange = new WsdlResponseMessageExchange( this );
    129
    130 		// assert!
    131       for (Iterator<WsdlMessageAssertion> iter = assertionsSupport.iterator(); iter.hasNext();)
    132       {
    133          iter.next().assertResponse( messageExchange, context );
    134       }
    135
    136       notifier.notifyChange();
    137    }
    138
    139 	private class PropertyChangeNotifier
    140    {
    141 	   private AssertionStatus oldStatus;
    142 	   private ImageIcon oldIcon;
    143
    144 	   public PropertyChangeNotifier()
    145 	   {
    146 		   oldStatus = getAssertionStatus();
    147 		   oldIcon = getIcon();
    148 	   }
    149
    150 	   public void notifyChange()
    151 	   {
    152 		   AssertionStatus newStatus = getAssertionStatus();
    153 	      ImageIcon newIcon = getIcon();
    154
    155 	      if( oldStatus != newStatus )
    156 	         notifyPropertyChanged( STATUS_PROPERTY, oldStatus, newStatus );
    157
    158 	      if( oldIcon != newIcon )
    159 	         notifyPropertyChanged( ICON_PROPERTY, oldIcon, getIcon() );
    160 	   }
    161    }
    162
    163    public WsdlMessageAssertion addAssertion(String assertionLabel)
    164    {
    165       PropertyChangeNotifier notifier = new PropertyChangeNotifier();
    166
    167       try
    168       {
    169       	RequestAssertionConfig assertionConfig = (RequestAssertionConfig) getConfig().addNewAssertion();
    170          assertionConfig.setType( WsdlAssertionRegistry.getInstance().getAssertionTypeForName( assertionLabel ));
    171
    172       	WsdlMessageAssertion assertion = assertionsSupport.addWsdlAssertion( assertionConfig );
    173       	assertionsSupport.fireAssertionAdded( assertion );
    174
    175          if( getResponse() != null )
    176          {
    177             assertion.assertResponse( new WsdlResponseMessageExchange( this ), new WsdlTestRunContext( testStep ) );
    178             notifier.notifyChange();
    179          }
    180
    181          return assertion;
    182       }
    183       catch (Exception e)
    184       {
    185          SoapUI.logError( e );
    186          return null;
    187       }
    188    }
    189
    190 	public void removeAssertion(WsdlMessageAssertion assertion)
    191    {
    192       PropertyChangeNotifier notifier = new PropertyChangeNotifier();
    193
    194       try
    195       {
    196       	int ix = assertionsSupport.removeAssertion( assertion );
    197       	getConfig().removeAssertion( ix );
    198       }
    199       finally
    200       {
    201 	      assertion.release();
    202 	      notifier.notifyChange();
    203       }
    204    }
    205
    206    public AssertionStatus getAssertionStatus()
    207    {
    208       currentStatus = AssertionStatus.UNKNOWN;
    209
    210       if( messageExchange != null )
    211       {
    212       	if( !messageExchange.hasResponse() && !getOperation().isOneWay() )
    213    		{
    214    			currentStatus = AssertionStatus.FAILED;
    215    		}
    216       }
    217       else  return currentStatus;
    218
    219       int cnt = getAssertionCount();
    220       if( cnt == 0 )
    221       	return currentStatus;
    222
    223       for( int c = 0; c < cnt; c++ )
    224       {
    225          if( getAssertionAt( c ).getStatus() == AssertionStatus.FAILED )
    226          {
    227             currentStatus = AssertionStatus.FAILED;
    228             break;
    229          }
    230       }
    231
    232       if( currentStatus == AssertionStatus.UNKNOWN )
    233       	currentStatus = AssertionStatus.VALID;
    234
    235       return currentStatus;
    236    }
    237
    238    public ImageIcon getIcon()
    239    {
    240    	if( forLoadTest )
    241    		return null;
    242
    243    	TestMonitor testMonitor = SoapUI.getTestMonitor();
    244 		if( testMonitor != null && testMonitor.hasRunningLoadTest( testStep.getTestCase()) )
    245    		return disabledRequestIcon;
    246
    247    	ImageIcon icon = getIconAnimator().getIcon();
    248       if( icon == getIconAnimator().getBaseIcon() )
    249       {
    250          AssertionStatus status = getAssertionStatus();
    251          if( status == AssertionStatus.VALID ) return validRequestIcon;
    252          else if( status == AssertionStatus.FAILED ) return failedRequestIcon;
    253          else if( status == AssertionStatus.UNKNOWN ) return unknownRequestIcon;
    254       }
    255
    256       return icon;
    257    }
    258
    259    public void propertyChange(PropertyChangeEvent evt)
    260    {
    261 	  if( evt.getPropertyName().equals( WsdlMessageAssertion.CONFIGURATION_PROPERTY ) && getResponse() != null )
    262 		  assertResponse( new WsdlTestRunContext( testStep ));
    263    }
    264
    265    public void addAssertionsListener( AssertionsListener listener )
    266    {
    267    	assertionsSupport.addAssertionsListener( listener );
    268    }
    269
    270    public void removeAssertionsListener( AssertionsListener listener )
    271    {
    272    	assertionsSupport.removeAssertionsListener( listener );
    273    }
    274
    275    /***
    276     * Called when a testrequest is moved in a testcase
    277     */
    278
    279 	public void updateConfig(CallConfig request)
    280 	{
    281 		super.updateConfig(request);
    282
    283 		assertionsSupport.updateConfig( getConfig().getAssertionList() );
    284
    285       List<AttachmentConfig> attachmentConfigs = getConfig().getAttachmentList();
    286       for( int i = 0; i < attachmentConfigs.size(); i++ )
    287       {
    288       	AttachmentConfig config = attachmentConfigs.get( i );
    289       	attachments.get( i ).updateConfig( config );
    290       }
    291 	}
    292
    293 	public void release()
    294 	{
    295 		super.release();
    296 		assertionsSupport.release();
    297 	}
    298
    299 	public String getAssertableContent()
    300 	{
    301 		return getResponse() == null ? null : getResponse().getContentAsString();
    302 	}
    303
    304 	public WsdlTestRequestStep getTestStep()
    305 	{
    306 		return testStep;
    307 	}
    308
    309 	public WsdlInterface getInterface()
    310 	{
    311 		return getOperation().getInterface();
    312 	}
    313
    314 	protected class TestRequestIconAnimator extends RequestIconAnimator
    315 	{
    316 		public boolean beforeSubmit(Submit submit, SubmitContext context)
    317 		{
    318 			if( SoapUI.getTestMonitor() != null && SoapUI.getTestMonitor().hasRunningLoadTest( getTestCase() ))
    319 				return true;
    320
    321 			return super.beforeSubmit( submit, context );
    322 		}
    323
    324 		public void afterSubmit(Submit submit, SubmitContext context)
    325 		{
    326 			if( submit.getRequest() == getTarget() )
    327 				stop();
    328 		}
    329 	}
    330
    331 	public AssertableType getAssertableType()
    332 	{
    333 		return AssertableType.RESPONSE;
    334 	}
    335
    336 	public String getInterfaceName()
    337 	{
    338 		return testStep.getInterfaceName();
    339 	}
    340
    341 	public String getOperationName()
    342 	{
    343 		return testStep.getOperationName();
    344 	}
    345
    346 	public WsdlMessageAssertion cloneAssertion( WsdlMessageAssertion source, String name )
    347 	{
    348 		RequestAssertionConfig conf = getConfig().addNewAssertion();
    349 		conf.set( source.getConfig() );
    350 		conf.setName( name );
    351
    352 		WsdlMessageAssertion result = assertionsSupport.addWsdlAssertion( conf );
    353 		assertionsSupport.fireAssertionAdded( result );
    354 		return result;
    355 	}
    356
    357 	public WsdlMessageAssertion importAssertion( WsdlMessageAssertion source, boolean overwrite )
    358 	{
    359 		RequestAssertionConfig conf = getConfig().addNewAssertion();
    360 		conf.set( source.getConfig() );
    361
    362 		if( !source.isAllowMultiple() )
    363 		{
    364 			List<WsdlMessageAssertion> existing = assertionsSupport.getAssertionsOfType( source.getClass() );
    365 			if( !existing.isEmpty() && !overwrite )
    366 				return null;
    367
    368 			while( !existing.isEmpty() )
    369 			{
    370 				removeAssertion( existing.remove( 0 ) );
    371 			}
    372 		}
    373
    374 		WsdlMessageAssertion result = assertionsSupport.addWsdlAssertion( conf );
    375 		assertionsSupport.fireAssertionAdded( result );
    376 		return result;
    377 	}
    378
    379 	public List<WsdlMessageAssertion> getAssertionList()
    380 	{
    381 		return assertionsSupport.getAssertionList();
    382 	}
    383 }