You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by vl...@apache.org on 2023/06/16 05:39:26 UTC
[jmeter] branch master updated (43797046fa -> c46e37a4f0)
This is an automated email from the ASF dual-hosted git repository.
vladimirsitnikov pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git
from 43797046fa fix: restore public static final String references to literals for backward compatibility
new 7ebbd98c6f test: add SampleEvent.toString and SampleResult.toDebugString for better debug representation
new c46e37a4f0 test: CollectSamplesListener should be NoThreadClone, so it collects all the events
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../org/apache/jmeter/samplers/SampleEvent.java | 23 +++++++++
.../org/apache/jmeter/samplers/SampleResult.java | 56 ++++++++++++++++++++++
.../jmeter/samplers/StatisticalSampleResult.java | 7 +++
.../openmodel/ThreadsInterruptAtFinishTest.kt | 4 +-
.../jmeter/test/samplers/CollectSamplesListener.kt | 3 +-
.../protocol/http/sampler/HTTPSampleResult.java | 8 ++++
.../protocol/http/HttpRequestInterruptTest.kt | 30 +++++++-----
7 files changed, 116 insertions(+), 15 deletions(-)
[jmeter] 01/02: test: add SampleEvent.toString and SampleResult.toDebugString for better debug representation
Posted by vl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
vladimirsitnikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git
commit 7ebbd98c6f24bcb6df7d807f030b215046d10416
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Fri Jun 16 08:35:31 2023 +0300
test: add SampleEvent.toString and SampleResult.toDebugString for better debug representation
---
.../org/apache/jmeter/samplers/SampleEvent.java | 23 +++++++++
.../org/apache/jmeter/samplers/SampleResult.java | 56 ++++++++++++++++++++++
.../jmeter/samplers/StatisticalSampleResult.java | 7 +++
.../protocol/http/sampler/HTTPSampleResult.java | 8 ++++
4 files changed, 94 insertions(+)
diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java b/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java
index ff7dd02691..d42ec38a12 100644
--- a/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java
+++ b/src/core/src/main/java/org/apache/jmeter/samplers/SampleEvent.java
@@ -224,4 +224,27 @@ public class SampleEvent implements Serializable {
return isTransactionSampleEvent;
}
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("SampleEvent{");
+ sb.append("hostname='").append(hostname).append('\'');
+ sb.append(", threadGroup='").append(threadGroup).append('\'');
+ sb.append(", isTransactionSampleEvent=").append(isTransactionSampleEvent);
+ if (values != null && values.length > 0) {
+ sb.append("values=[");
+ for (int i = 0; i < variableNames.length; i++) {
+ if (i > 0) {
+ sb.append(", ");
+ }
+ sb.append('\'').append(variableNames[i]).append("', '").append(values[i]).append('\'');
+ }
+ sb.append(']');
+ }
+ if (result != null) {
+ sb.append(", result=").append(result.toDebugString());
+ }
+ sb.append('}');
+ return sb.toString();
+ }
}
diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java
index a8eb891583..2518f26c31 100644
--- a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java
+++ b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java
@@ -936,6 +936,62 @@ public class SampleResult implements Serializable, Cloneable, Searchable {
return getSampleLabel();
}
+ public String toDebugString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(getClass().getSimpleName()).append('{');
+ appendDebugParameters(sb);
+ sb.append('}');
+ return sb.toString();
+ }
+
+ protected void appendDebugParameters(StringBuilder sb) {
+ sb.append("label='").append(label).append('\'');
+ sb.append(", success=").append(success);
+ sb.append(", saveConfig=").append(saveConfig);
+ if (parent != null) {
+ sb.append(", parent=").append(parent.toDebugString());
+ }
+ sb.append(", responseCode='").append(responseCode).append('\'');
+ sb.append(", resultFileName='").append(resultFileName).append('\'');
+ sb.append(", samplerData='").append(samplerData).append('\'');
+ sb.append(", threadName='").append(threadName).append('\'');
+ sb.append(", responseMessage='").append(responseMessage).append('\'');
+ sb.append(", responseHeaders='").append(responseHeaders).append('\'');
+ sb.append(", requestHeaders='").append(requestHeaders).append('\'');
+ sb.append(", timeStamp=").append(timeStamp);
+ sb.append(", startTime=").append(startTime);
+ sb.append(", endTime=").append(endTime);
+ sb.append(", idleTime=").append(idleTime);
+ sb.append(", pauseTime=").append(pauseTime);
+ sb.append(", assertionResults=").append(assertionResults);
+ sb.append(", subResults=").append(subResults);
+ sb.append(", dataType='").append(dataType).append('\'');
+ sb.append(", files=").append(files);
+ sb.append(", dataEncoding='").append(dataEncoding).append('\'');
+ sb.append(", contentType='").append(contentType).append('\'');
+ sb.append(", elapsedTime=").append(elapsedTime);
+ sb.append(", latency=").append(latency);
+ sb.append(", connectTime=").append(connectTime);
+ sb.append(", testLogicalAction=").append(testLogicalAction);
+ sb.append(", stopThread=").append(stopThread);
+ sb.append(", stopTest=").append(stopTest);
+ sb.append(", stopTestNow=").append(stopTestNow);
+ sb.append(", sampleCount=").append(sampleCount);
+ sb.append(", bytes=").append(bytes);
+ sb.append(", headersSize=").append(headersSize);
+ sb.append(", bodySize=").append(bodySize);
+ sb.append(", groupThreads=").append(groupThreads);
+ sb.append(", allThreads=").append(allThreads);
+ sb.append(", nanoTimeOffset=").append(nanoTimeOffset);
+ sb.append(", useNanoTime=").append(useNanoTime);
+ sb.append(", nanoThreadSleep=").append(nanoThreadSleep);
+ sb.append(", sentBytes=").append(sentBytes);
+ sb.append(", location=").append(location);
+ sb.append(", ignore=").append(ignore);
+ sb.append(", subResultIndex=").append(subResultIndex);
+ sb.append(", responseDataAsString='").append(getResponseDataAsString()).append('\'');
+ }
+
/**
* Returns the dataEncoding or the default if no dataEncoding was provided.
*
diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java b/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java
index 2177d5cf7c..77b1bf65c6 100644
--- a/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java
+++ b/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java
@@ -134,4 +134,11 @@ public class StatisticalSampleResult extends SampleResult implements
}
return sb.toString();
}
+
+ @Override
+ protected void appendDebugParameters(StringBuilder sb) {
+ super.appendDebugParameters(sb);
+ sb.append(", errorCount=").append(errorCount);
+ sb.append(", elapsed=").append(elapsed);
+ }
}
diff --git a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
index 0b30eaefbf..29919f4728 100644
--- a/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
+++ b/src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/sampler/HTTPSampleResult.java
@@ -280,4 +280,12 @@ public class HTTPSampleResult extends SampleResult {
list.add(getUrlAsString());
return list;
}
+
+ @Override
+ protected void appendDebugParameters(StringBuilder sb) {
+ super.appendDebugParameters(sb);
+ sb.append(", method='").append(method).append('\'');
+ sb.append(", redirectLocation='").append(redirectLocation).append('\'');
+ sb.append(", queryString='").append(queryString).append('\'');
+ }
}
[jmeter] 02/02: test: CollectSamplesListener should be NoThreadClone, so it collects all the events
Posted by vl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
vladimirsitnikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git
commit c46e37a4f0ef8a0aa87c2ea4fe2cab9e0423c49d
Author: Vladimir Sitnikov <si...@gmail.com>
AuthorDate: Fri Jun 16 08:38:03 2023 +0300
test: CollectSamplesListener should be NoThreadClone, so it collects all the events
Previously, HttpRequestInterruptTest received no events because the
listener was cloned, however, the test assumed there were no events because
the sampling was interrupted.
---
.../openmodel/ThreadsInterruptAtFinishTest.kt | 4 +--
.../jmeter/test/samplers/CollectSamplesListener.kt | 3 ++-
.../protocol/http/HttpRequestInterruptTest.kt | 30 +++++++++++++---------
3 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt
index 6e79eb8140..34d5586a65 100644
--- a/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt
+++ b/src/core/src/test/kotlin/org/apache/jmeter/threads/openmodel/ThreadsInterruptAtFinishTest.kt
@@ -32,9 +32,9 @@ import kotlin.time.Duration.Companion.seconds
class ThreadsInterruptAtFinishTest : JMeterTestCase() {
@Test
- @Timeout(5, unit = TimeUnit.SECONDS)
+ @Timeout(10, unit = TimeUnit.SECONDS)
fun `openmodel interrupts sleep`() {
- executePlanAndCollectEvents(10.seconds) {
+ assertInterruptionsPresent {
OpenModelThreadGroup::class {
scheduleString = "rate(50 / sec) random_arrivals(100 ms) pause(1 s)"
ThreadSleep::class {
diff --git a/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt b/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt
index 05c7aca0d3..10869b82c7 100644
--- a/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt
+++ b/src/core/src/testFixtures/kotlin/org/apache/jmeter/test/samplers/CollectSamplesListener.kt
@@ -17,6 +17,7 @@
package org.apache.jmeter.test.samplers
+import org.apache.jmeter.engine.util.NoThreadClone
import org.apache.jmeter.reporters.AbstractListenerElement
import org.apache.jmeter.samplers.SampleEvent
import org.apache.jmeter.samplers.SampleListener
@@ -25,7 +26,7 @@ import java.util.Collections
/**
* Collects [SampleEvent] to a list.
*/
-class CollectSamplesListener : AbstractListenerElement(), SampleListener {
+class CollectSamplesListener : AbstractListenerElement(), SampleListener, NoThreadClone {
private val mutableEvents: MutableList<SampleEvent> = Collections.synchronizedList(mutableListOf<SampleEvent>())
// Copy the events to prevent late arrivals after the test has finished
diff --git a/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt b/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt
index ac3f54e975..90e25213d2 100644
--- a/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt
+++ b/src/protocol/http/src/test/kotlin/org/apache/jmeter/protocol/http/HttpRequestInterruptTest.kt
@@ -22,35 +22,39 @@ import com.github.tomakehurst.wiremock.client.WireMock.get
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo
import com.github.tomakehurst.wiremock.junit5.WireMockTest
import org.apache.jmeter.junit.JMeterTestCase
+import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy
-import org.apache.jmeter.samplers.SampleEvent
import org.apache.jmeter.test.assertions.executePlanAndCollectEvents
import org.apache.jmeter.threads.openmodel.OpenModelThreadGroup
import org.junit.jupiter.api.Assertions.assertEquals
-import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Timeout
+import org.junit.jupiter.api.fail
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.ValueSource
import java.util.concurrent.TimeUnit
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
@WireMockTest
class HttpRequestInterruptTest : JMeterTestCase() {
- @Test
- @Timeout(5, unit = TimeUnit.SECONDS)
- fun `httpClient4 interrupts`(server: WireMockRuntimeInfo) {
+ @ParameterizedTest
+ @Timeout(10, unit = TimeUnit.SECONDS)
+ @ValueSource(strings = [HTTPSamplerFactory.IMPL_HTTP_CLIENT4, HTTPSamplerFactory.HTTP_SAMPLER_JAVA])
+ fun `http request interrupts`(httpImplementation: String, server: WireMockRuntimeInfo) {
server.wireMock.register(
get("/delayed")
.willReturn(
aResponse()
- .withStatus(200)
.withFixedDelay(1.minutes.inWholeMilliseconds.toInt())
+ .withStatus(200)
)
)
- val events = executePlanAndCollectEvents(50.seconds) {
+ val events = executePlanAndCollectEvents(5.seconds) {
OpenModelThreadGroup::class {
scheduleString = "rate(50 / sec) random_arrivals(100 ms) pause(1 s)"
HTTPSamplerProxy::class {
+ implementation = httpImplementation
method = "GET"
protocol = "http"
domain = "localhost"
@@ -60,10 +64,12 @@ class HttpRequestInterruptTest : JMeterTestCase() {
}
}
- assertEquals(
- listOf<SampleEvent>(),
- events,
- "No samples expected as all the threads should be interrupted before the request completes"
- )
+ assertEquals(5, events.size) { "5 events expected, got $events" }
+ if (events.any { it.result.isSuccessful || it.result.isResponseCodeOK || it.result.time < 500 }) {
+ fail(
+ "All events should be failing, and they should take more than 500ms since the requests " +
+ "should have been cancelled after 1sec. Results are: $events"
+ )
+ }
}
}