Author: sebb
Date: Fri Oct 10 08:46:34 2008
New Revision: 703505

URL: http://svn.apache.org/viewvc?rev=703505&view=rev
Log:
Bug 45903 - allow Assertions to apply to sub-samples
- generic implementation (specific assertions to follow)

Added:
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AssertionScopePanel.java
   (with props)
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractScopedAssertion.java
   (with props)
Modified:
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AbstractAssertionGui.java
    
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
    jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
    jakarta/jmeter/trunk/xdocs/changes.xml

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AbstractAssertionGui.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AbstractAssertionGui.java?rev=703505&r1=703504&r2=703505&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AbstractAssertionGui.java
 (original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AbstractAssertionGui.java
 Fri Oct 10 08:46:34 2008
@@ -21,18 +21,26 @@
 import java.util.Arrays;
 import java.util.Collection;
 
+import javax.swing.JPanel;
 import javax.swing.JPopupMenu;
 
 import org.apache.jmeter.gui.AbstractJMeterGuiComponent;
 import org.apache.jmeter.gui.util.MenuFactory;
+import org.apache.jmeter.testelement.AbstractScopedAssertion;
 
 /**
  * This is the base class for JMeter GUI components which manage assertions.
+ * 
+ * Assertions which can be applied to different scopes (parent, children or 
both)
+ * need to use the createScopePanel() to add the panel to the GUI, and they 
also
+ * need to use saveScopeSettings() and showScopeSettings() to keep the test 
element
+ * and GUI in synch.
  *
- * @author Michael Stover
- * @version $Revision$
  */
 public abstract class AbstractAssertionGui extends AbstractJMeterGuiComponent {
+
+    private AssertionScopePanel assertionScopePanel;
+    
     /**
      * When a user right-clicks on the component in the test tree, or selects
      * the edit menu when the component is selected, the component will be 
asked
@@ -60,4 +68,54 @@
     public Collection getMenuCategories() {
         return Arrays.asList(new String[] { MenuFactory.ASSERTIONS });
     }
+    
+    /**
+     * Create the scope settings panel.
+     * 
+     * @return the scope settings panel
+     */
+    protected JPanel createScopePanel(){
+        assertionScopePanel = new AssertionScopePanel();
+        return assertionScopePanel;
+    }
+
+    public void clearGui(){
+        super.clearGui();
+        if (assertionScopePanel != null) {
+            assertionScopePanel.clearGui();
+        }
+    }
+
+    /**
+     * Save the scope settings in the test element.
+     * 
+     * @param assertion
+     */
+    protected void saveScopeSettings(AbstractScopedAssertion assertion) {
+        if (assertionScopePanel.isScopeParent()){
+            assertion.setScopeParent();
+        } else
+        if (assertionScopePanel.isScopeChildren()){
+            assertion.setScopeChildren();
+        } else {
+            assertion.setScopeAll();
+        }
+        
+    }
+
+    /**
+     * Show the scope settings from the test element.
+     * 
+     * @param assertion
+     */
+    protected void showScopeSettings(AbstractScopedAssertion assertion) {
+        String scope = assertion.fetchScope();
+        if (assertion.isScopeParent(scope)) {
+                assertionScopePanel.setScopeParent();                
+        } else if (assertion.isScopeChildren(scope)){
+            assertionScopePanel.setScopeChildren();
+        } else {
+            assertionScopePanel.setScopeAll();
+        }
+    }
 }
\ No newline at end of file

Added: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AssertionScopePanel.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AssertionScopePanel.java?rev=703505&view=auto
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AssertionScopePanel.java
 (added)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AssertionScopePanel.java
 Fri Oct 10 08:46:34 2008
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.jmeter.assertions.gui;
+
+import java.awt.BorderLayout;
+
+import javax.swing.BorderFactory;
+import javax.swing.ButtonGroup;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+
+import org.apache.jmeter.gui.util.HorizontalPanel;
+import org.apache.jmeter.util.JMeterUtils;
+
+/**
+ * Assertion scope panel for Assertions so users can choose whether
+ * to apply the assertion to the parent sample, the child samples or both.
+ * 
+ * This class is a helper class for the AbstractAssertionGui.
+ *
+ */
+public class AssertionScopePanel extends JPanel {
+
+    private JRadioButton parentButton;
+    private JRadioButton childButton;
+    private JRadioButton allButton;
+    
+    /**
+     * Create a new NamePanel with the default name.
+     */
+    public AssertionScopePanel() {
+        init();
+    }
+
+    /**
+     * Initialize the GUI components and layout.
+     */
+    private void init() {
+        setLayout(new BorderLayout(5, 0));
+        
setBorder(BorderFactory.createTitledBorder(JMeterUtils.getResString("assertion_scope")));
 //$NON-NLS-1$
+
+        allButton = new 
JRadioButton(JMeterUtils.getResString("assertion_scope_all"));
+        parentButton = new 
JRadioButton(JMeterUtils.getResString("assertion_scope_parent"));
+        parentButton.setSelected(true);
+        childButton = new 
JRadioButton(JMeterUtils.getResString("assertion_scope_children"));
+        
+        ButtonGroup group = new ButtonGroup();
+        group.add(allButton);
+        group.add(parentButton);
+        group.add(childButton);
+        JPanel buttonPanel = new HorizontalPanel();
+        buttonPanel.add(parentButton);
+        buttonPanel.add(childButton);
+        buttonPanel.add(allButton);
+        
+        add(buttonPanel);
+    }
+
+    public void clearGui() {
+        parentButton.setSelected(true);
+    }
+    
+    public int getSelection(){
+        if (parentButton.isSelected()){
+            return 0;
+        }
+        return 1;
+    }
+
+    public void setScopeAll() {
+        allButton.setSelected(true);
+    }
+
+    public void setScopeChildren() {
+        childButton.setSelected(true);        
+    }
+
+    public void setScopeParent() {
+        parentButton.setSelected(true);
+    }
+
+    public boolean isScopeParent() {
+        return parentButton.isSelected();
+    }
+
+    public boolean isScopeChildren() {
+        return childButton.isSelected();
+    }
+}

Propchange: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AssertionScopePanel.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/assertions/gui/AssertionScopePanel.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=703505&r1=703504&r2=703505&view=diff
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties 
(original)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties 
Fri Oct 10 08:46:34 2008
@@ -72,6 +72,10 @@
 assertion_pattern_match_rules=Pattern Matching Rules
 assertion_patterns_to_test=Patterns to Test
 assertion_resp_field=Response Field to Test
+assertion_scope=Which samples to test
+assertion_scope_all=Main sample and sub-samples
+assertion_scope_children=Sub-samples only
+assertion_scope_parent=Main sample only
 assertion_substring=Substring
 assertion_text_resp=Text Response
 assertion_textarea_label=Assertions\:

Added: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractScopedAssertion.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractScopedAssertion.java?rev=703505&view=auto
==============================================================================
--- 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractScopedAssertion.java
 (added)
+++ 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractScopedAssertion.java
 Fri Oct 10 08:46:34 2008
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * 
+ */
+
+package org.apache.jmeter.testelement;
+
+/**
+ * <p>
+ * Super-class for all Assertions that can be applied to main sample, 
sub-samples or both.
+ * Test elements merely need to extend this class to support scoping.
+ * </p>
+ * 
+ * <p>
+ * Their corresponding GUI classes need to add the AssertionScopePanel to the 
GUI
+ * using the AbstractAssertionGui methods:
+ * <ul>
+ * <li>createScopePanel()</li>
+ * <li>saveScopeSettings()</li>
+ * <li>showScopeSettings()</li>
+ * </ul>
+ * </p>
+ */
+public abstract class AbstractScopedAssertion extends AbstractTestElement {
+
+    private static final String SCOPE = "Assertion.scope";
+    private static final String SCOPE_PARENT = "parent";
+    private static final String SCOPE_CHILDREN = "children";
+    private static final String SCOPE_ALL = "all";
+
+    /**
+     * Get the scope setting
+     * @return the scope, default parent
+     */
+    public String fetchScope() {
+        return getPropertyAsString(SCOPE, SCOPE_PARENT);
+    }
+
+    /**
+     * Is the assertion to be applied to the main (parent) sample?
+     * 
+     * @param scope
+     * @return if the assertion is to be applied to the parent sample.
+     */
+    public boolean isScopeParent(String scope) {
+        return scope.equals(SCOPE_PARENT);
+    }
+
+    /**
+     * Is the assertion to be applied to the sub-samples (children)?
+     * 
+     * @param scope
+     * @return if the assertion is to be applied to the children.
+     */
+    public boolean isScopeChildren(String scope) {
+        return scope.equals(SCOPE_CHILDREN);
+    }
+
+    /**
+     * Is the assertion to be applied to the all samples?
+     * 
+     * @param scope
+     * @return if the assertion is to be applied to the all samples.
+     */
+    public boolean isScopeAll(String scope) {
+        return scope.equals(SCOPE_ALL);
+    }
+
+    public void setScopeParent() {
+        removeProperty(SCOPE);
+    }
+
+    public void setScopeChildren() {
+        setProperty(SCOPE, SCOPE_CHILDREN);
+    }
+
+    public void setScopeAll() {
+        setProperty(SCOPE, SCOPE_ALL);
+    }
+}

Propchange: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractScopedAssertion.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/testelement/AbstractScopedAssertion.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: 
jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java?rev=703505&r1=703504&r2=703505&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java 
(original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/threads/JMeterThread.java 
Fri Oct 10 08:46:34 2008
@@ -39,6 +39,7 @@
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.samplers.Sampler;
 import org.apache.jmeter.testbeans.TestBeanHelper;
+import org.apache.jmeter.testelement.AbstractScopedAssertion;
 import org.apache.jmeter.testelement.AbstractTestElement;
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestListener;
@@ -531,16 +532,45 @@
         log.info("Stop Thread detected by thread " + threadName);
     }
 
-    private void checkAssertions(List assertions, SampleResult result) {
+    private void checkAssertions(List assertions, SampleResult parent) {
         Iterator iter = assertions.iterator();
         while (iter.hasNext()) {
             Assertion assertion = (Assertion) iter.next();
             TestBeanHelper.prepare((TestElement) assertion);
-            AssertionResult assertionResult = assertion.getResult(result);
-            result.setSuccessful(result.isSuccessful() && 
!(assertionResult.isError() || assertionResult.isFailure()));
-            result.addAssertionResult(assertionResult);
+            if (assertion instanceof AbstractScopedAssertion){
+                AbstractScopedAssertion scopedAssertion = 
(AbstractScopedAssertion) assertion;
+                String scope = scopedAssertion.fetchScope();
+                if (scopedAssertion.isScopeParent(scope) || 
scopedAssertion.isScopeAll(scope)){
+                    processAssertion(parent, assertion);
+                }
+                if (scopedAssertion.isScopeChildren(scope) || 
scopedAssertion.isScopeAll(scope)){
+                    SampleResult children[] = parent.getSubResults();
+                    boolean childError = false;
+                    for (int i=0;i <children.length; i++){
+                        processAssertion(children[i], assertion);
+                        if (!children[i].isSuccessful()){
+                            childError = true;
+                        }
+                    }
+                    // If parent is OK, but child failed, add a message and 
flag the parent as failed
+                    if (childError && parent.isSuccessful()) {
+                        AssertionResult assertionResult = new 
AssertionResult(((AbstractTestElement)assertion).getName());
+                        assertionResult.setResultForFailure("One or more 
sub-samples failed");
+                        parent.addAssertionResult(assertionResult);
+                        parent.setSuccessful(false);
+                    }
+                }
+            } else {
+                processAssertion(parent, assertion);
+            }
         }
-        threadContext.getVariables().put(LAST_SAMPLE_OK, 
Boolean.toString(result.isSuccessful()));
+        threadContext.getVariables().put(LAST_SAMPLE_OK, 
Boolean.toString(parent.isSuccessful()));
+    }
+
+    private void processAssertion(SampleResult result, Assertion assertion) {
+        AssertionResult assertionResult = assertion.getResult(result);
+        result.setSuccessful(result.isSuccessful() && 
!(assertionResult.isError() || assertionResult.isFailure()));
+        result.addAssertionResult(assertionResult);
     }
 
     private void runPostProcessors(List extractors) {

Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=703505&r1=703504&r2=703505&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Fri Oct 10 08:46:34 2008
@@ -134,6 +134,7 @@
 <li>Bug 45479 - Support for multiple HTTP Header Manager nodes</li>
 <li>Bug 43119 - Save Responses to file: optionally omit the file number</li>
 <li>Allow If Controller to use variable expressions (not just Javascript)</li>
+<li>Bug 45903 - allow Assertions to apply to sub-samples</li>
 </ul>
 
 <h3>Non-functional changes</h3>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to