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]