blob: 7906381cef28e576df6b5e3bd990736687c7e13d [file] [log] [blame]
/*
* 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;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterContext;
import org.apache.jmeter.threads.JMeterContextService;
import org.apache.jmeter.threads.JMeterVariables;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class ResponseAssertionTest {
public ResponseAssertionTest() {
}
private ResponseAssertion assertion;
private SampleResult sample;
private AssertionResult result;
@BeforeEach
public void setUp() throws MalformedURLException {
JMeterContext jmctx = JMeterContextService.getContext();
assertion = new ResponseAssertion();
assertion.setThreadContext(jmctx);
sample = new SampleResult();
JMeterVariables vars = new JMeterVariables();
jmctx.setVariables(vars);
jmctx.setPreviousResult(sample);
sample.setResponseData("response Data\nline 2\n\nEOF", null);
sample.setURL(new URL("http://localhost/Sampler/Data/"));
sample.setResponseCode("401");
sample.setResponseHeaders("X-Header: abcd");
sample.setRequestHeaders("X-reqHeader: cdef");
}
@Test
public void testResponseAssertionNoText() throws Exception{
assertion.clearTestStrings();
assertion.unsetNotType();
assertion.setToSubstringType();
assertion.setTestFieldResponseData();
//assertion.addTestString("response Data");
result = assertion.getResult(sample);
assertPassed();
}
@Test
public void testResponseAssertionEquals() throws Exception{
assertion.unsetNotType();
assertion.setToEqualsType();
assertion.setTestFieldURL();
assertion.addTestString("Sampler Label");
assertion.addTestString("Sampler labelx");
result = assertion.getResult(sample);
assertFailed();
assertion.setToNotType();
assertion.clearTestStrings();
assertion.addTestString("Sampler LabeL");
assertion.addTestString("Sampler Labelx");
result = assertion.getResult(sample);
assertPassed();
}
@Test
public void testCustomFailureMessage() throws Exception {
assertion.unsetNotType();
assertion.setToEqualsType();
assertion.setTestFieldURL();
assertion.addTestString("Sampler Label");
assertion.addTestString("Sampler labelx");
assertion.setCustomFailureMessage("Custom failure message");
result = assertion.getResult(sample);
assertFailed();
assertEquals("Custom failure message", result.getFailureMessage());
assertion.setToOrType();
result = assertion.getResult(sample);
assertFailed();
assertEquals("Custom failure message", result.getFailureMessage());
}
@Test
public void testMalformedCachePatternException() throws Exception{
assertion.unsetNotType();
assertion.setToMatchType();
assertion.setTestFieldResponseHeaders();
assertion.addTestString("[]");
result = assertion.getResult(sample);
assertNotNull(result.getFailureMessage());
assertNotEquals("Response was null", result.getFailureMessage(), "Should not be: Response was null");
assertTrue(result.isError(), "Not expecting error: "+result.getFailureMessage());
assertion.setCustomFailureMessage("Custom failure message");
result = assertion.getResult(sample);
assertTrue(result.isError(), "Did not get expected error: "+result.getFailureMessage());
assertNotEquals("Custom failure message", result.getFailureMessage(), "Failure message must not be custom failure message for error");
}
@Test
public void testResponseAssertionResponseHeaders() throws Exception{
assertion.unsetNotType();
assertion.setToEqualsType();
assertion.setTestFieldResponseHeaders();
assertion.addTestString("X-Header: abcd");
assertion.addTestString("X-Header: abcdx");
result = assertion.getResult(sample);
assertFailed();
assertion.clearTestStrings();
assertion.addTestString("X-Header: abcd");
result = assertion.getResult(sample);
assertPassed();
}
@Test
public void testResponseAssertionRequestHeaders() throws Exception{
assertion.unsetNotType();
assertion.setToEqualsType();
assertion.setTestFieldRequestHeaders();
assertion.addTestString("X-reqHeader: cdef");
assertion.addTestString("X-reqHeader: cdefx");
result = assertion.getResult(sample);
assertFailed();
assertion.clearTestStrings();
assertion.addTestString("X-reqHeader: cdef");
result = assertion.getResult(sample);
assertPassed();
}
@Test
public void testResponseAssertionContains() throws Exception{
assertion.unsetNotType();
assertion.setToContainsType();
assertion.setTestFieldURL();
assertion.addTestString("Sampler");
assertion.addTestString("Label");
assertion.addTestString(" x");
result = assertion.getResult(sample);
assertFailed();
assertion.setToNotType();
result = assertion.getResult(sample);
assertFailed();
assertion.clearTestStrings();
assertion.addTestString("r l");
result = assertion.getResult(sample);
assertPassed();
assertion.unsetNotType();
assertion.setTestFieldResponseData();
assertion.clearTestStrings();
assertion.addTestString("line 2");
result = assertion.getResult(sample);
assertPassed();
assertion.clearTestStrings();
assertion.addTestString("line 2");
assertion.addTestString("NOTINSAMPLEDATA");
result = assertion.getResult(sample);
assertFailed();
assertion.clearTestStrings();
assertion.setToOrType();
assertion.addTestString("line 2");
assertion.addTestString("NOTINSAMPLEDATA");
result = assertion.getResult(sample);
assertPassed();
assertion.unsetOrType();
assertion.clearTestStrings();
assertion.setToOrType();
assertion.addTestString("NOTINSAMPLEDATA");
assertion.addTestString("line 2");
result = assertion.getResult(sample);
assertPassed();
assertion.unsetOrType();
assertion.clearTestStrings();
assertion.setToOrType();
assertion.addTestString("NOTINSAMPLEDATA");
assertion.addTestString("NOTINSAMPLEDATA2");
result = assertion.getResult(sample);
assertFailed();
assertion.unsetOrType();
assertion.clearTestStrings();
assertion.setToOrType();
assertion.setToNotType();
assertion.addTestString("line 2");
assertion.addTestString("NOTINSAMPLEDATA2");
result = assertion.getResult(sample);
assertPassed();
assertion.unsetOrType();
assertion.unsetNotType();
assertion.clearTestStrings();
assertion.setToNotType();
assertion.addTestString("NOTINSAMPLEDATA");
result = assertion.getResult(sample);
assertPassed();
assertion.unsetNotType();
assertion.clearTestStrings();
assertion.addTestString("(?s)line \\d+.*EOF");
result = assertion.getResult(sample);
assertPassed();
assertion.setTestFieldResponseCode();
assertion.clearTestStrings();
assertion.addTestString("401");
result = assertion.getResult(sample);
assertPassed();
}
// Bug 46831 - check can match dollars
@Test
public void testResponseAssertionContainsDollar() throws Exception {
sample.setResponseData("value=\"${ID}\" Group$ctl00$drpEmails", null);
assertion.unsetNotType();
assertion.setToContainsType();
assertion.setTestFieldResponseData();
assertion.addTestString("value=\"\\$\\{ID\\}\" Group\\$ctl00\\$drpEmails");
result = assertion.getResult(sample);
assertPassed();
}
@Test
public void testResponseAssertionSubstring() throws Exception{
assertion.unsetNotType();
assertion.setToSubstringType();
assertion.setTestFieldURL();
assertion.addTestString("Sampler");
assertion.addTestString("Label");
assertion.addTestString("+(");
result = assertion.getResult(sample);
assertFailed();
assertion.setToNotType();
result = assertion.getResult(sample);
assertFailed();
assertion.clearTestStrings();
assertion.addTestString("r l");
result = assertion.getResult(sample);
assertPassed();
assertion.unsetNotType();
assertion.setTestFieldResponseData();
assertion.clearTestStrings();
assertion.addTestString("line 2");
result = assertion.getResult(sample);
assertPassed();
assertion.clearTestStrings();
assertion.addTestString("line 2\n\nEOF");
result = assertion.getResult(sample);
assertPassed();
assertion.setTestFieldResponseCode();
assertion.clearTestStrings();
assertion.addTestString("401");
result = assertion.getResult(sample);
assertPassed();
}
//TODO - need a lot more tests
private void assertPassed() throws Exception{
assertNull(result.getFailureMessage(), result.getFailureMessage());
assertFalse(result.isError(), "Not expecting error: "+result.getFailureMessage());
assertFalse(result.isError(), "Not expecting error");
assertFalse(result.isFailure(), "Not expecting failure");
}
private void assertFailed() throws Exception{
assertNotNull(result.getFailureMessage());
assertNotEquals("Response was null", result.getFailureMessage(), "Should not be: Response was null");
assertFalse(result.isError(), "Not expecting error: "+result.getFailureMessage());
assertTrue(result.isFailure(), "Expecting failure");
}
private AtomicInteger failed;
@Test
public void testThreadSafety() throws Exception {
Thread[] threads = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
for (int i = 0; i < threads.length; i++) {
threads[i] = new TestThread(latch);
}
failed = new AtomicInteger(0);
for (Thread thread : threads) {
thread.start();
}
latch.await();
assertEquals(failed.get(), 0);
}
class TestThread extends Thread {
static final String TEST_STRING = "DAbale arroz a la zorra el abad.";
// Used to be 'dábale', but caused trouble on Gump. Reasons
// unknown.
static final String TEST_PATTERN = ".*A.*\\.";
private CountDownLatch latch;
public TestThread(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
ResponseAssertion assertion = new ResponseAssertion();
assertion.setTestFieldResponseData();
assertion.setToContainsType();
assertion.addTestString(TEST_PATTERN);
SampleResult response = new SampleResult();
response.setResponseData(TEST_STRING, null);
for (int i = 0; i < 100; i++) {
AssertionResult result;
result = assertion.getResult(response);
if (result.isFailure() || result.isError()) {
failed.incrementAndGet();
}
}
} finally {
latch.countDown();
}
}
}
}